#ADX2 ロボット機能を使ってMIDIを読み込んでみる
ADX2にロボット機能についてはこちらもどうぞ
ADX2ロボット機能を使ってみる備忘録
#読み込んだ動画
https://twitter.com/tatmos/status/1356719488855498752?s=20
#ADX2 ロボット機能を使ってMIDIを読み込んでみたところ#ggjmd で作ったメロディー用MIDIを読み込んでいます
— tatmos (@tatmos) February 2, 2021
オクターブ以上の変化は、適当にまるめています。
(オクターブ超えた時の波形を用意すれば再現もできる) pic.twitter.com/g7FknbiSwQ
1.読み込みたいMIDIのパスを設定 (パス区切り文字は/にする)
2.MaterialにADX2のマテリアル(波形)をドロップする。(MIDIでNoteNo60の音想定)
3.トラックを選択する (空のトラックを用意しておく)
4.スクリプトを実行する
実行するとしばらく、波形を配置する処理が入って、シーケンスが出来上がります。
たくさん並べられていくの見てるの楽しい
#使ったもの
MIDIの読み込みに mido を使いました。
#スクリプト
# --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ロボット機能でブロックの長さ調整
ADX2ロボット機能でMIDI4オクターブに挑戦