マガジン

ゲームにピアノ音源を組み込む:軽量なサンプルの選び方

遊びをつくる

執筆にClaudeを使用しています。

つなぎ目のない銅色のリボンとテープリールで、自然なBGMループを表した写真風イメージ。
記事のテーマをもとに制作したAI生成イラスト。

ブラウザゲームにピアノの音を入れようとして、最初につまずくのはファイルサイズです。本格的なピアノ音源は1音ずつ複数のベロシティ(強弱)を収録しているため、全鍵盤分をそろえると数百MB以上になることも珍しくありません。ゲームのBGMや効果音として使うには、まったく別の考え方が必要です。 この記事では「音質をどこまで妥協するか」ではなく、「ゲームの用途に合った素材をどう選び、どう組み込むか」という判断の枠組みを示します。ピアノ音源を初めてゲームに使う方でも、読み終えたあとに具体的な次の一手が取れるように書きました。

この記事の目次
  1. ゲーム用ピアノ音源に求める条件を整理する
  2. サンプルの「音域カバー率」と「ベロシティ段数」で選ぶ
  3. フォーマットと圧縮:MP3・OGG・WebMの選び方
  4. ライセンスを確認するための三つの論点
  5. 実装の手順:Web Audio APIでサンプルを鳴らす最小構成
  6. 次の行動
  7. 参考資料

ゲーム用ピアノ音源に求める条件を整理する

BGMとして流すのか、鍵盤を押したときにリアルタイムで鳴らすのか、この違いが選択肢を大きく変えます。

BGMとして使う場合は、あらかじめ演奏をレンダリングしたMP3やOGGファイルを再生するだけなので、音源そのものをゲームに同梱する必要はありません。音源の品質はオフラインで制作するときにだけ影響します。ファイルサイズの問題は「最終的な音声ファイルをどう圧縮するか」に移ります。

インタラクティブに鳴らす場合、たとえばプレイヤーが鍵盤を押して音が出るゲームや、タイミングゲームでキーに対応したピアノ音を鳴らす仕組みでは、サンプルファイルをブラウザにロードしておく必要があります。この場合はファイル数・合計サイズ・ロード時間がゲームの快適さに直結します。

まず自分のゲームがどちらの用途かを決めてから、次の判断基準に進んでください。

サンプルの「音域カバー率」と「ベロシティ段数」で選ぶ

インタラクティブ用途でピアノサンプルを選ぶとき、品質とサイズのトレードオフを左右するのは主に二つの軸です。

音域カバー率とは、実際に録音した鍵盤の本数を指します。88鍵すべてを個別収録した音源は最もリアルですが、ゲームでよく使われる手法として「数鍵おきに1音を収録し、間の音はピッチシフトで補間する」があります。たとえば1オクターブに1音だけ収録し、その音を半音ずつずらして使えば、12音分のサンプルを1ファイルで賄えます。音の自然さは落ちますが、ファイル数を劇的に削減できます。ゲームの効果音程度であれば、3〜4音オクターブを1音で補間しても違和感はほとんど気になりません。

ベロシティ段数とは、同じ音を強さ別に何パターン録音しているかです。プロ用音源では1音あたり4〜8段用意することもありますが、ゲーム用では1段(つまり1種類)でも十分な場面が多いです。強弱表現が必要な場合は、再生時のボリュームをコードで変化させることで代替できます。

この二軸を組み合わせると、次のように整理できます。

  • 効果音・短いフレーズ、推奨音域カバー:1〜2オクターブのみ、推奨ベロシティ段数:1段、目安ファイル数:12〜25ファイル程度
  • インタラクティブ鍵盤、推奨音域カバー:3〜4オクターブ、推奨ベロシティ段数:1〜2段、目安ファイル数:36〜72ファイル程度
  • 高品質なリズムゲーム、推奨音域カバー:フル5オクターブ以上、推奨ベロシティ段数:2〜3段、目安ファイル数:72〜150ファイル以上

ファイル数が多くなるほどロード時間も増えます。Web Audio APIで遅延なく再生するには、ゲーム開始前にすべてのサンプルをデコード・バッファリングしておく必要があるため、多すぎるとロード画面が長くなります。

フォーマットと圧縮:MP3・OGG・WebMの選び方

ブラウザゲームで使える音声フォーマットは複数ありますが、ピアノサンプルに限って言えば判断はシンプルです。

MP3はほぼすべてのブラウザで動作し、互換性の面では最も安全です。128kbps程度のビットレートでエンコードすれば、ピアノの単音サンプル(1〜3秒程度)は数十KB以下に収まります。

OGG VorbisはMP3と同等かそれ以上の音質を低ビットレートで実現でき、ファイルサイズを小さく保ちやすいです。ただしSafariでのサポートは歴史的に不安定な時期があり、ターゲットブラウザに応じて確認が必要です。

実用的な対策として、MP3とOGGの両方を用意し、Web Audio APIや<audio>要素で再生できる方を選ばせる実装がよく使われます。

サンプルの長さも圧縮効率に影響します。ピアノの余韻は長く続きますが、ゲーム用途では音が重なるか途切れることが多く、長い余韻が意味を持たない場面も多いです。サンプルを1〜2秒でフェードアウト処理してからエンコードすると、ファイルサイズを半分以下にできることがあります。フェードアウトはAudacityなどの無償ツールで処理できます。

ライセンスを確認するための三つの論点

音源ファイルを探すとき、「無料」と書かれていてもゲームへの組み込みが許可されているかどうかは別問題です。確認すべき点を三つ挙げます。

商用利用の可否:広告収益を目的とするゲームや、ゲームプラットフォームで公開する作品は「商用」と見なされることがあります。ライセンスに「非商用のみ」と書かれている場合は利用を避けるか、作者に個別確認が必要です。

クレジット表記の義務:Creative CommonsのCC BYなどは利用を許可する代わりにクレジット(著作者表示)を求めます。ゲーム内またはゲームの説明文にクレジットを記載するのが一般的な対応です。

派生物・改変の可否:ピッチシフトやフェードアウト編集は音源の「改変」に当たることがあります。CC BY-NDのように「改変禁止」の条件が付いている場合、ピッチシフトで補間する使い方ができない可能性があります。

法律の解釈は状況によって異なるため、特定のライセンス条件について迷う場合は音源の配布元や専門家に確認することをお勧めします。

実装の手順:Web Audio APIでサンプルを鳴らす最小構成

具体的な実装イメージを持てるよう、ブラウザ標準のWeb Audio APIを使った最小手順を示します。

  1. AudioContextを作成する。ユーザー操作(クリックやタップ)のイベント内で初期化しないと、ブラウザのオートプレイ制限で音が出ないことがあります。
  2. fetchでサンプルファイルを取得し、arrayBuffer()でバイナリデータとして読み込む。
  3. audioContext.decodeAudioData()でデコードし、AudioBufferとして保持する。
  4. 音を鳴らすたびにcreateBufferSource()で新しいノードを作り、AudioBufferをセットしてstart()を呼ぶ。
  5. ピッチシフトで補間する場合はBufferSourceNodeのplaybackRateプロパティを変更する。半音上げるにはplaybackRateを2の(1/12)乗(約1.0595)倍にします。

複数のサンプルをまとめてロードするときは、Promise.all()でまとめてフェッチし、すべてデコードが終わってからゲームを開始するフローにするとロード漏れを防げます。

ピッチシフトによる補間は、元音から遠い音域ほど不自然になります。1〜2オクターブ以上離れた音を1ファイルから生成するのは避け、少なくとも1オクターブに1サンプルを用意するのが現実的な下限です。

次の行動

まず自分のゲームがBGM再生とインタラクティブ再生のどちらを必要としているかを確認してください。インタラクティブな鍵盤が必要なら、音域を3〜4オクターブに絞った軽量サンプルをライセンス条件つきで探し、1音ずつ再生できる最小実装を試してみてください。アソバースへの投稿はHTMLファイルやZIPファイル形式に対応しているので、動作確認ができたらそのまま公開できます。

参考資料

  • Web Audio API仕様(W3C)
  • MDN Web Docs「Web Audio API」
  • Audacity公式ドキュメント