XIAOをMIDIインターフェースにしてみる:Seeeduino XIAO and MIDIUSB Library

Arduino/SAMDArduino,MIDI,SAMD21,Seeeduino,Synthesia,XIAO,インターフェース

どうやらUSB HOSTになれるらしいSeeeduino XIAOさん。

今回はUSB HOSTでは無いですが、XIAOさんをMIDIインターフェースにしてみようと思います。

ライブラリは更新が活発そうでクロスプラットフォームを謳っているTinyUSBを使ってみようと思い、Arduinoラッパーの「Adafruit TinyUSB Library for Arduino」でexamplesを動かそうとしてみたのですが、、、

USE_TINYUSBを有効化しろとか、Adafruit_USBD_CDC.hをArduino.hから使える様にしろとか

沢山のハードルがありますて・・・

抽象クラスだからインスタンス化できないヨとか言われたり、ソレ、未定義だよとか言われたり

ちょっとづつ繋いでみるも

うん、なんかマクロが上手く動いてくれまい。

結局断念

とりあえずAdafruitのライブラリは諦めますん( ノД`)

さて、ざっとMIDIインターフェースになれるモジュールを探してみますと、シンプルで判り易いコードの「MIDIUSB」ライブラリが良さそうでしたのでこれを使ってみます。

TinyUSBでちょっと疲れたので、あまりいじらずに、、、

こちらの例を動かしてみようと思います。

ソースを見るに、ドの音を押したり離したりしているだけっぽいですので、ちょこっと足しまして

折角なのでMIDIキーボードの全キーを押してみようかと。

#include <Arduino.h>

//#include "USB\SAMD21_USBDevice.h"

/*
 * MIDIUSB_test.ino
 *
 * Created: 4/6/2015 10:47:08 AM
 * Author: gurbrinder grewal
 * Modified by Arduino LLC (2015)
 */
#include "MIDIUSB.h"

uint8_t note_num = 0;

// First parameter is the event type (0x09 = note on, 0x08 = note off).
// Second parameter is note-on/note-off, combined with the channel.
// Channel can be anything between 0-15. Typically reported to the user as 1-16.
// Third parameter is the note number (48 = middle C).
// Fourth parameter is the velocity (64 = normal, 127 = fastest).

void noteOn(byte channel, byte pitch, byte velocity)
{
	midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
	MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity)
{
	midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
	MidiUSB.sendMIDI(noteOff);
}

void setup()
{
	Serial.begin(115200);
	// ちょっと待つ
	delay(2000);
}

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value)
{
	midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
	MidiUSB.sendMIDI(event);
}

bool flag = false;

void loop()
{
	/*
  Serial.println("Sending note on");
  noteOn(0, 48, 64);   // Channel 0, middle C, normal velocity
  MidiUSB.flush();
  delay(500);
  Serial.println("Sending note off");
  noteOff(0, 48, 64);  // Channel 0, middle C, normal velocity
  MidiUSB.flush();
  delay(1500);
*/

	if (flag)
	{

		Serial.print("Sending note on at : ");
		Serial.print(note_num);
		Serial.println("");
		noteOn(0, note_num, 64); // Channel 0, middle C, normal velocity
		MidiUSB.flush();

		delay(150);

		Serial.println("Sending note off");
		noteOff(0, note_num, 64); // Channel 0, middle C, normal velocity
		MidiUSB.flush();

		delay(80);

		// 全部押し
		if (note_num > 127)
		{
			Serial.println("Sending note on at ALL");
			for (uint8_t i = 0; i < 128; i++)
			{
				noteOn(0, i, 64); // Channel 0, middle C, normal velocity
				MidiUSB.flush();
			}

			delay(800);

			Serial.println("Sending note off");
			for (uint8_t i = 0; i < 128; i++)
			{
				noteOff(0, i, 64); // Channel 0, middle C, normal velocity
				MidiUSB.flush();
			}
			delay(80);

			note_num = 0;
		}
		else
		{
			note_num++;
		}
	}
	else
	{
		// 開始ボタン
		if (Serial.available())
		{
			int inputchar = Serial.read();

			// mキー
			if (char(inputchar) == 'm')
			{
				flag = true;
			}
		}
	}

	// controlChange(0, 10, 65); // Set the value of controller 10 on channel 0 to 65
}

ササッと転送すると、WindowsのデバイスマネージャにXIAOが。

XiaoMidiInterfaceTest01

「サウンド、ビデオ、およびゲーム コントローラ」には「Seeeduino XIAO」

「ソフトウェア デバイス」には「Seeeduino XIAO [0]」「Seeeduino XIAO [1]」が現れました。

どれがどんな役目なのかはよく判りませんが

デバイスの種類から推察するに、上段は物理デバイスのハンドラで、下段の二つはMIDI機能としての論理デバイスハンドラかなぁ。

XIAOさんの本体LEDがノートon/offに合わせて光っていますが、これだけではちゃんと動いているのか判りませんのでちょっとMIDIで動かせるソフトを立ち上げてみます。

Synthesiaで動作確認

今回使うのはコレ。

Synthesia – A fun way to learn how to play the piano.

ウチのがピアノを練習したいとかで購入したシンセシアというソフト。

見ている分にはとても楽しそうなソフト。

昔流行ったビーマニみたいな感じ。

勿論、私は全く弾けませんのでPlayしても楽しむ以前の問題ですが・・・

XiaoMidiInterfaceTest02

設定を開くと、MIDIデバイスにXIAOさんが居るじゃぁありませんか。

入力の所をクリックして有効化してみます。

きっと鳴ってくれると信じてた。

これでXIAOさんに自動演奏とかさせられますね。

なんか色々できそうで楽しみです。

前半はライブラリの問題で悶々としましたが、後半使ったライブラリはとても見易くシンプルで、とりあえず動かすにはとても良いと思います。

実は全くサッパリMIDIの事は判りませんが、多分どこかにMIDIの信号一覧とかあるでしょうキット。

XIAOは何か作ってみようかなって気にさせてくれます。