#include "midi.hpp" namespace rack { //////////////////// // MidiIO //////////////////// int MidiIO::getDeviceCount() { if (rtMidi) return rtMidi->getPortCount(); return 0; } std::string MidiIO::getDeviceName(int device) { if (rtMidi) { if (device < 0) return ""; return rtMidi->getPortName(device); } return ""; } void MidiIO::openDevice(int device) { if (rtMidi) { rtMidi->closePort(); if (device >= 0) { rtMidi->openPort(device); } this->device = device; } } bool MidiIO::isActive() { if (rtMidi) return rtMidi->isPortOpen(); return false; } json_t *MidiIO::toJson() { json_t *rootJ = json_object(); std::string deviceName = getDeviceName(device); json_object_set_new(rootJ, "deviceName", json_string(deviceName.c_str())); json_object_set_new(rootJ, "channel", json_integer(channel)); return rootJ; } void MidiIO::fromJson(json_t *rootJ) { json_t *deviceNameJ = json_object_get(rootJ, "deviceName"); if (deviceNameJ) { std::string deviceName = json_string_value(deviceNameJ); // Search for device with equal name for (int device = 0; device < getDeviceCount(); device++) { if (getDeviceName(device) == deviceName) { openDevice(device); break; } } } json_t *channelJ = json_object_get(rootJ, "channel"); if (channelJ) channel = json_integer_value(channelJ); } //////////////////// // MidiInput //////////////////// static void midiInputCallback(double timeStamp, std::vector *message, void *userData) { if (!message) return; if (!userData) return; MidiInput *midiInput = (MidiInput*) userData; if (!midiInput) return; MidiMessage midiMessage; midiMessage.time = timeStamp; midiMessage.data = *message; midiInput->onMessage(midiMessage); } MidiInput::MidiInput() { rtMidiIn = new RtMidiIn(); rtMidi = rtMidiIn; rtMidiIn->setCallback(midiInputCallback, this); } MidiInput::~MidiInput() { delete rtMidiIn; } void MidiInputQueue::onMessage(const MidiMessage &message) { for (uint8_t d : message.data) { debug("MIDI message: %02x", d); } const int messageQueueSize = 8192; if (messageQueue.size() < messageQueueSize) messageQueue.push(message); } //////////////////// // MidiOutput //////////////////// MidiOutput::MidiOutput() { rtMidiOut = new RtMidiOut(); rtMidi = rtMidiOut; } MidiOutput::~MidiOutput() { delete rtMidiOut; } } // namespace rack