概要
インディーゲーム開発に勤しんでいる中年個人プログラマです。
普段はGitHub CopilotによるAI支援を受けていて、非常に賢い自動コード補完をしてくれるのでAIスゲーと思っていましたが、世間で盛り上がっているClaude code等のAIエージェントに関して、バイブコーディングで簡単なプロンプトだけでゲームが作れたとかネットの話が流れてきても、自分的には何か懐疑的だったのでスルーしていました、
ただ巷であまりにスゴいという情報が大きくなってきて、一応触るだけでも触っておかないと技術情報弱者になってしまうという焦りの気持ちでClaude codeの有料プランに加入して体験してみようと思った次第です。
そこでClaude codeに何を作ってもらおうと考えたときに、現在開発中の2DアクションRPGゲーム用のBGMを鳴らすサウンドエンジン作ってもらうことにしました。
wav,ogg,mp3等をストリーミング再生する方式では、楽曲1ファイルで数十メガバイトのサイズになってしまい曲数が増えるとBGMに使用する配布ファイルのサイズが肥大化してしまいます。
今回作るサウンドエンジンは昔のゲームハードに内蔵しているサウンドチップの様にFM音源やPCM音源をリアルタイムで鳴らす方式になります(世代的に80年代、90年代をリスペクトしてるので、その年代のレトロゲームや技術を好んでいます😊)
この方式なら1音色のPCM波形(wav)100キロバイト程度、複数楽器の音色PCM波形を合計しても数メガバイト程度(FM音源なら僅かなテキストデータ)のデータサイズで済むのでBGMに使用する配布データは劇的に減少することができます、そしてサウンドエンジンにはMML(Music Macro Language)でシーケンス再生する機能も持たせます。
サウンドエンジンはGo言語向けのゲーム組込み用になり、主にEbitengine を使用したゲーム実装への組込みを想定しています(内部的にEbitengineのoto/v3 を利用して出音しています)
サウンド再生方式のメリット、デメリット
各方式には どちらにもメリット・デメリットがあります、ただ万人向けのサウンドエンジンではありませんが80年代・90年代風ゲームを作っている人には刺さるのではないかと思います(シンセサイザー音源をリアルタイムで鳴らす感じ)
| ストリーミング方式 | 今回サウンドエンジン方式 | |
|---|---|---|
| 方式 | 現代の主流 wav等をそのまま再生 |
非主流(古い方式) リアルタイムで音を合成して再生 |
| サウンドファイルサイズ | 大きい | 非常に小さい FM音源だけなら数KB |
| 音質 | wav = CD音質 mp3 = 劣化(bpsによる) |
PCM音源(wav) = CD音質 FM音源 = CD音質 |
| BGM作成方法 | 楽曲作成はDAW内で完結、豪華な楽器構成やエフェクトなど自由に使ってつくった楽曲をwav化 | 音色PCM波形(wav)やFM音源を自前で作り用意し、DAWで楽曲作りしたデータをMMLに変換してオーサリング作業を行なう |
| 表現力 | wav楽曲次第 | 細かい音変化は苦手 |
| ループ再生 | wav = なめらか mp3 = 一瞬途切れる |
なめらか |
| パフォーマンス負荷 | 小さい 2chのみの再生負荷 |
少し負荷がかかる 複数トラック再生分の負荷(リバーブの負荷もある) |
| 手軽さ | 楽曲wavが用意されていれば手軽 | MMLをその場で書いて演奏できるのですぐ音を出したい場合は手軽 |
| 使用目的 | 素材BGMを鳴らす場合 | レトロゲーム時代の音表現で鳴らす場合 |
開発手法
当初Claude codeエージェントAIに実装を作ってもらう開発手法自体をバイブコーディングなのだと思っていました、Claude codeについてまったくの素人なので実践本を買ってきてCLAUDE.mdに設計仕様を書いてAIに作ってもらうの知りました。
開発ロードマップ & フェーズ計画テンプレートを元にフェーズ単位で実装していく方法も初めて知りました。
Markdown
### 開発ロードマップ & フェーズ計画
現在は **[ Phase 1 ]** を実行中です。
※ 上のフェーズが完了して承認されるまで、次のフェーズのコードは実装しないでください。
---
### Phase 1: XXXを作成
* **目的**: XXXの実装
*
* **実装内容**:
* XXXロジック作成
* **完了条件(Definition of Done)**:
XXXが正しく動作すること
---
今回CLAUDE.mdに事細かく設計仕様を書いてフェーズ単位でAIに実装してもらったので「仕様書駆動開発」という開発手法になると思います。
今回実際に記載したCLAUDE.mdは以下
https://github.com/megaak-soft/go-fmml/blob/main/CLAUDE.md
実装過程
ほとんどの場合はCLAUDE.mdに記載した内容を正しく理解して一発で想定内容通りに実装してくれました。
もちろん問題や修正箇所は発生するので逐次修正を指示していきました、特にフェーズ2のシーケンス再生実装は大変でした、再生しても発音タイミングのずれや重なりが発生し、何度修正をお願いしても一向に直らず、しまいには音色リリース設定が悪いと言い出し、音色リリースパラメータを勝手に固定にしてしまうというズルまで披露してくれました、軽く叱った後に「4拍子の曲で1小節の時間を192分割したタイミング粒度で時間管理する」という指示でAIが何かを理解したのか完璧なタイミングで再生できる様になりました。
実装完了後にREADME.mdや設計資料HTMLドキュメントもCalude codeにお願いしましたが、自分が忘れていたような仕様もちゃんと資料として完璧にまとめてくれました。
GitHubに公開するにあたってもCalude codeに相談しながら進めていきました。
今回加入したプランはProですが、自分の使い方では1回も5時間制限には引っ掛からなかったです。尚、今回使用したモデルは「Sonnet」です。
AIエージェントを使った感想
今回コーディングはすべてAIエージェントに任せており(生成されたコードをあとからちょっと見る程度)、人間が細かい仕様を渡せば、ちゃんと内容を理解把握した上で完璧に近いくらいちゃんと作ってくれることがわかりました、これなら業務で使用する人が爆発的に増えている現状が当然だと思いました。
(ただプロンプト一行で〇〇みたいのを作ってとかの無茶振りでは拡張性も何もないものが出来上がるとは思いますが😅)
今回初めてClaude codeのAIエージェントを実際に触って完成品まで作ることができましたが、総括としての結論としてやはり「AIスゲー」という感想でした。
成果物
go-fmml
GitHub
https://github.com/megaak-soft/go-fmml
Go (Golang) 製のFM音源+PCM音源合成サウンドエンジンです。Ebitengine のoto/v3 を音声出力に使用し、ゲームプロジェクトへライブラリとして組み込んで、MML(Music Macro Language)で記述したBGMを非同期に再生することを想定しています。
コードはMITライセンスで公開していますので、著作権表示とライセンス全文を保持することだけを条件に、商用、組込み、改変、再配布などほぼ無制限に利用できます。
仕様ドキュメント
https://megaak.com/go-fmml/docs/index.html
特徴(概要)
- YAMAHA系FM音源チップを参考にしたFMシンセシスコア(最大16パート、1パートあたり最大16音ポリフォニック)
- 基本波形8種類(W1〜W8)を選択可能なオペレータ
- WAVサンプルを使ったPCM音源パート(ワンショット/ロングの2タイプ、最大16パート)
- 独自MML仕様によるシーケンスデータ記述・再生(最大16パートのFM+16パートのPCMを時間軸ズレなく同期再生)
- マスターステレオリバーブ(Schroeder型・FDN型の2種類、パート単位のセンドレベル対応)
- ボリュームフェードイン/フェードアウト、コンダクターパートによるテンポ変化・ループジャンプ地点指定
- スタンダードMIDIファイル(SMF)を本エンジンのMML仕様へ変換するツール
Smf2GoFMMLを同梱
動作環境
-
Go: 1.24.0 以上(依存する
ebitengine/oto/v3が要求する最低バージョンに準拠) -
対応OS: Windows / macOS / Linux / Android / iOS / WebAssembly(音声出力に使用する
ebitengine/oto/v3の対応プラットフォームに準拠)
演奏サンプル
現在開発中の2DアクションRPGゲームに今回のサウンドエンジンを組み込んでBGMを鳴らしています
(画像をクリックするとXのPostにリンクしています)
https://x.com/MegaakSoft/status/2099785864717259162
作者について
https://megaak.com/
https://x.com/MegaakSoft
「MEGAAK SOFT」はインディーズゲーム開発個人プロジェクト、レトロ風2Dゲームを作っています