diff --git a/src/plug/JK_MidiClock.cpp b/src/plug/JK_MidiClock.cpp index acf990a..509f958 100644 --- a/src/plug/JK_MidiClock.cpp +++ b/src/plug/JK_MidiClock.cpp @@ -33,6 +33,7 @@ JK_MidiClock::JK_MidiClock() m_songPositionMessage = new MidiMessage(MidiMessage::songPositionPointer(0)); m_last_sample_pos_sync = 0; m_syncSamplePos = 0; + m_syncNext_smp_f = 0; } //================================================================================================= void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &posInfo, @@ -54,14 +55,23 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p const double ppqPerSample = (posInfo.bpm / 60.0) / sampleRate; //PPQ offset to compensate Midi interface latency - double hostPpqPosition = posInfo.ppqPosition + m_ppqOffset * ppqPerSample;; - + double hostPpqPosition = posInfo.ppqPosition + m_ppqOffset * ppqPerSample; + + const double clockDistanceInSamples_f = (60.0 * sampleRate) / (posInfo.bpm * 24.0); + const int clockDistanceInSamples = roundToInt(clockDistanceInSamples_f); + + const double quant = (60.0 / posInfo.bpm) * sampleRate; + const double hostSamplePos_f = hostPpqPosition * quant; + + double syncSamplePos_f = hostSamplePos_f; + if (posInfo.isPlaying || posInfo.isRecording) { if (! m_wasPlaying) { //set the point where to start the slave m_ppqToStartSyncAt = getNearestSixteenthInPPQ(hostPpqPosition); + SynthDebug("m_ppqToStartSyncAt %f", m_ppqToStartSyncAt); //Special case: Master is set to always start playback from the previous start position... if (positionJumped(m_syncPpqPosition, hostPpqPosition, sampleRate, ppqPerSample)) @@ -69,7 +79,10 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p //Cue Midiclock slave to the nearest sixteenth note to new start position //because the one calculated in stop mode isn't valid anymore. sendSongPositionPointerMessage(m_ppqToStartSyncAt, 0, midiBuffer); + SynthDebug("m_ppqToStartSyncAt %f", m_ppqToStartSyncAt); } + m_syncNext_smp_f = m_ppqToStartSyncAt * quant + clockDistanceInSamples_f; + } else { @@ -103,14 +116,10 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p m_syncFlag = 0; } } + m_syncNext_smp_f = m_ppqToStartSyncAt * quant + clockDistanceInSamples_f; } } - const int clockDistanceInSamples = roundToInt((60.0 * sampleRate) / (posInfo.bpm * 24.0)); - const double quant = (60.0 / posInfo.bpm) * sampleRate; - const double hostSamplePos_f = hostPpqPosition * quant; - - double syncSamplePos_f = hostSamplePos_f; int64 syncSamplePos = (int64)std::round(syncSamplePos_f); double sample_offset = syncSamplePos_f - m_syncSamplePos; @@ -151,6 +160,7 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p } } +#if 0 //For best timing we should never interupt Midiclock messages! //Seems that some slaves constantly adjusting their internal clock //to Midiclock even if they are in stop mode. @@ -158,8 +168,10 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p double distance = fabs(syncSamplePos_f-m_last_sample_pos_sync); if ((syncSamplePos % clockDistanceInSamples) == 0 and sample_pos >= 0) { - SynthDebug("Distance : %f", distance); - SynthDebug("syncSamplePos_f: %f", syncSamplePos_f); + SynthDebug("Distance (soll) : %f", clockDistanceInSamples_f); + SynthDebug("Distance (ist) : %f", distance); + SynthDebug("syncSamplePos_f : %f", syncSamplePos_f); + SynthDebug("sample_offset : %f", sample_offset); // SynthDebug("MidiClock at Sample Sync: %d | PPQ Host: %f | PPQ Sync: %f", syncSamplePos-m_last_sample_pos_sync, hostPpqPosition-m_last_ppq_pos_host, m_syncPpqPosition-m_last_syncPpqPosition); SynthDebug("MidiClock at Sample Sync: %f, diff %f", sample_pos, syncSamplePos_f-m_last_sample_pos_sync); @@ -170,6 +182,24 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p } m_syncSamplePos = ++syncSamplePos; syncSamplePos_f += 1.0; +#else + double curr_sample_pos = hostSamplePos_f + (double)posInBuffer; + if (fabs(curr_sample_pos - m_syncNext_smp_f) <= 0.5) + { + SynthDebug("posInBuffer : %d", posInBuffer); + SynthDebug("hostSamplePos_f : %f", hostSamplePos_f); + SynthDebug("hostSamplePos_f + posInbuffer : %f", hostSamplePos_f + posInBuffer); + SynthDebug("clockDistanceInSamples_f (soll) : %f", clockDistanceInSamples_f); + SynthDebug("clockDistanceInSamples_f (ist) : %f", curr_sample_pos - m_last_sample_pos_sync); + + m_syncNext_smp_f += clockDistanceInSamples_f; + m_last_sample_pos_sync = curr_sample_pos; + SynthDebug("m_syncNext_smp_f : %f", m_syncNext_smp_f); + midiBuffer->addEvent(*m_clockMessage, roundToInt(posInBuffer)); + + } + +#endif } m_wasPlaying = true; @@ -185,6 +215,7 @@ void JK_MidiClock::generateMidiclock(const AudioPlayHead::CurrentPositionInfo &p } m_syncPpqPosition = hostPpqPosition; + m_syncNext_smp_f = hostSamplePos_f + clockDistanceInSamples_f; m_syncFlag = startSlave_; m_wasPlaying = false; } diff --git a/src/plug/JK_MidiClock.h b/src/plug/JK_MidiClock.h index 53f7457..9d54ebb 100644 --- a/src/plug/JK_MidiClock.h +++ b/src/plug/JK_MidiClock.h @@ -56,6 +56,7 @@ private: double m_last_ppq_pos_host; double m_last_syncPpqPosition; double m_syncSamplePos; + double m_syncNext_smp_f; static const int cycleEnd_ = 1; static const int startSlave_ = 2;