26スロットとオーディオコンテキストの初期化プロセス
本ツールは,ブラウザが標準で提供するWeb Audio APIを利用して構築されたサンプラーであり,画面上にはアルファベットのAからZまでに対応付けられた合計26個の独立したサンプリングスロットが格子状に配置されています.ページを読み込んだだけではAudioContextはまだ生成されていません.
最初の操作で生成し,一時停止状態なら再開を試みます.ユーザーが「オーディオを有効化」ボタンを押下するか,いずれかのパッドを直接クリック(またはタップ)することでAudioContextのresumeメソッドが呼び出され,音声処理の基盤がアクティブな状態へと移行します.
この初回のオーディオ初期化プロセスが完了した瞬間に,プログラム内部の数式モデルを利用した音声合成が実行され,特定の8スロットに対して自動的にプリセット波形が割り当てられます.具体的には,スロットAには指数減衰エンベロープを用いたバスドラム,スロットSにはノイズジェネレーターを合成したスネアドラム,スロットDには高周波成分を強調したハイハットが構築されます.
さらに,スロットF,G,H,J,Kには,それぞれ261.63Hz(C4)から392.00Hz(G4)に相当するピッチのサイン波ベースのシンセサイザー音が生成されます.これらのプリセット音源は,外部サーバーから音声ファイルをダウンロードして取得するのではなく,すべて端末のCPUを用いてブラウザのメモリ内で直接計算され,Float32Arrayの配列データとしてAudioBufferへ展開される仕様となっています.
これにより,事前のファイル読み込みによる待機時間を生じさせることなく,即座にタイピングやパッドのクリックを通じた音声再生のテストが可能になります.ファイル取り込みや全体の構成を保存・復元する機能は搭載されていないため,設定はブラウザのタブを閉じるかリロードするたびに破棄されます.
短時間のマイク入力録音と波形データのメモリ内変換
既存のオーディオファイルをアップロードしてスロットに割り当てる機能を持たない本ツールでは,すべての外部サンプルの取得をブラウザのMediaRecorder APIを用いた直接録音に依存しています.録音を行うには,対象となるAからZのいずれかのスロットを選択した上でマイクへのアクセスを許可する必要があります.
録音の持続時間は,スライダーインターフェースを通じて最小1秒から最大5秒までの範囲で設定可能であり,デフォルトの初期値は3秒に指定されています.指定された最大録音時間に到達するか,ユーザーが録音停止ボタンを操作するまでの間,MediaRecorderは取得したマイク入力ストリームを一定のチャンク単位でBlobとして順次蓄積します.
録音が完了してストリームが停止すると,蓄積されたBlobデータはArrayBufferへと変換され,AudioContextのdecodeAudioDataメソッドによって再生用の一時的なAudioBufferとしてメモリ上に展開されます.この変換処理は入力された音声の実際のエンコード形式(audio/webmやaudio/mp4など)に依存して行われますが,万が一デコードに失敗した場合は,録音データを再生用に変換できなかった旨を示すエラーメッセージがインターフェース上に表示されます.
また,録音の二重開始を防ぎ,開始に失敗した場合や録音停止時には取得したマイクのトラックを停止します.デコード完了まで次の録音を待つため,短い録音でも変換待ちが生じる場合があります.すべての端末障害からの自動復旧を保証する機能ではありません.録音処理自体はブラウザ内で完結しており,入力された音声データがマイクからブラウザのメモリに渡される事実に基づいて動作します.
サンプルのトリガー再生とポリフォニックな発音の重なり
本サンプラーにおける各スロットの再生操作は,画面上に描画されたパッドへのマウスクリックやタッチ操作,あるいは対応するPCキーボードのAからZのキーを押下することによってトリガーされます.テキスト入力欄などにフォーカスがある場合を除き,キーボードの特定のキーを押下すると,即座に対応するスロットのAudioBufferSourceNodeが生成され,発音が開始されます.
このツールでは,同じキーを連続して入力した場合,以前に発音された音声を強制的に停止して鳴らし直す(モノフォニック)処理ではなく,入力のたびに新しい再生ノードを独立して生成して音を重ねる(ポリフォニック)仕様を採用しています.これにより,減衰の長いシンセサイザー音や環境音のサンプルを連続してトリガーした際にも,音声が途切れることなく自然な残響として重なり続けます.
一方で,重なった音声を直ちに停止したい場合には,右クリックやタップによって対象のスロットを選択状態にし,パラメーター調整パネル内の「停止」ボタンを押下することで,そのスロットに紐づく全てのアクティブな再生ノードのstopメソッドが一斉に呼び出され,直ちに消音されます.
また,不要になったサンプルデータを削除する「サンプルの削除」ボタンを実行した際にも,該当スロットの再生は強制的に停止された上で,保持されていたAudioBufferへの参照がnullにリセットされ,スロットは初期の空状態へと戻ります.これらの再生制御は全てメモリ上のオンメモリバッファを対象としているため,再生ごとに音声ファイルを取得する処理はありません.
ただし,端末負荷やブラウザ・出力機器の遅延によって発音が遅れる場合があります.
スロット個別の音量・再生速度調整およびループ設定
選択されたスロットに格納されている音声サンプルに対しては,パラメータ編集パネルを通じて個別に音量(Volume),再生速度(Pitch),およびループ再生(Loop)の設定を適用することが可能です.各パラメータは次に作られる再生ノードへ適用されます.既に鳴っている音には変更が遡って反映されないため,一度停止して再生し直してください.
音量設定はGainNodeのgain値を使い,スライダーを動かすことで0(無音)から1(元の音量)までの範囲を0.05刻みで調整できます.インターフェース上ではパーセンテージ(0%〜100%)として表示され,録音した環境音とプリセット音源のバランスを調整する役割を担います.
再生速度の変更は,AudioBufferSourceNodeのplaybackRateプロパティを操作することで実現されており,0.5倍から最大2.0倍までの範囲で0.05単位の調整が可能です.ここで注意すべき制約として,本ツールには高度なタイムストレッチ機能は実装されておらず,再生速度と音程(ピッチ)は常に連動して変化します.
つまり,スライダーを2.0倍に設定すると再生時間は半分の長さに短縮されると同時に音程は1オクターブ上がり,0.5倍に設定すると再生時間は2倍に引き延ばされる代わりに音程は1オクターブ下がるという古典的なテープスピード制御と同様の挙動を示します.また,ループ再生のスイッチを有効化することで,AudioBufferの終端に到達した際に自動的に先頭から再生を繰り返すloopプロパティがtrueに設定されます.
なお,録音した音声の一部を切り出すカット編集やフェードイン・フェードアウトの適用,複数のスロットを組み合わせた演奏結果を一つの音声ファイルとしてエクスポート・保存するようなシーケンサー的な全体録音機能は一切提供されていません.
波形ビジュアライザーのリアルタイム描画とスロットの初期化
本ツールは音声の視覚的な確認を補助するために,二種類の波形描画機能を備えています.一つは録音中に稼働するリアルタイムの波形ビジュアライザーであり,マイクからの入力ストリームをAnalyserNode(fftSizeを2048に設定)へ接続し,getByteTimeDomainDataメソッドを用いて定期的に取得した時間領域の振幅データをHTML Canvas上に緑色の折れ線グラフとしてアニメーション描画します.
この処理により,入力されている環境音の大きさやマイクが正常に音声を拾っているかどうかを録音中において直感的に把握することが可能になります.もう一つは,録音完了後やプリセット音が割り当てられたスロットを選択した際に表示される静止波形プレビューです.こちらは既にメモリ内にデコードされたAudioBufferからgetChannelData(0)を用いて左チャンネルのPCMデータを直接取得し,Canvasの横幅(ピクセル数)に合わせてデータを間引いて最大値と最小値を算出し,サンプル全体のエンベロープ形状を描画する仕組みです.
この静止波形表示によって,意図した音声がバッファ内に正しく格納されているかを確認できます.録音データが不要になったり,新しく音声を録音し直したい場合には,該当スロットを選択して削除処理を実行することで,割り当てられていたAudioBufferのデータがメモリ上から破棄されます.
部分的な波形の削除や切り抜きを行う機能は存在しないため,削除を行うとスロットの音声バッファが取り除かれます.音量・速度・ループの設定まで初期値に戻す処理ではありません.
マイク利用権限,ブラウザ間の実装差異,およびデータの揮発性
Web APIを活用した本ツールの運用においては,動作環境となるオペレーティングシステムやブラウザごとの仕様の違い,そしてセキュリティ上の制約について正確に理解しておく必要があります.まず,録音機能を利用するためには,ブラウザのセキュリティポリシーに基づいてマイクデバイスへのアクセス権限(MediaDevices.getUserMedia)をユーザーが明示的に許可しなければなりません.
権限が拒否された場合や,HTTPSやlocalhost等の信頼可能な起点に該当しない非セキュアなコンテキストでページが開かれている場合には,API自体が機能せず録音を開始できない状態となります.また,MediaRecorderが録音時に用いるエンコードのMIMEタイプ(audio/webm;codecs=opus や audio/mp4 など)はブラウザのレンダリングエンジンによってサポート状況が異なるため,内部的にはisTypeSupportedメソッドを用いて各環境で利用可能な形式を動的に選択して録音チャンクを作成しています.
この結果,録音完了時のデコード処理(decodeAudioData)において,一部のブラウザでは特定のコーデックが解釈できずに復号エラーとなる例外が発生する可能性があります.さらに最も留意すべき点として,録音されたすべての音声データや設定した音量・ピッチのパラメータは,IndexedDBやLocal Storageなどの永続化ストレージには保存されず,揮発性のあるメモリ空間(RAM)内のAudioBufferとしてのみ保持されています.
したがって,ブラウザのタブを閉じる動作はもちろんのこと,ページを再読み込み(リロード)しただけでも,作成したサンプラーの構成は全て消失して初期状態に戻る性質を持っています.