藤本健のDigital Audio Laboratory

第1051回

ChatGPT×コード生成AIでASIO対応の音楽プレーヤー「DAL Player」作ってみた

わずか30分ほどで出来あがった「DAL Player」

ここ最近、Claudeの「Fable 5」が大きな話題になっている。筆者もFable 5を使ってみたり、「Claude Code」でDTM関連の簡単なプログラムを組んだりして遊んでいる。そこで、もうちょっと踏み出して「WindowsのASIOドライバで出力するプレイヤーを作ってみたら面白いのでは?」と思いつき、試してみることにした。

当初はFable 5を使うつもりだったが、別件で触っていた経験から今回の用途にはオーバースペックだと感じて見送った。代わりに候補に挙がったのがOpenAIのCodexだ。たまたま数日前、知人から「これまでClaude Codeを使って某楽器システムを作っていたけど、Codexが便利で簡単だから、そちらにすべて移管した」と聞いたのだ。

これまでCodexはまったく使ってなかったのだが、いざ試してみると、インストールからわずか30分ほどでASIO対応の音楽プレーヤー「DAL Player」ができてしまった。その一部始終をレポートしたい。

Fable 5からCodexへ。方針転換のいきさつ

もともとの発想はシンプルで、「Fable 5が話題になっているのだから、次のDigital Audio Laboratoryのネタもこれを使って何か作ってみよう。せっかくなら、Windows用のASIOドライバで音を鳴らせるプレーヤーを作ってみたら面白いのではないか?」。こう考えたのがきっかけだ。

音楽の再生なら「foobar2000」「MusicBee」「JRiver」「AIMP」「Roon」など、世の中にいくらでも存在する。だからこそ、ここでプレーヤーを作ったところで、大きな価値があるわけではないとは思う。

とはいえ、自分でオリジナルプレーヤーが作れるとなると、これはちょっと面白い。またせっかくならASIOドライバを利用して、ビットパーフェクトを実現するプレーヤーができるなら、多少なりとも価値があるかもしれない。

それに、もしうまくいくなら、WASAPIなどをサポートしたり、オーディオAPIといったテーマと結び付けて発展させていくのも面白そうだ。

ところが、いざ試してみようと思ったところで方針が変わった。たまたま知人から「Codexがいい」という話を聞いたのである。

ちょうどFable 5は別件で使っていた最中で、今回の用途にそこまでのパワーは不要だろうと感じていたこと、さらにClaudeの利用が上限に達し、6時間待ちのような状態になっていたことも重なった。

そこで今回は、これまでまったく使ったことのなかったCodexで試してみよう、ということになったわけだ。

Codexを試すも最初の一歩でつまずく

Codexが何かもほとんどよく知らなかったけど、確かにいつものChatGPT画面の左側にCodexというのがある。

これをクリックすると、Microsoft StoreからCodexがインストールされた。

が、使い方がよくわからないから、ChatGPTに聞くとターミナルを起動して「codex」と入力して起動しろ、という。しかしPowerShellで「codex」と入力しても起動しないという壁にぶつかった。

原因は単純で、ChatGPT DesktopとCodexは別アプリだったのである。Codex Desktopを起動することで解決したが、最初から少しつまずいた形になった。

Codexを起動すると、今度は「エージェント・サウンドボックス」なるものの設定を求められた。何のことやらわからないが、ChatGPTによれば、これはCodexがローカルPC上で安全に作業するための仕組みとのこと。作業フォルダを指定し、ようやく開発がスタートする。

Claude Codeを使い始めたときもそうだったが、いきなりコーディングAIそのものと向き合うのはハードルが高い。そこで今回も、ChatGPTと対話をしながらCodexを操作するという進め方を取った。

ChatGPTと対話をしながら作業を進めた

ChatGPTには機能要求を伝えるだけでなく、設計の妥当性を検討してもらったり、Codexへの指示文=プロンプトをブラッシュアップしてもらったりする役回りを任せている。つまり、ChatGPTが作ったプロンプトをCodexへコピペするだけが筆者の仕事というわけだ。

ここではいきなりCodexに「プレーヤーを作れ」というわけではなく、ChatGPTと相談しながら進めていく。

私自身はPythonによるインスタントプログラムでもできるのかな? となんとなく想像していたのだが、Pythonにするか、C#にするか、WPFかWinFormsか、NAudioか他のライブラリか、といった設計レビューもChatGPTが勝手に行なってくれて、方針が決まっていく。最終的に採用したのは、

- C# / .NET 10
- WPF
- NAudio

という構成だ。Pythonも候補に挙がったが、ASIOとの親和性、WindowsネイティブAPIへのアクセス、将来のWASAPI Exclusive対応、Visual Studioとの統合を考えるとC#が自然という結論になった。

もっとも、その検討において、筆者は何も考えてないというか、参加してない。ChatGPTやCodexが自問自答しながら、検討してくれて最適解を見つけ出してくれたようだ。

ちなみにChatGPTによれば、WPFを選んだのはWinFormsに比べて将来UIを育てやすく、MVVMへの発展も見込めるため、とのこと。

オーディオライブラリはNAudio、ManagedBass、CSCoreを比較し、ASIO・WASAPI・DirectSound・Media Foundationを一つのライブラリで扱えるNAudioを採用したとのことだが、正直なところすべてお任せで、筆者は数分ただ待っていただけのことだ。

そんな中、筆者にChatGPT側から求められたのはプロジェクト名というかソフトウェア名の命名。

最初仮でASIO-TESTとかにしてたけれど、それじゃ面白くないだろうということで、Digital Audio Laboratoryの略である「DAL」を使い、「DAL Player」にした。

GhatGPTの提案により、単なる試作品ではなく、連載とともに育てていくプロジェクトという位置付けにしようと、この名前にしている。

わずか30分でVer0.1が完成

ChatGPTが作り出したCodexへの最初の指示は、いきなり実装をさせるのではなく「設計だけをしてください」というものだった。AIはコードを書くこと自体は得意でも、設計思想を確認しないまま実装させると方向性がぶれやすい。そこでまずアーキテクチャとライブラリ構成、開発計画を提案させ、それを人間側でレビューする方式を採った。

Codexは、.NET 10、WPF、NAudio 2系という構成に加え、将来ASIO/WASAPIを抽象化するインターフェースまで提案してきた。ここでChatGPT側から「最初から抽象化しすぎず、まずは音を出すことを優先すべき」というレビューが入り、Ver0.1はASIOドライバ選択、WAVファイルを開く、Play、Stopという最小構成に絞ることにした。

Codexはいきなりコードを書き始めるのではなく、.NET SDKの確認、WPFプロジェクトの作成、NuGetパッケージの追加、READMEの作成という順番で進めていった。この段取りの付け方は、人間の開発者の進め方とソックリだ。

途中、NAudioの取得でTLS絡みと思われるエラーが発生する場面もあった。しかしCodexは「失敗しました」で終わらせず、Pythonを使った取得やローカルNuGetの構築、キャッシュの利用など、複数の代替手段を自ら試していった。

NuGetへのアクセスやGitの初期化など、要所要所で許可を求めるダイアログが表示されるので、そのたびにChatGPTへ確認しながら進めた。

そんなCodexが自問自答してる画面を横目で見つつ、まったく関係ない帳簿入力などをしてたら、10分ほどで作業が終わり、ドキュメントも完成していた。

作業用フォルダを覗いてみると、ソースコードやプロジェクトファイルなど、いろいろなファイルが出来上がっている。もっとも、実行できるプログラムがそこにあるというわけではなく、Visual Studioを用いて自分でビルドする必要はあるようだ。

といっても操作自体はとても簡単。これもChatGPTに聞きながら行なったのだが、できあがっていたファイルDAL Player.csprojをダブルクリックしてVisual Studioを開くだけで、ビルドは何の問題もなく成功。

Visual Studioのツールバーにある再生ボタンをクリックすると、非常にシンプルな画面が現れた。この画面の上には小さなアイコンがいっぱい並んでいるけれど、これはデバッグバージョンであり、Vusual Studioの機能で、そうなっているようだ。

再生ボタンをクリックすると……
シンプルな画面が現れた

本体としてはASIOドライバ選択、WAV選択、Play、Stopのみのウィンドウだが、デフォルトとしてAbleton MoveのASIOドライバが設定されており、ここをクリックすると現在入っているASIOドライバの一覧に表示される。

WAVファイルを指定してPlayを押すと、ASIO経由で本当に音が出た。こんなあっさりASIOドライバを使ったプレーヤーが完成してしまうのかと、驚いてしまう。

ASIO経由で音が出た

ここまでスタートから30分。しかも、横で事務作業をしながらできてしまったのだ。こんなに簡単にできていいのかと不安に感じてしまうほどである。

Ver0.2でASIO Control Panelを追加

Ver0.1が予想以上にあっさり動いたことで、「もう少しだけ実用的にしたい」という気持ちも出てくる。

まず、あるべきだろうと思ったのがASIO Control Panelボタンの追加だ。DAWはもちろん、オーディオプレーヤーソフトでも、ASIOドライバを使えるソフトであれば、通常このボタンが用意されている。

サンプルレートやバッファサイズ、クロックの変更にこのコントロールパネルを開く必要があるため、「ASIO対応」を名乗るならあって当然だろう。その実装も、ChatGPTと相談の上、Codexへのプロンプトを作ってもらった。

ここでCodexへは「追加するのはASIO Control Panelのみ、それ以外は変更しない」という具体的な指示を出し、Ver0.1を壊さないことを最優先にした。もっとも、ここもChatGPTに言われるままにCodexへプロンプトをコピペしただけである。

その結果、MainWindow.xamlやAsioPlaybackService.csなどが書き換えられ、ビルドも問題なく成功。画面にASIO Control Panelボタンが追加された。

画面にASIO Control Panelボタンが追加された

改めてドライバの選択ができることを確認の上、ASIOドライバを指定し、ASIO Control Panelボタンを押すと、ASIOドライバの設定画面がきちんと開くことも確認できた。

ASIOドライバを指定
ASIO Control Panelボタンを押すと、ASIOドライバの設定画面が開いた

Ver0.1で試したのは、昔にCDからリッピングした44.1kHz/16bitのWAVファイル。Ver0.2においては、Ver0.1で再生したファイルに続き、ProToolsから書き出したものとして以前受け取った48kHz/24bitのWAVファイルも開いてみた。するとASIO Control Panel側の表示も48kHzへ自動的に切り替わった。再生するファイルに応じてASIOデバイスのサンプルレートを変更していることになる。

ここまでは、予想通りだったのだが、そのままPlayを押すとアプリがクラッシュした。ChatGPTに相談してみたところ、推測では、44.1kHz用のASIOストリームを完全に破棄しないまま48kHz用のストリームを作ろうとしたため、内部状態に不整合が生じたのではないか、とのこと。

初めて作ったプレーヤーであり、サンプルレート変更まで考慮されていないのはむしろ自然な結果とも言えそうだ。とはいえ、ここからバグ修正の旅に出るのも大変そうなので、この修正は次回の課題とすることにした。

Gitを導入しDAL Playerを「育てるプロジェクト」に

このVer0.2をフリーウェアとして公開してもいいかなとは思ったものの、それほど価値のあるプログラムでもないし、セキュリティ面などで問題が出る可能性も無きにしも非ず。どうすればよいかChatGPTに相談すると、連載企画としてバージョン管理をしながら育てていき、GitHubに公開していくのがいいのでは? とのこと。

なるほど、それは面白そう。GitHubは時々利用しているが、自分でプロジェクトを立ち上げて公開したことはないので、どうすればいいのかを聞くと、またCodexに投げるプロンプトを作ってくれた。

具体的にはGitリポジトリの初期化、.gitignoreの追加、MITライセンス、CHANGELOG、READMEの整備、初回コミット、そしてタグ「v0.2」の付与までを一気に行なってもらった。bin、obj、.nugetといった公開に不要なファイルもきちんと除外されている。ここまでくると、GitHubへ公開できる状態は十分に整ったと言える。

とはいえ、GitHubの公開そのものは、今回は見送り次回ネタにしよう、ということに。

やはりGitHubの環境を整えるにはそれなりにパワーがかかりそうなので、今回はとりあえず動いたというところまでで止めておく。

AIは「コードを書く機械」ではなかった

今回の開発を通じて感じたのは、Codexが単なるコード生成ツールではなかったということだ。

設計を考え、問題点を見つけ、エラーを解析し、代替案を試し、ビルドし、READMEまで整備する。ソースコードだけでなくプロジェクト全体を整えていく様子は、コード生成AIというより、新しくチームに加わったジュニアエンジニアに近い感覚だった。

一方、ChatGPTは設計レビュー役として機能した。WPFかWinFormsか、Gitをいつ導入するか、GitHub公開を見送るかどうかといった判断は、Codexへ丸投げせずChatGPTと相談しながら決めている。

実装はCodex、設計レビューと方向性の相談はChatGPT、そして「何を作るか」「どこまで実装するか」「記事としてどう成立させるか」を決めるのは人間、という三者の役割分担が、結果として非常にうまく機能したと思う。

コードはほとんど自分では書いていないし、内容も見ていない。それでもASIO対応プレーヤーが1日で動くところまで仕上がったという事実は、AIとの共同開発の可能性を強く感じさせるものだった。

DAL Playerは、普通の音楽プレーヤーを目指しているわけではない。ASIO、WASAPI Exclusive、WASAPI Shared、DirectSoundを瞬時に切り替えられ、サンプルレートやバッファサイズ、レイテンシー、使用中のAPIを表示できる、Windowsオーディオの実験ツールへ育てていきたいと考えている。

次は、今回見つかったサンプルレート切り替え時のクラッシュを修正し、GitHubへの公開を行なう。あわせて、MP3対応やWASAPI Exclusive対応など、機能追加にも着手する予定だ。

Ver0.1からVer0.2まで、AIと対話しながらソフトウェアを育てていくこの実験が、どこまで進むのか。続報をお楽しみに。

藤本健

リクルートに15年勤務した後、2004年に有限会社フラクタル・デザインを設立。リクルート在籍時代からMIDI、オーディオ、レコーディング関連の記事を中心に執筆している。以前にはシーケンスソフトの開発やMIDIインターフェイス、パソコン用音源の開発に携わったこともあるため、現在でも、システム周りの知識は深い。 著書に「コンプリートDTMガイドブック」(リットーミュージック)、「できる初音ミク&鏡音リン・レン 」(インプレスジャパン)、「MASTER OF SONAR」(BNN新社)などがある。またブログ型ニュースサイトDTMステーションを運営するほか、All AboutではDTM・デジタルレコーディング担当ガイドも務めている。Twitterは@kenfujimoto