MIDI Pipe Filter

Custom MIDI pipe that filters and modifies messages. Only Note messages pass through, transposed down one octave and redirected to Channel 5.

Original: MIDI_Pipes-Filter.ino

#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include <cs_midi.h>

using namespace cs;

BluetoothMIDI_Interface midi;

struct NoteFilter : MIDI_Pipe {
    void mapForwardMIDI(ChannelMessage msg) override {
        switch (msg.getMessageType()) {
            case MIDIMessageType::NoteOff:
            case MIDIMessageType::NoteOn:
                msg.setChannel(Channel_5);
                if (msg.data1 >= 12)
                    msg.data1 -= 12;
                sourceMIDItoSink(msg);
                break;
            default:
                break;
        }
    }
    void mapForwardMIDI(SysExMessage) override {}
    void mapForwardMIDI(SysCommonMessage) override {}
    void mapForwardMIDI(RealTimeMessage msg) override {
        sourceMIDItoSink(msg);
    }
};

NoteFilter filter;

int main() {
    stdio_init_all();
    if (cyw43_arch_init()) return 1;
    midi >> filter >> midi;
    midi.begin();
    while (true) {
        midi.update();
        sleep_ms(1);
    }
}