// Synth Lab // copyright 2008 Les Hall // This software is protected by the GNU General Public License // parameters: change to suit the application, fit the screen, save CPU, improve slider resolution, etc. 10 => int num_nodes; // number of nodes available for connection 4 => int num_gains; // number of gains 4 => int num_osc; // number of oscillators 2 => int num_filters; // number of filters 2 => int num_delays; // number of delay lines 2 => int num_reverbs; // number of reverbs 150 => int slot_width; // width in pixels of each card slot // variables int node_boost_val[num_nodes+1]; // boost value for nodes int mic_out; // output node of microphone int dac_left_in; // left input node of dac int dac_right_in; // right input node of dac int gain_boost_val[num_gains]; // boost value for gains int gain_in[num_gains]; // the previous value of input node int gain_out[num_gains]; // the previous value of output node int osc_sel[num_osc]; // the selected oscillators int osc_in[num_osc]; // the previous value of input node int osc_out[num_osc]; // the previous value of output node int filter_sel[num_filters]; // the selected filters int filter_in[num_filters]; // the previous value of input node int filter_out[num_filters]; // the previous value of output node int delay_sel[num_delays]; // the selected delays int delay_in[num_delays]; // the previous value of input node int delay_out[num_delays]; // the previous value of output node int reverb_sel[num_reverbs]; // the selected reverbs int reverb_in[num_reverbs]; // the previous value of input node int reverb_out[num_reverbs]; // the previous value of output node int noise_out; // the previous value of output node int pitshift_in; // the previous value of input node int pitshift_out; // the previous value of output node int exit; // 1 to indicate an exit when self-destruct is pressed // define the pages MAUI_View main_view; main_view.size (2 * slot_width, 300); main_view.position (0, 800 - 250); main_view.name ("Synth Lab - Main Panel"); MAUI_View node_view; node_view.size (3 * slot_width, 50 * (num_nodes + 1)); node_view.position (100, 750 - 50 * (num_nodes + 1)); node_view.name ("Synth Lab - Nodes"); MAUI_View gain_view; gain_view.size (num_gains * slot_width, 300); gain_view.position (200, 700 - 300); gain_view.name ("Synth Lab - Gains"); MAUI_View osc_view; osc_view.size (num_osc * slot_width, 475); osc_view.position (300, 650 - 475); osc_view.name ("Synth Lab - Oscillators"); MAUI_View filter_view; filter_view.size (num_filters * slot_width, 400); filter_view.position (400, 600 - 400); filter_view.name ("Synth Lab - Filters"); MAUI_View delay_view; delay_view.size (num_delays * slot_width, 275); delay_view.position (500, 550 - 275); delay_view.name ("Synth Lab - Delays"); MAUI_View reverb_view; reverb_view.size (num_reverbs * slot_width, 225); reverb_view.position (3600, 500 - 225); reverb_view.name ("Synth Lab - Reverb"); MAUI_View misc_view; misc_view.size (2*slot_width, 275); reverb_view.position (700, 450 - 275); misc_view.name ("Synth Lab - Misc."); // control declarations // main panel controls MAUI_Button main_record; MAUI_Slider main_volume; MAUI_Button main_self_destruct; MAUI_Button main_copyright; MAUI_Button main_credits; MAUI_Slider main_mic_output; MAUI_Slider main_dac_left_input; MAUI_Slider main_dac_right_input; // node controls MAUI_Slider node_gain[num_nodes+1]; MAUI_Button node_boost[num_nodes+1]; MAUI_Slider node_op[num_nodes+1]; // gain controls MAUI_Slider gain_input[num_gains]; MAUI_Slider gain_output[num_gains]; MAUI_Slider gain_gain[num_gains]; MAUI_Button gain_boost[num_gains]; MAUI_Slider gain_op[num_gains]; // oscillator controls MAUI_Button osc_label[num_osc]; MAUI_Slider osc_input[num_osc]; MAUI_Slider osc_output[num_osc]; MAUI_Slider osc_gain[num_osc]; MAUI_Slider osc_freq1[num_osc]; MAUI_Slider osc_freq2[num_osc]; MAUI_Slider osc_phase[num_osc]; MAUI_Slider osc_width[num_osc]; MAUI_Slider osc_sync[num_osc]; // filter panel controls MAUI_Button filter_label[num_filters]; MAUI_Slider filter_input[num_filters]; MAUI_Slider filter_output[num_filters]; MAUI_Slider filter_gain[num_filters]; MAUI_Slider filter_freq1[num_filters]; MAUI_Slider filter_freq2[num_filters]; MAUI_Slider filter_q[num_filters]; // delay panel controls MAUI_Button delay_label[num_delays]; MAUI_Slider delay_input[num_delays]; MAUI_Slider delay_output[num_delays]; MAUI_Slider delay_gain[num_delays]; MAUI_Slider delay_dur[num_delays]; // reverb panel controls MAUI_Button reverb_label[num_reverbs]; MAUI_Slider reverb_input[num_reverbs]; MAUI_Slider reverb_output[num_reverbs]; MAUI_Slider reverb_mix[num_reverbs]; // misc panel controls MAUI_Button noise_label; MAUI_Slider noise_output; MAUI_Slider noise_gain; MAUI_Button pitshift_label; MAUI_Slider pitshift_input; MAUI_Slider pitshift_output; MAUI_Slider pitshift_mix; MAUI_Slider pitshift_shift; // main panel controls // main record button main_record.toggleType (); main_record.size (slot_width, 60); main_record.position (0, 0); main_record.name ("Record"); main_view.addElement (main_record); // main volume slider main_volume.name ("Volume"); main_volume.range (0, 1); main_volume.value (0.5); main_volume.size (slot_width, 75); main_volume.position (0, 35); main_view.addElement (main_volume); // main self-destruct button main_self_destruct.pushType (); main_self_destruct.size (slot_width, 60); main_self_destruct.position (0, 100); main_self_destruct.name ("Self Destruct"); main_view.addElement (main_self_destruct); // main copyright button main_copyright.pushType (); main_copyright.size (2*slot_width, 60); main_copyright.position (0, 170); main_copyright.name ("Copyright 2008 Les Hall"); main_view.addElement (main_copyright); // main credits button main_credits.pushType (); main_credits.size (2*slot_width, 60); main_credits.position (0, 220); main_credits.name ("Thanks to www.electro-music.com"); main_view.addElement (main_credits); // main mic output node slider main_mic_output.name ("Mic Output"); main_mic_output.range (0, num_nodes); main_mic_output.value (0); main_mic_output.size (slot_width, 75); main_mic_output.position (slot_width, 0); main_mic_output.displayFormat (main_mic_output.integerFormat); main_view.addElement (main_mic_output); // main dac left output node slider main_dac_left_input.name ("DAC Left"); main_dac_left_input.range (0, num_nodes); main_dac_left_input.value (1); main_dac_left_input.size (slot_width, 75); main_dac_left_input.position (slot_width, 50); main_dac_left_input.displayFormat (main_dac_left_input.integerFormat); main_view.addElement (main_dac_left_input); // main dac right output node slider main_dac_right_input.name ("Dac Right"); main_dac_right_input.range (0, num_nodes); main_dac_right_input.value (1); main_dac_right_input.size (slot_width, 75); main_dac_right_input.position (slot_width, 100); main_dac_right_input.displayFormat (main_dac_right_input.integerFormat); main_view.addElement (main_dac_right_input); // nodes for (1 => int n; n <= num_nodes; n++) { // node gain slider node_gain[n].name ("Gain " + n); node_gain[n].range (0, 1); node_gain[n].value (1); node_gain[n].size (slot_width, 75); node_gain[n].position (0, 50 * (n - 1)); node_view.addElement (node_gain[n]); // node boost button node_boost[n].pushType (); node_boost[n].size (slot_width, 60); node_boost[n].position (slot_width, 50 * (n -1) + 10); node_boost[n].name ("x1"); node_view.addElement (node_boost[n]); // node op slider node_op[n].name ("op " + n); node_op[n].range (-1, 4); node_op[n].value (1); node_op[n].size (slot_width, 75); node_op[n].position (2 * slot_width, 50 * (n - 1)); node_op[n].displayFormat (node_op[n].integerFormat); node_view.addElement (node_op[n]); } // gains for (0 => int g; g < num_gains; g++) { // gain input node slider gain_input[g].name ("Input Node"); gain_input[g].range (0, num_nodes); gain_input[g].value (0); gain_input[g].size (slot_width, 75); gain_input[g].position (slot_width * g, 0); gain_input[g].displayFormat (gain_input[g].integerFormat); gain_view.addElement (gain_input[g]); // gain output node slider gain_output[g].name ("Output Node"); gain_output[g].range (0, num_nodes); gain_output[g].value (0); gain_output[g].size (slot_width, 75); gain_output[g].position (slot_width * g, 50); gain_output[g].displayFormat (gain_output[g].integerFormat); gain_view.addElement (gain_output[g]); // gain gain slider gain_gain[g].name ("Gain " + g); gain_gain[g].range (0, 1); gain_gain[g].value (1); gain_gain[g].size (slot_width, 75); gain_gain[g].position (slot_width * g, 100); gain_view.addElement (gain_gain[g]); // gain boost button gain_boost[g].pushType (); gain_boost[g].size (slot_width, 60); gain_boost[g].position (slot_width * g, 160); gain_boost[g].name ("x1"); gain_view.addElement (gain_boost[g]); // gain op slider gain_op[g].name ("op " + g); gain_op[g].range (-1, 4); gain_op[g].value (1); gain_op[g].size (slot_width, 75); gain_op[g].position (slot_width * g, 200); gain_op[g].displayFormat (gain_op[g].integerFormat); gain_view.addElement (gain_op[g]); } // oscillators for (0 => int o; o < num_osc; o++) { // initialize oscillator selection 1 => osc_sel[o]; // osc label button osc_label[o].pushType (); osc_label[o].size (slot_width, 60); osc_label[o].position (slot_width*o, 0); osc_label[o].name ("SinOsc " + o); osc_view.addElement (osc_label[o]); // osc input node slider osc_input[o].name ("Input Node"); osc_input[o].range (0, num_nodes); osc_input[o].value (0); osc_input[o].size (slot_width, 75); osc_input[o].position (slot_width*o, 50); osc_input[o].displayFormat (osc_input[o].integerFormat); osc_view.addElement (osc_input[o]); // osc output node slider osc_output[o].name ("Output Node"); osc_output[o].range (0, num_nodes); osc_output[o].value (0); osc_output[o].size (slot_width, 75); osc_output[o].position (slot_width*o, 100); osc_output[o].displayFormat (osc_output[o].integerFormat); osc_view.addElement (osc_output[o]); // osc gain slider osc_gain[o].name ("Gain"); osc_gain[o].range (0, 1); osc_gain[o].value (0); osc_gain[o].size (slot_width, 75); osc_gain[o].position (slot_width*o, 150); osc_view.addElement (osc_gain[o]); // osc freq1 slider osc_freq1[o].name ("Freq"); osc_freq1[o].range (0, 10); osc_freq1[o].value (5); osc_freq1[o].size (slot_width, 75); osc_freq1[o].position (slot_width*o, 200); osc_view.addElement (osc_freq1[o]); // osc freq2 slider osc_freq2[o].name ("Freq Exp"); osc_freq2[o].range (-2, 4); osc_freq2[o].value (2); osc_freq2[o].size (slot_width, 75); osc_freq2[o].position (slot_width*o, 250); osc_freq2[o].displayFormat (osc_freq2[o].integerFormat); osc_view.addElement (osc_freq2[o]); // osc phase slider osc_phase[o].name ("Phase"); osc_phase[o].range (0, 2*pi); osc_phase[o].value (pi); osc_phase[o].size (slot_width, 75); osc_phase[o].position (slot_width*o, 300); osc_view.addElement (osc_phase[o]); // osc width slider osc_width[o].name ("Width"); osc_width[o].range (0, 1); osc_width[o].value (0.5); osc_width[o].size (slot_width, 75); osc_width[o].position (slot_width*o, 350); osc_view.addElement (osc_width[o]); // osc synch slider osc_sync[o].name ("Sync"); osc_sync[o].range (0, 2); osc_sync[o].value (0); osc_sync[o].size (slot_width, 75); osc_sync[o].position (slot_width*o, 400); osc_sync[o].displayFormat (osc_sync[o].integerFormat); osc_view.addElement (osc_sync[o]); } // filters for (0 => int f; f < num_filters; f++) { // initialize filter selection 0 => filter_sel[f]; // filter label button filter_label[f].pushType (); filter_label[f].size (slot_width, 60); filter_label[f].position (slot_width*f, 0); filter_label[f].name ("LPF " + f); filter_view.addElement (filter_label[f]); // filter input node slider filter_input[f].name ("Input Node"); filter_input[f].range (0, num_nodes); filter_input[f].value (0); filter_input[f].size (slot_width, 75); filter_input[f].position (slot_width*f, 50); filter_input[f].displayFormat (filter_input[f].integerFormat); filter_view.addElement (filter_input[f]); // filter output node slider filter_output[f].name ("Output Node"); filter_output[f].range (0, num_nodes); filter_output[f].value (0); filter_output[f].size (slot_width, 75); filter_output[f].position (slot_width*f, 100); filter_output[f].displayFormat (filter_output[f].integerFormat); filter_view.addElement (filter_output[f]); // filter gain slider filter_gain[f].name ("Gain"); filter_gain[f].range (0, 1); filter_gain[f].value (0); filter_gain[f].size (slot_width, 75); filter_gain[f].position (slot_width*f, 150); filter_view.addElement (filter_gain[f]); // filter freq1 slider filter_freq1[f].name ("Freq"); filter_freq1[f].range (0, 10); filter_freq1[f].value (5); filter_freq1[f].size (slot_width, 75); filter_freq1[f].position (slot_width*f, 200); filter_view.addElement (filter_freq1[f]); // filter freq2 slider filter_freq2[f].name ("Freq Exp"); filter_freq2[f].range (-2, 4); filter_freq2[f].value (2); filter_freq2[f].size (slot_width, 75); filter_freq2[f].position (slot_width*f, 250); filter_freq2[f].displayFormat (filter_freq2[f].integerFormat); filter_view.addElement (filter_freq2[f]); // filter Q slider filter_q[f].name ("Q"); filter_q[f].range (0, 50); filter_q[f].value (4); filter_q[f].size (slot_width, 75); filter_q[f].position (slot_width*f, 300); filter_q[f].displayFormat (filter_q[f].integerFormat); filter_view.addElement (filter_q[f]); } // delays for (0 => int d; d < num_delays; d++) { // initialize delay selection 0 => delay_sel[d]; // delay label button delay_label[d].pushType (); delay_label[d].size (slot_width, 60); delay_label[d].position (slot_width*d, 0); delay_label[d].name ("Delay " + d); delay_view.addElement (delay_label[d]); // delay input node slider delay_input[d].name ("Input Node"); delay_input[d].range (0, num_nodes); delay_input[d].value (0); delay_input[d].size (slot_width, 75); delay_input[d].position (slot_width*d, 50); delay_input[d].displayFormat (delay_input[d].integerFormat); delay_view.addElement (delay_input[d]); // delay output node slider delay_output[d].name ("Output Node"); delay_output[d].range (0, num_nodes); delay_output[d].value (0); delay_output[d].size (slot_width, 75); delay_output[d].position (slot_width*d, 100); delay_output[d].displayFormat (delay_output[d].integerFormat); delay_view.addElement (delay_output[d]); // delay gain slider delay_gain[d].name ("Gain"); delay_gain[d].range (0, 1); delay_gain[d].value (0); delay_gain[d].size (slot_width, 75); delay_gain[d].position (slot_width*d, 150); delay_view.addElement (delay_gain[d]); // delay duration slider delay_dur[d].name ("Delay, ms"); delay_dur[d].range (0, 10); delay_dur[d].value (0); delay_dur[d].size (slot_width, 75); delay_dur[d].position (slot_width*d, 200); delay_view.addElement (delay_dur[d]); } // delays for (0 => int r; r < num_reverbs; r++) { // initialize reverb selection 0 => reverb_sel[r]; // reverb label button reverb_label[r].pushType (); reverb_label[r].size (slot_width, 60); reverb_label[r].position (slot_width*r, 0); reverb_label[r].name ("JCRev " + r); reverb_view.addElement (reverb_label[r]); // reverb input node slider reverb_input[r].name ("Input Node"); reverb_input[r].range (0, num_nodes); reverb_input[r].value (0); reverb_input[r].size (slot_width, 75); reverb_input[r].position (slot_width*r, 50); reverb_input[r].displayFormat (reverb_input[r].integerFormat); reverb_view.addElement (reverb_input[r]); // reverb output node slider reverb_output[r].name ("Output Node"); reverb_output[r].range (0, num_nodes); reverb_output[r].value (0); reverb_output[r].size (slot_width, 75); reverb_output[r].position (slot_width*r, 100); reverb_output[r].displayFormat (reverb_output[r].integerFormat); reverb_view.addElement (reverb_output[r]); // reverb mix slider reverb_mix[r].name ("Mix"); reverb_mix[r].range (0, 1); reverb_mix[r].value (0.1); reverb_mix[r].size (slot_width, 75); reverb_mix[r].position (slot_width*r, 150); reverb_view.addElement (reverb_mix[r]); } // misc // misc noise label button noise_label.pushType (); noise_label.size (slot_width, 60); noise_label.position (0, 0); noise_label.name ("Noise"); misc_view.addElement (noise_label); // misc noise output node slider noise_output.name ("Output Node"); noise_output.range (0, num_nodes); noise_output.value (0); noise_output.size (slot_width, 75); noise_output.position (0, 50); noise_output.displayFormat (noise_output.integerFormat); misc_view.addElement (noise_output); // misc noise gain slider noise_gain.name ("Gain"); noise_gain.range (0, 1); noise_gain.value (1); noise_gain.size (slot_width, 75); noise_gain.position (0, 100); misc_view.addElement (noise_gain); // pitshift label button pitshift_label.pushType (); pitshift_label.size (slot_width, 60); pitshift_label.position (slot_width, 0); pitshift_label.name ("Pitch Shifter"); misc_view.addElement (pitshift_label); // pitshift input node slider pitshift_input.name ("Input Node"); pitshift_input.range (0, num_nodes); pitshift_input.value (0); pitshift_input.size (slot_width, 75); pitshift_input.position (slot_width, 50); pitshift_input.displayFormat (pitshift_input.integerFormat); misc_view.addElement (pitshift_input); // pitshift output node slider pitshift_output.name ("Output Node"); pitshift_output.range (0, num_nodes); pitshift_output.value (0); pitshift_output.size (slot_width, 75); pitshift_output.position (slot_width, 100); pitshift_output.displayFormat (pitshift_output.integerFormat); misc_view.addElement (pitshift_output); // pitshift mix slider pitshift_mix.name ("Mix"); pitshift_mix.range (0, 1); pitshift_mix.value (0.1); pitshift_mix.size (slot_width, 75); pitshift_mix.position (slot_width, 150); misc_view.addElement (pitshift_mix); // pitshift shift slider pitshift_shift.name ("Shift"); pitshift_shift.range (0, 1); pitshift_shift.value (0.1); pitshift_shift.size (slot_width, 75); pitshift_shift.position (slot_width, 200); misc_view.addElement (pitshift_shift); // display the pages misc_view.display (); reverb_view.display (); delay_view.display (); filter_view.display (); osc_view.display (); gain_view.display (); node_view.display (); main_view.display (); // instantiate the gains Gain gain[num_gains]; // instantiate the oscillators Phasor phasor[num_osc]; SinOsc sinosc[num_osc]; PulseOsc pulseosc[num_osc]; SqrOsc sqrosc[num_osc]; TriOsc triosc[num_osc]; SawOsc sawosc[num_osc]; // instantiate the filters LPF lpf[num_filters]; BPF bpf[num_filters]; HPF hpf[num_filters]; BRF brf[num_filters]; ResonZ resonz[num_filters]; // instantiate delays Delay delay[num_delays]; DelayA delaya[num_delays]; DelayL delayl[num_delays]; // instantiate reverbs JCRev jcrev[num_reverbs]; NRev nrev[num_reverbs]; PRCRev prcrev[num_reverbs]; // instantiate misc view items Noise noise; PitShift pitshift; // the nodes are implemented as Gain ugens Gain node[num_nodes+1]; // hook up the highest node to the dac node[1] => Gain master => WvOut wave_out; wave_out => dac.left; wave_out => dac.right; // shred for record button on main panel function void main_record_adj () { while (true) { main_record => now; if (main_record.state ()) { "Synth_Lab.wav" => wave_out.wavFilename; } else { wave_out.closeFile (); } } } spork ~ main_record_adj (); // shred for volume button on main panel function void main_volume_adj () { while (true) { main_volume => now; master.gain (main_volume.value ()); } } spork ~ main_volume_adj (); // shred for monitoring self-destruct button function void main_self_destruct_adj () { while (true) { main_self_destruct => now; if (main_self_destruct.state ()) { 1 => exit; } } } spork ~ main_self_destruct_adj (); // shred for output node slider on mic function void main_mic_output_adj () { while (true) { main_mic_output => now; adc =< node[mic_out]; adc => node[main_mic_output.value () $ int]; main_mic_output.value () $ int => mic_out; } } spork ~ main_mic_output_adj (); // shred for input node slider on dac left function void main_dac_left_input_adj () { while (true) { main_dac_left_input => now; node[dac_left_in] =< dac.left; node[main_dac_left_input.value () $ int] => dac.left; main_dac_left_input.value () $ int => dac_left_in; } } spork ~ main_dac_left_input_adj (); // shred for input node slider on dac right function void main_dac_right_input_adj () { while (true) { main_dac_right_input => now; node[dac_right_in] =< dac.right; node[main_dac_right_input.value () $ int] => dac.right; main_dac_right_input.value () $ int => dac_right_in; } } spork ~ main_dac_right_input_adj (); // shreds to watch the ugen buttons and sliders of nodes // shred for gain slider on nodes function void node_gain_adj (int n) { while (true) { node_gain[n] => now; node[n].gain (node_boost_val[n] * node_gain[n].value ()); } } for (1 => int n; n <= num_nodes; n++) { spork ~ node_gain_adj (n); } // gain boost button function void node_boost_adj (int n) { while (true) { node_boost[n] => now; if (node_boost[n].state ()) { 10 *=> node_boost_val[n]; if (node_boost_val[n] > 10000) { 1 => node_boost_val[n]; } node_boost[n].name ("x" + node_boost_val[n]); } node_boost_val[n] * node_gain[n].value () => node[n].gain; } } for (1 => int n; n <= num_nodes; n++) { spork ~ node_boost_adj (n); } // shred for op slider on nodes function void node_op_adj (int n) { while (true) { node_op[n] => now; node[n].op (node_op[n].value () $ int); } } for (1 => int n; n <= num_nodes; n++) { spork ~ node_op_adj (n); } // shreds to watch the ugen buttons and sliders of gains // shred for input node slider on gains function void gain_input_adj (int g) { while (true) { gain_input[g] => now; node[gain_in[g]] =< gain[g]; //if (gain_input[0].value ()) { node[gain_input[g].value () $ int] => gain[g]; //} gain_input[g].value () $ int => gain_in[g]; } } for (0 => int g; g < num_gains; g++) { spork ~ gain_input_adj (g); } // shred for output node slider on gains function void gain_output_adj (int g) { while (true) { gain_output[g] => now; gain[g] =< node[gain_out[g]]; gain[g] => node[gain_output[g].value () $ int]; gain_output[g].value () $ int => gain_out[g]; } } for (0 => int g; g < num_gains; g++) { spork ~ gain_output_adj (g); } // shred for gain slider on gains function void gain_gain_adj (int g) { while (true) { gain_gain[g] => now; node[g].gain (gain_boost_val[g] * gain_gain[g].value ()); } } for (0 => int g; g < num_gains; g++) { spork ~ gain_gain_adj (g); } // gain boost button function void gain_boost_adj (int g) { while (true) { gain_boost[g] => now; if (gain_boost[g].state ()) { 10 *=> gain_boost_val[g]; if (gain_boost_val[g] > 10000) { 1 => gain_boost_val[g]; } gain_boost[g].name ("x" + gain_boost_val[g]); } gain_boost_val[g] * gain_gain[g].value () => node[g].gain; } } for (0 => int g; g < num_gains; g++) { spork ~ gain_boost_adj (g); } // shred for op slider on gains function void gain_op_adj (int g) { while (true) { gain_op[g] => now; node[g].op (gain_op[g].value () $ int); } } for (0 => int g; g < num_gains; g++) { spork ~ gain_op_adj (g); } // shreds to watch the ugen buttons and sliders of oscillators // osc label button function void osc_label_adj (int o) { while (true) { osc_label[o] => now; if (osc_label[o].state ()) { (osc_sel[o] + 1) % 6 => osc_sel[o]; if (osc_sel[o] == 0) { node[osc_in[o]] =< sawosc[o]; node[osc_input[o].value () $ int] => phasor[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< phasor[o]; } sawosc[o] =< node[osc_out[o]]; phasor[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("Phasor " + o); } if (osc_sel[o] == 1) { node[osc_in[o]] =< phasor[o]; node[osc_input[o].value () $ int] => sinosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sinosc[o]; } phasor[o] =< node[osc_out[o]]; sinosc[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("SinOsc " + o); } if (osc_sel[o] == 2) { node[osc_in[o]] =< sinosc[o]; node[osc_input[o].value () $ int] => pulseosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< pulseosc[o]; } sinosc[o] =< node[osc_out[o]]; pulseosc[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("PulseOsc " + o); } if (osc_sel[o] == 3) { node[osc_in[o]] =< pulseosc[o]; node[osc_input[o].value () $ int] => sqrosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sqrosc[o]; } pulseosc[o] =< node[osc_out[o]]; sqrosc[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("SqrOsc " + o); } if (osc_sel[o] == 4) { node[osc_in[o]] =< sqrosc[o]; node[osc_input[o].value () $ int] => triosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< triosc[o]; } sqrosc[o] =< node[osc_out[o]]; triosc[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("TriOsc " + o); } if (osc_sel[o] == 5) { node[osc_in[o]] =< triosc[o]; node[osc_input[o].value () $ int] => sawosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sawosc[o]; } triosc[o] =< node[osc_out[o]]; sawosc[o] => node[osc_output[o].value () $ int]; osc_label[o].name ("SawOsc " + o); } phasor[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sinosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); pulseosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sqrosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); triosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sawosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); } } } for (0 => int o; o < num_osc; o++) { spork ~ osc_label_adj (o); } // shred for input node slider on oscillators function void osc_input_adj (int o) { while (true) { osc_input[o] => now; if (osc_sel[o] == 0) { node[osc_in[o]] =< phasor[o]; node[osc_input[o].value () $ int] => phasor[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< phasor[o]; } } if (osc_sel[o] == 1) { node[osc_in[o]] =< sinosc[o]; node[osc_input[o].value () $ int] => sinosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sinosc[o]; } } if (osc_sel[o] == 2) { node[osc_in[o]] =< pulseosc[o]; node[osc_input[o].value () $ int] => pulseosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< pulseosc[o]; } } if (osc_sel[o] == 3) { node[osc_in[o]] =< sqrosc[o]; node[osc_input[o].value () $ int] => sqrosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sqrosc[o]; } } if (osc_sel[o] == 4) { node[osc_in[o]] =< triosc[o]; node[osc_input[o].value () $ int] => triosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< triosc[o]; } } if (osc_sel[o] == 5) { node[osc_in[o]] =< sawosc[o]; node[osc_input[o].value () $ int] => sawosc[o]; if (osc_input[0].value () == 0) { node[osc_input[o].value () $ int] =< sawosc[o]; } } osc_input[o].value () $ int => osc_in[o]; phasor[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sinosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); pulseosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sqrosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); triosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sawosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_input_adj (o); } // shred for output node slider on oscillators function void osc_output_adj (int o) { while (true) { osc_output[o] => now; if (osc_sel[o] == 0) { phasor[o] =< node[osc_out[o]]; phasor[o] => node[osc_output[o].value () $ int]; } if (osc_sel[o] == 1) { sinosc[o] =< node[osc_out[o]]; sinosc[o] => node[osc_output[o].value () $ int]; } if (osc_sel[o] == 2) { pulseosc[o] =< node[osc_out[o]]; pulseosc[o] => node[osc_output[o].value () $ int]; } if (osc_sel[o] == 3) { sqrosc[o] =< node[osc_out[o]]; sqrosc[o] => node[osc_output[o].value () $ int]; } if (osc_sel[o] == 4) { triosc[o] =< node[osc_out[o]]; triosc[o] => node[osc_output[o].value () $ int]; } if (osc_sel[o] == 5) { sawosc[o] =< node[osc_out[o]]; sawosc[o] => node[osc_output[o].value () $ int]; } osc_output[o].value () $ int => osc_out[o]; } } for (0 => int o; o < num_osc; o++) { spork ~ osc_output_adj (o); } // shred for gain slider on oscillators function void osc_gain_adj (int o) { while (true) { osc_gain[o] => now; phasor[o].gain (osc_gain[o].value ()); sinosc[o].gain (osc_gain[o].value ()); pulseosc[o].gain (osc_gain[o].value ()); sqrosc[o].gain (osc_gain[o].value ()); triosc[o].gain (osc_gain[o].value ()); sawosc[o].gain (osc_gain[o].value ()); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_gain_adj (o); } // shred for freq1 slider on oscillators function void osc_freq1_adj (int o) { while (true) { osc_freq1[o] => now; phasor[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sinosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); pulseosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sqrosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); triosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sawosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_freq1_adj (o); } // shred for freq2 slider on oscillators function void osc_freq2_adj (int o) { while (true) { osc_freq2[o] => now; phasor[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sinosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); pulseosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sqrosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); triosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sawosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_freq2_adj (o); } // shred for phase slider on oscillators function void osc_phase_adj (int o) { while (true) { osc_phase[o] => now; phasor[o].phase (osc_phase[o].value ()); sinosc[o].phase (osc_phase[o].value ()); pulseosc[o].phase (osc_phase[o].value ()); sqrosc[o].phase (osc_phase[o].value ()); triosc[o].phase (osc_phase[o].value ()); sawosc[o].phase (osc_phase[o].value ()); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_phase_adj (o); } // shred for width slider on oscillators function void osc_width_adj (int o) { while (true) { osc_width[o] => now; pulseosc[o].width (osc_width[o].value ()); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_width_adj (o); } // shred for sync slider on oscillators function void osc_sync_adj (int o) { while (true) { osc_sync[o] => now; phasor[o].sync (osc_sync[o].value () $ int); sinosc[o].sync (osc_sync[o].value () $ int); pulseosc[o].sync (osc_sync[o].value () $ int); sqrosc[o].sync (osc_sync[o].value () $ int); triosc[o].sync (osc_sync[o].value () $ int); sawosc[o].sync (osc_sync[o].value () $ int); } } for (0 => int o; o < num_osc; o++) { spork ~ osc_sync_adj (o); } // shreds to watch the ugen buttons and sliders of filters // filter label button function void filter_label_adj (int f) { while (true) { filter_label[f] => now; if (filter_label[f].state ()) { (filter_sel[f] + 1) % 5 => filter_sel[f]; if (filter_sel[f] == 0) { node[filter_in[f]] =< hpf[f]; node[filter_input[f].value () $ int] => lpf[f]; hpf[f] =< node[filter_out[f]]; lpf[f] => node[filter_output[f].value () $ int]; filter_label[f].name ("LPF " + f); } if (filter_sel[f] == 1) { node[filter_in[f]] =< lpf[f]; node[filter_input[f].value () $ int] => bpf[f]; lpf[f] =< node[filter_out[f]]; bpf[f] => node[filter_output[f].value () $ int]; filter_label[f].name ("BPF " + f); } if (filter_sel[f] == 2) { node[filter_in[f]] =< bpf[f]; node[filter_input[f].value () $ int] => hpf[f]; bpf[f] =< node[filter_out[f]]; hpf[f] => node[filter_output[f].value () $ int]; filter_label[f].name ("HPF " + f); } if (filter_sel[f] == 3) { node[filter_in[f]] =< hpf[f]; node[filter_input[f].value () $ int] => brf[f]; hpf[f] =< node[filter_out[f]]; brf[f] => node[filter_output[f].value () $ int]; filter_label[f].name ("BRF " + f); } if (filter_sel[f] == 4) { node[filter_in[f]] =< brf[f]; node[filter_input[f].value () $ int] => resonz[f]; brf[f] =< node[filter_out[f]]; resonz[f] => node[filter_output[f].value () $ int]; filter_label[f].name ("ResonZ " + f); } } } } for (0 => int f; f < num_filters; f++) { spork ~ filter_label_adj (f); } // shred for input node slider on filters function void filter_input_adj (int f) { while (true) { filter_input[f] => now; if (filter_sel[f] == 0) { node[filter_in[f]] =< lpf[f]; node[filter_input[f].value () $ int] => lpf[f]; } if (filter_sel[f] == 1) { node[filter_in[f]] =< bpf[f]; node[filter_input[f].value () $ int] => bpf[f]; } if (filter_sel[f] == 2) { node[filter_in[f]] =< hpf[f]; node[filter_input[f].value () $ int] => hpf[f]; } if (filter_sel[f] == 3) { node[filter_in[f]] =< brf[f]; node[filter_input[f].value () $ int] => brf[f]; } if (filter_sel[f] == 4) { node[filter_in[f]] =< resonz[f]; node[filter_input[f].value () $ int] => resonz[f]; } filter_input[f].value () $ int => filter_in[f]; } } for (0 => int f; f < num_filters; f++) { spork ~ filter_input_adj (f); } // shred for output node slider on filters function void filter_output_adj (int f) { while (true) { filter_output[f] => now; if (filter_sel[f] == 0) { lpf[f] =< node[filter_out[f]]; lpf[f] => node[filter_output[f].value () $ int]; } if (filter_sel[f] == 1) { bpf[f] =< node[filter_out[f]]; bpf[f] => node[filter_output[f].value () $ int]; } if (filter_sel[f] == 2) { hpf[f] =< node[filter_out[f]]; hpf[f] => node[filter_output[f].value () $ int]; } if (filter_sel[f] == 3) { brf[f] =< node[filter_out[f]]; brf[f] => node[filter_output[f].value () $ int]; } if (filter_sel[f] == 4) { resonz[f] =< node[filter_out[f]]; resonz[f] => node[filter_output[f].value () $ int]; } filter_output[f].value () $ int => filter_out[f]; } } for (0 => int f; f < num_filters; f++) { spork ~ filter_output_adj (f); } // shred for gain slider on filters function void filter_gain_adj (int f) { while (true) { filter_gain[f] => now; lpf[f].gain (filter_gain[f].value ()); bpf[f].gain (filter_gain[f].value ()); hpf[f].gain (filter_gain[f].value ()); brf[f].gain (filter_gain[f].value ()); resonz[f].gain (filter_gain[f].value ()); } } for (0 => int f; f < num_filters; f++) { spork ~ filter_gain_adj (f); } // shred for freq1 slider on filters function void filter_freq1_adj (int f) { while (true) { filter_freq1[f] => now; lpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); bpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); hpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); brf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); resonz[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); } } for (0 => int f; f < num_filters; f++) { spork ~ filter_freq1_adj (f); } // shred for freq2 slider on filters function void filter_freq2_adj (int f) { while (true) { filter_freq2[f] => now; lpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); bpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); hpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); brf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); resonz[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); } } for (0 => int f; f < num_filters; f++) { spork ~ filter_freq2_adj (f); } // shred for Q slider on filters function void filter_q_adj (int f) { while (true) { filter_q[f] => now; lpf[f].Q (filter_q[f].value ()); bpf[f].Q (filter_q[f].value ()); hpf[f].Q (filter_q[f].value ()); brf[f].Q (filter_q[f].value ()); resonz[f].Q (filter_q[f].value ()); } } for (0 => int f; f < num_filters; f++) { spork ~ filter_q_adj (f); } // shreds to watch the ugen buttons and sliders of delays // delay label button function void delay_label_adj (int d) { while (true) { delay_label[d] => now; if (delay_label[d].state ()) { (delay_sel[d] + 1) % 3 => delay_sel[d]; if (delay_sel[d] == 0) { node[delay_in[d]] =< delayl[d]; node[delay_input[d].value () $ int] => delay[d]; delayl[d] =< node[delay_out[d]]; delay[d] => node[delay_output[d].value () $ int]; delay_label[d].name ("Delay " + d); } if (delay_sel[d] == 1) { node[delay_in[d]] =< delay[d]; node[delay_input[d].value () $ int] => delaya[d]; delay[d] =< node[delay_out[d]]; delaya[d] => node[delay_output[d].value () $ int]; delay_label[d].name ("DelayA " + d); } if (delay_sel[d] == 2) { node[delay_in[d]] =< delaya[d]; node[delay_input[d].value () $ int] => delayl[d]; delaya[d] =< node[delay_out[d]]; delayl[d] => node[delay_output[d].value () $ int]; delay_label[d].name ("DelayL " + d); } } } } for (0 => int d; d < num_delays; d++) { spork ~ delay_label_adj (d); } // shred for input node slider on delays function void delay_input_adj (int d) { while (true) { delay_input[d] => now; if (delay_sel[d] == 0) { node[delay_in[d]] =< delay[d]; node[delay_input[d].value () $ int] => delay[d]; } if (delay_sel[d] == 1) { node[delay_in[d]] =< delaya[d]; node[delay_input[d].value () $ int] => delaya[d]; } if (delay_sel[d] == 2) { node[delay_in[d]] =< delayl[d]; node[delay_input[d].value () $ int] => delayl[d]; } delay_input[d].value () $ int => delay_in[d]; } } for (0 => int d; d < num_delays; d++) { spork ~ delay_input_adj (d); } // shred for output node slider on delays function void delay_output_adj (int d) { while (true) { delay_output[d] => now; if (delay_sel[d] == 0) { delay[d] =< node[delay_out[d]]; delay[d] => node[delay_output[d].value () $ int]; } if (delay_sel[d] == 1) { delaya[d] =< node[delay_out[d]]; delaya[d] => node[delay_output[d].value () $ int]; } if (delay_sel[d] == 2) { delayl[d] =< node[delay_out[d]]; delayl[d] => node[delay_output[d].value () $ int]; } delay_output[d].value () $ int => delay_out[d]; } } for (0 => int d; d < num_delays; d++) { spork ~ delay_output_adj (d); } // shred for gain slider on delays function void delay_gain_adj (int d) { while (true) { delay_gain[d] => now; delay[d].gain (delay_gain[d].value ()); delaya[d].gain (delay_gain[d].value ()); delayl[d].gain (delay_gain[d].value ()); } } for (0 => int d; d < num_delays; d++) { spork ~ delay_gain_adj (d); } // shred for duration slider on delays function void delay_dur_adj (int d) { while (true) { delay_dur[d] => now; delay[d].delay (delay_dur[d].value () :: ms); delaya[d].delay (delay_dur[d].value () :: ms); delayl[d].delay (delay_dur[d].value () :: ms); } } for (0 => int d; d < num_delays; d++) { spork ~ delay_dur_adj (d); } // shreds to watch the ugen buttons and sliders of reverbs // reverb label button function void reverb_label_adj (int r) { while (true) { reverb_label[r] => now; if (reverb_label[r].state ()) { (reverb_sel[r] + 1) % 3 => reverb_sel[r]; if (reverb_sel[r] == 0) { node[reverb_in[r]] =< prcrev[r]; node[reverb_input[r].value () $ int] => jcrev[r]; prcrev[r] =< node[reverb_out[r]]; jcrev[r] => node[reverb_output[r].value () $ int]; reverb_label[r].name ("JCRev " + r); } if (reverb_sel[r] == 1) { node[reverb_in[r]] =< jcrev[r]; node[reverb_input[r].value () $ int] => nrev[r]; jcrev[r] =< node[reverb_out[r]]; nrev[r] => node[reverb_output[r].value () $ int]; reverb_label[r].name ("NRev " + r); } if (reverb_sel[r] == 2) { node[reverb_in[r]] =< nrev[r]; node[reverb_input[r].value () $ int] => prcrev[r]; nrev[r] =< node[reverb_out[r]]; prcrev[r] => node[reverb_output[r].value () $ int]; reverb_label[r].name ("PRCRev " + r); } } } } for (0 => int r; r < num_reverbs; r++) { spork ~ reverb_label_adj (r); } // shred for input node slider on reverbs function void reverb_input_adj (int r) { while (true) { reverb_input[r] => now; if (reverb_sel[r] == 0) { node[reverb_in[r]] =< jcrev[r]; node[reverb_input[r].value () $ int] => jcrev[r]; } if (reverb_sel[r] == 1) { node[reverb_in[r]] =< nrev[r]; node[reverb_input[r].value () $ int] => nrev[r]; } if (reverb_sel[r] == 2) { node[reverb_in[r]] =< prcrev[r]; node[reverb_input[r].value () $ int] => prcrev[r]; } reverb_input[r].value () $ int => reverb_in[r]; } } for (0 => int r; r < num_reverbs; r++) { spork ~ reverb_input_adj (r); } // shred for output node slider on reverbs function void reverb_output_adj (int r) { while (true) { reverb_output[r] => now; if (reverb_sel[r] == 0) { jcrev[r] =< node[reverb_out[r]]; jcrev[r] => node[reverb_output[r].value () $ int]; } if (reverb_sel[r] == 1) { nrev[r] =< node[reverb_out[r]]; nrev[r] => node[reverb_output[r].value () $ int]; } if (reverb_sel[r] == 2) { prcrev[r] =< node[reverb_out[r]]; prcrev[r] => node[reverb_output[r].value () $ int]; } reverb_output[r].value () $ int => reverb_out[r]; } } for (0 => int r; r < num_reverbs; r++) { spork ~ reverb_output_adj (r); } // shred for mix slider on reverbs function void reverb_mix_adj (int r) { while (true) { reverb_mix[r] => now; jcrev[r].mix (reverb_mix[r].value ()); nrev[r].mix (reverb_mix[r].value ()); prcrev[r].mix (reverb_mix[r].value ()); } } for (0 => int r; r < num_reverbs; r++) { spork ~ reverb_mix_adj (r); } // shreds to watch ugen buttons and sliders of misc view // shred for output node slider on noise function void noise_output_adj () { while (true) { noise_output => now; noise =< node[noise_out]; noise => node[noise_output.value () $ int]; noise_output.value () $ int => noise_out; } } spork ~ noise_output_adj (); // shred for gain slider on noise function void noise_gain_adj () { while (true) { noise_gain => now; noise.gain (noise_gain.value ()); } } spork ~ noise_gain_adj (); // shred for input node slider on pitshift function void pitshift_input_adj () { while (true) { pitshift_input => now; node[pitshift_in] =< pitshift; node[pitshift_input.value () $ int] => pitshift; pitshift_input.value () $ int => pitshift_in; } } spork ~ pitshift_input_adj (); // shred for output node slider on pitshift function void pitshift_output_adj () { while (true) { pitshift_output => now; pitshift =< node[pitshift_out]; pitshift => node[pitshift_output.value () $ int]; pitshift_output.value () $ int => pitshift_out; } } spork ~ pitshift_output_adj (); // shred for mix slider on pitshift function void pitshift_mix_adj () { while (true) { pitshift_mix => now; pitshift.mix (pitshift_mix.value ()); } } spork ~ pitshift_mix_adj (); // shred for shift slider on pitshift function void pitshift_shift_adj () { while (true) { pitshift_shift => now; pitshift.shift (pitshift_shift.value ()); } } spork ~ pitshift_shift_adj (); // initialization of instruments function void initialize () { // initialize nodes for (1 => int n; n <= num_nodes; n++) { node[n].gain (node_gain[n].value ()); // initialize the gain boosts 1 => node_boost_val[n]; } // initialize gains for (0 => int g; g < num_gains; g++) { // initialize the gain boosts 1 => gain_boost_val[g]; } // initialize oscillators for (0 => int o; o < num_osc; o++) { phasor[o].gain (osc_gain[o].value ()); phasor[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); phasor[o].phase (osc_phase[o].value ()); sinosc[o].gain (osc_gain[o].value ()); sinosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sinosc[o].phase (osc_phase[o].value ()); pulseosc[o].gain (osc_gain[o].value ()); pulseosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); pulseosc[o].phase (osc_phase[o].value ()); sqrosc[o].gain (osc_gain[o].value ()); sqrosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sqrosc[o].phase (osc_phase[o].value ()); triosc[o].gain (osc_gain[o].value ()); triosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); triosc[o].phase (osc_phase[o].value ()); sawosc[o].gain (osc_gain[o].value ()); sawosc[o].freq (osc_freq1[o].value () * Math.pow(10, osc_freq2[o].value ())); sawosc[o].phase (osc_phase[o].value ()); } // initialize filters for (0 => int f; f < num_filters; f++) { lpf[f].gain (filter_gain[f].value ()); lpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); lpf[f].Q (filter_q[f].value ()); bpf[f].gain (filter_gain[f].value ()); bpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); bpf[f].Q (filter_q[f].value ()); hpf[f].gain (filter_gain[f].value ()); hpf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); hpf[f].Q (filter_q[f].value ()); brf[f].gain (filter_gain[f].value ()); brf[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); brf[f].Q (filter_q[f].value ()); resonz[f].gain (filter_gain[f].value ()); resonz[f].freq (filter_freq1[f].value () * Math.pow(10, filter_freq2[f].value ())); resonz[f].Q (filter_q[f].value ()); } // initialize delays for (0 => int d; d < num_delays; d++) { delay[d].gain (delay_gain[d].value ()); delay[d].delay (delay_dur[d].value () :: ms); delay[d].max (second); delaya[d].gain (delay_gain[d].value ()); delaya[d].delay (delay_dur[d].value () :: ms); delaya[d].max (second); delayl[d].gain (delay_gain[d].value ()); delayl[d].delay (delay_dur[d].value () :: ms); delayl[d].max (second); } // initialize reverbs for (0 => int r; r < num_reverbs; r++) { jcrev[r].mix (reverb_mix[r].value ()); nrev[r].mix (reverb_mix[r].value ()); prcrev[r].mix (reverb_mix[r].value ()); } // initialize misc view objects noise.gain (noise_gain.value ()); pitshift.mix (pitshift_mix.value ()); pitshift.shift (pitshift_shift.value ()); } initialize (); // loop forever while (true) { second => now; if (exit) { break; } } // ending program due to self-destruct button press, so destroy the GUI misc_view.destroy (); reverb_view.destroy (); delay_view.destroy (); filter_view.destroy (); osc_view.destroy (); gain_view.destroy (); node_view.destroy (); main_view.destroy ();