Hello,
I created a simple VST host to send midi file to Kontakt.
It works fine but if the midi is more than 48 seconds the music stops in the middle and I hear a long last note. I tested it with several midis. Always happens after 48 seconds. I guess there is some kind of problem the way I use MidiBuffer and AudioSampleBuffer, but I can’t find the reason.
My code:
void RenderKontakt::loadMidi (const String& filename, const String& wavfile)
{FileInputStream fileStream(filename); MidiFile Mfile; Mfile.readFrom(fileStream); Mfile.convertTimestampTicksToSeconds(); MidiBuffer midiBuffer; midiBuffer.clear(); float totalTime = 0; float TrackTotalTime = 0; for (int t = 0; t < Mfile.getNumTracks(); t++) { const MidiMessageSequence* track = Mfile.getTrack(t); TrackTotalTime = track->getEndTime(); if (totalTime < TrackTotalTime) totalTime = TrackTotalTime; for (int i = 0; i < track->getNumEvents(); i++) { MidiMessage& m = track->getEventPointer(i)->message; std::cout<<m.getDescription ()<<" time:" << m.getTimeStamp() << "\n"; int sampleOffset = (int)(sampleRate * m.getTimeStamp()); midiBuffer.addEvent(m, sampleOffset); TrackTotalTime = m.getTimeStamp(); } } int numberOfBuffers = int (std::ceil ((totalTime) * sampleRate / bufferSize)); // Data structure to hold multi-channel audio data. AudioSampleBuffer audioBuffer (plugin->getTotalNumOutputChannels(), bufferSize); plugin->prepareToPlay (sampleRate, bufferSize); File outputFile = File(wavfile); WavAudioFormat format; std::unique_ptr<AudioFormatWriter> writer; writer.reset (format.createWriterFor (new FileOutputStream (outputFile), 44100, audioBuffer.getNumChannels(), 16, {}, 0)); plugin->setNonRealtime (true); for (int i = 0; i < numberOfBuffers; ++i) { plugin->processBlock (audioBuffer, midiBuffer); if (writer != nullptr) writer->writeFromAudioSampleBuffer (audioBuffer, 0, audioBuffer.getNumSamples()); } writer.reset();
}
Thanks!!!