Browse Source

midipattern: always kill all notes on reposition

tags/v2.3.1
falkTX 3 years ago
parent
commit
b6d9c0bcd6
1 changed files with 20 additions and 14 deletions
  1. +20
    -14
      source/native-plugins/midi-pattern.cpp

+ 20
- 14
source/native-plugins/midi-pattern.cpp View File

@@ -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;


Loading…
Cancel
Save