Serial MIDIの使い方

ArduinoなどのSerial通信をMIDIに変換します。Serial MIDIはArduino Unoを使って、センサーを使ったIoTのプログラミングの勉強をする時に使えるアプリだと思います。PCにArduinoをUSBケーブルで接続すると、PCからはシリアルデバイスとして見えます。デバイスマネージャで見ると下のように見えます。

ArduinoからPCへ送るデータを表示したい時、シリアルをモニターができるようなアプリを持ってくるか、Arduino IDEのシリアルモニターを使うのが一般的かと思います。ただ、シリアルのモニターだと二次利用が面倒ではないでしょうか。二次利用とは、例えばデータをブラウザで大きく表示したいとか、平均値を出したいとか。そこで、データをMIDIで送ることを考えます。MIDIならば、データを生値で使うことも、いろんなフリーのアプリがあり扱いに便利です。そこで登場するのかSerial-MIDIを使ってみます。

Serial-MIDIはSpikenzielabs.com のページから手に入ります。下の図を見ると、左からSerial data, Serial MIDI Converter, MIDI software/Hardware となっています。左からSerial ポート(RX/Serial In)から入ってきたデータは、Serial MIDI ConverterによりMIDIに変換されて、ソフトウェアのMIDI-INもしくは、PCのMIDI-OUT につながります。右からソフトウェアのMIDI-OUTもしくは、PCのMIDI-INから来たMIDIデータは、Serial MIDI ConverterによりSerial Dataに変換されてSerial Out(TX/Serial Out)から出力されます。


https://www.spikenzielabs.com/

ダウンロードは、ホームページの下の方、以下の画面に示すところにリンクがあります。application.windows_2.zipがダウンロードできます。このアプリにはJavaが必要ですので、もしインストールしていなけばJavaをjava.comからインストールしてください。

   

Serial_MIDI_Converter_V2D.exe をダブルクリックしてアプリケーションを起動します。多少起動に時間がかかる気がします。

Press the number key that matches your Arduino's serial Port
Arduinoのシリアルポートの番号を押せ、ということなので”A"もしくは"a"を押します。

Press the letter key that matches your serial port baud rate.
MIDIのボーレート(転送速度)は31250bpsなのですが、このアプリを使う上ではボーレートはどのように設定しても良いようです。Arduinoのスケッチを一番早い115200bpsで作りましたので、"F" もしくは"f"を押します。

Press the number key that matches MIDI INPUT port
MIDI INPUTのポートを選べとのこと。"C"のReal Time Sequencerとは何か?実はわかっていません。別途調べてみたいと思います。私のシステムではloop MIDIが入っているので、loopMIDI Port 1を選びます。”A"もしくは"a"を押します。

Press the number key that matches MIDI OUTPUT port
MIDI OUYPUTのポートを選べとのこと。

  • "A" Gervill: Javaのソフトシンセ(音源)のようです。
  • "B" Microsoft MIDI Mapper: MIDI のWindows独自のMIDIのパッチベイ(切り替え器)で、Windows XP まではシステムメニューで設定できました。Windows 7以降はアプリが無いと操作することができません。
  • "C" Microsoft GS Wavetable Synth: Windowsに内蔵している定番のソフトシンセ(音源)です。
  • ”D", "E": loopMIDI Port
  • ”F" Real Time Sequencer: 不明
ここでは音を鳴らしたいので、Microsoft GS Wavetable Synthを選びます。"C"もしくは"c"を押します。

Converter is running と表示し、Serial からMIDIへの変換が始まります



Arduino側のプログラム

Arduino UNO上にドレミファソラシドと音が鳴るプログラムを書きます。

    void setup() {
        Serial.begin(115200);
    }
    void loop() {
        NoteOn(0x3C);  delay(500);  //C
        NoteOff(0x3C); delay(500);
        NoteOn(0x3E);  delay(500);  //D
        NoteOff(0x3E); delay(500);
        NoteOn(0x40);  delay(500);  //E
        NoteOff(0x40); delay(500);
        NoteOn(0x41);  delay(500);  //F
        NoteOff(0x41); delay(500);
        NoteOn(0x43);  delay(500);  //G
        NoteOff(0x43); delay(500);
        NoteOn(0x45);  delay(500);  //A
        NoteOff(0x45); delay(500);
        NoteOn(0x47);  delay(500);  //B
        NoteOff(0x47); delay(500);
        NoteOn(0x48);  delay(500);  //C
        NoteOff(0x48); delay(500);
    }
    void NoteOn(unsigned char noteno){
        Serial.write(0x90); Serial.write(noteno); Serial.write(0x50);
    }
    void NoteOff(unsigned char noteno){
        Serial.write(0x80); Serial.write(noteno); Serial.write(0x00);
    }
    

MIDI OUTPUT の選択で、"A" Gervillを選んだ場合にもJavaのソフトシンセで音が鳴りました。