Reaperでノートの情報を得るPythonスクリプト

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)

これを実行すると

image.png

こんな感じで ノート番号とノートオン、ノートオフのタイミング情報がテキストで得られる。

TIPS

  • 対象となるMIDIEditor(MIDIリージョン)を選択して実行する。
  • 時間を最初から知りたい場合は、リージョンをまとめて実行する。
  • 途中テンポチェンジだとうまくいかない?

以下いろいろ試したメモ

MIDI TicksからMS(ミリ秒)に変換

  start = RPR_TimeMap_QNToTime( startppqposOut)
  end = RPR_TimeMap_QNToTime( endppqposOut)

これ、テンポチェンジには対応していないのかな・・・

プロジェクトの先頭からの絶対時間で得る

  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)

まぁ、ファイルとかに出力するのが妥当な感じもする。

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
コメント
この記事にコメントはありません。
あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした