3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

好きな曲をExcelに入れたらピアノが弾き始めた【Python×VBA】

3
Posted at

Excelが楽器になった。コードは読めない。バイブコーディングで作った。

先に言っておきます。

この記事に出てくるコード、ほとんど理解していません。

PythonもVBAも、自分で1から書いたわけじゃない。
AIに「こういうの作って」と伝えて、出てきたものを動かして、動かなかったら「エラー出た」と伝えて、また直してもらう。

いわゆる バイブコーディング で作った。

それでもExcelが好きな曲を弾き始めた。

demo_nice.gif

↑ これ、全部Excelです。コードは読めないけど。

音付きで見たい方はこちら → YouTube動画


バイブコーディングって何?

知らない人のために簡単に説明すると、AIと会話しながらプログラムを作る方法のこと。

従来のプログラミング:

仕様を考える → 設計する → コードを書く → デバッグする → 完成

バイブコーディング:

「こういうの作って」→ AIがコード出す → 動かす → 「ここ変えて」→ 完成

コードの中身を完全に理解している必要はない。
「何を作りたいか」と「どう動いてほしいか」が言えれば、AIがコードにしてくれる。


何を作ったか

「MIDIファイルを入れるとExcelピアノリズムゲームのVBAコードが出てくるPythonアプリ」。

MIDIファイル (.mid)
        ↓
   [Python GUI アプリ]
     MIDIデータ解析
     ノート情報抽出
        ↓
   完成したVBAコード(.bas)
        ↓
   ExcelのVBAエディタに貼る
        ↓
   StartGame 実行
        ↓
   🎹 演奏開始

好きな曲のMIDIファイルさえあれば、Excelが勝手にその曲を弾く。

このPythonアプリの中身、正直ほとんど分からない。
でも動く。ちゃんと動く。


なぜMIDIなのか

最初はMP3やWAV、MP4にも対応させようとした。
librosaでピッチ検出して音を拾う仕組みまで作った。

結論から言うと、音声ファイルからの変換は安定しなかった。

ピアノソロならまだしも、ボーカルが入っていたり楽器が重なっていると、どの音がどの楽器なのか分離できない。検出したノートで演奏させると「なんか違う曲」になってしまう。

一方MIDIファイルは 「いつ・何の音を・どのくらいの強さで・どのくらいの長さ鳴らすか」が全部データとして入っている 。楽譜そのものだ。

変換精度は完璧。音の取りこぼしがゼロ。

割り切ってMIDIに絞ったことで、結果的に一番いいものができた。

ただし、MP3/WAV/MP4の解析機能もアプリ内にそのまま残してあります。
ファイル選択でMP3やWAVを選べば変換が走ります。ピアノソロの曲ならそこそこの精度で動くので、興味のある方はぜひ試してみてください。「おっ、意外といけるじゃん」という曲もあれば「全然ダメだ」という曲もあって、それはそれで面白いです。


デモ

Pythonアプリ側

python_demo.gif
MIDIファイルを選んでボタンを押すだけ。数秒でVBAコードが生成される。


実際の会話はこんな感じだった

最初の一言はこうだった。

「パッヘルベルのカノンのVBAコードがあるんだけど、MIDIファイルを入れたらこういうコードが自動で出てくるPythonのデスクトップアプリを作りたい」

するとAIがPythonのコードを出してきた。983行。

動かしてみた。

No module named 'librosa' って出る」

AIが教えてくれた。pip install librosa しろと。
前回の記事でPythonは入れてあったので、ライブラリを追加するだけだった。
……と思ったら、PATHが通ってなくてバッチファイルから python が見つからない。

python が見つからないって言われる」

AIがPythonの場所を自動で探すバッチファイルを作ってくれた。

入れた。

「文字化けしてる」

AIが日本語を全部消したASCII版のバッチファイルを作り直してくれた。

こういうやりとりを何十回も繰り返して、最終的に動くものが出来上がった。

自分がやったことは「伝えること」と「試すこと」だけ。


PCへの負荷は大丈夫なのか

正直これは心配だった。

Excelでリアルタイムにセルの色を変えながらMIDI APIを叩くわけで、メインループが Do While で回り続ける。CPUやメモリに負荷をかけすぎてPCの寿命を縮めないか?

AIに聞いたところ、以下の対策が入っているらしい:

  • Sleep 1 がループの末尾にある → CPUを1ミリ秒休ませることで占有率が100%に張り付くのを防ぐ
  • 描画は50ms間隔に間引き → 毎フレーム描画せず、秒間20回に抑えている
  • ウィンドウ方式 → 全ノートを毎回チェックせず、現在時刻付近のノートだけ処理

とはいえ、演奏中はCPUをそれなりに使う。

結論として、数分の演奏を何回か楽しむ程度でPCが壊れることはない。 ゲームをプレイするのと同じレベルの負荷。ただし演奏中に他の重いアプリを同時に動かすとカクつく可能性はある。

心配な人は StopGame マクロでいつでも止められる。


パフォーマンスの限界

パソコンの性能やCPU・メモリの使用状況によって、ノーツと音がズレることがあります。

できるだけ軽くしたつもりだけど、Excelはリアルタイム描画のために作られたソフトじゃない。同時発音数が多い箇所や、ノート数が多い曲(5000以上)では特にズレが出やすい。

「Excelでここまでやってるんだから」 という温かい目で見てもらえると嬉しい。


長い曲の制限について

長すぎる曲を入れるとエラーになることがあります。

これはVBAの仕様上しかたのないことで、生成されるコードの中に全ノートのデータが AddN i, sM, sT, sD, sV, ... という1行1音の形で入る。10分の曲で和音だらけだと何千行にもなり、VBAモジュールの限界に達する。

ノート数の上限は8000に設定してあり、超えた場合は音量の小さいノートから間引かれる。それでも長い曲やオーケストラ編成のMIDIだと厳しい場合がある。

正直なところ、自分にはこの制限を解消するスキルがない。

たとえばノートデータを外部ファイルに出して読み込む方式にするとか、VBAのコードを分割するとか、方法はあるのかもしれない。腕に覚えのある方がいたら、ぜひ改善してみてください。 ソースコードは公開しているので、フォークもプルリクも大歓迎です。


「保守できないだろ」という声について

バイブコーディングの話を出すと、必ずこう言われる。

「コード理解してないのに保守やメンテどうするの?」
「バグが出たとき自分で直せないでしょ?」

正論だと思う。 実際そういう意見も来ている。

VBAの変数名が衝突してエラーが出たとき、自分では何が起きているか分からなかった。AIに聞いて「VBAは大文字小文字を区別しないから prpR が衝突している」と教えてもらって初めて理解した。

でも、こうも思う。

「理解してから作る」を待っていたら、一生作れなかった。

自分はもともと半導体の製造現場で働いていた人間で、プログラミングの専門教育は受けていない。VBAは業務改善で独学した。Pythonは触ったことがあるけど、librosaだのmidoだの言われても正直分からない。

でもバイブコーディングなら、「こういうものが欲しい」を伝えるだけで形になる。

作りたいものがある。動かしてみたい。人に見せたい。

その気持ちがあれば、コードが読めなくても作れる時代になった。
これは排他的な話じゃない。プロの人はコードを書けばいい。自分はバイブコーディングで作る。どっちも「ものを作っている」ことに変わりはない。

保守が必要になったら? またAIに聞けばいい。


仕組み(AIに教えてもらった範囲で)

全部は分からないけど、AIに聞いて理解できた範囲で書く。

MIDIファイル → ノートリスト(Python)

MIDIファイルには「いつ・何の音を・どのくらいの強さで鳴らす」が全部入っている。Pythonがそれを読み取って、こんなリストにしてくれる:

[(60番の音, 0ms, 500ms, 音量90), (64番の音, 500ms, 500ms, 音量85), ...]

ノートリスト → VBAコード(Python)

そのリストを、VBAで読める形のコードに変換する。音楽データが丸ごとソースコードになる。

AddN i, sM, sT, sD, sV, 60, 0, 500, 90
AddN i, sM, sT, sD, sV, 64, 500, 500, 85
' ... 何千行も続く

VBA → 演奏(Excel + Windows API)

VBAがWindowsのMIDI機能を直接呼んで音を鳴らす。同時にセルの色を変えてノーツの落下アニメーションを描画する。

この3段階。自分が理解しているのはこのレベル。
でもこのレベルの理解で、動くものが作れた。


使い方

必要なもの

  • Python(前回の記事で入れたものでOK)
  • Excel(Windows版、マクロ有効)
  • MIDIファイル(ネットで「〇〇 MIDI」で検索すると見つかる)

セットアップ

前回の記事でPythonは入っている前提で、追加ライブラリだけ入れる:

pip install librosa numpy soundfile pydub

実行

python music_to_vba.py
  1. GUIが立ち上がる
  2. MIDIファイル(.mid)を選ぶ
  3. 「VBAコードを生成」ボタンを押す
  4. 生成されたコードをコピー
  5. Excelで Alt+F11 → 挿入 → 標準モジュール → 貼り付け
  6. StartGame マクロを実行

以上。好きな曲がExcelで演奏される。

何度でも StartGame を実行できる。毎回自動でリセットされる。

MP3やWAVで試したい方は、ファイル選択ダイアログでMP3/WAV/MP4も選べます。MP4の場合は追加で pip install imageio-ffmpeg が必要。精度はMIDIに劣りますが、ピアノソロの曲なら意外と楽しめます。


苦労したポイント(バイブコーディングならではの)

環境構築が一番キツかった

Pythonは前回の記事で入れてあった。でもそこからが長かった。

PATHが通ってない、pip installがエラーになる、バッチファイルが文字化けする、imageio-ffmpegを初めて入れたらまた別のエラー。コードの外側の問題で何時間も使った。

AIはコードを書くのは得意だけど、「あなたのPCの今の状態」は見えない。「エラー出た」「こういう画面になった」とスクリーンショットを送りながら一つずつ潰していった。

「動かない」の伝え方が大事

バイブコーディングで一番大事なスキルは、「何が起きているかを正確に伝えること」 だと思う。

「動かない」だけじゃダメ。
「このボタンを押したらこのエラーメッセージが出た」まで伝える。
できればエラーメッセージをそのままコピペする。

これができるかどうかで、AIの回答の精度が全然違う。

何度もやり直した

最初のコードで完成したわけじゃない。

  • MIDIデバイスが開けない → 修正
  • 低音が鳴らない → 修正
  • 変数名が衝突 → 修正
  • 重すぎる → 軽量化
  • またエラー → また修正

10回以上やり直している。 でもそれでいい。1回で完璧なものが出てくる必要はない。「伝える→試す→伝える」のサイクルを回せば、最終的には動くものができる。


改善してくれる人、募集

このアプリには自分では直せない課題がいくつかある:

  • 長い曲(ノート8000超)でエラーになる → ノートデータの外部ファイル化?
  • MP3/WAVの変換精度 → 音源分離や機械学習ベースのピッチ検出?
  • 描画のさらなる軽量化 → Excelの限界を超える方法があれば
  • Mac対応 → 現状Windows MIDI APIに依存している

腕に覚えのある方、ぜひ触ってみてください。 フォークもプルリクも歓迎です。

自分が作れたのはここまで。ここから先は、コードが読める人の力を借りたい。
バイブコーディングで種を蒔いて、プロの人が育ててくれたら最高だと思っている。


まとめ

  • MIDIファイルを入れるとExcelがピアノを弾く アプリを作った
  • バイブコーディングで作った。コードの中身はほとんど理解していない
  • MP3/WAVも試せるが安定するのはMIDI。音声変換は機能として残してあるのでぜひ試してほしい
  • 長い曲はノート上限でエラーになる。直せる方がいたらお願いしたい
  • PCへの負荷は通常のゲーム程度。Sleep処理と描画間引きで対策済み
  • パソコンの性能次第でズレは出る。できるだけ軽くしたつもり
  • 「保守できないだろ」→ またAIに聞けばいい

コードが読めなくても、作りたいものがあれば作れる。

Excelは表計算ソフトのはずだった。
MIDIファイルを食わせたら好きな曲を弾き始めた。
しかもそれを作ったのは、コードが読めない人間だった。

いい時代になった。


リンク

  • ▶ 動画(音付き)YouTube
  • 📂 ソースコードGitHub

前回の記事:

質問・感想・「この曲でやってみた」報告・改善プルリク、お待ちしています。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?