/* * Carla Native Plugins * Copyright (C) 2012 Filipe Coelho * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * For a full copy of the GNU General Public License see the COPYING file */ #include "carla_nativemm.h" #include class MidiSplitPlugin : public PluginDescriptorClass { public: MidiSplitPlugin(const PluginDescriptorClass* master) : PluginDescriptorClass(master) { if (! master) return; } ~MidiSplitPlugin() { } // ------------------------------------------------------------------- protected: PluginDescriptorClass* createMe() { return new MidiSplitPlugin(this); } void deleteMe() { delete this; } // ------------------------------------------------------------------- PluginCategory getCategory() { return PLUGIN_CATEGORY_UTILITY; } uint32_t getHints() { return 0; } const char* getName() { return "MIDI Split"; } const char* getLabel() { return "midiSplit"; } const char* getMaker() { return "falkTX"; } const char* getCopyright() { return "GNU GPL v2+"; } // ------------------------------------------------------------------- uint32_t getPortCount() { return PORT_MAX; } PortType getPortType(uint32_t) { return PORT_TYPE_MIDI; } uint32_t getPortHints(uint32_t index) { return (index == 0) ? 0 : PORT_HINT_IS_OUTPUT; } const char* getPortName(const uint32_t index) { switch (index) { case PORT_INPUT: return "input"; case PORT_OUTPUT_1: return "output-01"; case PORT_OUTPUT_2: return "output-02"; case PORT_OUTPUT_3: return "output-03"; case PORT_OUTPUT_4: return "output-04"; case PORT_OUTPUT_5: return "output-05"; case PORT_OUTPUT_6: return "output-06"; case PORT_OUTPUT_7: return "output-07"; case PORT_OUTPUT_8: return "output-08"; case PORT_OUTPUT_9: return "output-09"; case PORT_OUTPUT_10: return "output-10"; case PORT_OUTPUT_11: return "output-11"; case PORT_OUTPUT_12: return "output-12"; case PORT_OUTPUT_13: return "output-13"; case PORT_OUTPUT_14: return "output-14"; case PORT_OUTPUT_15: return "output-15"; case PORT_OUTPUT_16: return "output-16"; default: return ""; } } // ------------------------------------------------------------------- void activate() { memset(events, 0, sizeof(MidiEvent) * MAX_MIDI_EVENTS); } // ------------------------------------------------------------------- void process(float**, float**, uint32_t, uint32_t midiEventCount, MidiEvent* midiEvents) { MidiEvent midiEvent; for (uint32_t i=0; i < midiEventCount; i++) { memcpy(&midiEvent, &midiEvents[i], sizeof(MidiEvent)); uint8_t status = midiEvent.data[0]; uint8_t channel = status & 0x0F; CARLA_ASSERT(channel < 16); if (channel >= 16) continue; status -= channel; midiEvent.portOffset = channel; midiEvent.data[0] = status; writeMidiEvent(&midiEvent); } } // ------------------------------------------------------------------- private: enum Ports { PORT_INPUT = 0, PORT_OUTPUT_1, PORT_OUTPUT_2, PORT_OUTPUT_3, PORT_OUTPUT_4, PORT_OUTPUT_5, PORT_OUTPUT_6, PORT_OUTPUT_7, PORT_OUTPUT_8, PORT_OUTPUT_9, PORT_OUTPUT_10, PORT_OUTPUT_11, PORT_OUTPUT_12, PORT_OUTPUT_13, PORT_OUTPUT_14, PORT_OUTPUT_15, PORT_OUTPUT_16, PORT_MAX }; static const unsigned short MAX_MIDI_EVENTS = 512; MidiEvent events[MAX_MIDI_EVENTS]; }; static MidiSplitPlugin midiSplitPlugin(nullptr); CARLA_REGISTER_NATIVE_PLUGIN_MM(midiSplit, midiSplitPlugin)