/* The ChucK file to act as a server for the pedalboard GUI. Make sure to chuck the following files before using this one: myugen.ck distortion.ck delay.ck Then, run pedalboard.pde in Processing to bring up a GUI. */ // Set up OSC listener OscRecv oscRecv; 8889 => oscRecv.port; oscRecv.listen(); // Set up OSC sender OscSend xmit; xmit.setHost( "127.0.0.1", 8888 ); /* OSC Message: Int delay time Float delay feedback Float delay level Float distortion gain Float chorus depth Float chorus frequency Float chorus level Int (treated as boolean) for compressor on/off */ oscRecv.event( "/220a, iffffffi" ) @=> OscEvent @ oe; adc => Gain in; Gain out => dac; 50.0 => in.gain; // Set up envelope followers for input and output levels Envfol inLevel; inLevel.connect(adc); Envfol outLevel; outLevel.connect(out); // Set up effects DelayPedal delay; Distortion dist; Chorus chorus; chorus.modFreq(4.0); chorus.modDepth(0.01); Dyno dyno; dyno.compress(); 1 => int compressorOn; Mix2 dynoMixer => chorus => dist.chuck => delay.chuck => out; in => dyno => dynoMixer.left; in => dynoMixer.right; 0.0 => dynoMixer.pan; // Turn off the Dyno effect fun void dynoOff() { if (compressorOn == 1) { 1.0 => dynoMixer.pan; 0 => compressorOn; } } // Turn on the Dyno effect fun void dynoOn() { if (compressorOn != 1) { 0.0 => dynoMixer.pan; 1 => compressorOn; } } // receiveOSCMessage() : receive osc message fun void receiveOSCMessage() { while ( true ) { oe => now; while( oe.nextMsg() ) { // get value and update note durations oe.getInt()::ms => delay.delay; oe.getFloat() => delay.feedback; oe.getFloat() => delay.level; oe.getFloat() => dist.gain; oe.getFloat() => chorus.modDepth; oe.getFloat() => chorus.modFreq; oe.getFloat() => chorus.mix; oe.getInt() => int doCompress; if (doCompress == 1) { dynoOn(); } else { dynoOff(); } } } } // sendOSCMessage() : send osc message fun void sendOSCMessage() { while ( true ) { xmit.startMsg( "/220a", "ff" ); inLevel.last() => xmit.addFloat; outLevel.last() => xmit.addFloat; 17::ms => now; } } // Spork the OSC send and receive threads spork ~ sendOSCMessage(); spork ~ receiveOSCMessage(); fun void infiniteLoop() { // Sit in an infinite loop while(true) { 10::ms => now; } } fun void doRecording(string suffix) { // Disconnect live input adc =< in; out => WvOut recorder => blackhole; me.sourceDir() + "/recording-" + suffix + ".wav" => recorder.wavFilename; SndBuf s; me.sourceDir() + "/sample-" + suffix + ".wav" => s.read; s => in; s.length() => now; recorder.closeFile(); } //doRecording("distort"); infiniteLoop(); // Envelope follower class. Taken from Hongchan's GitHub account. class Envfol { Gain in => OnePole p => blackhole; 3 => in.op; 0.99 => p.pole; fun void connect( UGen input ) { input => in; input => in; } fun float last() { return p.last(); } }