diff --git a/main.ck b/main.ck index f1b9cd8..877b140 100644 --- a/main.ck +++ b/main.ck @@ -1,52 +1,56 @@ // TODO: turn off adcThru when recording // 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]; // Levels //0 => adc.gain; .5 => adcThru.gain; +// Global loop time +1::second => dur loopTime; + // 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 OscIn oin; 9000 => oin.port; oin.listenAll(); OscMsg msg; +// Start the metronome +0 => int metronomeLevel; +spork ~plip(); + // Event loop while (true) { oin => now; - //1::second => now; while (oin.recv(msg)) { - if (msg.address=="/input") - { + if (msg.address=="/input") { msg.getFloat(0) => adc.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; for( 0 => int i; i < channels.cap(); i++ ) { - channels[i].setLoopPoint(loopPoint); + channels[i].setLoopPoint(loopTime); channels[i].setFeedback(feedback); } } - else if(msg.address=="/channel") - { + else if(msg.address=="/channel") { msg.getInt(0) => int i; channels[i].setGain(msg.getFloat(1)); channels[i].setPan(msg.getFloat(2)); } - else if(msg.address=="/arm") - { + else if(msg.address=="/arm") { msg.getInt(0) => int 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; channels[channel].clear(); } @@ -56,7 +60,7 @@ while (true) { public class SampleChan { // Chain - adc => LiSa sample => LPF filter; + adc => LiSa sample => LPF filter => Pan2 panner; // Setup 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 setFilter( float freq ) { freq => filter.freq; } 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 outputTo(UGen ugen) { 1 => sample.play; - filter => ugen; + panner => ugen; } 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; + } + } + +} diff --git a/main.py b/main.py index a5f65da..48ffc5a 100644 --- a/main.py +++ b/main.py @@ -102,6 +102,7 @@ class DelayPanel(wx.Panel): self.SetSizerAndFit(sizer) self.delayTime.Bind(wx.EVT_SCROLL, self.update) self.feedback.Bind(wx.EVT_SCROLL, self.update) + self.metronome.Bind(wx.EVT_TOGGLEBUTTON, self.switchMetronome) self.update(None) def update(self, evt): @@ -110,6 +111,10 @@ class DelayPanel(wx.Panel): b=self.feedback.slider.GetValue()/100. sendOSCMsg("/delay", [a, b]) + def switchMetronome(self, evt): + """ Send OSC messages """ + sendOSCMsg("/metronome", [int(self.metronome.GetValue())]) + class Channel(wx.Panel): """ A single channel """ def __init__(self, parent, index): diff --git a/run.sh b/run.sh index 699ed67..b6ef88b 100755 --- a/run.sh +++ b/run.sh @@ -1,4 +1,5 @@ #!/bin/bash +#chuck scratch.ck chuck --bufsize64 main.ck & python ./main.py pkill -SIGINT chuck diff --git a/scratch.ck b/scratch.ck index 4dab6c4..f9d014d 100644 --- a/scratch.ck +++ b/scratch.ck @@ -1,7 +1,26 @@ -SinOsc s => Pan2 p => dac; -1 => p.pan; +1::second => dur loopTime; -while(1::second => now){ - // this will flip the pan from left to right - p.pan() * -1. => p.pan; +fun void plip() +{ + SinOsc s => dac; + 0.05::second => dur plipTime; + 2000 => s.freq; + + while(true){ + .1 => s.gain; + plipTime => now; + 0 => s.gain; + loopTime - plipTime => now; + } + +} + +spork ~plip(); + +while(true){ + 1::second => now; + loopTime - 0.1::second => loopTime; } + + +