
なぜ誰も手を付けなかったのか? ― Vibeコーディングが解いた15年の沈黙
ベルリンのしがひです。DJやっています。
昨日、DJ用音源のラウドネス最適化ツール「headroom」を開発したことをZennで記事にしました。RekordboxからCDJにUSBエクスポートする際、Auto Gain機能が効かないために発生するトラック間の音量差を解消するためのツールです。
開発を進める中で、MP3ファイルのロスレスゲイン調整のためにmp3gainという古いツールへの依存が発生しました。そしてこのmp3gainを調べていくうちに、私はあることに気づきました。
このツールは15年以上メンテナンスされていない。それにもかかわらず、今でもSourceForgeで週1,000回以上ダウンロードされ続けている。
なんとかならんもんか。Claudeの力を借りて、このツールを現代に蘇生させることにしました。
mp3gainとは何か
mp3gainは、MP3ファイルの音量をロスレスで調整できるツールです。「ロスレス」がポイントで、再エンコードなしに音量を変更できます。
MP3フォーマットには各フレームのside informationにglobal_gainという8ビットのフィールドがあります。mp3gainはこのフィールドを直接書き換えることで、オーディオデータには一切触れずに音量調整を実現しています。
| 特性 | 値 |
|---|---|
| global_gainのビット幅 | 8ビット(0-255) |
| 1ステップあたりの変化量 | 1.5 dB |
| 計算式 | 2^(gain/4) |
この仕組みはMP3フォーマットの仕様そのものに基づいているため、mp3gainに限らずどんなツールで操作しても1.5dB刻みになります。これはフォーマットの制約です。
放置されたツール、使われ続けるツール
mp3gainのSourceForgeページを見ると、最後のニュース更新は2018年9月で、内容は「ブラジルポルトガル語の翻訳を更新しました」というもの。実質的な機能開発は2009年頃で停止しています。
Wikipediaには衝撃的な記述がありました。
In 2015 Debian and Ubuntu removed it from their repositories due to a lack of an active maintainer.
(2015年、メンテナ不在によりDebianとUbuntuがリポジトリから削除)
それでも、mp3gainは使われ続けています。
| プラットフォーム | 利用状況 |
|---|---|
| SourceForge | 週1,000回以上ダウンロード |
| Homebrew | 年間320回インストール |
| Windows | Windows 11で動作しない報告多数 |
需要はある。でも誰もメンテナンスしていない。これが15年以上続いているのです。
headroom開発で直面した依存問題
headroomの開発でMP3サポートを追加する際、mp3gainへの依存が必要になりました。FLACやAIFFはffmpegのvolumeフィルターで精密なゲイン調整ができますが、MP3でロスレス調整をするにはmp3gainのアプローチが必須でした。
しかし、メンテナンスされていないCライブラリに依存することへの不安がありました。
- セキュリティパッチが当たらない
- 新しいOSやアーキテクチャへの対応がない
- バグが見つかっても誰も直さない
そこで私はClaudeに相談しました。
「mp3のglobal gainヘッダー操作に現在mp3gainを使用していますが、ヘッダー操作だけのために外部依存する必要はありますか?もしこの操作が簡単なら、メンテナンスされていないライブラリからの依存脱却を目指すべきではないでしょうか。」
Claudeの回答は明確でした。
「依存脱却を目指すべきです。global_gain操作自体は8ビット整数の加減算でシンプル。難しいのはMP3フレーム解析部分ですが、これは仕様書を読み解けば実装できます。」
Claudeと仕様書を読み解く
ここからがVibeコーディングの真骨頂です。
私はmp3gainのCソースコードを移植する道を選びませんでした。代わりに、Claudeと一緒にISO 11172-3(MPEG Audio Layer III仕様)を読み解いて、計算ロジックから再構築することにしました。いわゆるクリーンルームリバースエンジニアリングです。
Claudeは検索結果からMP3フレームの構造を特定していきました。
Side Information構造(各granule):
Part2_3_length: 12 bits
Big_values: 9 bits
GlobalGain: 8 bits ← ここを変更
ScalefacCompress: 4 bits
...
問題はglobal_gainフィールドがバイト境界をまたぐ位置にあることでした。単純なバイト操作では対応できず、ビットレベルでの読み書きが必要です。
さらに複雑なのは、MPEG1/2/2.5、ステレオ/モノラルの組み合わせによってside informationのサイズが変動することです。
| MPEG Version | Channel Mode | Side Info Size |
|---|---|---|
| MPEG1 | Mono | 17 bytes |
| MPEG1 | Stereo | 32 bytes |
| MPEG2/2.5 | Mono | 9 bytes |
| MPEG2/2.5 | Stereo | 17 bytes |
Claudeはこれらの条件分岐を整理し、Rustで568行の実装を生成しました。ID3v2タグのスキップ、フレーム同期検出、ビット非整列アクセス、すべてが動作するコードです。
mp3rgainの誕生
headroomへの組み込みが成功した後、この実装を独立したツールとして公開することにしました。名前はmp3rgain。
# インストール
brew tap M-Igashi/tap
brew install mp3rgain
# 使用例
mp3rgain apply -g 2 song.mp3 # +2ステップ(+3.0 dB)
mp3rgain info song.mp3 # ゲイン情報表示
mp3rgain undo -g 2 song.mp3 # 元に戻す
mp3gainとの主な違いは以下の通りです。
| 特性 | mp3gain | mp3rgain |
|---|---|---|
| 言語 | C | Rust |
| 外部依存 | mpg123 | なし |
| メモリ安全性 | 手動管理 | 言語保証 |
| 最終更新 | 2009年頃 | 2026年(継続中) |
| ライブラリAPI | なし | あり |
Vibeコーディングの意義
今回の経験で強く感じたのは、Claudeがいなければ誰もこの行動を起こさなかったということです。
mp3gainは15年間放置されていました。需要があることは明らかなのに、誰も手を付けなかった。なぜか?
コストとリターンが見合わないからです。
ISO 11172-3の仕様を読み解き、ビットレベルのフレーム解析を実装し、すべてのエッジケースをテストする。この作業量に対して、得られるのは「既存ツールと同じ機能」です。趣味でやるにはハードルが高すぎるし、ビジネスとしてはリターンがない。
しかしClaudeとのVibeコーディングでは、この方程式が変わります。
- 仕様の読み解き → Claudeが検索・要約・解説
- 実装の生成 → Claudeが568行のRustコードを出力
- デバッグ → Claudeがエラーメッセージを解析して修正案を提示
私がやったのは「この問題を解決したい」という意思決定と、Claudeの出力を検証・統合する作業だけです。
これは思いを実装に変換するコストが劇的に下がったことを意味します。今まで「面白そうだけど作るまでもない、使い続けるのは不安だけど自分で作り直すほどヒマじゃない」と判断されていた無数のプロジェクト、ツールが、実現可能な範囲に入ってきています。
Homebrew公式採用を目指して
現在、mp3rgainはHomebrew公式formulaへの採用を目指しています。mp3gainに代わるモダンな選択肢として、コミュニティに貢献したいと考えています。
リポジトリ:https://github.com/M-Igashi/mp3rgain
15年放置されたOSSを蘇らせる。それがVibeコーディングで可能になった。これは単なる技術的な成果ではなく、オープンソースエコシステムの新しい可能性を示唆していると思います。








