完成品
twitterにて実演動画を投稿したので見ていただければと思います。
GitHubに成果物がございます。
設計
構築図、使用デバイス・ソフトについて説明します。
構築図
構築図は以下の通りです。
フローを簡単に説明すると、
** ① ピアノから音声データとMIDIデータを取得**
** ※音声データはMIDIインターフェースを通す**
** ② 取得したデータそれぞれ、**
** 音声データ:Audacityで録音**
** MIDIデータ:Unityでエフェクトを生成**
** ③ プロジェクタで投影**
という感じです。
使用デバイス・ソフト
ハードウェア
項目 | 規格・型番 |
---|---|
ピアノ | CASIO Privia PX-S1000 |
MIDIインターフェース | ベリンガー UCA222 |
ケーブル類 | オーディオ赤白 オーディオ3.5mm抵抗あり HDMI USB Aオス-Bオス |
ソフトウェア
項目 | バージョン |
---|---|
OS | Windows10 Home |
Unity | 2019.2.0f1 |
blender | 2.79b |
Audacity | 2.2.2 |
PCへのMIDIデータ取得
keijiroさんのMIDIreceiverを使用させていただきました。
発案当初は、ピアノ → Python → C# → Unity というようにPythonをかませてMIDIデータをUnityに処理させようと考えていました。しかし、PythonをかませるとUnityでの動作がめちゃくちゃ遅くなる問題がわかったり、C#だけでMIDIを読み込むのが結構楽ということがわかり廃案となりました。
Unity内で実行するとMIDI ReceiverのインスペクターからC#スクリプトの挙動が確認できます。
Unity内でのMIDIデータな処理
C#スクリプトをかく
MIDIデータは例えば、
s(144) d(60, 127) from 3016879824
というように構成されておりそれぞれ
s("144:on 128:off") d("音高:21~108", "ベロシティ") from "デバイス名"
となっています。
Unity内で簡易的な鍵盤を作成し入力したMIDIデータ(21~108)までの数値それぞれに対応した座標からパーティクルが出てアニメーションが再生されるようにC#スクリプトParticleTrigger.cs
を書きました。パーティクル射出座標指定とアニメーション再生について、1オクターブごとに制御したほうが絶対よかったのですが、狂った私は88分岐のswitch case文を書きました。
↓ 88分岐の一部(ぜったいもっといいやり方がある気がする……)
パーティクル
パーティクルは雰囲気良さげのマテリアルを選んで、射出角度や速度がランダムにばらけるようにカーブの調整を行いました。
↓ パーティクルの生存期間の速度カーブ
アニメーション
またパーティクルのほかに鍵盤を光らせるアニメーションも作成しました。
とはいっても、打鍵の瞬間にパッと明るく光ってゆっくりと消えていくような簡素なアニメーションです。