何が起きているか
- 打撃音は押した瞬間には鳴りません。 16 分音符のグリッドへ量子化され、いま鳴っている和音のコードトーンへ音程が寄ります。
- 連打すると音程が駆け上がります。 コードトーンを 1 つずつ登り、音域の上端まで行くと最低音へ戻ります。0.7 秒ほど間が空くと最初の音に戻ります。挙動は素材ごとに選べます(固定・駆け上がり・駆け下り・往復・ランダム)。
- セクションを切り替えると次の小節頭で遷移します。 調とコード進行が同時に差し替わり、以降の打撃音は自動的に新しい和声に従います。
- 打撃音は毎回わずかに違う音です。 同じ音の複数テイクから「直前と同じものを避けるランダム」で選んでいます。反復が最も目立つのは直後の 1 回なので、そこだけを外します。
- 水中にすると BGM も打撃音も同じフィルタを通ります。 両者が同じ音場バスを通る構造の帰結です。
- 残響を入れると、返ってくる音もグリッドに乗ります。 遅延を付点 8 分に取っているため、量子化された打撃音の残響が拍の上に落ちます。遅延線を要する処理はバスの列にしか置けません。
- 向きを変えると音場全体が回ります。 音源ごとの再計算ではなく、B-format の回転 1 回で済みます。
.NET ランタイムは Web Worker の上で動き、そこが「レンダースレッド」になります。
生成した音は SharedArrayBuffer 上のリングバッファへ流し込まれ、AudioWorklet が
それを吸い出すだけです。メインスレッドは音声経路に一切入りません。