Playing MIDI file thru Synth

    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);
    }

π

2 Likes