#音のお絵かきを作る:実WAVから絵を測り直す設計
SoundLoomは、線を描いて音を作り、その実音から周波数の絵を測って見比べるツールです。入力と出力を横に並べ、暗緑の音響パネル、麦色の周波数インク、朱の丸印、明朝の大きな見出しで、実験ノートのような画面にしました。
直接描画する音の創作には、Draw.AudioやPhosphorなどの既存例があります。無料・描画・保存だけを独自性とは呼びません。今回は日本語の小さな実験体験として、描く、聴く、保存する、その保存音声を測り直す、という往復を一続きにしています。競合の説明は確認しましたが、操作や音質を比較評価したわけではありません。
#1マスを時間と周波数にする
絵は48列×24行。列は左から右へ時間、行は下から上へ160〜2000Hzを80Hz間隔で表します。長さは3秒か6秒、筆の濃さは4段階です。ドレミに合わせた音階ではなく、24種類の正弦波を重ねる音の実験です。
各マスの濃さを振幅にして、該当する列の音声へ正弦波を足します。列の最初と最後は振幅を滑らかに0へ近づけ、急な切替えを抑えます。複数の行を描くと、その高さの音が同じ時間に重なります。1本の斜線は滑らかな周波数変化ではなく、固定24音の段階的な変化です。
#再生音量と保存音量を分ける
合成音は全体のピークを70%にそろえます。全セルを塗ってもサンプルが範囲外にならないことを検査し、空の絵は0のままにします。最大値に合わせるため、薄い絵だけを描いた場合も保存音が小さくなるとは限りません。
再生には初期8%・最大20%の別の音量を掛けます。これは保存WAVには掛けません。保存した音を別のプレーヤーで開くときにも音量を下げる必要があるため、画面とFAQでこの違いを説明します。音のピークや再生ゲインは、端末から出る音圧や安全な聴取を保証するものではありません。
WAVは24kHz・モノラル16bit PCM。ファイルのヘッダー、チャンネル数、サンプル数、先頭と末尾のフェードを検査し、実ブラウザ標準のデコーダーでも復号します。自分のエンコーダーとデコーダーだけが同じ間違いを共有する検査にしないためです。
#絵をコピーせず、WAVを測る
「測った絵」は入力マスの再表示ではありません。保存用WAVを作って復号し、列の中央80%のサンプルから、24種類の周波数の強さをGoertzel法で計算します。特定周波数の成分を求めるための再帰計算で、入力した描画データはこの測定へ渡しません。
固定周波数と測定窓は、両方の長さで整数個の周期を含むよう選んでいます。列の端のフェードを外して測ることで、見本の絵と音の関係を確かめやすくしています。これは任意の音声を扱う一般的なスペクトログラムではなく、この方式で作った音に合わせた測定です。
強度は音全体の最大値を1とする相対値で表示します。実測マス数は0.15を超えた数です。入力1152セルすべての相対強度と件数を検査し、独立した単音の相関計算とも照合します。16bitへの量子化や窓の選び方で小さな差は残るので、文字や写真を音へ完全保存できるとは説明しません。
#編集しても古い処理を混ぜない
音声の許可待ち、ファイルの読込み、PNG生成は遅れて終わることがあります。その間に絵を変えたりページを離れたりしたら、旧結果を再生・適用・保存しません。操作の世代とページの生存状態を照合してから結果を反映します。
ページ移動では音源を止め、AudioContextを閉じ、描画イベントや生成URLを片付けます。別のページから戻ったときに、同じ操作が二重に動いたり、過去の音が鳴ったりしないことも検査します。画面の非表示でも再生を止めます。
指で素早くなぞった線は、前回の位置から現在地まで補間します。取り消しはストローク単位で直近20操作だけ保持。編集用JSONは版・長さ・固定マス数・0〜4の整数・8KB上限を照合し、壊れたファイルで現在の絵を置き換えません。PNGは絵の保存用で、再編集にはJSONが必要です。
#実出力と限界を一緒に確かめる
単体検査は、両長さ・見本・無音・全面描画・不正WAV/JSON・独立単音相関を含みます。ブラウザ検査は実タップ/ドラッグ/キー、停止、WAV・PNG・JSONの実ファイル、測定数と描画数、失敗後の再試行、待機中の編集、ページ移動、スマホの表示を扱います。
24音の粗い格子、3秒・6秒の短い長さ、正弦波の組合せという範囲です。録音、写真取込、声の復元、AI作曲、楽器の再現はありません。聞こえ方の好み、利用者の興味、実機Safari、学習効果は、この機械的な検査からは結論できません。今後も絵と実音の対応を壊さず、使い道を育てていきます。
[ ./next_action ]
読んだら、 SoundLoom を実際に動かす。
この開発ログは SoundLoom をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。