|
@@ -1,52 +1,56 @@ |
|
|
// TODO: turn off adcThru when recording |
|
|
// TODO: turn off adcThru when recording |
|
|
// Effects chain |
|
|
// Effects chain |
|
|
adc => Gain adcThru => Gain mixer => dac; // Monitor input through a mixer |
|
|
|
|
|
|
|
|
adc => Gain adcThru => dac; // Monitor input through a mixer |
|
|
SampleChan channels[4]; |
|
|
SampleChan channels[4]; |
|
|
|
|
|
|
|
|
// Levels |
|
|
// Levels |
|
|
//0 => adc.gain; |
|
|
//0 => adc.gain; |
|
|
.5 => adcThru.gain; |
|
|
.5 => adcThru.gain; |
|
|
|
|
|
|
|
|
|
|
|
// Global loop time |
|
|
|
|
|
1::second => dur loopTime; |
|
|
|
|
|
|
|
|
// Each channel should output to the mixer |
|
|
// Each channel should output to the mixer |
|
|
for( 0 => int i; i < channels.cap(); i++ ) { channels[i].outputTo(mixer); } |
|
|
|
|
|
|
|
|
for( 0 => int i; i < channels.cap(); i++ ) { channels[i].outputTo(dac); } |
|
|
|
|
|
|
|
|
// Listen to OSC messages |
|
|
// Listen to OSC messages |
|
|
OscIn oin; 9000 => oin.port; |
|
|
OscIn oin; 9000 => oin.port; |
|
|
oin.listenAll(); |
|
|
oin.listenAll(); |
|
|
OscMsg msg; |
|
|
OscMsg msg; |
|
|
|
|
|
|
|
|
|
|
|
// Start the metronome |
|
|
|
|
|
0 => int metronomeLevel; |
|
|
|
|
|
spork ~plip(); |
|
|
|
|
|
|
|
|
// Event loop |
|
|
// Event loop |
|
|
while (true) { |
|
|
while (true) { |
|
|
oin => now; |
|
|
oin => now; |
|
|
//1::second => now; |
|
|
|
|
|
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) => adcThru.gain; |
|
|
} |
|
|
} |
|
|
else if(msg.address=="/delay") |
|
|
|
|
|
{ |
|
|
|
|
|
msg.getFloat(0)::second => dur loopPoint; |
|
|
|
|
|
|
|
|
else if(msg.address=="/delay") { |
|
|
|
|
|
msg.getFloat(0)::second => loopTime; |
|
|
msg.getFloat(1) => float feedback; |
|
|
msg.getFloat(1) => float feedback; |
|
|
for( 0 => int i; i < channels.cap(); i++ ) { |
|
|
for( 0 => int i; i < channels.cap(); i++ ) { |
|
|
channels[i].setLoopPoint(loopPoint); |
|
|
|
|
|
|
|
|
channels[i].setLoopPoint(loopTime); |
|
|
channels[i].setFeedback(feedback); |
|
|
channels[i].setFeedback(feedback); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
else if(msg.address=="/channel") |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
else if(msg.address=="/channel") { |
|
|
msg.getInt(0) => int i; |
|
|
msg.getInt(0) => int i; |
|
|
channels[i].setGain(msg.getFloat(1)); |
|
|
channels[i].setGain(msg.getFloat(1)); |
|
|
channels[i].setPan(msg.getFloat(2)); |
|
|
channels[i].setPan(msg.getFloat(2)); |
|
|
} |
|
|
} |
|
|
else if(msg.address=="/arm") |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
else if(msg.address=="/arm") { |
|
|
msg.getInt(0) => int channel; |
|
|
msg.getInt(0) => int channel; |
|
|
for( 0 => int i; i < channels.cap(); i++ ) { channels[i].arm(i==channel); } |
|
|
for( 0 => int i; i < channels.cap(); i++ ) { channels[i].arm(i==channel); } |
|
|
} |
|
|
} |
|
|
else if(msg.address=="/clear") |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
else if(msg.address=="/metronome") { |
|
|
|
|
|
msg.getInt(0) => metronomeLevel; |
|
|
|
|
|
} |
|
|
|
|
|
else if(msg.address=="/clear") { |
|
|
msg.getInt(0) => int channel; |
|
|
msg.getInt(0) => int channel; |
|
|
channels[channel].clear(); |
|
|
channels[channel].clear(); |
|
|
} |
|
|
} |
|
@@ -56,7 +60,7 @@ while (true) { |
|
|
public class SampleChan |
|
|
public class SampleChan |
|
|
{ |
|
|
{ |
|
|
// Chain |
|
|
// Chain |
|
|
adc => LiSa sample => LPF filter; |
|
|
|
|
|
|
|
|
adc => LiSa sample => LPF filter => Pan2 panner; |
|
|
|
|
|
|
|
|
// Setup |
|
|
// Setup |
|
|
10::second => sample.duration; //This is the max duration |
|
|
10::second => sample.duration; //This is the max duration |
|
@@ -71,12 +75,12 @@ public class SampleChan |
|
|
public void setFeedback( float fb ) { fb => sample.feedback; } |
|
|
public void setFeedback( float fb ) { fb => sample.feedback; } |
|
|
public void setFilter( float freq ) { freq => filter.freq; } |
|
|
public void setFilter( float freq ) { freq => filter.freq; } |
|
|
public void setGain( float gain ) { gain => filter.gain; } |
|
|
public void setGain( float gain ) { gain => filter.gain; } |
|
|
public void setPan( float pan ) { } |
|
|
|
|
|
|
|
|
public void setPan( float pan ) { pan => panner.pan; } |
|
|
public void clear() { sample.clear(); } |
|
|
public void clear() { sample.clear(); } |
|
|
|
|
|
|
|
|
public void outputTo(UGen ugen) { |
|
|
public void outputTo(UGen ugen) { |
|
|
1 => sample.play; |
|
|
1 => sample.play; |
|
|
filter => ugen; |
|
|
|
|
|
|
|
|
panner => ugen; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void arm(int value) { |
|
|
public void arm(int value) { |
|
@@ -85,3 +89,21 @@ public class SampleChan |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO timing here should be done using events |
|
|
|
|
|
fun void plip() |
|
|
|
|
|
{ |
|
|
|
|
|
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; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |