summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlavien Bridault2006-08-28 18:22:44 +0200
committerFlavien Bridault2006-08-28 18:22:44 +0200
commit7658a3f43d9598d52215904878314a5345d60c08 (patch)
tree87cc8ab9df6d8a0ed7e10c781588fbde00f41294
parent236d5451683cbbac07ae0d534465f21178ca3b77 (diff)
parente0285ff8d14eff1be12ece29786be0dc93e7ebe2 (diff)
Merge with git+ssh://fbridault@scm.sourcemage.org/smgl/grimoire.git
-rw-r--r--ChangeLog3
-rwxr-xr-xaudio-creation/zynaddsubfx/BUILD13
-rwxr-xr-xaudio-creation/zynaddsubfx/CONFIGURE17
-rwxr-xr-xaudio-creation/zynaddsubfx/DEPENDS26
-rwxr-xr-xaudio-creation/zynaddsubfx/DETAILS17
-rw-r--r--audio-creation/zynaddsubfx/HISTORY4
-rwxr-xr-xaudio-creation/zynaddsubfx/INSTALL14
-rwxr-xr-xaudio-creation/zynaddsubfx/PRE_BUILD36
-rw-r--r--audio-creation/zynaddsubfx/zyn_debian.diff192
-rw-r--r--audio-creation/zynaddsubfx/zyn_lash.diff428
-rw-r--r--audio-creation/zynaddsubfx/zyn_unzombify.diff20
11 files changed, 770 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 33345a7c3e..2be4326944 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2006-08-28 Juuso Alasuutari <iuso@sourcemage.org>
+ * audio-creation/zynaddsubfx: New spell, software synthesizer.
+
2006-08-27 Flavien Bridault <vlaaad@sourcemage.org>
* disk/video-dvdrip: deprecated in favour of dvdrip (bug #11545)
diff --git a/audio-creation/zynaddsubfx/BUILD b/audio-creation/zynaddsubfx/BUILD
new file mode 100755
index 0000000000..b700e165b4
--- /dev/null
+++ b/audio-creation/zynaddsubfx/BUILD
@@ -0,0 +1,13 @@
+# Build standalone synth
+if [[ "$BUILD_MODE" != "DSSI plugin" ]]; then
+ cd src &&
+ make &&
+ cd ..
+fi &&
+
+# Build DSSI plugin
+if [[ "$BUILD_MODE" != "Standalone synth" ]]; then
+ cd src_dssi &&
+ make &&
+ cd ..
+fi
diff --git a/audio-creation/zynaddsubfx/CONFIGURE b/audio-creation/zynaddsubfx/CONFIGURE
new file mode 100755
index 0000000000..b429da5637
--- /dev/null
+++ b/audio-creation/zynaddsubfx/CONFIGURE
@@ -0,0 +1,17 @@
+config_query_list BUILD_MODE "Select build mode:" \
+ "Standalone synth" "DSSI plugin" Both &&
+
+if [[ "$BUILD_MODE" == "DSSI plugin" ]]; then
+ message "${MESSAGE_COLOR}Building DSSI plugin only, MIDI In and" \
+ "Audio Out are set automatically to DSSI.${DEFAULT_COLOR}"
+else
+ config_query_list LINUX_MIDIIN "Select MIDI input driver:" \
+ ALSA OSS NONE &&
+ config_query_list LINUX_AUDIOOUT "Select audio output driver:" \
+ OSS OSS_AND_JACK JACK PA NONE
+fi &&
+
+config_query ZYN_EXAMPLES "Install example banks and presets?" y &&
+
+config_query_option ASM_F2I "Use assembler FLOAT to INT conversions?" y \
+ YES NO
diff --git a/audio-creation/zynaddsubfx/DEPENDS b/audio-creation/zynaddsubfx/DEPENDS
new file mode 100755
index 0000000000..3f53b6cb1b
--- /dev/null
+++ b/audio-creation/zynaddsubfx/DEPENDS
@@ -0,0 +1,26 @@
+depends g++ &&
+depends fftw &&
+depends mxml &&
+
+if [[ "$BUILD_MODE" != "Standalone synth" ]]; then
+ depends dssi
+fi &&
+
+if [[ "$BUILD_MODE" != "DSSI plugin" ]]; then
+ if [[ "$LINUX_MIDIIN" == ALSA ]]; then
+ depends alsa-lib
+ fi &&
+ case "$LINUX_AUDIOOUT" in
+ *JACK* ) depends jack;;
+ PA ) depends portaudio;;
+ esac
+fi &&
+
+if [[ "$LINUX_MIDIIN" == ALSA ]]; then
+ if [[ "$LINUX_AUDIOOUT" == JACK ]] ||
+ [[ "$LINUX_AUDIOOUT" == OSS_AND_JACK ]]; then
+ optional_depends lash "" "" "for Linux Audio Session Handler support"
+ fi
+fi &&
+
+optional_depends fltk "" "" "to enable Graphical User Interface"
diff --git a/audio-creation/zynaddsubfx/DETAILS b/audio-creation/zynaddsubfx/DETAILS
new file mode 100755
index 0000000000..236455a67b
--- /dev/null
+++ b/audio-creation/zynaddsubfx/DETAILS
@@ -0,0 +1,17 @@
+ SPELL=zynaddsubfx
+ VERSION=2.2.1
+ SOURCE=ZynAddSubFX-$VERSION.tar.bz2
+ SOURCE_URL[0]=$SOURCEFORGE_URL/$SPELL/$SOURCE
+ SOURCE_HASH=sha512:defc1c0a29a7184ad8fad410dbf615df4f0c746f51682ed14847e70e422850a4146fbca753901b9fc3e8108ad5700304ef1ac9986d240e44f31bfc0c293c5d0a
+SOURCE_DIRECTORY=$BUILD_DIRECTORY/ZynAddSubFX-$VERSION
+ WEB_SITE=http://zynaddsubfx.sourceforge.net/
+ LICENSE[0]=GPL
+ ENTERED=20060828
+ KEYWORDS="editors audio"
+ SHORT="An opensource software synthesizer."
+cat << EOF
+ZynAddSubFX is a opensource software synthesizer capable of making a
+countless number of instruments, from some common heared from expensive
+hardware to interesting sounds that you'll boost to an amazing universe
+of sounds.
+EOF
diff --git a/audio-creation/zynaddsubfx/HISTORY b/audio-creation/zynaddsubfx/HISTORY
new file mode 100644
index 0000000000..4f2edf2137
--- /dev/null
+++ b/audio-creation/zynaddsubfx/HISTORY
@@ -0,0 +1,4 @@
+2006-08-28 Juuso Alasuutari <iuso@sourcemage.org>
+ * DETAILS, CONFIGURE, DEPENDS, PRE_BUILD, BUILD,
+ INSTALL, HISTORY, zyn_debian.diff, zyn_unzombify.diff,
+ zyn_lash.diff: created spell
diff --git a/audio-creation/zynaddsubfx/INSTALL b/audio-creation/zynaddsubfx/INSTALL
new file mode 100755
index 0000000000..5e7683b3fe
--- /dev/null
+++ b/audio-creation/zynaddsubfx/INSTALL
@@ -0,0 +1,14 @@
+if [[ "$BUILD_MODE" != "DSSI plugin" ]]; then
+ cp src/zynaddsubfx $INSTALL_ROOT/usr/bin/
+fi &&
+
+if [[ "$BUILD_MODE" != "Standalone synth" ]]; then
+ mkdir -p $INSTALL_ROOT/usr/lib/dssi/ &&
+ cp src_dssi/zynaddsubfx.so $INSTALL_ROOT/usr/lib/dssi/
+fi &&
+
+if [[ "$ZYN_EXAMPLES" == y ]]; then
+ mkdir -p $INSTALL_ROOT/usr/share/$SPELL/ &&
+ cp -r banks/ $INSTALL_ROOT/usr/share/$SPELL/ &&
+ cp -r presets/ $INSTALL_ROOT/usr/share/$SPELL/
+fi
diff --git a/audio-creation/zynaddsubfx/PRE_BUILD b/audio-creation/zynaddsubfx/PRE_BUILD
new file mode 100755
index 0000000000..42a62ae8f3
--- /dev/null
+++ b/audio-creation/zynaddsubfx/PRE_BUILD
@@ -0,0 +1,36 @@
+default_pre_build &&
+cd $SOURCE_DIRECTORY &&
+
+# Apply bugfixes from Debian
+patch -p1 < $SCRIPT_DIRECTORY/zyn_debian.diff &&
+
+# Apply config options shared by standalone & DSSI builds
+sedit "s/^ASM_F2I=.*/ASM_F2I=$ASM_F2I/" src/Makefile.inc &&
+if ! is_depends_enabled $SPELL fltk; then
+ sedit "s/^DISABLE_GUI=.*/DISABLE_GUI=YES/" src/Makefile.inc
+fi &&
+
+# Make a copy of the build dir for DSSI build (if only DSSI is selected
+# we can simply rename the existing dir)
+if [[ "$BUILD_MODE" != "Standalone synth" ]]; then
+ if [[ "$BUILD_MODE" == "DSSI plugin" ]]; then
+ mv src/ src_dssi/
+ else
+ mkdir src_dssi/ &&
+ cp -r src/* src_dssi/
+ fi &&
+ sedit "s/^LINUX_DSSI=.*/LINUX_DSSI=YES/" src_dssi/Makefile.inc
+fi &&
+
+# Apply JACK unzombify + LASH support patches (do this after the DSSI
+# stuff above, borks compile otherwise)
+patch -p1 < $SCRIPT_DIRECTORY/zyn_unzombify.diff &&
+if is_depends_enabled $SPELL lash; then
+ patch -p1 < $SCRIPT_DIRECTORY/zyn_lash.diff
+fi &&
+
+# If standalone is enabled apply midi & audio configs
+if [[ "$BUILD_MODE" != "DSSI plugin" ]]; then
+ sedit "s/^LINUX_MIDIIN=.*/LINUX_MIDIIN=$LINUX_MIDIIN/" src/Makefile.inc &&
+ sedit "s/^LINUX_AUDIOOUT=.*/LINUX_AUDIOOUT=$LINUX_AUDIOOUT/" src/Makefile.inc
+fi
diff --git a/audio-creation/zynaddsubfx/zyn_debian.diff b/audio-creation/zynaddsubfx/zyn_debian.diff
new file mode 100644
index 0000000000..3adcbf770a
--- /dev/null
+++ b/audio-creation/zynaddsubfx/zyn_debian.diff
@@ -0,0 +1,192 @@
+--- zynaddsubfx-2.2.1.orig/src/Synth/LFO.C
++++ zynaddsubfx-2.2.1/src/Synth/LFO.C
+@@ -108,7 +108,12 @@
+ else out*=lfointensity*amp2;
+ if (lfodelay<0.00001) {
+ if (freqrndenabled==0) x+=incx;
+- else x+=incx*(incrnd*(1.0-x)+nextincrnd*x);
++ else {
++ float tmp=(incrnd*(1.0-x)+nextincrnd*x);
++ if (tmp>1.0) tmp=1.0;
++ else if (tmp<0.0) tmp=0.0;
++ x+=incx*tmp;
++ };
+ if (x>=1) {
+ x=fmod(x,1.0);
+ amp1=amp2;
+@@ -136,6 +141,5 @@
+ if (freqrndenabled==0) return;
+ incrnd=nextincrnd;
+ nextincrnd=pow(0.5,lfofreqrnd)+RND*(pow(2.0,lfofreqrnd)-1.0);
+- if (nextincrnd*incx>=0.49999999) nextincrnd=1.0;
+ };
+
+--- zynaddsubfx-2.2.1.orig/src/Params/EnvelopeParams.C
++++ zynaddsubfx-2.2.1/src/Params/EnvelopeParams.C
+@@ -51,7 +51,7 @@
+ };
+
+ REALTYPE EnvelopeParams::getdt(char i){
+- REALTYPE result=(pow(2.0,Penvdt[i]/127.0*12.0)-1.0)*10.0;//miliseconds
++ REALTYPE result=(pow(2.0,Penvdt[(int)i]/127.0*12.0)-1.0)*10.0;//miliseconds
+ return(result);
+ };
+
+--- zynaddsubfx-2.2.1.orig/src/Output/JACKaudiooutput.C
++++ zynaddsubfx-2.2.1/src/Output/JACKaudiooutput.C
+@@ -35,6 +35,7 @@
+ jackmaster=master_;
+ jackclient=0;
+ char tmpstr[100];
++ const char **ports;
+
+ for (int i=0;i<15;i++){
+ if (i!=0) snprintf(tmpstr,100,"ZynAddSubFX_%d",i);
+@@ -50,7 +51,7 @@
+
+ fprintf(stderr,"Internal SampleRate = %d\nJack Output SampleRate= %d\n",SAMPLE_RATE,jack_get_sample_rate(jackclient));
+ if ((unsigned int)jack_get_sample_rate(jackclient)!=(unsigned int) SAMPLE_RATE)
+- fprintf(stderr,"It is recomanded that the both samplerates to be equal.\n");
++ fprintf(stderr,"It is recommended that the both samplerates to be equal.\n");
+
+ jack_set_process_callback(jackclient,jackprocess,0);
+ jack_set_sample_rate_callback(jackclient,jacksrate,0);
+@@ -66,10 +67,20 @@
+ return(false);
+ };
+
+- /*
++
++ /*
+ jack_connect(jackclient,jack_port_name(outport_left),"alsa_pcm:out_1");
+ jack_connect(jackclient,jack_port_name(outport_right),"alsa_pcm:out_2");
+- */
++ */
++
++ if ((ports = jack_get_ports (jackclient, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == NULL)
++ fprintf(stderr,"Cannot connect to jack output, you may hear no sound\n"); else {
++ if (jack_connect(jackclient,jack_port_name(outport_left),ports[0]))
++ fprintf(stderr,"Cannot connect to left output port\n");
++ if (jack_connect(jackclient,jack_port_name(outport_right),ports[1]))
++ fprintf(stderr,"Cannot connect to right output port\n");
++ }
++
+ return(true);
+ };
+
+--- zynaddsubfx-2.2.1.orig/src/Output/OSSaudiooutput.C
++++ zynaddsubfx-2.2.1/src/Output/OSSaudiooutput.C
+@@ -31,6 +31,19 @@
+ #include "OSSaudiooutput.h"
+ #include "../Misc/Util.h"
+
++#if __BYTE_ORDER == __BIG_ENDIAN
++/* borrowed from glib2 */
++#define SHORT_SWAP_LE_BE(val) ((short) ( \
++ (short) ((short) (val) >> 8) | \
++ (short) ((short) (val) << 8)))
++
++void swap_endian(short *data, int length)
++{
++ int i;
++ for (i = 0; i < length; i += 1, data++)
++ *data = SHORT_SWAP_LE_BE(*data);
++}
++#endif
+ OSSaudiooutput::OSSaudiooutput(){
+ int i;
+ int snd_bitsize=16;
+@@ -76,6 +89,9 @@
+ smps[i*2]=(short int) (l*32767.0);
+ smps[i*2+1]=(short int) (r*32767.0);
+ };
++#if __BYTE_ORDER == __BIG_ENDIAN
++ swap_endian(smps, SOUND_BUFFER_SIZE*4);
++#endif
+ write(snd_handle,smps,SOUND_BUFFER_SIZE*4);// *2 because is 16 bit, again * 2 because is stereo
+ };
+
+--- zynaddsubfx-2.2.1.orig/src/UI/BankUI.fl
++++ zynaddsubfx-2.2.1/src/UI/BankUI.fl
+@@ -35,6 +35,8 @@
+ } {}
+ decl {Bank *bank;} {public
+ }
++ Function {~BankProcess_()} {return_type virtual
++ } {code {} {}}
+ }
+
+ class BankSlot {: {public Fl_Button,BankProcess_}
+--- zynaddsubfx-2.2.1.orig/src/UI/PartUI.fl
++++ zynaddsubfx-2.2.1/src/UI/PartUI.fl
+@@ -86,6 +86,8 @@
+ class PartUI_ {} {
+ Function {showparameters(int kititem,int engine)} {return_type virtual
+ } {}
++ Function {~PartUI_()} {return_type virtual} { code {} {}
++ }
+ }
+
+ class PartKitItem {: {public Fl_Group}
+--- zynaddsubfx-2.2.1.orig/src/UI/VirKeyboard.fl
++++ zynaddsubfx-2.2.1/src/UI/VirKeyboard.fl
+@@ -168,7 +168,8 @@
+ }
+ Function {presskey(int nk,int exclusive,int type)} {} {
+ code {if (nk>=N_OCT*12) return;
+-if ((nk<0)&&(exclusive==0)) {
++if ((nk<0)) {
++ if(exclusive==0)
+ relaseallkeys(type);
+ return;
+ };
+--- zynaddsubfx-2.2.1.orig/src/main.C
++++ zynaddsubfx-2.2.1/src/main.C
+@@ -90,7 +90,7 @@
+ * Try to get the realtime priority
+ */
+ void set_realtime(){
+-#ifdef OS_LINUX
++#if 0
+ sched_param sc;
+
+ sc.sched_priority=50;
+@@ -230,7 +230,7 @@
+ */
+
+
+-void initprogram(){
++void initprogram(int noui){
+ #ifndef JACKAUDIOOUT
+ #ifndef JACK_RTAUDIOOUT
+ fprintf(stderr,"\nSample Rate = \t\t%d\n",SAMPLE_RATE);
+@@ -284,7 +284,8 @@
+ Midi=new NULLMidiIn();
+ #endif
+ #ifndef DISABLE_GUI
+- ui=new MasterUI(master,&Pexitprogram);
++ if (noui==0)
++ ui=new MasterUI(master,&Pexitprogram);
+ #endif
+ };
+
+@@ -475,8 +476,10 @@
+ fprintf(stderr,"%s"," -D , --dump\t\t\t\t Dumps midi note ON/OFF commands\n");
+ fprintf(stderr,"%s"," -U , --no-gui\t\t\t\t Run ZynAddSubFX without user interface\n");
+ #ifdef JACKAUDIOOUT
++#ifdef OSSAUDIOOUT
+ fprintf(stderr,"%s"," -A , --not-use-jack\t\t\t Use OSS/ALSA instead of JACK\n");
+ #endif
++#endif
+ #ifdef OS_WINDOWS
+ fprintf(stderr,"%s","\nWARNING: On Windows systems, only short comandline parameters works.\n");
+ fprintf(stderr,"%s"," eg. instead '--buffer-size=512' use '-b 512'\n");
+@@ -487,7 +490,7 @@
+
+ //---------
+
+- initprogram();
++ initprogram(noui);
+
+ if (strlen(loadfile)>1){
+ int tmp=master->loadXML(loadfile);
diff --git a/audio-creation/zynaddsubfx/zyn_lash.diff b/audio-creation/zynaddsubfx/zyn_lash.diff
new file mode 100644
index 0000000000..6937c60368
--- /dev/null
+++ b/audio-creation/zynaddsubfx/zyn_lash.diff
@@ -0,0 +1,428 @@
+--- a/src/Input/ALSAMidiIn.C 2005-03-14 21:54:28.000000000 +0200
++++ b/src/Input/ALSAMidiIn.C 2006-08-26 12:32:53.000000000 +0300
+@@ -94,3 +94,14 @@
+ };
+
+
++int ALSAMidiIn::getalsaid() {
++ if (midi_handle) {
++ snd_seq_client_info_t* seq_info;
++ snd_seq_client_info_malloc(&seq_info);
++ snd_seq_get_client_info(midi_handle, seq_info);
++ int id = snd_seq_client_info_get_client(seq_info);
++ snd_seq_client_info_free(seq_info);
++ return id;
++ }
++ return -1;
++}
+--- a/src/Input/ALSAMidiIn.h 2005-03-14 21:54:19.000000000 +0200
++++ b/src/Input/ALSAMidiIn.h 2006-08-26 12:32:53.000000000 +0300
+@@ -32,6 +32,7 @@
+ ALSAMidiIn();
+ ~ALSAMidiIn();
+ void getmidicmd(MidiCmdType &cmdtype,unsigned char &cmdchan,int *cmdparams);
++ int getalsaid();
+
+ private:
+ snd_seq_t *midi_handle;
+--- a/src/main.C 2006-08-26 12:31:33.000000000 +0300
++++ b/src/main.C 2006-08-26 12:32:53.000000000 +0300
+@@ -83,6 +83,10 @@
+ OSSaudiooutput *audioout;
+ #endif
+
++#include "Misc/LASHClient.h"
++LASHClient *lash;
++
++
+ MidiIn *Midi;
+ int Pexitprogram=0;//if the UI set this to 1, the program will exit
+
+@@ -180,7 +184,20 @@
+ void *thread3(void *arg){
+ #ifndef DISABLE_GUI
+ ui->showUI();
+- while (Pexitprogram==0) Fl::wait();
++ while (Pexitprogram==0) {
++ std::string filename;
++ switch (lash->checkevents(filename)) {
++ case LASHClient::Save:
++ ui->do_save_master(const_cast<char*>(filename.c_str()));
++ lash->confirmevent(LASHClient::Save);
++ break;
++ case LASHClient::Restore:
++ ui->do_load_master(filename.c_str());
++ lash->confirmevent(LASHClient::Restore);
++ break;
++ }
++ Fl::wait();
++ }
+ #endif
+ return(0);
+ };
+@@ -313,6 +330,8 @@
+ delete(Midi);
+ delete(master);
+
++ delete(lash);
++
+ // pthread_mutex_unlock(&master->mutex);
+ delete(denormalkillbuf);
+ delete(OscilGen::tmpsmps);
+@@ -346,6 +365,9 @@
+
+ #ifndef VSTAUDIOOUT
+ int main(int argc, char *argv[]){
++
++ lash = new LASHClient(&argc, &argv, &Pexitprogram);
++
+ config.init();
+ int noui=0;
+ #ifdef JACKAUDIOOUT
+@@ -491,7 +513,13 @@
+ //---------
+
+ initprogram(noui);
+-
++
++ ALSAMidiIn* alsamidi = dynamic_cast<ALSAMidiIn*>(Midi);
++ if (alsamidi) {
++ lash->setalsaid(alsamidi->getalsaid());
++ lash->setjackname(JACKgetname());
++ }
++
+ if (strlen(loadfile)>1){
+ int tmp=master->loadXML(loadfile);
+ if (tmp<0) {
+--- a/src/Makefile 2005-04-28 02:45:52.000000000 +0300
++++ b/src/Makefile 2006-08-26 12:32:53.000000000 +0300
+@@ -70,6 +70,9 @@
+ LIBS+= `pkg-config --libs jack`
+ endif
+
++CXXFLAGS += `pkg-config --cflags lash-1.0`
++LIBS += `pkg-config --libs lash-1.0`
++
+ objects=main.o
+ SUBDIRS=DSP Effects Input Misc Output Params Synth Seq
+
+--- a/src/Misc/lash/lash.h 1970-01-01 02:00:00.000000000 +0200
++++ b/src/Misc/lash/lash.h 2006-08-26 12:32:53.000000000 +0300
+@@ -0,0 +1 @@
++dummy
+--- a/src/Misc/LASHClient.C 1970-01-01 02:00:00.000000000 +0200
++++ b/src/Misc/LASHClient.C 2006-08-26 12:32:53.000000000 +0300
+@@ -0,0 +1,75 @@
++#include <unistd.h>
++#include <iostream>
++#include <string>
++
++#include "LASHClient.h"
++
++
++LASHClient::LASHClient(int* argc, char*** argv, int* exitflag) {
++ this->exitflag = exitflag;
++ client = lash_init(lash_extract_args(argc, argv), "ZynAddSubFX",
++ LASH_Config_File, LASH_PROTOCOL(2, 0));
++}
++
++
++void LASHClient::setalsaid(int id) {
++ if (lash_enabled(client)) {
++ if (id != -1)
++ lash_alsa_client_id(client, id);
++ }
++}
++
++
++void LASHClient::setjackname(const char* name) {
++ if (lash_enabled(client)) {
++ if (name != NULL)
++ lash_jack_client_name(client, name);
++ }
++}
++
++
++LASHClient::Event LASHClient::checkevents(std::string& filename) {
++
++ if (!lash_enabled(client))
++ return NoEvent;
++
++ Event received = NoEvent;
++ lash_event_t* event;
++ while (event = lash_get_event(client)) {
++
++ // save
++ if (lash_event_get_type(event) == LASH_Save_File) {
++ std::cerr<<"LASH event: LASH_Save_File"<<std::endl;
++ filename = std::string(lash_event_get_string(event)) + "/master.xmz";
++ received = Save;
++ break;
++ }
++
++ // restore
++ else if (lash_event_get_type(event) == LASH_Restore_File) {
++ std::cerr<<"LASH event: LASH_Restore_File"<<std::endl;
++ filename = std::string(lash_event_get_string(event)) + "/master.xmz";
++ received = Restore;
++ break;
++ }
++
++ // quit
++ else if (lash_event_get_type(event) == LASH_Quit) {
++ std::cerr<<"LASH event: LASH_Quit"<<std::endl;
++ *(exitflag) = 1;
++ received = Quit;
++ break;
++ }
++
++ lash_event_destroy(event);
++ }
++ return received;
++}
++
++
++void LASHClient::confirmevent(Event event) {
++ if (event == Save)
++ lash_send_event(client, lash_event_new_with_type(LASH_Save_File));
++ else if (event == Restore)
++ lash_send_event(client, lash_event_new_with_type(LASH_Restore_File));
++}
+--- a/src/Misc/LASHClient.h 1970-01-01 02:00:00.000000000 +0200
++++ b/src/Misc/LASHClient.h 2006-08-26 12:32:53.000000000 +0300
+@@ -0,0 +1,35 @@
++#ifndef LASHClient_h
++#define LASHClient_h
++
++#include <string>
++#include <pthread.h>
++#include <lash/lash.h>
++
++
++class LASHClient {
++ public:
++
++ enum Event {
++ Save,
++ Restore,
++ Quit,
++ NoEvent
++ };
++
++ LASHClient(int* argc, char*** argv, int* exitflag);
++
++ void setalsaid(int id);
++ void setjackname(const char* name);
++ Event checkevents(std::string& filename);
++ void confirmevent(Event event);
++
++ private:
++
++ lash_client_t* client;
++ pthread_t thread;
++ int* exitflag;
++};
++
++
++#endif
++
+--- a/src/Misc/Makefile 2005-03-12 20:16:26.000000000 +0200
++++ b/src/Misc/Makefile 2006-08-26 12:32:53.000000000 +0300
+@@ -1,6 +1,6 @@
+ include ../Makefile.inc
+
+-objects=Bank.o Master.o Microtonal.o Part.o Util.o Config.o Dump.o XMLwrapper.o
++objects=Bank.o Master.o Microtonal.o Part.o Util.o Config.o Dump.o XMLwrapper.o LASHClient.o
+
+
+ all: $(objects)
+--- a/src/Misc/Master.C 2005-03-14 21:57:26.000000000 +0200
++++ b/src/Misc/Master.C 2006-08-26 12:32:53.000000000 +0300
+@@ -640,7 +640,7 @@
+ delete(xml);
+ };
+
+-int Master::saveXML(char *filename){
++int Master::saveXML(const char *filename){
+ XMLwrapper *xml=new XMLwrapper();
+
+ xml->beginbranch("MASTER");
+@@ -654,7 +654,7 @@
+
+
+
+-int Master::loadXML(char *filename){
++int Master::loadXML(const char *filename){
+ XMLwrapper *xml=new XMLwrapper();
+ if (xml->loadXMLfile(filename)<0) {
+ delete(xml);
+--- a/src/Misc/Master.h 2005-03-14 21:57:29.000000000 +0200
++++ b/src/Misc/Master.h 2006-08-26 12:32:53.000000000 +0300
+@@ -43,7 +43,7 @@
+
+ //saves all settings to a XML file
+ //returns 0 for ok or <0 if there is an error
+- int saveXML(char *filename);
++ int saveXML(const char *filename);
+
+ //this adds the parameters to the XML data
+ void add2XML(XMLwrapper *xml);
+@@ -53,7 +53,7 @@
+
+ //loads all settings from a XML file
+ //returns 0 for ok or -1 if there is an error
+- int loadXML(char *filename);
++ int loadXML(const char *filename);
+ void applyparameters();
+
+ void getfromXML(XMLwrapper *xml);
+--- a/src/Misc/XMLwrapper.C 2005-04-13 01:09:34.000000000 +0300
++++ b/src/Misc/XMLwrapper.C 2006-08-26 12:32:53.000000000 +0300
+@@ -162,7 +162,7 @@
+
+ /* SAVE XML members */
+
+-int XMLwrapper::saveXMLfile(char *filename){
++int XMLwrapper::saveXMLfile(const char *filename){
+ char *xmldata=getXMLdata();
+ if (xmldata==NULL) return(-2);
+
+--- a/src/Misc/XMLwrapper.h 2005-03-14 21:57:17.000000000 +0200
++++ b/src/Misc/XMLwrapper.h 2006-08-26 12:32:53.000000000 +0300
+@@ -43,7 +43,7 @@
+ /********************************/
+
+ //returns 0 if ok or -1 if the file cannot be saved
+- int saveXMLfile(char *filename);
++ int saveXMLfile(const char *filename);
+
+ //returns the new allocated string that contains the XML data (used for clipboard)
+ //the string is NULL terminated
+--- a/src/Output/JACKaudiooutput.C 2006-08-26 12:31:39.000000000 +0300
++++ b/src/Output/JACKaudiooutput.C 2006-08-26 13:09:07.000000000 +0300
+@@ -25,6 +25,7 @@
+
+ Master *jackmaster;
+ jack_client_t *jackclient;
++char jackname[100];
+ jack_port_t *outport_left,*outport_right;
+
+ int jackprocess(jack_nframes_t nframes,void *arg);
+@@ -34,13 +35,12 @@
+ bool JACKaudiooutputinit(Master *master_){
+ jackmaster=master_;
+ jackclient=0;
+- char tmpstr[100];
+ const char **ports;
+
+ for (int i=0;i<15;i++){
+- if (i!=0) snprintf(tmpstr,100,"ZynAddSubFX_%d",i);
+- else snprintf(tmpstr,100,"ZynAddSubFX");
+- jackclient=jack_client_new(tmpstr);
++ if (i!=0) snprintf(jackname,100,"ZynAddSubFX_%d",i);
++ else snprintf(jackname,100,"ZynAddSubFX");
++ jackclient=jack_client_new(jackname);
+ if (jackclient!=0) break;
+ };
+
+@@ -113,4 +113,8 @@
+ };
+
+
+-
++const char* JACKgetname() {
++ if (jackclient != NULL)
++ return jackname;
++ return NULL;
++}
+--- a/src/Output/JACKaudiooutput.h 2005-03-12 20:16:26.000000000 +0200
++++ b/src/Output/JACKaudiooutput.h 2006-08-26 12:32:53.000000000 +0300
+@@ -40,6 +40,8 @@
+
+ bool JACKaudiooutputinit(Master *master_);
+ void JACKfinish();
++const char* JACKgetname();
++
+
+ #endif
+
+--- a/src/UI/MasterUI.fl 2005-04-08 22:50:53.000000000 +0300
++++ b/src/UI/MasterUI.fl 2006-08-26 12:32:53.000000000 +0300
+@@ -413,7 +413,8 @@
+ decl {BankUI *bankui;} {}
+ }
+
+-class MasterUI {} {
++class MasterUI {open
++} {
+ Function {make_window()} {} {
+ Fl_Window masterwindow {
+ label zynaddsubfx
+@@ -424,7 +425,7 @@
+ config.save();
+ *exitprogram=1;
+ };
+-\#endif} selected
++\#endif}
+ xywh {353 127 390 465} type Double hide
+ } {
+ Fl_Menu_Bar mastermenu {
+@@ -1701,11 +1702,16 @@
+
+ updatepanel();} {}
+ }
+- Function {do_load_master()} {} {
+- code {char *filename;
+-filename=fl_file_chooser("Open:","({*.xmz})",NULL,0);
+-if (filename==NULL) return;
+-
++ Function {do_load_master(const char* file = NULL)} {selected
++ } {
++ code {const char *filename;
++ if (file == NULL) {
++ filename=fl_file_chooser("Open:","({*.xmz})",NULL,0);
++ if (filename==NULL) return;
++ }
++ else {
++ filename = file;
++ }
+
+ pthread_mutex_lock(&master->mutex);
+ //clear all parameters
+@@ -1725,20 +1731,23 @@
+ if (result==-10) fl_alert("Error: Could not load the file\\nbecause it is not a zynaddsubfx parameters file.");
+ else if (result<0) fl_alert("Error: Could not load the file.");} {}
+ }
+- Function {do_save_master()} {} {
++ Function {do_save_master(char* file = NULL)} {} {
+ code {char *filename;
+-int result=0;
+-
+-filename=fl_file_chooser("Save:","({*.xmz})",NULL,0);
+-if (filename==NULL) return;
+-filename=fl_filename_setext(filename,".xmz");
+-
+-result=fileexists(filename);
+-if (result) {
+- result=0;
+- if (!fl_ask("The file exists. \\nOverwrite it?")) return;
+-
+-};
++ int result=0;
++ if (file == NULL) {
++ filename=fl_file_chooser("Save:","({*.xmz})",NULL,0);
++ if (filename==NULL) return;
++ filename=fl_filename_setext(filename,".xmz");
++ result=fileexists(filename);
++ if (result) {
++ result=0;
++ if (!fl_ask("The file exists. Overwrite it?")) return;
++
++ }
++ }
++ else {
++ filename = file;
++ }
+
+
+ pthread_mutex_lock(&master->mutex);
diff --git a/audio-creation/zynaddsubfx/zyn_unzombify.diff b/audio-creation/zynaddsubfx/zyn_unzombify.diff
new file mode 100644
index 0000000000..0a2cfe1405
--- /dev/null
+++ b/audio-creation/zynaddsubfx/zyn_unzombify.diff
@@ -0,0 +1,20 @@
+--- a/src/Output/JACKaudiooutput.C 2006-08-26 13:18:19.000000000 +0300
++++ b/src/Output/JACKaudiooutput.C 2006-08-26 13:19:15.000000000 +0300
+@@ -88,9 +88,14 @@
+ jack_default_audio_sample_t *outl=(jack_default_audio_sample_t *) jack_port_get_buffer (outport_left, nframes);
+ jack_default_audio_sample_t *outr=(jack_default_audio_sample_t *) jack_port_get_buffer (outport_right, nframes);
+
+- pthread_mutex_lock(&jackmaster->mutex);
+- jackmaster->GetAudioOutSamples(nframes,jack_get_sample_rate(jackclient),outl,outr);
+- pthread_mutex_unlock(&jackmaster->mutex);
++ if (!pthread_mutex_trylock(&jackmaster->mutex)) {
++ jackmaster->GetAudioOutSamples(nframes,jack_get_sample_rate(jackclient),outl,outr);
++ pthread_mutex_unlock(&jackmaster->mutex);
++ }
++ else {
++ memset(outl, 0, sizeof(jack_default_audio_sample_t) * nframes);
++ memset(outr, 0, sizeof(jack_default_audio_sample_t) * nframes);
++ }
+
+ return(0);
+ };