//This example was originally created in a seminar. It illustrates creating a new SynthDef, then a GUI which controls an active Synth based on that def.
//As an exercise, you might want to expand this by adding labels to the GUI window to show a user what each control does!
(
SynthDef(\mysound,{arg density=100, centrefreq=1000, rq=0.1, amp=0.1;
var dust, filter;
//Dust is a stochastic source of impulse clicks, density per second
dust= Dust.ar(density);
//the filtering is twofold; shaping the clicks via attack and decay smoothing in Decay2, and then a Band Pass Filter
filter= BPF.ar(50*Decay2.ar(dust,0.01,0.05),centrefreq, rq);
Out.ar(0,(filter*amp).dup(2))
}).add
)
//GUI code. The MIDI Controller option is commented out; it was added spontaneously to answer an inquiry about how to hook up an external control to a graphical user interface control. You may want to look back at this after later material in the course on MIDI.
(
var w, slid2d, knob, numberbox;
var sound;
//use that SynthDef!
sound= Synth(\mysound);
w= Window("mysound's window",Rect(100,300,300,200));
slid2d= Slider2D(w,Rect(10,10,180,180));
knob= Knob(w,Rect(210,10,80,80));
numberbox= NumberBox(w,Rect(210,110,80,80));
//slid2d.action = {stuff...} is the same as slid2d.action_({stuff...})
slid2d.action = {
sound.set(\density,slid2d.x*100.0+1,\rq,slid2d.y*0.5+0.01);
};
knob.action={sound.set(\centrefreq,knob.value*2000+500)};
//to let any MIDI control message set the knob position, and trigger the corresponding action
/*
MIDIIn.control={arg src,chan,num,val;
//defer avoids complaints from the system that the GUI is being updated outside of a safe thread; it pushes the code through to the AppClock (see week 6 of course)
{knob.value= (val/127.0); knob.action.value;}.defer;
};
*/
numberbox.action={var temp;
temp= numberbox.value.max(0.0).min(1.0);
sound.set(\amp,temp);
numberbox.value = temp;
};
w.front;
w.onClose= {sound.free;};
)