// --------------- Jason Riggs - Looping Meditations --------------- // Add a shred // Click once briefly on the "end" slider (do not change value) // patch SndBuf snd => ADSR e => PitShift p => JCRev r => Gain g => dac; 0 => snd.chunks; "bells.aiff" => snd.read; // fx constants 1.0 => p.mix; 0.0 => r.mix; // Declare MAUI vars MAUI_View ctrl_panel; MAUI_Slider startPt; MAUI_Slider endPt; MAUI_Slider currentPosition; MAUI_Slider pitchShift; MAUI_Slider reverbSlider; MAUI_Slider gainSlider; MAUI_Button phaseResetButton; // boolean flag denotes whether MAUI-ing or Live Coding // 0 = MAUI, 1 = Live code 0 => int flag; // spork stuff spork ~ monitor(); spork ~ gui(); spork ~ resetPhase(); spork ~ playLoop(); // length of file 1000.0 => float multiplier; // set loop locations startPt.value()*10 => float start; // start point of loop endPt.value()*10 => float end; // end point of loop // envelope 3.2::ms => dur att; 3.2::ms => dur rel; e.set(att, 0::ms, 1.0, rel); e.keyOff(); // play the loop fun void playLoop() { while (true) { // play current loop e.keyOn(); Math.floor(start/multiplier * (snd.length()/1::samp)) $ int => snd.pos; Math.floor(Math.fabs(end-start)/multiplier * (snd.length()/1::samp))::samp => now; // stop current loop e.keyOff(); rel=> now; } } // print current info every 2 seconds fun void monitor() { while(true) { multiplier*(snd.pos()/(snd.length()/1::samp)) => float curPos; curPos/10 => currentPosition.value; //<<<"current loop length: ", end - start>>>; 20::ms=>now; } } // reset phase on button press fun void resetPhase() { while (true) { // wait for click phaseResetButton => now; // reset phase only at onset of click (releasing click does nothing) if(!phaseResetButton.state() == 0) { e.keyOn(); Math.floor(start/multiplier * (snd.length()/1::samp)) $ int => snd.pos; } } } fun void gui() { // names "s t a r t"=> startPt.name; "e n d"=> endPt.name; "p o s i t i o n" => currentPosition.name; "p i t c h"=> pitchShift.name; "r e v e r b" => reverbSlider.name; "g a i n" => gainSlider.name; "reset phase" => phaseResetButton.name; // button phaseResetButton.pushType(); 125.0 => float BUTTON_WIDTH; phaseResetButton.size(BUTTON_WIDTH, 62); phaseResetButton.position(606/2 - BUTTON_WIDTH/2, 150); // slider ranges startPt.range(0,100); currentPosition.range(0,100); endPt.range(0,100); pitchShift.range(1.0,1.75); reverbSlider.range(0.0, 0.5); gainSlider.range(0.0, 1.5); // slider sizes startPt.size(606,66); endPt.size(606,66); currentPosition.size(606, 66); pitchShift.size(303,66); reverbSlider.size(303,66); gainSlider.size(303,66); // slider positions startPt.position(0,0); endPt.position(0,50); currentPosition.position(0, 100); pitchShift.position(0, 200); reverbSlider.position(0, 250); gainSlider.position(0, 300); // slider display formats startPt.displayFormat(4); endPt.displayFormat(4); currentPosition.displayFormat(4); pitchShift.displayFormat(4); reverbSlider.displayFormat(4); gainSlider.displayFormat(4); // slider precision startPt.precision(1); endPt.precision(1); currentPosition.precision(1); pitchShift.precision(1); reverbSlider.precision(1); gainSlider.precision(1); // init slider values Std.rand2f(0.0,75.0) => startPt.value; startPt.value() => currentPosition.value; Std.rand2f(startPt.value() + 1.0, 100.0) => endPt.value; //Std.rand2f(1.0,1.75) => pitchShift.value; //1.0 => pitchShift.value; Std.rand2f(0.0, 0.1) => reverbSlider.value; 1.0 => gainSlider.value; // ctrl panel ctrl_panel.size(606,375); ctrl_panel.position(200,500); ctrl_panel.addElement(startPt); ctrl_panel.addElement(endPt); ctrl_panel.addElement(currentPosition); ctrl_panel.addElement(pitchShift); ctrl_panel.addElement(gainSlider); ctrl_panel.addElement(reverbSlider); ctrl_panel.addElement(phaseResetButton); ctrl_panel.display(); // go while (true) { pitchShift.value() => p.shift; gainSlider.value() => g.gain; reverbSlider.value() => r.mix; (startPt.value()*10) => start; if(startPt.value()>endPt.value()) { startPt.value()+0.1=>endPt.value; } 1::ms=>now; (endPt.value()*10) => end; if(endPt.value()startPt.value; } 1::ms=>now; } } // go while(true) { 1::second => now; }