LoginSignup
0
0

More than 3 years have passed since last update.

toio SDK for UnityでMMLを再生する

Posted at

概要

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)

技術情報

MMLのパース

C#で書かれたMMLPlayer(パーサ)を教えていただいたので、こちらを利用しました。
https://github.com/Enichan/textplayer

Unity projectのAssets内に入れたら、問題なくビルド通ります。

TextPlayer.MML.MMLPlayerを継承したclassを作成して、PlayNote()をoverrideし、受け取ったNoteからCube.SoundOperationに変換してtoioキューブに再生指示を出します。

ToioCubeMmlPlayer.cs
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キューブと通信を行うため、同時に他の通信を行うとラグが出る可能性はあります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0