2018年5月5日土曜日

Nucleo(mbed)でMIDIメッセージを受信する

mbedにもArduinoのMIDI Libraryを移植したものがあるので、テストしました。

ブレッドボード配線図


Nucleo F446REにはSerialが複数あるので、今回はSerial 2を使用しました。NucleoのArduino HeaderのD2(RX)、D10(TX)です。Serial 1はプログラミングやPCとのSerial通信に使用します。

ファームウェア <main.cpp>

#include "mbed.h"
#include "MIDI.h"

#define TITLE_STR1  ("MIDI Message")
#define TITLE_STR2  ("20180502")

MIDI midi(D10, D2); // Serail2
Serial pc(D1, D0);  // Serial1

// -----------------------------------------------------------------------------

void printNoteOnOff(const char* type, byte inChannel, byte inNote, byte inVelocity) 
{
    pc.printf("%s %3d %3d %3d\r\n", type, inChannel, inNote, inVelocity);
}

void handleNoteOn(byte inChannel, byte inNote, byte inVelocity)
{
    midi.sendNoteOn(inNote, inVelocity, inChannel);
    printNoteOnOff("On ", inChannel, inNote, inVelocity);
}

void handleNoteOff(byte inChannel, byte inNote, byte inVelocity)
{
    midi.sendNoteOff(inNote, inVelocity, inChannel);
    printNoteOnOff("Off", inChannel, inNote, inVelocity);
}

// -----------------------------------------------------------------------------

int main()
{
    midi.setHandleNoteOn(handleNoteOn);
    midi.setHandleNoteOff(handleNoteOff);
    midi.begin(MIDI_CHANNEL_OMNI);
    
    pc.baud(115200);

    for (;;) {
        if (midi.read()) {
            byte type    = midi.getType();
            byte channel = midi.getChannel(); 
            byte data1   = midi.getData1();
            byte data2   = midi.getData2();
    
            pc.printf("%2x %2x %2x %2x\r\n", type, channel, data1, data2);
        }
    }
}

mbed repository
https://os.mbed.com/users/ryood/code/MIDI_Display_Message/

動作としては、MIDI IN(D2)で受信したMIDIメッセージをMIDI OUT(D10)にオウム返しし、SerialでPCに送信するものです。

Puttyで受信

送受信のようす

ch1:MIDI IN ch2:MIDI OUT

Nucleoは3.3V駆動なので、MIDI OUTの信号レベルが3.3Vになっています。MIDIの受信はフォトカプラで受けることになっているので3.3Vでも大丈夫なようですが、できれば5V系にレベル・シフトしておいた方よさそうです。