rox

プレイヤーの中に住むビジュアライザー

たいていのプレイヤーはスペクトラムアナライザーを出して終わりです。rox にはそのパネルがあり、20 年分のプリセットを回す Milkdrop エンジンがあり、その下に変調の層があります。音声から取り出した名前付きシグナルを、自分で書いたシェーダーの入力へルーティングし、テーマの残りと同じファイルに保存します。

まずは普通のパネルから

バーやブロックのスタイル、グラデーション、独自の落下速度を持つピークの印、周波数のラベル、そして選んだ周波数の上下を別々の窓サイズで解析するゾーン分割を備えたスペクトラムパネル。これで、帯域の両端がそれぞれの条件で反応の速さと分解能を天秤にかけられます。曲全体をチャンネルごとに描き、クリックした場所へシークする波形のストリップ。VU メーター。カバーを本物の 3D で回すアルバムカルーセル。どれもコードを 1 文字も要求しませんし、多くの人が使うのはこちらです。

一時停止するとバーは床まで落ちず、その場で凍ります。小さなことに聞こえますが、一時停止したその瞬間を見ようとすると効いてきます。

Milkdrop、パネルの中と、すべての背後に

Milkdrop パネルは専用スレッドで libprojectM を通してプリセットをレンダリングし、その結果を他のすべてと同じシェーダーチェーンで描きます。だから他のパネルと同じようにドッキングし、タブになり、切り離せて、サーフェスシェーダーも同じようにその上にかかります。プリセットパックを「プリセット」ページに書かれたフォルダーへ入れて、Cream of the Crop でも元祖 MilkDrop セットでも構いません、「再スキャン」を押します。パックに同梱されたテクスチャは自動で見つかります。

「プリセットを選択」は独立したウィンドウにブラウザーを開きます。フォルダーツリーかサムネイルのグリッド、フィルター、お気に入りスイッチ、キーボード操作。プリセットをクリックするとすぐウィンドウの背後に読み込まれるので、見えているのはプレビューではなく実際のレンダリングです。ローテーションは「次へ」「前へ」と時間切り替えが何を巡るかを決め、ロックは曲をまたいで 1 つのプリセットを保ちます。

同じエンジンがすべてのウィンドウの背景としても動き、ぼかしたカバーアートの上に指定した強さで合成されます。プリセットは自分の色を保つことも、ライトテーマ向けに反転することも、パレットで塗ることも、細部を残したまま再生中のカバーの色を取ることもでき、アルバムティントが色相をカバーの方へ寄せます。キューが止まるとフェードアウトしてレンダースレッドも止まるので、遊んでいるビジュアルは何も食いません。

シェーダーは 4 つの面に

rox のシェーダーは 1 つの WGSL フラグメントステージです。1 つのパネルの本体に走らせることも、独立したシェーダーパネルにすることも、ウィンドウ全体のオーバーレイにすることも、カバーアートの後ろですべてのパネルの下に描く背景にすることもできます。オーバーレイと背景にはそれぞれ、rox が開いているすべてのウィンドウへ広げるスイッチが付きます。どれも同じ言語、同じ uniform ブロック、同じルーティングです。

どのシェーダーにも、時計、解像度、ポインター、そしてその瞬間を表す 8 個の meta float が渡ります。音量、曲の中で再生位置がどこにあるか、実際に音が動いているか、曲の長さ、そして今のパレットがどれくらい暗く描かれるか。おかげで 1 つのシェーダーが、書かれたときのテーマ向けに出荷されるのではなく、明暗それぞれに自分で装いを合わせられます。

パネルのシェーダーは、そのパネルが実際に描いたものも読めます。マスクのバインドがパネル自身の描画を透明の上に再生して渡し、パネルは自分の内容の形を公開するので、影やグローがレターボックスされたカバーの両脇の空白ではなく、カバーそのものに沿います。

1 ステージを超えると、// @pass コメントがテキストを最大 8 段の連鎖に分け、各段が前の段を名前で読めるようになります。ぼかしピラミッドや 2 段のブルームに要るのがこれです。// @asset 行はサンプリングする画像を指定し、// @asset art: @cover は再生中の曲のカバーを結び付け、曲が変わると結び直します。サンプルは 9 つ同梱されていて、プラズマの 9 通りの変奏ではなく、それぞれがこの取り決めの別の部分を示しています。

パネルをディスク上のファイルに向けると、rox がそれを監視します。エディターで保存すればウィンドウに反映されます。コンパイルできない保存では、直前の正常な版を画面に残し、エラーをパネルに出します。セミコロンの打ち間違いに気づく手段として、絵を失うのは筋が悪いので。

シグナルこそが違う部分

時計が入っただけのシェーダーはスクリーンセーバーです。ビジュアライザーにするのは何を食わせるかで、rox ではそれがアプリ全体で共有される名前付きシグナルのプールです。専用のウィンドウ、アプリケーションの下、イコライザーの隣で組み立てます。そこにスペクトラムと再生操作が付いているのはイコライザーと同じ理由で、実際に鳴らしているものに対して目と耳で帯域を選ぶためです。

ソースは 5 種類。バンドは 2 つの周波数のあいだのエネルギーで、うねりが乗るシグナルです。レベルはミックス全体。オンセットは帯域が自身の直近の平均を跳び越えたときにパルスを出す、打点が乗るシグナル。トリガーは引いた線を帯域が越えたときにパルスを出すもので、移動平均が下がりきらず最初の小節のあとオンセットが黙ってしまう素材向けです。トータルは別のシグナルを時間で積み上げて 1 で折り返すので、音が大きいあいだ進み、静かなあいだ止まる位相としてシェーダーが読めます。

どれも応答のスムージングとしきい値を備えています。効いてくるのはしきい値のほうです。暗騒音を拾った帯域は、つないだつまみをずっとわずかに浮かせたままにします。しきい値とその上のカーブがあれば、打点と打点のあいだはちゃんと黙ります。メーターはしきい値をかける前の値を描いて、そこに目印を横切らせます。自分のしきい値に沈んで消えたバーでは、しきい値をどこに置くか決めようがないので。

ルートは 1 つのシグナルを 1 つのパラメーターに、出力の範囲付きで結び付けます。このシグナルを、この対象に、ここからここまで。どのシェーダーにも 16 個のスロットがあり、ルートの無いスロットは設定ページで普通のスライダーになるので、見た目の半分は音に演奏させ、残り半分は手で決められます。

議論としての Critters

同梱ワークスペースの 1 つは、プレイヤー全体を 1 ビットの印刷物として描いたものです。すべての面に規則的なディザ、サブベースで潰れる階調、そしてパネルの後ろで曲に合わせてうねるノイズの壁。シグナル 5 つとシェーダー 4 つが 1 つのファイルに入っているだけで、アプリ側に特別扱いは一切ありません。

Critters の rox ワークスペース。ウィンドウ全体が白黒の規則的ディザで描かれ、湾曲した棚に並ぶアルバムカバーの下にシークバー、再生操作の行、波形のストリップ、曲テーブルが並び、すべてが揺れるノイズの上に載っている。

ようこそウィンドウから読み込んで、設定を開いて分解してみてください。他のもの

他人のシェーダーを走らせる

シェーダーはワークスペースのファイルの中を旅します。つまり、インポートした見た目は他人のコードを抱えて届きます。

承認するまで何も動きません。シェーダーのソースは指紋を取られ、承認済みの一覧はこのマシンだけのもので、直接の操作でしか書き込まれません。自分でファイルを選んだ、再読み込みを押した、プリセットを選んだ、承認を押した。バンドルで届いた見た目は、それまでボタンを添えて動かないまま待ちます。rox 同梱のサンプルは作りからして信頼されています。バイナリにコンパイルされているので。

有効にすると、カウントダウンせずに答えを待つ確認ウィンドウが開きます。そのウィンドウ自体にシェーダーがかかることはありません。シェーダーが画面の他をどうしようと、戻り道は読めるままです。

扱っていないこと

  • ルートが届くのはシェーダーのスロットとパーティクルパネルのつまみです。他のパネルの設定は、今も手で決めるつまみです。
  • Milkdrop のプリセットであって、AVS ではありません。Winamp の AVS にはインポーターがありません。それにプリセットはディスク上のファイルなので、どれを読み込んでいるかはワークスペースに乗って旅をせず、マシンごとに残ります。
  • MIDI や OSC のコントロールサーフェスはありません。あるのはオーバーレイのパスとパネルのパスで、音声とポインターが駆動します。
  • ウィンドウ全体のパスは、毎フレーム本物の GPU パスです。バッテリー駆動のノート PC では、それは自分で選んでいることになります。

「キックでプレイヤー全体を明滅させたい」と、それが実際に起きることのあいだにあるのは、バンドとしきい値とルートの 3 つだけで、どれもリビルドを必要としません。

自分のライブラリで試す

ここから外へは何も出ていきません。解析するのは、既にプレイヤーを通っている音声そのものです。ワークスペースが何を抱えているか も参考に。