Create chords from one midi note

I also tried to simplify things and just get each note press to play a chord …
Still can’t get any midi messages out the other side of the plugin :slight_smile:

void WaylochorderAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)

{
    ScopedNoDenormals noDenormals;
    auto totalNumInputChannels  = getTotalNumInputChannels();
    auto totalNumOutputChannels = getTotalNumOutputChannels();

    MidiMessage m;
    using namespace std;
    buffer.clear();
    MidiBuffer processedMidi;
    int time;
    
    vector<int> chord { 60, 67 , 72 };
    vector<MidiMessage> midiChord;
        
    for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
        {
            if (m.isNoteOn())
            {
                for (int i = 0; i < 3; i++)
                {
                    int NewNote = chord[i];
                    m = MidiMessage::noteOn(m.getChannel(), NewNote , m.getVelocity());
                    midiChord[i] = m;
                }
            }
            if (m.isNoteOff())
            {
                for (int i = 0; i < 3; i++)
                {
                    int NewNote = chord[i];
                    m = MidiMessage::noteOff(m.getChannel(), NewNote , m.getVelocity());
                    midiChord[i] = m;
                }
            }
            
            for ( int i = 0; i < 3; i ++)
            {
                processedMidi.addEvent (midiChord[i], time);
            }
        }

        midiMessages.swapWith (processedMidi);

This is even simpler but still no dice …

void WaylochorderAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)

{
    ScopedNoDenormals noDenormals;
    auto totalNumInputChannels  = getTotalNumInputChannels();
    auto totalNumOutputChannels = getTotalNumOutputChannels();

    MidiMessage m;
    MidiMessage n;
    using namespace std;
    buffer.clear();
    MidiBuffer processedMidi;
    int time;

    for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
        {
            if (m.isNoteOn())
            {
                    m = MidiMessage::noteOn(m.getChannel(), 60 , m.getVelocity());
                    n = MidiMessage::noteOn(m.getChannel(), 72 , m.getVelocity());
            }
            if (m.isNoteOff())
            {
                for (int i = 0; i < 3; i++)
                {
                    m = MidiMessage::noteOff(m.getChannel(), 60 , m.getVelocity());
                    n = MidiMessage::noteOn(m.getChannel(), 72 , m.getVelocity());
                }
            }
         processedMidi.addEvent (m, time);
         processedMidi.addEvent (n, time);
        }
        midiMessages.swapWith (processedMidi);

I don’t understand how to handle this :

i.getNextEvent (m, time)

processedMidi.addEvent (m, time);

I can see I am adding multiple events to a midi buffer at the same sample position ?

This didn’t help either !

void WaylochorderAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)

{
    auto startTime (Time::getMillisecondCounterHiRes() * 0.001);
    ScopedNoDenormals noDenormals;
    auto totalNumInputChannels  = getTotalNumInputChannels();
    auto totalNumOutputChannels = getTotalNumOutputChannels();

    MidiMessage m;
    MidiMessage n;
    using namespace std;
    buffer.clear();
    MidiBuffer processedMidi;
    int time;

    for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (m, time);)
        {
            if (m.isNoteOn())
            {
                    m = MidiMessage::noteOn(m.getChannel(), 60 , m.getVelocity());
                    m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001 - startTime);
                    n = MidiMessage::noteOn(m.getChannel(), 72 , m.getVelocity());
                    n.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001 - startTime);
            }
            if (m.isNoteOff())
            {
                for (int i = 0; i < 3; i++)
                {
                    m = MidiMessage::noteOff(m.getChannel(), 60 , m.getVelocity());
                    m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001 - startTime);
                    n = MidiMessage::noteOn(m.getChannel(), 72 , m.getVelocity());
                    n.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001 - startTime);
                }
            }
        auto timestamp = m.getTimeStamp();
        auto sampleNumber =  (int) (timestamp * 48000);
        processedMidi.addEvent (m, sampleNumber);
        timestamp = n.getTimeStamp();
        sampleNumber =  (int) (timestamp * 48000);
         processedMidi.addEvent (n, sampleNumber);
        }
        midiMessages.swapWith (processedMidi);

Tried this too !

void WaylochorderAudioProcessor::processBlock (AudioBuffer<float>& buffer, MidiBuffer& midiMessages)

{
    
    for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i)
    {buffer.clear (i, 0, buffer.getNumSamples());}
    
    MidiBuffer processedMidi;
    int time;
    MidiMessage m;
    int chordLength = 3;
    for(MidiBuffer::Iterator i (midiMessages); i.getNextEvent(m, time);)
    {
        if(m.isNoteOn()) {
    for(int i = 0;i<chordLength;i++) {

        int interval = 60 + i*12;
        MidiMessage n = MidiMessage::noteOn(m.getChannel(), interval, m.getFloatVelocity());
        processedMidi.addEvent(n, time);
    }
        }
        else if(m.isNoteOff())
        {
            MidiMessage n = MidiMessage::allNotesOff(m.getChannel());
            processedMidi.addEvent(n, time);
        }
    }
    midiMessages.swapWith(processedMidi);
    

}