REAPERでノートのタイミングを数値で得られたら
いろいろ音と同期したビジュアライズにはかどるかと思ったので
作ったメモ
GetNoteList.py
RPR_ClearConsole()
outlist = ""
midieditor = RPR_MIDIEditor_GetActive()
take = RPR_MIDIEditor_GetTake( midieditor )
notecntOut = 0
ccevtcntOut = 0
textsyxevtcntOut = 0
( retval, take, notecntOut, ccevtcntOut, textsyxevtcntOut ) = RPR_MIDI_CountEvts(take, notecntOut, ccevtcntOut, textsyxevtcntOut )
for noteidx in range(notecntOut):
selectedOut = True
mutedOut = True
startppqposOut = 0
endppqposOut = 0
chanOut = 0
pitchOut = 0
velOut = 0
( retval, take, noteidx, selectedOut, mutedOut, startppqposOut, endppqposOut, chanOut, pitchOut, velOut ) = RPR_MIDI_GetNote(take, noteidx, selectedOut, mutedOut, startppqposOut, endppqposOut, chanOut, pitchOut, velOut )
outlist += str(pitchOut) + "," + str(startppqposOut) + "," + str(endppqposOut) + "\n"
#RPR_ShowMessageBox("End", "status", 0 )
RPR_ShowConsoleMsg(outlist)
これを実行すると
こんな感じで ノート番号とノートオン、ノートオフのタイミング情報がテキストで得られる。
#TIPS
- 対象となるMIDIEditor(MIDIリージョン)を選択して実行する。
- 時間を最初から知りたい場合は、リージョンをまとめて実行する。
- 途中テンポチェンジだとうまくいかない?
#以下いろいろ試したメモ
quarter note count (QN)
QNとは、1/4ノートカウント、一小節が4拍として、1拍を表すカウントのよう。
960で1拍っぽい。
##QNからMS(ミリ秒)に変換
start = RPR_TimeMap_QNToTime( startppqposOut)
end = RPR_TimeMap_QNToTime( endppqposOut)
これ、テンポチェンジには対応していないのかな・・・
追記これミリ秒だったら1000で割れば秒になりそうだけど、なぜか960でちょうど良い値になるのはなんだろう?
※ヨクワカラン
##プロジェクトの先頭からの絶対時間で得る
start = RPR_TimeMap_QNToTime_abs(0, startppqposOut)
end = RPR_TimeMap_QNToTime_abs(0, endppqposOut)
とリファレンスには書いてあるけどうまくとれない・・・
※ので、先頭までエディターの範囲を伸ばす
start = RPR_TimeMap2_QNToTime(0, startppqposOut)
end = RPR_TimeMap2_QNToTime(0, endppqposOut)
こちらの方が新しいのか・・・違いがよくわからない。
こちらも途中のテンポチェンジには非対応っぽいです。
##Reaperのコンソールログより長い出力の場合の対処
長いデータだとコンソールのログ量をオーバーしていた。
とりあえずテキストコピーできればよかったので
import pyperclip
#略
pyperclip.copy(outlist)
まぁ、ファイルとかに出力するのが妥当な感じもする。