//MAUI voice looper by Andrew Plan //signal path adc => LiSa saveme1 => gain a => NRev r => dac; adc => LiSa saveme2 => gain b => NRev s => dac; adc => LiSa saveme3 => gain c => NRev t => dac; adc => LiSa saveme4 => gain d => NRev u => dac; adc => LiSa saveme5 => gain e => NRev v => dac; // loop 1 defaults .80 => a.gain; .00 => r.mix; // loop 2 defaults .80 => b.gain; .00 => s.mix; // loop 3 defaults .80 => c.gain; .00 => t.mix; // loop 4 defaults .80 => d.gain; .00 => u.mix; // loop 5 defaults .80 => e.gain; .00 => v.mix; //buffer length of each loop bank 60::second => saveme1.duration; 60::second => saveme2.duration; 60::second => saveme3.duration; 60::second => saveme4.duration; 60::second => saveme5.duration; // maui elements MAUI_View control_view; MAUI_LED on_led, latch_led; MAUI_Button loop_1, latch; MAUI_Button loop_2; MAUI_Button loop_3; MAUI_Button loop_4; MAUI_Button loop_5; MAUI_Button reset_all; MAUI_Button reset_1; MAUI_Button reset_2; MAUI_Button reset_3; MAUI_Button reset_4; MAUI_Button reset_5; MAUI_Button play_all; MAUI_Slider reverb_mix_slider_1; MAUI_Slider reverb_mix_slider_2; MAUI_Slider reverb_mix_slider_3; MAUI_Slider reverb_mix_slider_4; MAUI_Slider reverb_mix_slider_5; MAUI_Slider volume_slider_1; MAUI_Slider volume_slider_2; MAUI_Slider volume_slider_3; MAUI_Slider volume_slider_4; MAUI_Slider volume_slider_5; // set view control_view.size( 700, 730 ); control_view.name( "mic looper" ); // Loop 1 button loop_1.pushType(); loop_1.size( 120, 120 ); loop_1.position( 100, 120 ); loop_1.name( "1" ); control_view.addElement( loop_1 ); // Loop 2 button loop_2.pushType(); loop_2.size( 120, 120 ); loop_2.position( 100, 240 ); loop_2.name( "2" ); control_view.addElement( loop_2 ); // Loop 3 button loop_3.pushType(); loop_3.size( 120, 120 ); loop_3.position( 100, 360 ); loop_3.name( "3" ); control_view.addElement( loop_3 ); // Loop 4 button loop_4.pushType(); loop_4.size( 120, 120 ); loop_4.position( 100, 480 ); loop_4.name( "4" ); control_view.addElement( loop_4 ); // Loop 5 button loop_5.pushType(); loop_5.size( 120, 120 ); loop_5.position( 100, 600 ); loop_5.name( "5" ); control_view.addElement( loop_5 ); // Reset All button reset_all.pushType(); reset_all.size( 120, 120 ); reset_all.position( 200, 0 ); reset_all.name( "Reset All" ); control_view.addElement( reset_all ); // Play All button play_all.pushType(); play_all.size( 120, 120 ); play_all.position( 300, 0 ); play_all.name( "Play All" ); control_view.addElement( play_all ); // Reset 1 button reset_1.pushType(); reset_1.size( 120, 120 ); reset_1.position( 200, 120 ); reset_1.name( "Reset" ); control_view.addElement( reset_1 ); // Reset 2 button reset_2.pushType(); reset_2.size( 120, 120 ); reset_2.position( 200, 240 ); reset_2.name( "Reset" ); control_view.addElement( reset_2 ); // Reset 3 button reset_3.pushType(); reset_3.size( 120, 120 ); reset_3.position( 200, 360 ); reset_3.name( "Reset" ); control_view.addElement( reset_3 ); // Reset 4 button reset_4.pushType(); reset_4.size( 120, 120 ); reset_4.position( 200, 480 ); reset_4.name( "Reset" ); control_view.addElement( reset_4 ); // Reset 5 button reset_5.pushType(); reset_5.size( 120, 120 ); reset_5.position( 200, 600 ); reset_5.name( "Reset" ); control_view.addElement( reset_5 ); // Latch (Arm) latch.toggleType(); latch.size( 120, 120 ); latch.position( 100, 0 ); latch.name( "Arm!" ); control_view.addElement( latch ); // led on_led.size( 100, on_led.height() ); on_led.position( 500, 24 ); on_led.unlight(); control_view.addElement( on_led ); // Reverb 1 reverb_mix_slider_1.range( 0, 5 ); reverb_mix_slider_1.size( 300, 60 ); reverb_mix_slider_1.position( 300, 120 ); reverb_mix_slider_1.value( r.mix() ); reverb_mix_slider_1.name( "'verb" ); control_view.addElement( reverb_mix_slider_1 ); // Reverb 2 reverb_mix_slider_2.range( 0, 5 ); reverb_mix_slider_2.size( 300, 60 ); reverb_mix_slider_2.position( 300, 240 ); reverb_mix_slider_2.value( s.mix() ); reverb_mix_slider_2.name( "'verb" ); control_view.addElement( reverb_mix_slider_2 ); // Reverb 3 reverb_mix_slider_3.range( 0, 5 ); reverb_mix_slider_3.size( 300, 60 ); reverb_mix_slider_3.position( 300, 360 ); reverb_mix_slider_3.value( t.mix() ); reverb_mix_slider_3.name( "'verb" ); control_view.addElement( reverb_mix_slider_3 ); // Reverb 4 reverb_mix_slider_4.range( 0, 5 ); reverb_mix_slider_4.size( 300, 60 ); reverb_mix_slider_4.position( 300, 480 ); reverb_mix_slider_4.value( u.mix() ); reverb_mix_slider_4.name( "'verb" ); control_view.addElement( reverb_mix_slider_4 ); // Reverb 5 reverb_mix_slider_5.range( 0, 5 ); reverb_mix_slider_5.size( 300, 60 ); reverb_mix_slider_5.position( 300, 600 ); reverb_mix_slider_5.value( v.mix() ); reverb_mix_slider_5.name( "'verb" ); control_view.addElement( reverb_mix_slider_5 ); // volume 1 volume_slider_1.range( 0, 5 ); volume_slider_1.size( 300, 60 ); volume_slider_1.position( 300, 180 ); volume_slider_1.value( a.gain() ); volume_slider_1.name( "gain" ); control_view.addElement( volume_slider_1 ); // volume 2 volume_slider_2.range( 0, 5 ); volume_slider_2.size( 300, 60 ); volume_slider_2.position( 300, 300 ); volume_slider_2.value( b.gain() ); volume_slider_2.name( "gain" ); control_view.addElement( volume_slider_2 ); // volume 3 volume_slider_3.range( 0, 5 ); volume_slider_3.size( 300, 60 ); volume_slider_3.position( 300, 420 ); volume_slider_3.value( c.gain() ); volume_slider_3.name( "gain" ); control_view.addElement( volume_slider_3 ); // volume 4 volume_slider_4.range( 0, 5 ); volume_slider_4.size( 300, 60 ); volume_slider_4.position( 300, 540 ); volume_slider_4.value( d.gain() ); volume_slider_4.name( "gain" ); control_view.addElement( volume_slider_4 ); // volume 5 volume_slider_5.range( 0, 5 ); volume_slider_5.size( 300, 60 ); volume_slider_5.position( 300, 660 ); volume_slider_5.value( e.gain() ); volume_slider_5.name( "gain" ); control_view.addElement( volume_slider_5 ); control_view.display(); function void control1() { // infinite event loop while( true ) { loop_1 => now; // wait on event on_led.light(); now => time a1; 1 => saveme1.record; 0::ms => saveme1.playPos; 50::ms => saveme1.loopStart; 50::ms => saveme1.rampUp; <<< "on", "" >>>; // wait for button to be released loop_1 => now; on_led.unlight(); now => time a2; 50::ms => now; now => time a3; for(int i; i < 2; i++) { a3 - a1 => saveme1.loopEnd; a3 - a2 => saveme1.rampUp; 0 => saveme1.record; .001::second => now; } <<< "off", "" >>>; } } function void control2() { while( true ) { // wait for the button to be pushed down loop_2 => now; saveme2.clear; on_led.light(); now => time b1; 1 => saveme2.record; 0::ms => saveme2.playPos; 0::ms => saveme2.loopStart; 50::ms => saveme2.rampUp; <<< "on", "" >>>; // wait for button to be released loop_2 => now; on_led.unlight(); now => time b2; 50::ms => now; now => time b3; 0 => saveme2.record; for(int i; i < 2; i++) { b3 - b1 => saveme2.loopEnd; b3 - b2 => saveme2.rampUp; .001::second => now; } <<< "off", "" >>>; } } function void control3() { while( true ) { // wait for the button to be pushed down loop_3 => now; saveme3.clear; on_led.light(); now => time c1; 1 => saveme3.record; 0::ms => saveme3.playPos; 0::ms => saveme3.loopStart; 50::ms => saveme3.rampUp; <<< "on", "" >>>; // wait for button to be released loop_3 => now; on_led.unlight(); now => time c2; 50::ms => now; now => time c3; 0 => saveme3.record; for(int i; i < 2; i++) { c3 - c1 => saveme3.loopEnd; c3 - c2 => saveme3.rampUp; .001::second => now; } <<< "off", "" >>>; } } function void control4() { while( true ) { // wait for the button to be pushed down loop_4 => now; saveme4.clear; on_led.light(); now => time d1; 1 => saveme4.record; 0::ms => saveme4.playPos; 0::ms => saveme4.loopStart; 50::ms => saveme4.rampUp; <<< "on", "" >>>; // wait for button to be released loop_4 => now; on_led.unlight(); now => time d2; 50::ms => now; now => time d3; 0 => saveme4.record; for(int i; i < 2; i++) { d3 - d1 => saveme4.loopEnd; d3 - d2 => saveme4.rampUp; .001::second => now; } <<< "off", "" >>>; } } function void control5() { while( true ) { // wait for the button to be pushed down loop_5 => now; saveme5.clear; on_led.light(); now => time e1; 1 => saveme5.record; 0::ms => saveme5.playPos; 0::ms => saveme5.loopStart; 50::ms => saveme5.rampUp; <<< "on", "" >>>; // wait for button to be released loop_5 => now; on_led.unlight(); now => time e2; 50::ms => now; now => time e3; 0 => saveme5.record; for(int i; i < 2; i++) { e3 - e1 => saveme5.loopEnd; e3 - e2 => saveme5.rampUp; .001::second => now; } } } function void controlLoop() { while( true ) { // wait for button to be pushed down latch => now; //on_led.light(); loop_1.toggleType(); loop_2.toggleType(); loop_3.toggleType(); loop_4.toggleType(); loop_5.toggleType(); // wait for button to be pushed up latch => now; //on_led.unlight(); loop_1.pushType(); loop_2.pushType(); loop_3.pushType(); loop_4.pushType(); loop_5.pushType(); } } function void controlResetAll() { while( true ) { reset_all => now; 0 => saveme1.play; 0 => saveme2.play; 0 => saveme3.play; 0 => saveme4.play; 0 => saveme5.play; saveme1.clear; saveme2.clear; saveme3.clear; saveme4.clear; saveme5.clear; .001::second => now; } } function void controlPlayAll() { while( true ) { play_all => now; 0::ms => saveme1.playPos; 0::ms => saveme2.playPos; 0::ms => saveme3.playPos; 0::ms => saveme4.playPos; 0::ms => saveme5.playPos; 1 => saveme1.play; 1 => saveme2.play; 1 => saveme3.play; 1 => saveme4.play; 1 => saveme5.play; .001::second => now; } } function void controlReset1() { while( true ) { reset_1 => now; saveme1.clear; 0 => saveme1.play; .001::second => now; } } function void controlReset2() { while( true ) { reset_2 => now; 0 => saveme2.play; saveme2.clear; .001::second => now; } } function void controlReset3() { while( true ) { reset_3 => now; 0 => saveme3.play; saveme3.clear; .001::second => now; } } function void controlReset4() { while( true ) { reset_4 => now; 0 => saveme4.play; saveme4.clear; .001::second => now; } } function void controlReset5() { while( true ) { reset_5 => now; 0 => saveme5.play; saveme5.clear; .001::second => now; } } function void controlReverb1() { while( true ) { reverb_mix_slider_1 => now; reverb_mix_slider_1.value() => r.mix; } } function void controlReverb2() { while( true ) { reverb_mix_slider_2 => now; reverb_mix_slider_2.value() => s.mix; } } function void controlReverb3() { while( true ) { reverb_mix_slider_3 => now; reverb_mix_slider_3.value() => t.mix; } } function void controlReverb4() { while( true ) { reverb_mix_slider_4 => now; reverb_mix_slider_4.value() => u.mix; } } function void controlReverb5() { while( true ) { reverb_mix_slider_5 => now; reverb_mix_slider_5.value() => v.mix; } } function void controlVolume1() { while( true ) { volume_slider_1 => now; volume_slider_1.value() => a.gain; } } function void controlVolume2() { while( true ) { volume_slider_2 => now; volume_slider_2.value() => b.gain; } } function void controlVolume3() { while( true ) { volume_slider_3 => now; volume_slider_3.value() => c.gain; } } function void controlVolume4() { while( true ) { volume_slider_4 => now; volume_slider_4.value() => d.gain; } } function void controlVolume5() { while( true ) { volume_slider_5 => now; volume_slider_5.value() => e.gain; } } spork ~ control1(); spork ~ control2(); spork ~ control3(); spork ~ control4(); spork ~ control5(); spork ~ controlLoop(); spork ~ controlResetAll(); spork ~ controlPlayAll(); spork ~ controlReset1(); spork ~ controlReset2(); spork ~ controlReset3(); spork ~ controlReset4(); spork ~ controlReset5(); spork ~ controlReverb1(); spork ~ controlReverb2(); spork ~ controlReverb3(); spork ~ controlReverb4(); spork ~ controlReverb5(); spork ~ controlVolume1(); spork ~ controlVolume2(); spork ~ controlVolume3(); spork ~ controlVolume4(); spork ~ controlVolume5(); while( true ) 1::day => now;