#include "rtmidi.hpp" namespace rack { static void midiInputCallback(double timeStamp, std::vector *message, void *userData) { if (!message) return; if (!userData) return; RtMidiInputDevice *midiInputDevice = (RtMidiInputDevice*) userData; if (!midiInputDevice) return; MidiMessage msg; if (message->size() >= 1) msg.cmd = (*message)[0]; if (message->size() >= 2) msg.data1 = (*message)[1]; if (message->size() >= 3) msg.data2 = (*message)[2]; midiInputDevice->onMessage(msg); } RtMidiInputDevice::RtMidiInputDevice(int driver, int device) { rtMidiIn = new RtMidiIn((RtMidi::Api) driver, "VCV Rack"); rtMidiIn->ignoreTypes(false, false, false); rtMidiIn->setCallback(midiInputCallback, this); } RtMidiInputDevice::~RtMidiInputDevice() { rtMidiIn->closePort(); delete rtMidiIn; } std::vector rtmidiGetDrivers() { std::vector rtApis; RtMidi::getCompiledApi(rtApis); std::vector drivers; for (RtMidi::Api api : rtApis) { drivers.push_back((int) api); } return drivers; } int rtmidiGetDeviceCount(int driver) { RtMidiIn *rtMidiIn = new RtMidiIn((RtMidi::Api) driver); int count = rtMidiIn->getPortCount(); delete rtMidiIn; return count; } std::string rtmidiGetDeviceName(int driver, int device) { RtMidiIn *rtMidiIn = new RtMidiIn((RtMidi::Api) driver); std::string name = rtMidiIn->getPortName(device); delete rtMidiIn; return name; } RtMidiInputDevice *rtmidiGetDevice(int driver, int device) { // TODO Pull from cache return new RtMidiInputDevice(driver, device); } } // namespace rack