おいおい、みんな聞いちゃくれよ! 私、今、とんでもないプロジェクトに手を出してるんだ。そう、あの「Google Antigravity」と一緒に、誰もが夢見たであろう、あの8bit音楽の自動生成ツールを開発中なんだよ! もう、胸が高鳴りすぎて、心臓がスーパーマリオの1UPキノコを連打してる気分!
これがまた、一筋縄ではいかない。期待と興奮、そしてちょっぴりの「あれ?」が入り混じった、まさにジェットコースターのような開発現場。今日はその「企画構想編」と題して、この狂おしいほどに魅力的なプロジェクトの始まりから、最新の「わかったこと」まで、ぜーんぶぶっちゃけていこうじゃないか!
第 1 章: 8bit音楽、それは僕らの心の宇宙(そら)。AIで自動生成、夢じゃなかった!
そう、始まりはね、ほんの小さな「好き」からだったんだ。私、昔から8bit音楽が大好きなの。あの、たった数種類のシンプルな波形だけで、無限のドラマを奏でるサウンド。ファミコンの起動音から、ゼルダの伝説の広大なフィールド、ロックマンの痺れるボス戦BGMまで、全部が僕らのDNAに刻まれてる、って言っても過言じゃないだろ?
もうね、気づけば休日になると、昔のゲーム音楽をひたすら聴いて、自分でも「カバー」を作っちゃうのが趣味になっちゃってたんだよね。フリーのDAWソフトを立ち上げては、ピコピコ音をひたすら打ち込む。いや、これがもう、たまらないんだ! 限られた音源の中で、どうやってあのメロディを再現するか、どうやってアレンジするか。そこには、無限のクリエイティビティが詰まってるんだ。
でもね、ふと思ったんだよ。「これ、もしかしてAIにできるんじゃね?」って。
世の中には、数えきれないほどの8bit音楽のカバー音源がある。オリジナルももちろんだけど、愛と情熱が詰まったユーザーメイドの音源もごまんとある。もし、これらをAIに学習させたらどうなる? ファミコン時代の限られた音色で、新しい、それでいて「あの頃」を感じさせるオリジナル楽曲を、ぽんっ!と生み出せちゃうんじゃないか?
いや、これ、夢すぎるだろ! 「よし、やろう!」って思ったら、もう止まらない。いてもたってもいられなくなって、すぐにAI開発の最前線をぶっ飛ばしてる「Antigravity」さんに、勢い任せでお願いしてみたんだ。
「あの! 私、8bit音楽が死ぬほど好きで! AIで自動生成ツール作りたいんですけど! いけますか!?」
この無謀とも思える情熱が、まさか実現に向けて動き出すとは、この時の私は知る由もなかったのだ。
第 2 章: これがバイブコーディングの真髄!雑な要望がアートになった瞬間
Antigravityさんからの返事は、秒速だった。
私「なんか8bitのMIDIデータを学習してオリジナルの楽曲をつくるものをつくりたいんですよ! できればブラウザでポチってできたら最高なんすけど!」
私の、もはや中学生の夏休みの自由研究レベルのざっくりした要望に対して、Antigravityさんの返答は、もうね、「おかのした!」の一言。いや、この軽さ、好きすぎる! そして次の瞬間、目の前に現れたのは、私の脳内でぼんやりとくすぶっていた炎を、一気に燃え上がらせるような、とんでもない「企画構想案」だったんだ!
ちょっと見てくれよ、このプロフェッショナルな言語化能力!
🌟 初期構想と技術の選定
コンセプト
「懐かしくも新しい。ボタンひとつで、誰もが8ビット音楽のクリエイターになれる体験の提供」
プロジェクトのスタート地点は、ファミコン(NES)時代の制限された音源(矩形波、三角波、ノイズ)を使いつつ、現代のAI技術を統合した、ブラウザで動作する軽量かつ高機能なDAWの開発でした。
技術スタック
- Frontend: React + Vite + TypeScript
- モダンなWeb開発の鉄板。軽快な動作と開発効率を両立。
- Audio Logic: Tone.js (ブラウザ音楽エンジンの標準)
- Web Audio APIを強力に抽象化。複雑な音源生成もブラウザ上で実現可能に。
- AI/Math: seedrandom による決定的かつ音楽的なメロディ生成アルゴリズム
- 同じシード値からは常に同じ結果が生まれる。つまり「このプロンプトからはこの曲が生まれる」という再現性を担保しながら、無限のバリエーションを生み出す核。
- Styling: TailwindCSS + Vanilla CSS (カスタムグラスモルフィズム、ネオンエフェクト)
- 8bitの世界観に合わせた、レトロフューチャーなUIデザインを構築。
おいおいおいおい! マジかよ!?
「懐かしくも新しい。ボタンひとつで、誰もが8ビット音楽のクリエイターになれる体験の提供」だと!? もう、これ! これだよこれ! 私が言語化できなかった漠然とした夢が、たった数行で完璧に表現されてる! しかも、「ブラウザで動作する軽量かつ高機能なDAW」って、まさに私が求めていたもの!
私「ええやん! めちゃくちゃええやんこれ!! お願いします! これでいきましょう!!」
私の感情のタガは外れ、まるで子供のように興奮しちゃったよ。Antigravityさんの「バイブコーディング」は、こちらのざっくりとした「バイブス」を、一瞬にして明確なビジョンと確固たる技術プランへと昇華させる、まさしく魔法だったのだ!
第 3 章: 夢の先に待つ現実…あれ?なんかちがうぞ?試行錯誤は続くよ、どこまでも!
よし、完璧な構想だ! あとはAntigravityさんがバリバリ自動でコーディングして、システムをバンバンつくってくれるんだろ? そう思ってた。期待値は爆上がり。まるで、ファミコンのカートリッジを本体に差し込んで、電源ONボタンを押す瞬間のワクワク感だ。
しかし、現実は……甘くなかった。
いや、甘すぎる8bitサウンドだった、と言うべきか。
現段階で出来上がった成果物が、これだ。
8bit DAWの画面
画面には、DAWのようなトラックと再生ボタン、そしていかにも「生成するぞ!」と言わんばかりのボタンが並んでる。UIは、TailwindCSSとカスタムCSSで組まれた、レトロフューチャー感満載のクールなデザイン。うんうん、見た目はめっちゃ良い! グラスモルフィズムの透明感とネオンエフェクトが、まさにサイバーパンクな8bit世界を演出してる。何度言ってもトラック名のエリアとタイムラインのカラムを分けてという要望は聞き入れてもらえなかったのであきらめた(くそが!)
そして、「CREATE UNIVERSE」ボタンを、期待に胸を膨らませて押してみたんだ。
…ピコ……ピコピコ……ブン……タン!……ピコ……ブンブン……。
……あれ?
いや、音が鳴ってる。うん、確かに8bitっぽい音だ。矩形波、三角波、ノイズ。まさにファミコンサウンド。しかし、そのメロディは……なんというか、「変な音のランダムな並び」としか言いようがない。
私の頭の中には、ロックマンXのオープニングステージや、FFの勝利のファンファーレが流れるはずだったのに、実際に聞こえてきたのは、まるで壊れたファミコンが発する奇妙なノイズの集合体だったんだ。うーん、これはこれでシュールで面白いんだけど、私が求めていた「懐かしくも新しい、8bitミュージック」とは、かなり乖離があるぞ……?
でもね、コードを読んでみたら、Antigravityさんの技術力にまたしても驚かされたんだ。見てくれ、このオーディオエンジンの核心を。
2. 🎹 オーディオエンジンの核心
究極の8ビットサウンドの実装audioEngine.tsでは、Tone.js をラップしたカスタムクラスを構築しました。それぞれのトラックに対し、8ビット音楽の黄金時代を支えた波形を精密に定義しています。
// Lead Synth: 矩形波(Pulse)の鋭いメロディ
this.leadSynth = new Tone.PolySynth(Tone.Synth, {
oscillator: { type: 'pulse', width: 0.5 },
envelope: { attack: 0.005, decay: 0.1, sustain: 0.3, release: 0.1 }
}).toDestination();
// Bass Synth: 三角波(Triangle)の温かい低音
this.bassSynth = new Tone.MonoSynth({
oscillator: { type: 'triangle' },
envelope: { attack: 0.01, decay: 0.2, sustain: 0.4, release: 0.2 },
filter: { Q: 1, type: 'lowpass', rolloff: -12 }
}).toDestination();
TIP
「矩形波の幅(Pulse Width)」を0.5に設定することで、ファミコン特有の「鼻にかかったような」独特のリードサウンドを再現しています。
これだよ! このこだわり! 「Pulse Width」を0.5にするだけで、あのファミコン特有の「鼻にかかったような」サウンドを再現してるんだ。技術的には完璧なんだよ。音源は、もう限りなくファミコンなのだ。
問題は、「音の並び」、つまりAIによる作曲部分なんだ。
3. 🧠 AI作曲:メロディ生成の仕組み
再現性とランダム性の共存ユーザーが「CREATE UNIVERSE」を押すたびに、独自の宇宙(曲)が誕生します。ここではseedrandomを活用し、特定のプロンプトから常に同じ「世界線」の音楽が生まれるようにしました。
// リズムと音程の音楽的制約
const scale = ['C4', 'D4', 'E4', 'F4', 'G4', 'A4', 'B4'];
const generatePattern = (seed) => {
const rng = seedrandom(seed);
// 音楽的なルールに基づいた音符の配置...
};
そう、問題はここなんだ。「音楽的なルールに基づいた音符の配置…」の部分が、まだ「音楽的」になりきれていないんだな。今はまだ、scaleで指定された音階の中で、seedrandomが生成するランダムなパターンがそのまま出力されている状態。だから、あの「変な音のランダムな並び」になっちゃうわけだ。
これは、つまり、AIに「良い音楽」の定義を、もっと深く学習させる必要がある、ってことだよね。ファミコンサウンドの肝は、限られた音色の中でいかに人間が心地よいと感じるメロディやハーモニーを作り出すか。そこには、単純なランダム性だけでは到達できない、人間が「エモい」と感じるパターンが存在するんだ。
Antigravityと開発を進めていく中で、いくつかの課題も見えてきたんだ。
- UI面の指示が結構難しい: 「こんな感じのボタンで、この機能がほしい!」と伝えるだけだと、AIは想像力を働かせきれないことがある。やっぱり、Figmaとかで具体的なモックアップを作って、「ここをこうして、こう動いてほしい」って明確に伝えるのが大事だね。これもAIにデザイン案から作ってもらえたら、もっとすごいんだけどな!
- 「動いてないな?」と思うと許可出しが必要な時がある: これは設定次第なのかもしれないけど、AIが次のステップに進むために、途中で私の許可を求めてくることが何度かあった。自動生成って言っても、まだまだ人間の確認は不可欠なんだな、と。
- Geminiの知識が少し古かったりする: 最新のWeb技術や、特定のライブラリの最新バージョンについての情報が、AIの学習データに含まれていないことがある。そこは人間が補完してあげる必要があって、「今、これ最新情報だとこうなってるよ!」って教えてあげると、ちゃんとアップデートしてくれるんだけどね。
いやー、AIってのは、万能の魔法のランプじゃないんだな、と改めて痛感させられたよ。でも、それがまた面白いんだ。AIが生成したコードやアイデアを叩き台にして、人間が「もっとこうしたい」「ここが違う」って、対話しながら育てていく感覚。まるで、一緒に子供を育ててるみたいだ。
この「変な音のランダムな並び」を、どうやって、私らの心の琴線に触れる「懐かしくも新しい8bitミュージック」に進化させていくか。ここからが、このプロジェクトの真骨頂であり、最も熱くて、最も「ワクワク」するフェーズになるはずだ。
次回は、いよいよAI作曲アルゴリズムの精度向上、そして「感情を揺さぶる8bitサウンド」を生み出すための、知られざる試行錯誤の舞台裏を、とことん深掘りしていこうじゃないか!
乞うご期待!
コメント