1
1

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.

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

Last updated at Posted at 2021-02-02

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

ADX2にロボット機能についてはこちらもどうぞ
ADX2ロボット機能を使ってみる備忘録

#読み込んだ動画
https://twitter.com/tatmos/status/1356719488855498752?s=20

#使い方
image.png

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

image.png

実行するとしばらく、波形を配置する処理が入って、シーケンスが出来上がります。
image.png

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

#使ったもの
MIDIの読み込みに mido を使いました。

#スクリプト

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ロボット機能でブロックの長さ調整
ADX2ロボット機能でMIDI4オクターブに挑戦

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?