diff --git a/src/looper.cxx b/src/looper.cxx index e3a0883..d1d3fb2 100644 --- a/src/looper.cxx +++ b/src/looper.cxx @@ -28,15 +28,21 @@ void Looper::process(int nframes, Buffers* buffers) { if ( playPoint < endPoint ) { - out[i] += sample[playPoint++]; + out[i] += sample[playPoint]; } + // always update playPoint, even when not playing sound. + // it updates the UI of progress + playPoint++; } - EventLooperProgress e(track, float(playPoint) / endPoint ); + float prog = (float(playPoint) / fpb * numBeats); + if ( track == 0 ) + cout << prog << " fpb*numBeats " << fpb * numBeats << endl; + EventLooperProgress e(track, prog ); writeToGuiRingbuffer( &e ); } - else if ( state == STATE_RECORDING ) + else if ( state == STATE_RECORDING || stopRecordOnBar ) { for(int i = 0; i < nframes; i++) { @@ -51,12 +57,11 @@ void Looper::process(int nframes, Buffers* buffers) void Looper::bar() { - // only reset if we're on the last beat of a loop - if ( playedBeats >= numBeats ) + stopRecordOnBar = false; + + if ( state == STATE_RECORDING ) { - //cout << "Looper " << track << " restting to 0 " << endl; - playPoint = 0; - playedBeats = 0; + stopRecordOnBar = true; } if ( state == STATE_PLAY_QUEUED ) @@ -87,6 +92,18 @@ void Looper::bar() } } +void Looper::beat() +{ + playedBeats++; // only reset if we're on the last beat of a loop + + if ( playedBeats >= numBeats ) + { + //cout << "Looper " << track << " restting to 0 " << endl; + playPoint = 0; + playedBeats = 0; + } +} + void Looper::setLoopLength(float l) { numBeats *= l; diff --git a/src/looper.hxx b/src/looper.hxx index 15f6ffc..74c7c6e 100644 --- a/src/looper.hxx +++ b/src/looper.hxx @@ -26,14 +26,15 @@ class Looper : public Observer // for notifications state(STATE_STOPPED), numBeats (4), playedBeats(0), + stopRecordOnBar(false), endPoint (0), playPoint (0), lastWrittenSampleIndex(0) {} void bar(); + void beat(); - void beat() { playedBeats++; } void setFpb(int f) { fpb = f; } void setState(State s); @@ -48,6 +49,7 @@ class Looper : public Observer // for notifications int fpb; int numBeats; int playedBeats; + bool stopRecordOnBar; int endPoint, playPoint, lastWrittenSampleIndex; float sample[44100*60];