MIDIのイベントに合わせてキューブが落ちるようにした

最終的にはMRピアノを再現したくその過程でやったことをまとめました。
MIDIファイルも用意してますが、Google Driveに保存してるため何かの拍子で場合によっては消えている可能性があります。その場合は申し訳ないですが自前で用意してください。

# １．MIDI Animation Track for Unity Timelineを導入

UnityのPacageの中にあるmanifest.jsonに以下を書き込む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/5b094796-2d0d-3b01-34cb-894a311c07f2.png)

```json
{
   "scopedRegistries": [
    {
      "name": "Keijiro",
      "url": "https://registry.npmjs.com",
      "scopes": [
        "jp.keijiro"
      ]
    }
  ],
  "dependencies": {
    "jp.keijiro.klak.timeline.midi": "1.0.5",
    ...
  }
} 

```
こんな感じに書きこみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/235488fb-f8a4-fbc7-4a2b-9a2dde63395b.png)

成功すると以下の画面が出ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/db330202-0a6d-6054-ba7e-9e70a3a11e1f.png)

これで導入は完了です。
PacageManagerにも無事追加されてますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/3384744a-1749-7720-949f-a279d4c0cc7e.png)

# ２．キューブが落ちるスクリプトを書く

down.csのファイル名で以下のコードをコピペする
```down.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class down : MonoBehaviour
{
    //キューブの速度はここで操作
    float speed = 0.01f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(0,-speed,0);
    }
}
```
キューブにアタッチする。

実行結果

https://x.com/RsMtJkjuAc46Nyo/status/1734980122686673381?s=20

# ３．キューブを生成する関数を作る

空のオブジェクト（CubeSet）を生成する

以下のコードをアタッチする

```Cube.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Cube : MonoBehaviour
{
    [SerializeField] GameObject cubePrefab;
    // Start is called before the first frame update
    void Start()
    {
        //プレハブを生成
        CubeSet();
    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            CubeSet();
        }
    }

    public void CubeSet()
    {
        //プレハブを生成
        //Instantiate(生成したいもの, 場所,角度);
        Instantiate(cubePrefab, new Vector3(0,10,0),Quaternion.identity);//Quaternion.identity要は無回転
    }
}
```
インスペクターにプレハブをセット（忘れがちなんでちゃんとやりましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/bf875abf-2c76-1e5c-5259-b4737418da92.png)

# ４．タイムラインを作成
右クリックからTimelineを生成し、ダブルクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/d1538834-830a-dc3f-f078-c05ca5c4e906.png)
こんな画面になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/e8ce7d59-5cdc-25a4-5583-ce78ee7057e5.png)

空のオブジェクト（Timeline）を生成し、先ほど生成したTimelineをアタッチ、プラスでAudioSoruceのコンポーネントも追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/a8fd9b14-86d6-8c35-4e2b-4f023c8fcd55.png)

mp3,Timeine（空のオブジェクト）,MIDIファイルそれぞれをドロップアンドドロップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/7cf2649e-1fe8-72ea-4577-24246565b2da.png)
MIDIとmp3の長さの比率はなんかおかしかったので僕はこんな感じにしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/ccf54c92-963a-3496-dd7b-f1a3611d038c.png)
↓今回使用したファイル

https://drive.google.com/drive/folders/1KQqk6lyS7fh2stKSrOorhIWgqnbXjLyc?usp=sharing

＜MIDIファイルを自前で用意した方へ＞

MIDIファイルだけでなくmp3ファイルも必要なので以下のサイトで用意してください
（mp4ではなくmp3）

https://www.freeconvert.com/ja/mid-to-mp3


MIDIファイルとmp3を追加すると以下のようになる
※僕はDominoで自作した関係上トラックが18個あるので18個あります。実際に打ったのは3つ目のトラックなので赤で囲ったものを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/c8d1bae4-f3b2-dcf0-9d62-169cfcaacb66.png)

# ５．MIDI Signal Receiver（MIDIのイベントを取得）を作成

空のオブジェクト（MIDI Signal Receiver）を生成

MIDI Signal Receiverのコンポーネントと以下のコードをアタッチ
```NoteInstance.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NoteInstance : MonoBehaviour
{
    [SerializeField] Cube cube = default;
    public void NoteEvent()
    {
        Debug.Log("音が鳴りました");
        cube.CubeSet();
    }
}
```
このようになる（※Note On Eventの＋を押した）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/492e0c3f-7c25-0997-c286-bbf3caa346df.png)

次にMIDI Signal Receiverの設定をいじる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/170455f3-8b1d-92f6-ab35-7b891363a25b.png)

MIDI Signal Receiverをアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/1b66299e-ab3a-b57e-33ec-29d606e445d4.png)

CubeSetをMIDI Signal ReceiverのインスペクターのNoteInstance.csアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432250/0ccb8f5e-e246-111c-1663-e9b2f309fcff.png)

# ６．実行結果
少しずれてますが大体やりたいことはできたと思います

https://x.com/RsMtJkjuAc46Nyo/status/1735000358047600813?s=20

# 参考記事、動画

https://qiita.com/miyagoshisouta/items/8bbd5115c3747985f5c7

↓2~6の動画にお世話になりました。

https://www.youtube.com/watch?v=2JLSla8LDo4&list=PLEkX-p0oUs8znYFdVLvAKK43Q0EcZW-4Y&index=2