3DCG

Python3で「OpenGL」を学ぶ 「PyOpenGL」PyCG lesson8

lesson8を学んだ。順にそれぞれ自分の理解をメモしながらまとめる。

オシロスコープ ミュージックという、ジャンルの音楽がある。(詳しくはこちらの動画を参照)アイディアとしては、オーディオ信号をオシロスコープに通したときに浮かび上がるデザインされたパターンを表現として用いることで、視覚的に楽しめるものにしている。本稿では、このように波形を視覚化する方法を探る。

オシロスコープのXYモード

XY モードは、独立した2つの入力信号をまとめて出力する。仕組みはかんたんで、信号1の強さで点のX座標、信号2の強さでY座標を表す。有名なリサージュ曲線は、2つの正弦波を入力として、XYモードでかんたんに確認できる。

リサージュ曲線 (引用 Wolfram MathWorld)

オーディオデータのデコード

audioreadを利用して、オーディオデータを符号付きの配列(int16_t)にデコードする。

オーディオファイルはバッファごとに読み込まれ、各バッファは特定のサイズ(通常は4KB)のオーディオデータのchuckになっている。バッファはサンプルで構成され、各サンプルのサイズはオーディオデータのサイズの倍のチャンネル数となる。(この時、ステレオオーディオであり、データ型が符号付き shortであるため、各サンプルのサイズは2×2バイト=4バイトとなる。)各サンプルには、各チャンネルのデータが横に並んで格納される。

よりPythonフレンドリーにするために、データを大きな配列に結合、numpyを使って2チャンネルに分割することができる。詳細は元記事のDecoding audio dataの項を参照。

オーディオ再生

PyOpenALパッケージを使用して、オーディオ再生をサポートする。パッケージが提供する最も基本的なAPIを使用しているため、動画と音声を正確に同期させるためには、調整が必要な可能性がある。PyOpenALはWAVのみのサポートだが、audioreadはより多くのフォーマットをサポートしている。

デモ

GitHub を確認して実行してみる。私の環境では以下のように、audioreadとPyOpenALのインストールが必要だった。

pip install audioread
pip install PyOpenAL