Claude Codeに、BGMと効果音を鳴らす処理を書かせる頼み方【AIでゲーム開発】
Claude Code に文を1回頼むと、音のファイルを使わずにブラウザの中で音を作り、BGM を繰り返し鳴らし、コインを取ると短い効果音を鳴らし、M キーで音のあり・なしを切り替えるブラウザゲームができました。画面を持たないブラウザでキーを送り、音の仕組みが呼ばれた回数・時刻・音量の値を記録すると、最初のキーで音の仕組みが作られること、コインを取った描き直しの中で効果音が予約されること、M キーで全体の音量が 1 と 0 で入れ替わること、BGM が最後の音のあと最初に戻ることは、頼んだとおりでした。
このページの目次
Claude Code に頼んだ文
空の作業フォルダを1つ決め、Claude Code に次の文を1回だけ渡しました。ゲームの中身は、矢印キーで自機を動かし、落ちてくるコインを取る簡単な仕組みにして、音のファイルを使わない BGM と 効果音、音のあり・なしの切り替え、最初のキーで鳴り始めることを頼んでいます。
Claude CodeにBGMと効果音を頼んだ文
作業フォルダは C:\games\my-game\ だけです。このフォルダの外は読まない・書かないでください。
HTML ファイル1つ(game.htm)で、ブラウザで動く小さなゲームを作ってください。音のファイルは使わず、ブラウザの中で音を作って鳴らしてください。
画面の下にいる自機(四角)を左右の矢印キーで動かし、上から落ちてくるコイン(丸)を取るとスコアが1増えます。
ゲームのあいだ、短いメロディーを BGM として繰り返し鳴らしてください。
コインを取ったときに「ピロン」という短い効果音を鳴らしてください。
M キーで音のあり・なしを切り替えられるようにし、いまの設定を画面の左上にスコアと一緒に出してください。
ブラウザは、ページを開いただけでは音を鳴らさないことがあるので、最初にキーを押したときに音が鳴り始めるようにしてください。
作り終えたら、BGM と効果音をそれぞれどう鳴らしているか、音のあり・なしをどう切り替えているかを、ふつうの言葉で説明してください。※ このページの枠の中の作業フォルダの道は、例の道(C:\games\ の下)に置き換えて載せています。ほかの文字はそのままです。
Claude Code は HTML ファイルを1つ作り、音の鳴らし方を次のように説明しました。
BGM については、14音の短い楽譜(音の高さと長さの表)を持たせ、0.025秒ごとに楽譜を少し先まで読んで、次の0.1秒ぶんの音を鳴らす時刻を前もって予約する作りだと説明しました。最後の音まで行ったら最初に戻るので繰り返し鳴る、とのことです。効果音「ピロン」は、コインを取った瞬間に高い音を2つ続けて鳴らす(0.08秒の「ピ」と、少し高い0.22秒の「ロン」)と説明しました。
音のあり・なしについては、すべての音が最後に1つの音量つまみを通って出る作りで、M キーでそのつまみを「1(あり)」と「0(なし)」で入れ替え、BGM は「なし」のあいだも裏で進む、と説明しました。ページを開いただけでは音の仕組みを作らず、最初にどれかのキーが押されたときに作って BGM を始める、とも説明しています。
Claude Code は、スクリプトが文法の誤りなく読み込めることを確かめただけで、ブラウザで開いて遊んだり音を聞いたりはしていない、と自分で書いています。この説明は Claude Code 自身の説明で、動いた証拠ではありません。次の節は、その動きを測った記録です。
BGM と効果音が頼んだとおりに鳴るかを確かめる
音は聞けないので、画面を持たないブラウザ(Chrome)で game.htm をファイルのまま開く前に、ページが読み込まれる前に走る処理を1つ差し込みました。この処理は、ブラウザの音の仕組み(Web Audio API)のうち、音の仕組みそのものを作る処理、音の時計を進め直す処理、音を出す部品の発音を予約する処理、音量の値を入れる処理が呼ばれるたびに、呼ばれた時刻と、そのときの値(音の高さ・予約した時刻・音量)を記録します。あわせて、全体の音量つまみの出口に、音の波形を読むだけの部品を横につなぎ、0.1秒おきに「全体の音量つまみの値」と「出口の波形の振れ幅の最大」を読みました。スコアは、ゲームの描き直しの処理が1回終わるたびに読み、増えた時刻を記録しました。自動再生を緩めるブラウザの設定は使っていません(スピーカーから音を出さない設定だけを使いました)。
以下の秒数は、すべて「ページが最初のキー(右矢印)を受けた時点から」の経過時間です。
| したこと | 記録に出たこと |
|---|---|
| ページを開き始めてから2.5秒ほど、キーを押さずに待つ | 音の仕組みが作られた回数は0、発音の予約は0、音の時計を進め直す処理は0。画面の真ん中に「何かキーを押すと音が鳴り始めます」と出ていた |
| 最初のキーとして右矢印を押す | 0.04秒で音の仕組みが1つ作られ、そのときにはもう「動いている」状態だった。0.07秒で BGM の1音目の予約が呼ばれた(予約した時刻は、そのときの音の時計の0.088秒先)。出口の波形の振れ幅が初めて0でなくなったのは1.04秒の読み取り。この試しのブラウザでは、音の時計は0.14秒から0.84秒までの読み取りで0.0116秒のまま進まず、次の0.94秒の読み取りから進み始めていた |
| 自機をコインの下へ寄せてコインを取る | スコアが1になった描き直しの処理(1.84秒)の中で、効果音の発音の予約が2つ呼ばれた。1つ目はそのときの音の時計ちょうど、2つ目は0.07秒先。2つとも、予約が呼ばれた時点でスコアはもう1だった。スコアが2(3.61秒)・3(9.24秒)になったときも同じ形だった(3回とも、スコアの増えた描き直しの中で2つの予約が呼ばれた) |
| M キーを押す(4.14秒) | 全体の音量つまみを0へ動かす処理が1回呼ばれた(0.02秒の時定数で近づける形)。つまみの値は、4.14秒の読み取りで1、4.24秒で0.0072、4.44秒からは0だった。M キーから0.3秒後から次の M キーまでの39回の読み取りは、つまみの値も出口の振れ幅もすべて0だった。そのあいだ(4.14〜8.32秒)にも BGM の予約は15音呼ばれた |
| もう一度 M キーを押す(8.32秒) | 全体の音量つまみを1へ動かす処理が1回呼ばれた。つまみの値は8.34秒の読み取りで0.6375、8.54秒からは1だった。M キーから0.3秒後から試しの終わり(12.51秒)までの39回の読み取りは、つまみの値がすべて1で、出口の振れ幅の最大は0.2988だった |
BGM の予約は、試しのあいだ(12.51秒まで)に全部で46音呼ばれ、音の高さの並びは、最初の14音(523.25ヘルツで始まり523.25ヘルツで終わる)のあと、15音目からまた同じ並びに戻っていました。15音目から46音目までの32音は、どれも14音前の音と同じ高さでした。予約した時刻どうしの間は、45か所すべてが0.2273秒か0.4545秒で、14音ごとに同じ間の並び(0.2273秒が6回、0.4545秒が1回、0.2273秒が6回、0.4545秒が1回)が続いていました。音を「なし」にしていたあいだも、この間の並びは途切れていません。
この試しのあいだ、コンソールに出たエラー・警告・例外は0件でした。スピーカーから出る音そのものを聞くこと、最初に押したキーが M のときの動き、M キーを押しっぱなしにしたときの動き、タブを裏に回したときの動きは、この試しでは確かめていません。
BGM を繰り返し鳴らす仕組み
game.htm を読むと、BGM は音のファイルを使わず、一定の高さの音を出し続ける部品(発振器)で1音ずつ作る作りでした。楽譜は14音ぶんの「音の高さ(ヘルツ)と長さ(拍)」の表で、1分に132拍の速さで、長さは0.5拍か1拍です。1音ごとに発振器を1つ作り、音の形は矩形波にし、鳴り始めにすっと大きく、終わりにすっと小さくなるよう音量を動かしてから、決まった時刻に鳴り始め、決まった時刻に止まるよう予約します。
予約は、0.025秒ごとに走る処理が、ブラウザの音の時計を見て、0.1秒先までに鳴り始める音をまとめて予約する形でした。予約するたびに次の音の時刻を1音の長さだけ進め、楽譜の最後の音の次は最初の音に戻ります。1拍が60÷132秒なので、0.5拍は0.2273秒、1拍は0.4545秒で、上の試しで記録した間と同じ数です。予約が遅れて次の音の時刻がもう過ぎていたときは、たまった音をまとめて鳴らさず、その時点の0.05秒先から続ける作りも入っていました。
効果音と音のあり・なしの仕組み
コインを取ったときの効果音は、BGM と同じ1音ずつの作りで、音の形を三角波にし、1318.51ヘルツの音を0.08秒と、0.07秒遅れて1975.53ヘルツの音を0.22秒、続けて予約していました。コインを取ってスコアを1増やす処理のすぐあとに呼ばれるので、上の試しでは、スコアが増えた描き直しの処理の中で予約が呼ばれていました。
音の流れは、BGM 用の音量つまみ(0.18)と効果音用の音量つまみ(0.35)が、どちらも全体の音量つまみにつながり、全体の音量つまみだけがスピーカーの出口につながる形でした。上の試しで記録した、音の部品が出口までどうつながっていたかの並びも、BGM は「発振器 → 1音ごとの音量 → BGM 用の音量つまみ → 全体の音量つまみ → 出口」、効果音は「発振器 → 1音ごとの音量 → 効果音用の音量つまみ → 全体の音量つまみ → 出口」でした。
M キーは、全体の音量つまみの値を、音の時計のその時点から、1か0へ時定数0.02秒で近づける処理を呼びます。値をいきなり変えると音にプツッという雑音が入ることがあり、決まった時間をかけて値を近づける処理が用意されています。この作りでは BGM の予約の処理は全体の音量つまみを見ていないので、「なし」のあいだも予約は続き、出口に届く音だけが0になります。M キーの判定では、押しっぱなしのときに繰り返し届くキーの知らせを数えない作りでした。
Claude Code でゲームを1から作る手順は、初心者がブラウザゲームを作るにあります。
ページを開いただけでは音が鳴らない決まり
Chrome では、Web Audio API で鳴らす音も自動再生の決まりの対象で、Chrome 71 からこの形です。ページがユーザーの操作を受ける前に音の仕組みを作ると、止まった状態で作られます。止まった音の仕組みは、ユーザーの操作のあとに音の時計を進め直す処理を呼ぶか、つながった部品の発音を始める処理を呼ぶと動き出します。ブラウザが自動で音を鳴らしてよいのは、そのサイトでユーザーがクリック・タップ・キーを押すなどの操作をしたあと、などの場合に限られ、ユーザーの操作をまだ受けていないタブでプログラムから始めた音は、ふつうは止められます。
この game.htm は、最初のキーを受けた処理の中で音の仕組みを作り、そのあとで音の時計を進め直す処理を1回呼んでいました。上の試しでは、音の仕組みは作られた時点で「動いている」状態で、進め直す処理が呼ばれた時点でも「動いている」状態のままでした。ページを開いた時点で音の仕組みを作った場合に、この試しのブラウザで止まった状態になるかは、この試しでは確かめていません。
情報源
- Overview(Claude Code の公式ドキュメント)https://code.claude.com/docs/en/overview確認日 2026-09-25
- AudioContext(MDN)https://developer.mozilla.org/en-US/docs/Web/API/AudioContext確認日 2026-09-25
- OscillatorNode(MDN)https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode確認日 2026-09-25
- GainNode(MDN)https://developer.mozilla.org/en-US/docs/Web/API/GainNode確認日 2026-09-25
- AudioScheduledSourceNode: start() method(MDN)https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode/start確認日 2026-09-25
- AudioParam: setTargetAtTime() method(MDN)https://developer.mozilla.org/en-US/docs/Web/API/AudioParam/setTargetAtTime確認日 2026-09-25
- BaseAudioContext: currentTime property(MDN)https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/currentTime確認日 2026-09-25
- AnalyserNode(MDN)https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode確認日 2026-09-25
- Autoplay guide for media and Web Audio APIs(MDN)https://developer.mozilla.org/en-US/docs/Web/Media/Guides/Autoplay確認日 2026-09-25
- Autoplay policy in Chrome(Chrome for Developers)https://developer.chrome.com/blog/autoplay確認日 2026-09-25
- AudioContext: resume() method(MDN)https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/resume確認日 2026-09-25




