On Thu, Feb 10, 2011 at 5:56 PM, Alessandro Preziosi <lsnpreziosi@gmail.com> wrote:
i need to do something relatively simple, but i cant figure out how to do it, or what software i need...
basically i have to play a certain song where i need to switch between different sounds (say, a piano at the beginning using qsyinth and then a synth created with zynaddsubfx). I want to be able to switch between one setup to the other quickly, possibly using the program change from my keyboard. How do i do that???

On my keyboard i can create different programs, each using different sounds (patches) and switch between them with the click of a button. I want to use that, but I want to generate the sounds with my computer. 
I think I need a way to 'map' midi channels to different programs or midi patches to specific programs (like, when i select piano on the keyboard (patch0, bank0) it uses qsynth, and when i select a synth it uses zynaddusbfx).
Any ideas?

Thank you very much,

Alessandro Preziosi




It probably is an overkill for your problem, but I did this small supercollider program; basically it makes an Alsa midi client to which you send program changes and it changes through jack connections created by jack_snapshot. So to use it you would create a jack_snapshot for each synth/set of connections, save them and put the in "files" variable

Hope it works since I haven't time to test it now and it's been a while since I've used it... also I remember for some strange reason if I gave it many program changes rapidly one after the other it would clog the cpu

ah yes, once you have supercollider installed you could simply run it from command line with "sclang jack-switcher.sc"

HTH,
renato


jack-switcher.sc:
(
//var midichan, files = "jsfiles".getenv.split($ );
var midichan, files;
files = ["/home/renato/Audio/1.snp","/home/renato/Audio/2.snp"]; //these have to be files obtained through "jack_snapshot save 1.snp"

//Starts MIDI client
MIDIClient.init;
MIDIIn.program = {arg src, chan, prog;
               
                [src,chan,prog].postln;
               
                ("jack_snapshot restore "++files[prog.min(files.size)]).unixCmd;
                };

)