37 jassert (newSampleRate > 0);
41 hasCalledReset =
true;
43 sampleRate = newSampleRate;
44 incomingMessages.
clear();
51 jassert (hasCalledReset);
60 auto sampleNumber = (int) ((message.
getTimeStamp() - 0.001 * lastCallbackTime) * sampleRate);
62 incomingMessages.
addEvent (message, sampleNumber);
66 if (sampleNumber > sampleRate)
67 incomingMessages.
clear (0, sampleNumber - (
int) sampleRate);
74 jassert (hasCalledReset);
77 jassert (numSamples > 0);
80 auto msElapsed = timeNow - lastCallbackTime;
83 lastCallbackTime = timeNow;
85 if (! incomingMessages.
isEmpty())
87 int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate));
91 const uint8* midiData;
92 int numBytes, samplePosition;
96 if (numSourceSamples > numSamples)
100 const int maxBlockLengthToUse = numSamples << 5;
102 if (numSourceSamples > maxBlockLengthToUse)
104 startSample = numSourceSamples - maxBlockLengthToUse;
105 numSourceSamples = maxBlockLengthToUse;
109 scale = (numSamples << 10) / numSourceSamples;
111 while (iter.
getNextEvent (midiData, numBytes, samplePosition))
113 samplePosition = ((samplePosition - startSample) * scale) >> 10;
115 destBuffer.
addEvent (midiData, numBytes,
116 jlimit (0, numSamples - 1, samplePosition));
123 startSample = numSamples - numSourceSamples;
125 while (iter.
getNextEvent (midiData, numBytes, samplePosition))
127 destBuffer.
addEvent (midiData, numBytes,
128 jlimit (0, numSamples - 1, samplePosition + startSample));
132 incomingMessages.
clear();
Automatically locks and unlocks a mutex object.
Used to iterate through the events in a MidiBuffer.
void setNextSamplePosition(int samplePosition) noexcept
Repositions the iterator so that the next event retrieved will be the first one whose sample position...
bool getNextEvent(MidiMessage &result, int &samplePosition) noexcept
Retrieves a copy of the next event from the buffer.
Holds a sequence of time-stamped midi events.
void addEvent(const MidiMessage &midiMessage, int sampleNumber)
Adds an event to the buffer.
bool isEmpty() const noexcept
Returns true if the buffer is empty.
void clear() noexcept
Removes all events from the buffer.
Represents a piano keyboard, keeping track of which keys are currently pressed.
void handleIncomingMidiMessage(MidiInput *, const MidiMessage &) override
void handleNoteOn(MidiKeyboardState *, int midiChannel, int midiNoteNumber, float velocity) override
void removeNextBlockOfMessages(MidiBuffer &destBuffer, int numSamples)
Removes all the pending messages from the queue as a buffer.
void handleNoteOff(MidiKeyboardState *, int midiChannel, int midiNoteNumber, float velocity) override
MidiMessageCollector()
Creates a MidiMessageCollector.
~MidiMessageCollector() override
Destructor.
void reset(double sampleRate)
Clears any messages from the queue.
void addMessageToQueue(const MidiMessage &message)
Takes an incoming real-time message and adds it to the queue.
Encapsulates a MIDI message.
static MidiMessage noteOn(int channel, int noteNumber, float velocity) noexcept
Creates a key-down message (using a floating-point velocity).
double getTimeStamp() const noexcept
Returns the timestamp associated with this message.
static MidiMessage noteOff(int channel, int noteNumber, float velocity) noexcept
Creates a key-up message.
void setTimeStamp(double newTimestamp) noexcept
Changes the message's associated timestamp.
static double getMillisecondCounterHiRes() noexcept
Returns the number of millisecs since a fixed event (usually system startup).