19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ピアノへのインタラクティブプロジェクションマッピングの組み込み

Last updated at Posted at 2021-07-04

完成品

twitterにて実演動画を投稿したので見ていただければと思います。
GitHubに成果物がございます。

設計

構築図、使用デバイス・ソフトについて説明します。

構築図

構築図は以下の通りです。
フローを簡単に説明すると、

** ① ピアノから音声データとMIDIデータを取得**
**   ※音声データはMIDIインターフェースを通す**
** ② 取得したデータそれぞれ、**
**   音声データ:Audacityで録音**
**   MIDIデータ:Unityでエフェクトを生成**
** ③ プロジェクタで投影**

という感じです。

image.png

使用デバイス・ソフト

ハードウェア

項目 規格・型番
ピアノ 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#スクリプトの挙動が確認できます。
image.png

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分岐の一部(ぜったいもっといいやり方がある気がする……)
image.png

パーティクル

パーティクルは雰囲気良さげのマテリアルを選んで、射出角度や速度がランダムにばらけるようにカーブの調整を行いました。
↓ パーティクルの生存期間の速度カーブ
image.png

↓ 完成品
image.png

アニメーション

またパーティクルのほかに鍵盤を光らせるアニメーションも作成しました。
とはいっても、打鍵の瞬間にパッと明るく光ってゆっくりと消えていくような簡素なアニメーションです。

Videotogif.gif

19
15
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
19
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?