Maxには昔からsmpte~
というリニアタイムコードを出力するためのオブジェクトが存在する。
しかし、出力はできても音声ファイルとして書き込まれたLTCをデコードしてbangを送るとかはできそうでできない。
もっともシンプルなやり方として、GSi - SMPTE Toolを使ってLTCから一度MTC(MIDI Time Code)に変換し、仮想デバイスto Max
を経由して受信する。
MTCのデコードはPeter Elsea氏の資料を参考に。
MTCのより詳しい話はHoly Caterさんのブログを参考に。
SMPTE Toolのデバイス情報保存問題
問題はSMPTE ToolとMaxを使って展示を自動で運用したい場合である。 SMPTE Toolは多分JUCEを使って作られているので、使用するオーディオデバイスや仮想含むMIDIデバイスは前回アプリ終了時の情報が自動で復元される。
SMPTE Toolsを起動中にインターフェースを抜いたり、仮想MIDIデバイスを持つソフトを落としたりすると、その情報は即時更新される。
つまり、展示などで自動起動・終了を考えた時に、SMPTE ToolがMaxより先に立ち上がると、Max以外のデバイスが自動で選択された状態になってしまう。終了時も、Maxが先にシャットダウンされるとMIDIデバイスの認識が外れた状態でSMPTE Toolも終了するので、次回起動した時にデバイスが正しく読み込まれない。
残念ながらSMPTE Toolには、設定ファイルやコマンドラインオプションなどで固定のデバイス名を指定して起動する方法が公式には存在していない。
だが、アプリケーションの状態を保存したファイルは、Macでは実は以下の場所に記録されている。
~/Library/SMPTE Tool/SMPTE Tool.setting
これを使用(悪用)すれば正しく運用されている状態を強制的に復元できる。
- まず、展示での正しいオーディオインターフェースとMIDIデバイス等の設定を普通にアプリを起動して設定。
- SMPTE Toolを一度終了する(設定ファイルはここで更新される)
~/Library/SMPTE Tool/SMPTE Tool.setting
をプロジェクトフォルダやデスクトップなど適当な場所にコピーする- 展示の際はスタートアップ起動アプリに、立ち上げたいMaxプロジェクトと次のシェルスクリプトの2つを登録する。(ここではデスクトップにコピーしたとする)。Macの場合は拡張子を
.command
に設定して、設定→一般→ログイン項目にそのファイルを登録すればよい
起動前に30秒スリープしているのは、Maxより先にSMPTE Toolが立ち上がるのを避けるため。逆に、Max内のアプリもSMPTE Toolが立ち上がるまでタイムコードでの同期は取れないので、諸々の起動処理はloadbangを35秒遅延させるなどの対策を取っておくのが安全。
シャットダウンは普通にpmsetでシャットダウン時刻を設定する。また終了時刻の数分前にMax上で;max clean ;max quit
メッセージを使ってMaxを自殺させないとシステムがシャットダウンしないことがあるのでそれも組み込んでおく。
PythonでLTCからMTCにデコードするシングルファイルアプリがあるので、これを使うともっと楽になるのかも(視覚的にタイムコード確認できるのは楽でいいけどね)
brew install python-tk portaudio rtmidi
git clone https://github.com/Gouttfi/smpte-ltc-to-mtc.git
python3 -m venv venv
source venv/bin/activate
# 仮想環境に入る
pip install python-rtmidi mido PyAudio
python main.py