diff --git a/src/looperclip.cxx b/src/looperclip.cxx index 809748e..6debdbd 100644 --- a/src/looperclip.cxx +++ b/src/looperclip.cxx @@ -202,6 +202,13 @@ void LooperClip::record(int count, float* L, float* R) { _buffer->getData().at( _recordhead ) = *L++; _recordhead++; + if(_recordhead>=90112) + { + char buffer [50]; + sprintf (buffer, "LooperClip t %i, s %i, recordhead %f\n",track, scene,_recordhead); + EventGuiPrint e( buffer ); + //writeToGuiRingbuffer( &e ); + } } else { @@ -264,6 +271,11 @@ long LooperClip::getBufferLenght() long LooperClip::getActualAudioLength() { + char cbuffer [50]; +// sprintf (cbuffer, "LooperClip recordhead %f,audioFrames %d \n",_recordhead,(int)_buffer->getAudioFrames()); +// EventGuiPrint e( cbuffer ); +// writeToGuiRingbuffer( &e ); +// printf(cbuffer); return _buffer->getAudioFrames(); } diff --git a/src/timemanager.cxx b/src/timemanager.cxx index 62656f7..e361fc4 100644 --- a/src/timemanager.cxx +++ b/src/timemanager.cxx @@ -40,12 +40,16 @@ TimeManager::TimeManager(): // 120 BPM default fpb = samplerate / 2; + //Counter for current bar/beat barCounter = 0; beatCounter = 0; previousBeat = 0; - beatFrameCountdown = fpb; + //In process() we want to immediately process bar(), beat() of all observers + // thats why beatFrameCountdownnframes; - totalFrameCounter += nframes; - beatFrameCountdown -= nframes; + + - if ( beatFrameCountdown < 0 ) + if ( beatFrameCountdown < nframes ) { - int before = nframes + beatFrameCountdown; - int after = - beatFrameCountdown; + //length of beat is not multiple of nframes, so need to process last frames *before* + //then set beat (get the queued actions: play, rec etc) + // then process first frames *after* beat + int before=(beatCounter*fpb)%nframes; + int after=nframes-before; - if ( before < nframes && after < nframes && before + after == nframes ) + if ( before < nframes && after <= nframes && before + after == nframes ) { char buffer [50]; - //sprintf (buffer, "Timing OK: before %i, after %i, b+a %i", before, after, before+after ); - EventGuiPrint e2( buffer ); - writeToGuiRingbuffer( &e2 ); +// sprintf (buffer, "Timing OK: before %i, after %i, b+a %i", before, after, before+after ); +// EventGuiPrint e2( buffer ); +// writeToGuiRingbuffer( &e2 ); } else @@ -215,6 +222,7 @@ void TimeManager::process(Buffers* buffers) observers.at(i)->bar(); } barCounter++; + //beatCounter=0; } // process after @@ -226,13 +234,17 @@ void TimeManager::process(Buffers* buffers) - beatFrameCountdown = fpb; + beatFrameCountdown = fpb-after; beatCounter++; } else { jack->processFrames( nframes ); + beatFrameCountdown -= nframes; + } + + totalFrameCounter += nframes; // write BPM / transport info to JACK int bpm = ( samplerate * 60) / fpb; diff --git a/src/timemanager.hxx b/src/timemanager.hxx index 51fa8f9..a2b2275 100644 --- a/src/timemanager.hxx +++ b/src/timemanager.hxx @@ -65,7 +65,7 @@ class TimeManager TRANSPORT_STATE transportState; /// number of frames per beat - float fpb; + int fpb; /// holds the number of frames processed long long totalFrameCounter;