39 jassert (newSampleRate > 0);
42 hasCalledReset =
true;
44 sampleRate = newSampleRate;
45 incomingMessages.
clear();
54 jassert (hasCalledReset);
61 auto sampleNumber = (int) ((message.
getTimeStamp() - 0.001 * lastCallbackTime) * sampleRate);
63 incomingMessages.
addEvent (message, sampleNumber);
67 if (sampleNumber > sampleRate)
68 incomingMessages.
clear (0, sampleNumber - (
int) sampleRate);
77 jassert (hasCalledReset);
80 jassert (numSamples > 0);
83 auto msElapsed = timeNow - lastCallbackTime;
85 lastCallbackTime = timeNow;
87 if (! incomingMessages.
isEmpty())
89 int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate));
93 const uint8* midiData;
94 int numBytes, samplePosition;
98 if (numSourceSamples > numSamples)
102 const int maxBlockLengthToUse = numSamples << 5;
104 if (numSourceSamples > maxBlockLengthToUse)
106 startSample = numSourceSamples - maxBlockLengthToUse;
107 numSourceSamples = maxBlockLengthToUse;
111 scale = (numSamples << 10) / numSourceSamples;
113 while (iter.
getNextEvent (midiData, numBytes, samplePosition))
115 samplePosition = ((samplePosition - startSample) * scale) >> 10;
117 destBuffer.
addEvent (midiData, numBytes,
118 jlimit (0, numSamples - 1, samplePosition));
125 startSample = numSamples - numSourceSamples;
127 while (iter.
getNextEvent (midiData, numBytes, samplePosition))
129 destBuffer.
addEvent (midiData, numBytes,
130 jlimit (0, numSamples - 1, samplePosition + startSample));
134 incomingMessages.
clear();
void setNextSamplePosition(int samplePosition) noexcept
bool getNextEvent(MidiMessage &result, int &samplePosition) noexcept
void addEvent(const MidiMessage &midiMessage, int sampleNumber)
bool isEmpty() const noexcept
void handleIncomingMidiMessage(MidiInput *, const MidiMessage &) override
void handleNoteOn(MidiKeyboardState *, int midiChannel, int midiNoteNumber, float velocity) override
void removeNextBlockOfMessages(MidiBuffer &destBuffer, int numSamples)
void handleNoteOff(MidiKeyboardState *, int midiChannel, int midiNoteNumber, float velocity) override
~MidiMessageCollector() override
void reset(double sampleRate)
void addMessageToQueue(const MidiMessage &message)
static MidiMessage noteOn(int channel, int noteNumber, float velocity) noexcept
double getTimeStamp() const noexcept
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
void setTimeStamp(double newTimestamp) noexcept
static double getMillisecondCounterHiRes() noexcept