RtMidiを使って仮想Midiデバイスのルーティング
仮想MIDIデバイスを登録してMIDIキーボードから受け取った信号を ちょっとだけ加工してMIDIインターフェースに送出したい
#include <iostream> #include <cstdlib> #include "RtMidi.h" void mycallback(double deltatime, std::vector<unsigned char> *message, void *userData) { unsigned int nBytes = message->size(); for (unsigned int i=0; i<nBytes; i++) { std::cout << "Byte " << i << " = " << (int)message->at(i) << ", "; } RtMidiOut *midiout = (RtMidiOut *)userData; if ( nBytes > 0 ) { std::cout << "stamp = " << deltatime << std::endl; /* これがちょっとだけ加工している内容 */ (*message)[1] = 64; midiout->sendMessage(message); } } int main() { RtMidiOut *midiout = new RtMidiOut(); // midiout = new RtMidiOut(); unsigned int outPorts = midiout->getPortCount(); if (outPorts == 0) { std::cout << "No out ports available!\n"; delete midiout; return 0; } midiout->openPort(0); RtMidiIn *midiin = new RtMidiIn(); unsigned int inPorts = midiin->getPortCount(); if (inPorts == 0) { std::cout << "No in ports available!\n"; delete midiout; delete midiin; return 0; } midiin->openPort(1); midiin->setCallback(&mycallback, midiout); // Don't ignore sysex, timing, or active sensing messages. midiin->ignoreTypes( false, false, false ); std::cout << "\nReading MIDI input ... press <enter> to quit.\n"; char input; std::cin.get(input); delete midiout; delete midiin; return 0; }