い、い、、いっくし!!

各記事はkwskってコメントすると詳しく書き直します

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;
}