diff --git a/content/BrightSignをネットワーク経由でシークできるようにする.md b/content/BrightSignをネットワーク経由でシークできるようにする.md index 3674f9e0..f5c14f8e 100644 --- a/content/BrightSignをネットワーク経由でシークできるようにする.md +++ b/content/BrightSignをネットワーク経由でシークできるようにする.md @@ -8,9 +8,9 @@ date: 2024-08-02 16:50 頭出しだけなら設定ソフトのBrightAuthorから、UDPのインプットを受け取って動画ファイルごとの先頭に移動するよう設定できる。 -だが、20分の映像を全て頭から終わりまで確認し続けなければならないのはつらい。プラグインを使用すると映像の再生位置を特定の場所までシークすることができるのだが、とにかく情報が少ないのでまとめておく。 +だが、例えば20分とかある映像を全て頭から終わりまで確認し続けなければならないのはつらい。プラグインを使用すると映像の再生位置を特定の場所までシークすることができるのだが、とにかく情報が少ないのでまとめておく。 -なおここでは、設定ソフトにMacでも動作可能なBrightAuthor:Connectedを使用する。(日本語版のDLページでは「BrightAuthor:接続済み」となっているやつ) +なおここでは、設定ソフトにMacでも動作可能なBrightAuthor:Connectedを使用する。(日本語版のDLページでは「BrightAuthor:接続済み」となっているやつ。一応普通のBrightAuthorでも実行可能。) ## プラグインスクリプトをDLする @@ -91,7 +91,7 @@ Maxでは、udpsendオブジェクトで指定したIPの5000番ポート(標 ![[img/スクリーンショット 2024-08-02 20.25.24.png]] -`jit.movie~`(`jit.movie`や`jit.qt.movie`ではない方)を使用する。このオブジェクトは非常に奇妙な仕様なので、動画の再生状態を全てアトリビュート経由で取得しなければならない。写真のパッチでは動画の長さと再生位置を`getattr`オブジェクトで取得している。 +`jit.movie~`(`jit.movie`や`jit.qt.movie`ではない方)を使用する。このオブジェクトは非常に奇妙な仕様をしており、動画の再生状態を全てアトリビュート経由で取得しなければならない。写真のパッチでは動画の長さと再生位置を`getattr`オブジェクトで取得している。 注意点としては以下の通り。 @@ -99,4 +99,8 @@ Maxでは、udpsendオブジェクトで指定したIPの5000番ポート(標 - また当たり前だがUDPが送られてプラグインのseekが実行されるまでにはレイテンシがあるので、厳密にはMaxの再生位置をある程度オフセットする必要がある - そもそも通常のBright ignでのUDPでのシンクはフレーム単位で同期してるわけではないのは公式でも書いてある。フレームレベルでの同期が必要ならBrightWall使うのが無難 - 自動ループする時、BrightSignのほうが若干ラグがあってからループする。そのため、実際には`jit.movie~`が自動ループしたタイミングでudp信号を送るのが良い。 + - というか、`jit.movie`は再生速度が全く均一にならないんであんまり使わないほうがいい。BrightSignの映像側にタイムコード音声を書き込んでおいてMaxでそれを受けて特殊配置のスピーカーで音再生、とかが一番ありえるユースケースかも。 + - [[MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい]] - 内部がどういう仕組みかわからないが、UDPのメッセージのキューは割と簡単に詰まる。シークバーをぐりぐり動かすみたいな使い方はできない。 +- 一時停止ができると便利なんだと思うが、いまいちやり方がわからなかった +- **追記:動画のファイルのビットレートによってコマンドを送ってからシーク完了までの時間が変わるっぽい。2GBの動画とかだとコマンド送ってから5秒ぐらいかかったりすることもある。** やっぱり本番用の同期システムの選択肢というよりは、ざっくりでもいいから確認できるシステム構築のためと割り切るほうが良さそう diff --git a/content/MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい.md b/content/MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい.md new file mode 100644 index 00000000..9757016b --- /dev/null +++ b/content/MaxとSMPTE ToolでLTCをデコードした上で展示を自動起動させたい.md @@ -0,0 +1,69 @@ +--- +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 +``` \ No newline at end of file diff --git a/content/img/スクリーンショット 2024-08-12 15.21.57.png b/content/img/スクリーンショット 2024-08-12 15.21.57.png new file mode 100644 index 00000000..48608ee7 Binary files /dev/null and b/content/img/スクリーンショット 2024-08-12 15.21.57.png differ