| @@ -1,7 +1,7 @@ | |||||
| // TODO: turn off adcThru when recording | |||||
| // TODO: Effects break panning for some unknown reason | |||||
| // TODO: currently I don't turn ADC thru back on after recording | |||||
| // Effects chain with limiters, reverb, filters | |||||
| //TODO: turn off adcThru when recording, and turn it back on afterwards | |||||
| //TODO: Effects break panning for some unknown reason | |||||
| //TODO varying number of bars | |||||
| //TODO: Subdivide metronome (still a bit wierd) | |||||
| NRev reverb => LPF lpf => HPF hpf => Dyno outputLimiter => dac; | NRev reverb => LPF lpf => HPF hpf => Dyno outputLimiter => dac; | ||||
| outputLimiter.limit(); | outputLimiter.limit(); | ||||
| reverb @=> UGen @ outputWet; // Reference to wet output | reverb @=> UGen @ outputWet; // Reference to wet output | ||||
| @@ -13,12 +13,12 @@ adc => Dyno inputLimiter => Gain adcThru => mainOutput; // Monitor input | |||||
| inputLimiter.limit(); | inputLimiter.limit(); | ||||
| inputLimiter @=> UGen @ mainInput; | inputLimiter @=> UGen @ mainInput; | ||||
| // Default parameters | // Default parameters | ||||
| .5 => adcThru.gain; | |||||
| .5 => float adcThruLevel; | |||||
| 1 => int adcThruMute; | |||||
| adcThruLevel * adcThruMute => adcThru.gain; | |||||
| 10000 => lpf.freq; | 10000 => lpf.freq; | ||||
| 10 => hpf.freq; | 10 => hpf.freq; | ||||
| //1::second => dur loopTime; | |||||
| // Plug in the pedals | // Plug in the pedals | ||||
| LoopPedal pedals[4]; | LoopPedal pedals[4]; | ||||
| @@ -42,7 +42,8 @@ while (true) { | |||||
| while (oin.recv(msg)) { | while (oin.recv(msg)) { | ||||
| if (msg.address=="/input") { | if (msg.address=="/input") { | ||||
| msg.getFloat(0) => adc.gain; | msg.getFloat(0) => adc.gain; | ||||
| msg.getFloat(1) => adcThru.gain; | |||||
| msg.getFloat(1) => adcThruLevel; | |||||
| adcThruLevel * adcThruMute => adcThru.gain; | |||||
| } | } | ||||
| else if(msg.address=="/delay") { | else if(msg.address=="/delay") { | ||||
| msg.getFloat(0)::second => dur loopTime; | msg.getFloat(0)::second => dur loopTime; | ||||
| @@ -60,10 +61,12 @@ while (true) { | |||||
| } | } | ||||
| else if(msg.address=="/arm") { | else if(msg.address=="/arm") { | ||||
| msg.getInt(0) => int channel; | msg.getInt(0) => int channel; | ||||
| (channel<0) => adcThruMute; | |||||
| adcThruLevel * adcThruMute => adcThru.gain; | |||||
| for( 0 => int i; i < pedals.cap(); i++ ) { pedals[i].arm(i==channel); } | for( 0 => int i; i < pedals.cap(); i++ ) { pedals[i].arm(i==channel); } | ||||
| } | } | ||||
| else if(msg.address=="/metronome") { | else if(msg.address=="/metronome") { | ||||
| //msg.getInt(0) => metronomeLevel; | |||||
| metronome.mute(msg.getInt(0)); | |||||
| } | } | ||||
| else if(msg.address=="/clear") { | else if(msg.address=="/clear") { | ||||
| msg.getInt(0) => int channel; | msg.getInt(0) => int channel; | ||||
| @@ -102,7 +105,11 @@ class LoopPedal | |||||
| public void setWet( float ratio ) { ratio => wet.gain; 1-ratio => dry.gain;} | public void setWet( float ratio ) { ratio => wet.gain; 1-ratio => dry.gain;} | ||||
| public void clear() { sample.clear(); } | public void clear() { sample.clear(); } | ||||
| public void recordFrom(UGen ugen) { ugen => sample; } | public void recordFrom(UGen ugen) { ugen => sample; } | ||||
| public dur remaining() { return sample.loopEnd() - sample.playPos(); } | |||||
| public dur remaining() { sample.loopEnd() => dur ltime; return (ltime - sample.playPos()) % (ltime/4.); } | |||||
| public int beat() { | |||||
| sample.loopEnd() => dur ltime; | |||||
| return Math.floor(((ltime - sample.playPos()) / (ltime/4.))) $ int; | |||||
| } | |||||
| public void outputTo(UGen wetSink, UGen drySink) { | public void outputTo(UGen wetSink, UGen drySink) { | ||||
| 1 => sample.play; | 1 => sample.play; | ||||
| @@ -111,7 +118,6 @@ class LoopPedal | |||||
| } | } | ||||
| public void arm(int value) { | public void arm(int value) { | ||||
| 0 => adcThru.gain; | |||||
| sample.playPos() => sample.recPos; | sample.playPos() => sample.recPos; | ||||
| value => sample.record; | value => sample.record; | ||||
| } | } | ||||
| @@ -121,54 +127,21 @@ class LoopPedal | |||||
| class Metronome | class Metronome | ||||
| { | { | ||||
| // A simple metronome | // A simple metronome | ||||
| SinOsc s => ADSR a => dac; | |||||
| SinOsc s => ADSR a; | |||||
| 0.5 => s.gain; | 0.5 => s.gain; | ||||
| a.set(0.01, .1, .5, .2); | |||||
| a.set(0.001, .1, .5, .05); | |||||
| 0.01::second => dur plipTime; | 0.01::second => dur plipTime; | ||||
| fun void run() | |||||
| { | |||||
| while(true){ | |||||
| pedals[0].remaining() => now; | |||||
| a.keyOn(); | |||||
| plipTime => now; | |||||
| a.keyOff(); | |||||
| } | |||||
| fun void mute(int value) { | |||||
| if (value){ a => dac; } else { a =< dac; } | |||||
| } | } | ||||
| } | |||||
| /* | |||||
| // Start the metronome and the vu meter (optional) | |||||
| //0 => int metronomeLevel; | |||||
| //spork ~plip(); | |||||
| //spork ~vu_meter(); | |||||
| // TODO timing here should be done using events | |||||
| fun void metronome() | |||||
| { | |||||
| SinOsc s => dac; | |||||
| 0.01::second => dur plipTime; | |||||
| while(true){ | |||||
| for( 0 => int i; i < 4; i++ ) { | |||||
| if (i==0){2000 => s.freq;} else {1000 => s.freq;} | |||||
| .1*metronomeLevel => s.gain; | |||||
| plipTime => now; | |||||
| 0 => s.gain; | |||||
| loopTime/4 - plipTime => now; | |||||
| fun void run() { | |||||
| while(true){ | |||||
| <<< pedals[0].beat() >>>; | |||||
| pedals[0].remaining() => now; | |||||
| 500 + 500*(pedals[0].beat()==0) => s.freq; | |||||
| a.keyOn(); plipTime => now; a.keyOff(); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| */ | |||||