| @@ -43,10 +43,10 @@ public: | |||||
| fNeedsAllNotesOff(false), | fNeedsAllNotesOff(false), | ||||
| fWasPlayingBefore(false), | fWasPlayingBefore(false), | ||||
| fTimeSigNum(4), | fTimeSigNum(4), | ||||
| fLastPosition(0.0f), | |||||
| fLastPosition(0.0), | |||||
| fLastFrame(0), | fLastFrame(0), | ||||
| fTicksPerFrame(0.0), | fTicksPerFrame(0.0), | ||||
| fMaxTicks(0.0), | |||||
| fMaxTicksPerSigNum(0.0), | |||||
| fMidiOut(this), | fMidiOut(this), | ||||
| fTimeInfo(), | fTimeInfo(), | ||||
| fMidiQueue(), | fMidiQueue(), | ||||
| @@ -60,7 +60,7 @@ public: | |||||
| fParameters[kParameterDefLength] = 4.0f; | fParameters[kParameterDefLength] = 4.0f; | ||||
| fParameters[kParameterQuantize] = 4.0f; | fParameters[kParameterQuantize] = 4.0f; | ||||
| fMaxTicks = TICKS_PER_BEAT * fTimeSigNum * 4 /* kParameterMeasures */; | |||||
| fMaxTicksPerSigNum = TICKS_PER_BEAT * fTimeSigNum * 4 /* kParameterMeasures */; | |||||
| } | } | ||||
| protected: | protected: | ||||
| @@ -197,7 +197,8 @@ protected: | |||||
| fTimeSigNum = static_cast<int>(value + 1.5f); | fTimeSigNum = static_cast<int>(value + 1.5f); | ||||
| // fall through | // fall through | ||||
| case kParameterMeasures: | case kParameterMeasures: | ||||
| fMaxTicks = TICKS_PER_BEAT * fTimeSigNum * static_cast<double>(fParameters[kParameterMeasures]); | |||||
| fMaxTicksPerSigNum = TICKS_PER_BEAT * fTimeSigNum * static_cast<double>(fParameters[kParameterMeasures]); | |||||
| fNeedsAllNotesOff = true; | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| @@ -214,10 +215,14 @@ protected: | |||||
| if (fWasPlayingBefore != fTimeInfo.playing) | if (fWasPlayingBefore != fTimeInfo.playing) | ||||
| { | { | ||||
| fLastFrame = 0; | fLastFrame = 0; | ||||
| fLastPosition = 0.0f; | |||||
| fLastPosition = 0.0; | |||||
| fNeedsAllNotesOff = true; | fNeedsAllNotesOff = true; | ||||
| fWasPlayingBefore = fTimeInfo.playing; | fWasPlayingBefore = fTimeInfo.playing; | ||||
| } | } | ||||
| else if (fTimeInfo.playing && fLastFrame + frames != fTimeInfo.frame) | |||||
| { | |||||
| fNeedsAllNotesOff = true; | |||||
| } | |||||
| if (fNeedsAllNotesOff) | if (fNeedsAllNotesOff) | ||||
| { | { | ||||
| @@ -266,7 +271,7 @@ protected: | |||||
| if (fLastFrame + frames == fTimeInfo.frame) | if (fLastFrame + frames == fTimeInfo.frame) | ||||
| { | { | ||||
| // continuous playback | // continuous playback | ||||
| playPos = static_cast<double>(fLastPosition) + fTicksPerFrame * static_cast<double>(frames); | |||||
| playPos = fLastPosition + fTicksPerFrame * static_cast<double>(frames); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -275,11 +280,11 @@ protected: | |||||
| } | } | ||||
| const double endPos = playPos + fTicksPerFrame * static_cast<double>(frames); | const double endPos = playPos + fTicksPerFrame * static_cast<double>(frames); | ||||
| const double loopedEndPos = std::fmod(endPos, fMaxTicks); | |||||
| const double loopedEndPos = std::fmod(endPos, fMaxTicksPerSigNum); | |||||
| for (; playPos < endPos; playPos += fMaxTicks) | |||||
| for (; playPos < endPos; playPos += fMaxTicksPerSigNum) | |||||
| { | { | ||||
| const double loopedPlayPos = std::fmod(playPos, fMaxTicks); | |||||
| const double loopedPlayPos = std::fmod(playPos, fMaxTicksPerSigNum); | |||||
| if (loopedEndPos >= loopedPlayPos) | if (loopedEndPos >= loopedPlayPos) | ||||
| { | { | ||||
| @@ -288,16 +293,17 @@ protected: | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| const double diff = fMaxTicks - loopedPlayPos; | |||||
| const double diff = fMaxTicksPerSigNum - loopedPlayPos; | |||||
| if (! (fMidiOut.play(loopedPlayPos, diff) && fMidiOut.play(0.0, loopedEndPos, diff))) | if (! (fMidiOut.play(loopedPlayPos, diff) && fMidiOut.play(0.0, loopedEndPos, diff))) | ||||
| fNeedsAllNotesOff = true; | fNeedsAllNotesOff = true; | ||||
| } | } | ||||
| } | } | ||||
| fLastFrame = fTimeInfo.frame; | |||||
| fLastPosition = static_cast<float>(playPos); | |||||
| fLastPosition = playPos; | |||||
| } | } | ||||
| fLastFrame = fTimeInfo.frame; | |||||
| } | } | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
| @@ -483,11 +489,11 @@ private: | |||||
| bool fWasPlayingBefore; | bool fWasPlayingBefore; | ||||
| int fTimeSigNum; | int fTimeSigNum; | ||||
| float fLastPosition; | |||||
| double fLastPosition; | |||||
| uint64_t fLastFrame; | uint64_t fLastFrame; | ||||
| double fTicksPerFrame; | double fTicksPerFrame; | ||||
| double fMaxTicks; | |||||
| double fMaxTicksPerSigNum; | |||||
| MidiPattern fMidiOut; | MidiPattern fMidiOut; | ||||
| NativeTimeInfo fTimeInfo; | NativeTimeInfo fTimeInfo; | ||||