#ADX2 ロボット機能を使ってMIDIを読み込んでみる

#ADX2 ロボット機能を使ってMIDIを読み込んでみる

ADX2にロボット機能についてはこちらもどうぞ
[ADX2ロボット機能を使ってみる備忘録](https://qiita.com/tatmos/items/f33756ab5035b22190db)

#読み込んだ動画
https://twitter.com/tatmos/status/1356719488855498752?s=20
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/ADX2?src=hash&amp;ref_src=twsrc%5Etfw">#ADX2</a> ロボット機能を使ってMIDIを読み込んでみたところ<a href="https://twitter.com/hashtag/ggjmd?src=hash&amp;ref_src=twsrc%5Etfw">#ggjmd</a> で作ったメロディー用MIDIを読み込んでいます<br>オクターブ以上の変化は、適当にまるめています。<br>（オクターブ超えた時の波形を用意すれば再現もできる） <a href="https://t.co/g7FknbiSwQ">pic.twitter.com/g7FknbiSwQ</a></p>&mdash; tatmos (@tatmos) <a href="https://twitter.com/tatmos/status/1356719488855498752?ref_src=twsrc%5Etfw">February 2, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/5b9adbd8-5496-5ede-39b3-50690bb891e3.png)

1.読み込みたいMIDIのパスを設定　（パス区切り文字は/にする）
2.MaterialにADX2のマテリアル（波形）をドロップする。（MIDIでNoteNo60の音想定）
3.トラックを選択する　（空のトラックを用意しておく）
4.スクリプトを実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/336594ec-849d-9186-99fa-5d42ad07ad8c.png)

実行するとしばらく、波形を配置する処理が入って、シーケンスが出来上がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/1876435b-15b8-4532-589f-f8959d6601be.png)

たくさん並べられていくの見てるの楽しい


#使ったもの
MIDIの読み込みに　[mido](https://mido.readthedocs.io/en/latest/index.html)　を使いました。


#スクリプト
``` readMidi.py
# --Description:[tatmos]MIDIを読みこみwaveformを配置する
import sys
import cri.atomcraft.project
import cri.atomcraft.project as acproject
import cri.atomcraft.debug as acdebug
# --BeginUserVariable
"""
MIDI_FILE:
  type:string
  comment:MIDI File Path
MATERIAL:
  type:object
  comment:Material
"""
MIDI_FILE = "C:/Users/tanakat/Documents/Nuendo/20210128GGJ/20210128GGJ.mid"
MATERIAL = cri.atomcraft.project.get_object_from_path("/WorkUnits/WorkUnit_Block_IntaractiveMusic_MaterialInfo/MaterialRootFolder/Sozai20120527/epianoC.wav")["data"]
# --EndUserVariable

# 選択しているTrackを得る
selected_Track = acproject.get_selected_objects("Track")["data"]
if not selected_Track :
    acdebug.warning("MIDIを読み込むトラックを選択してください。")
    sys.exit()

# オブジェクトパス表示
acdebug.log("Target Path:\"{0}\"".format(acproject.get_object_path(selected_Track[0])["data"] ))

# Materialを得る
if not MATERIAL :
    acdebug.warning("Materialをセットしてください。")
    sys.exit()

# MIDI読み込み
import mido 
from mido import MidiFile

mid = MidiFile(MIDI_FILE)

for i, track in enumerate(mid.tracks):
    print('Track {}: {}'.format(i, track.name))
    absolute_time = 0
    for msg in track:
        if msg.type == 'set_tempo':
            tempo = msg.tempo
            acdebug.warning("temo is {0}".format(tempo))
        if msg.time > 0:
            absolute_time = absolute_time + mido.tick2second(msg.time,480,tempo)*1000

	#note onのみ
        if msg.type == 'note_on':
	        print(absolute_time)
	       
	        # マテリアルを指定してウェーブフォーム リージョンを作成
	        waveform_region = acproject.create_waveform_region(selected_Track[0], MATERIAL)["data"]
	        acproject.set_value(waveform_region, "Volume", msg.velocity/127)
	        acproject.set_value(waveform_region, "DelayTimeMS", absolute_time)
	        if (msg.note-60) <= 12 and (msg.note-60) >= -12:
                    acproject.set_value(waveform_region, "Pitch", (msg.note-60)*100)
	        else:
                    #1octより離れている時
                    acproject.set_value(waveform_region, "Pitch", ((msg.note-60)%12)*100)	

	        acproject.set_value(waveform_region, "Comment", "note {0} vel {1} absTime {2}".format(msg.note,msg.velocity,absolute_time))
```

#改善点

オクターブ超えのピッチ指定がADX2だとできないので、オクターブごとに元マテリアルを用意すると良いかも

#ADX2ロボット続き
[ADX2ロボット機能でブロックの長さ調整](https://qiita.com/tatmos/items/0138ed1160e31ebb9e41)
[ADX2ロボット機能でMIDI4オクターブに挑戦](https://qiita.com/tatmos/items/9ce9dd5fbf77ecf4439e)