quartz-research-note/content/MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい.md
松浦 知也 Matsuura Tomoya ce0c6b1ddf
All checks were successful
Build / build (push) Successful in 2m52s
[obsidian] vault backup: 2024-08-12 16:28:50
2024-08-12 16:28:50 +09:00

69 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2024-08-12 15:05
---
#max #tips
Maxには昔から`smpte~`というリニアタイムコードを出力するためのオブジェクトが存在する。
しかし、出力はできても音声ファイルとして書き込まれたLTCをデコードしてbangを送るとかはできそうでできない。
もっともシンプルなやり方として、[GSi - SMPTE Tool](https://www.genuinesoundware.com/?a=page&p=SMPTE_Tool)を使ってLTCから一度MTC(MIDI Time Code)に変換し、仮想デバイス`to Max`を経由して受信する。
MTCのデコードは[Peter Elsea氏の資料](http://peterelsea.com/Maxtuts_advanced/Max&MTC.pdf)を参考に。
![[img/スクリーンショット 2024-08-12 15.21.57.png]]
MTCのより詳しい話は[Holy Caterさんのブログ](https://ameblo.jp/holycater/entry-12657971601.html)を参考に。
## 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
```
これを使用(悪用)すれば正しく運用されている状態を強制的に復元できる。
1. まず、展示での正しいオーディオインターフェースとMIDIデバイス等の設定を普通にアプリを起動して設定。
2. SMPTE Toolを一度終了する設定ファイルはここで更新される
3. `~/Library/SMPTE Tool/SMPTE Tool.setting`をプロジェクトフォルダやデスクトップなど適当な場所にコピーする
4. 展示の際はスタートアップ起動アプリに、立ち上げたいMaxプロジェクトと次のシェルスクリプトの2つを登録する。(ここではデスクトップにコピーしたとする)。Macの場合は拡張子を`.command`に設定して、設定→一般→ログイン項目にそのファイルを登録すればよい
```sh
#!/bin/bash
cp -f ~/Desktop/SMPTE\ Tool.settings ~/Library/SMPTE\ Tool
sleep 30;
open /Applications/SMPTE_Tool.app;
exit;
```
起動前に30秒スリープしているのは、Maxより先にSMPTE Toolが立ち上がるのを避けるため。逆に、Max内のアプリもSMPTE Toolが立ち上がるまでタイムコードでの同期は取れないので、諸々の起動処理はloadbangを35秒遅延させるなどの対策を取っておくのが安全。
シャットダウンは普通にpmsetでシャットダウン時刻を設定する。また終了時刻の数分前にMax上で`;max clean ;max quit`メッセージを使ってMaxを自殺させないとシステムがシャットダウンしないことがあるのでそれも組み込んでおく。
---
PythonでLTCからMTCにデコードするシングルファイルアプリがあるので、これを使うともっと楽になるのかも視覚的にタイムコード確認できるのは楽でいいけどね
[GitHub - Gouttfi/smpte-ltc-to-mtc: This repository contains a Python application for converting SMPTE-LTC timecode to MIDI Time Code (MTC).](https://github.com/Gouttfi/smpte-ltc-to-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
```