|
@@ -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(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
*/ |
|
|
|