2018年5月3日木曜日

Arduino + LCDで受信したMIDIメッセージを表示

MIDIの規格はよくわからないので、MIDI OXというPCのMIDIユーティリティ・ソフトを使って受信したメッセージを表示させてみました。

「SF BAY MUSIC TECH」さんの「MIDI OX を使って MIDI メッセージを記録する方法」に使用方法があります。

MIDI接続


MIDI Keyboard(Novation Remote 25)からPCに直接USBでPCに接続し、同時にMIDI OUTからUSBオーディオ・インターフェイスのMIDI INに接続しました。PCへは2系統のMIDI入力になります。

MIDI Deviceの設定


MIDI OXの[Option]-[MIDI Devices...]でダイアログが開きます。


認識しているデバイスが表示されるので、[MIDI Inputs:]で[1) ReMOTE]と[2) TASCAM US-144 MKII MIDI]両方を選択しました。


MIDIキーボードで適当に鍵盤を押すと[Monitor - Input]に受信したMIDIメッセージが表示されます。2系統で受信しているので[IN]カラムの値が1と2で同じメッセージが受信されています。

Arduino UnoでMIDIメッセージを表示する。


Arduinoに16行2桁のキャラクタLCD(HD44780互換)を接続して受信したMIDIメッセージを表示させました。フォトカプラを使ったMIDIの受信についていては前回の記事にあります。

ブレッドボード配線図




Arduinoのスケッチ <MIDI_Display_Message.ino>

#include <MIDI.h>
#include <LiquidCrystal.h>

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

// MIDI
MIDI_CREATE_DEFAULT_INSTANCE();

// LCD
static const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

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

void printNoteOnOff(const char* type, byte inChannel, byte inNote, byte inVelocity) 
{
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print(type);
    lcd.print(' ');
    lcd.print(inChannel);
    lcd.print(' ');
    lcd.print(inNote);
    lcd.print(' ');
    lcd.print(inVelocity);  
}

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

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

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

void setup()
{
    MIDI.setHandleNoteOn(handleNoteOn);
    MIDI.setHandleNoteOff(handleNoteOff);
    MIDI.begin(MIDI_CHANNEL_OMNI);

    lcd.begin(16, 2);
    lcd.print(TITLE_STR1);
    lcd.setCursor(0, 1);
    lcd.print(TITLE_STR2);
}

void loop()
{
    if (MIDI.read()) {

        // Display Raw Midi Message

        byte type    = MIDI.getType();
        byte channel = MIDI.getChannel(); 
        byte data1   = MIDI.getData1();
        byte data2   = MIDI.getData2();

        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print(type, HEX);
        lcd.print(' ');
        lcd.print(channel, HEX);
        lcd.print(' ');
        lcd.print(data1, HEX);
        lcd.print(' ');
        lcd.print(data2, HEX);
    }
}


LCDの1行目は、受信したMIDIメッセージの
Type | Channel | Data1 | Data2
を表示。2行目はNoteON、NoteOFFのときのみ
ON/OFF | Channel | Note | Velocity
を表示するようにしています。

ちゃんとはチェックしていませんがだいたいのメッセージは拾えているようです。

まずは、NoteON/NoteOFF、PitchBend、Modulation、Control Changeが使えればいいかな~と思っています。