I’m working on a plugin that sends data from a midi file to the host. For the standalone app I use a Midi Output device but for some reason when I use sendBlockOfMessagesNow()
, the output doesn’t use the specified midi patch. Everything else works but all the files sound like piano instead of the instrument that is specified by the program change. The code below is what I am using in my processBlock()
function. Any help would be greatly appreciated, thanks!
const ScopedTryLock myScopedLock(processLock);
if (myScopedLock.isLocked())
{
if (midiTransports.isPlaying || m_HostPlayerInfo.isPlaying)
{
double startTime = ((Time::getMillisecondCounterHiRes() - midiTransports.timer) / 1000) + midiTransports.startPosition;
if (m_HostPlayerInfo.isPlaying && m_StateInfo.m_BBSyncPlayback)
startTime = m_HostPlayerInfo.timeInSeconds;
double endTime = startTime + getBlockSize() / getSampleRate();
if (m_HostPlayerInfo.isPlaying
&& std::abs(startTime - midiTransports.nextPosition) > (1.0 / getSampleRate())
&& midiTransports.nextPosition > 0.0)
sendAllNotesOff(midiBuffer);
midiTransports.nextPosition = endTime;
if (midiTransports.notesAreOn && startTime > midiManager.getEndTime())
{
sendAllNotesOff(midiBuffer);
midiTransports.hasStreamFinished = true;
}
else
{
midiTransports.currentPosition = startTime;
for (auto i = 0; i < midiManager.getNumEvents(); i++)
{
MidiMessage message = midiManager.getEventPointer(i)->message;
if (message.getTimeStamp() >= startTime && message.getTimeStamp() < endTime)
{
auto samplePosition = roundToInt((message.getTimeStamp() - startTime) * getSampleRate());
midiTransports.hasStreamFinished = false;
midiTransports.notesAreOn = true;
message.setVelocity((float)midiTransports.gain * message.getFloatVelocity());
midiBuffer.addEvent(message, samplePosition);
}
}
}
}
else if (midiTransports.notesAreOn)
sendAllNotesOff(midiBuffer);
}
else if (midiTransports.notesAreOn)
sendAllNotesOff(midiBuffer);
if (JUCEApplication::isStandaloneApp() && midiSource != nullptr)
midiSource->sendBlockOfMessagesNow(midiBuffer);