M5Stackを使ってタイムコード生成器を試作する

はじめに

エンジニアの松原です。以前紹介したオーディオ・映像機器間の同期方法に関しての取り組み(その1その2) を記事にしました。
前回記事ではオーディオ信号にLTC信号を送り、マイク入力から受け取ったLTC信号をUnity上でデコード、表示する方法について取り上げましたが、今回は前回記事とは逆に、LTC信号を送る側として、マイコンとして扱いやすいM5Stack(今回利用したのはM5StackCoreS3)とM5Stack用RCAモジュールを使ってLTC信号を生成するデバイスを試作してみました。今回はまだ試作段階で詰めが甘いところもあるため、コード公開はまた別の機会に行いたいと思います。

docs.m5stack.com

しくみ解説

タイムコードの最低単位としてフレーム(1秒以下の単位、タイムコードでは24~30フレーム)ごとにマイコン上でカウントアップし、このフレーム単位に合わせてLTC信号として信号の生成を行います。
まず総フレーム数をそれぞれ時間、分、秒、フレームの単位に変換し、それらをタイムコードとして80bitのデータに変換します。
そのタイムコードのデータを実際のオーディオデータとして再生するために48000Hzの信号データ(16bitの量子化データ)に変換後、DACを通して実際にオーディオ信号として出力します。
これらをM5Stackに対してプログラミングを行い、信号をRCAに出力します。

タイムコードの80bitのデータに関しては以前の記事でも取り上げましたがWikipediaにタイムコードのデータフォーマット表を参考にするのが分かりやすいかと思います。

実際にオーディオ信号として出力されたものをオシロスコープで信号のパターンを見てみました。

Sync Wordのパターンが見えるので、上手くいっているようです。波形が荒れているため、今後DACに送る際の信号データに何かしら加工を加える必要があるかもしれません。

生成されたLTC信号をUnity上でデコードしてみる

前回の記事の方法を使ってデコードしてみました。

synamon.hatenablog.com

放置してしばらく時間経過後、同時に並列で走らせていたストップウォッチの時間とのずれがどれぐらい出たか比べてみました。半日ぐらい放置した画像が下の画像です。

厳密なズレまでは計測できていませんが、ストップウォッチで時間を確認したところ、数時間で数秒ぐらいのズレで済んでいるので、初めて取り組んだ割にはよくできたのではないかと思います。

まとめ

今回まだ試作段階ですが、マイコンを使ってタイムコードを自作して、実際にUnity側でデコードできるか試した結果、思ったよりも結構うまくいきました。
ただ、タイムコードのデバイスとしてちゃんとM5Stack側のGUI部分の作成などがまだできていないのと、LTCの規格としてちゃんと信号が出せているかは確認できていないため、今後さらにブラッシュアップしていければと考えています。