39 jassert (newSampleRate > 0);
42 hasCalledReset =
true;
44 sampleRate = newSampleRate;
45 incomingMessages.
clear();
54 jassert (hasCalledReset);
59 jassert (! approximatelyEqual (message.
getTimeStamp(), 0.0));
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 if (numSourceSamples > numSamples)
97 const int maxBlockLengthToUse = numSamples << 5;
99 auto iter = incomingMessages.
cbegin();
101 if (numSourceSamples > maxBlockLengthToUse)
103 startSample = numSourceSamples - maxBlockLengthToUse;
104 numSourceSamples = maxBlockLengthToUse;
108 scale = (numSamples << 10) / numSourceSamples;
112 const auto pos = ((meta.samplePosition - startSample) * scale) >> 10;
113 destBuffer.addEvent (meta.data, meta.numBytes, jlimit (0, numSamples - 1, pos));
120 startSample = numSamples - numSourceSamples;
122 for (
const auto metadata : incomingMessages)
123 destBuffer.
addEvent (metadata.data, metadata.numBytes,
124 jlimit (0, numSamples - 1, metadata.samplePosition + startSample));
127 incomingMessages.
clear();
void ensureSize(size_t minimumNumBytes)
MidiBufferIterator cbegin() const noexcept
MidiBufferIterator findNextSamplePosition(int samplePosition) const noexcept
MidiBufferIterator cend() const noexcept
bool isEmpty() const noexcept
bool addEvent(const MidiMessage &midiMessage, int sampleNumber)
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
void ensureStorageAllocated(size_t bytes)
~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