ScopedPointer<MidiBuffer> midiBuffer = new MidiBuffer();
int samplesPlayed;
bool midiIsPlaying = false;
void setMidiFile(String file) {
FileInputStream fileStream(file);
MidiFile M;
M.readFrom(fileStream);
M.convertTimestampTicksToSeconds();
midiBuffer->clear();
double sampleRate = synth.getSampleRate(); // <-- tx MatKat
for (int t = 0; t < M.getNumTracks(); t++) {
const MidiMessageSequence* track = M.getTrack(t);
for (int i = 0; i < track->getNumEvents(); i++) {
MidiMessage& m = track->getEventPointer(i)->message;
int sampleOffset = (int)(sampleRate * m.getTimeStamp());
midiBuffer->addEvent(m, sampleOffset);
}
}
samplesPlayed = 0;
midiIsPlaying = true;
}
void getNextAudioBlock(const AudioSourceChannelInfo& bufferToFill) override {
bufferToFill.clearActiveBufferRegion();
MidiBuffer incomingMidi;
midiCollector.removeNextBlockOfMessages(incomingMidi, bufferToFill.numSamples);
// add events from playing midi-file
if (midiIsPlaying) {
int sampleDeltaToAdd = -samplesPlayed;
incomingMidi.addEvents(*midiBuffer, samplesPlayed, bufferToFill.numSamples, sampleDeltaToAdd);
samplesPlayed += bufferToFill.numSamples;
}
// pass these messages to the keyboard state so that it can update the component
// to show on-screen which keys are being pressed on the physical midi keyboard.
const bool injectIndirectEvents = true; // add midi messages generated by clicking on the on-screen keyboard.
keyboardState.processNextMidiBuffer(incomingMidi, 0 /*startSample*/, bufferToFill.numSamples, injectIndirectEvents);
synth.renderNextBlock(*bufferToFill.buffer, incomingMidi, 0 /*startSample*/, bufferToFill.numSamples);
}
π
