概要
toio SDK for UnityのMIDI note number再生機能で、MML(Music Macro Langauge)を再生しました。
GitHub repository
WebGL sample
toioキューブ実機が必要です。
3台まで接続可能にしています(当方2台しか持っていないので3台は動作未確認)
https://zurachu.github.io/toio-karuta/
Google Chrome推奨、あと別タブに切り替えるとパフォーマンスが落ちて発音のタイミングがズレズレになるので注意です。
動画(Twitter)
#toio でmml再生するやつ、Qiita用に再収録。 pic.twitter.com/5fMeVUGt5P
— ヅラChu (@zurachu) January 25, 2021
技術情報
MMLのパース
C#で書かれたMMLPlayer(パーサ)を教えていただいたので、こちらを利用しました。
https://github.com/Enichan/textplayer
Unity projectのAssets内に入れたら、問題なくビルド通ります。
TextPlayer.MML.MMLPlayerを継承したclassを作成して、PlayNote()をoverrideし、受け取ったNoteからCube.SoundOperationに変換してtoioキューブに再生指示を出します。
public class ToioCubeMmlPlayer : MMLPlayer
{
// (中略)
protected override void PlayNote(Note note, int channel, TimeSpan time)
{
var durationMs = (int)note.Length.TotalMilliseconds;
var volume = (byte)(note.Volume * 255);
var noteNumber = (byte)(noteMap[note.Type] + note.Octave * noteNumberPerOctave);
if (note.Sharp)
{
noteNumber++;
}
var operations = new Cube.SoundOperation[]
{
new Cube.SoundOperation(durationMs: durationMs, volume: volume, note_number: noteNumber)
};
cube.PlaySound(1, operations);
}
}
Cube.SoundOperationの同時指定数は最大59ですが、MMLPlayerによって、必要なタイミングで1音の指定が送られる→1音ぶんのCube.SoundOperationを送る、で良くなっているので、Operationの最大数を考慮する必要は無いです。
また、所謂「テンポずれ」問題も起こらないです。
一方で、都度toioキューブと通信を行うため、同時に他の通信を行うとラグが出る可能性はあります。