analyze-song(楽曲定量分析・Phase 1b)
できること
音源(YouTube URL / ローカル MP3)から以下を数値抽出:
- BPM・テンポ信頼度(librosa)
- キー・スケール・信頼度(music21)
- コード進行(music21 chordify)
- メロディ音域(music21)
- phrase_repetition:前半/後半の音程同一性検出(vocals.mid 単離で高精度化)
- vocals 音域・性別推定・声域(ボーカルMIDI音域ベース・median MIDI で male/female 判定)
- instrumentation 楽器構成(4 stem の音響特徴量で楽器カテゴリ推定)
- (Phase2)名曲特徴量DB登録: analyze-song 結果を features.json として名曲DB(reference/名曲DB/)へ蓄積・_index.yaml で一覧管理
- (Phase3)照合エンジン: query曲の features.json を名曲DBと照合し、類似名曲ランキング+重心(代表型)+改善ヒントを report.md で出力(
python -m scripts.match_song)
いつ使うか
- 自作曲の「名曲っぽさ」を数値で確認したい時
- 既存曲の構造を定量化して make-song の参照にしたい時
- reverse-engineer-song の定性分析を数値で裏付けたい時
トリガーワード
「楽曲分析して」「曲を定量分析」「BPM/コード抽出」「名曲っぽさ分析」「analyze-song」「/analyze-song」
使い方(Phase 1b)
cd /home/yn4416/projects/claude-config/skills/analyze-song && \
/home/yn4416/projects/claude-config/.venv/bin/python scripts/analyze_song.py \
<YouTube URL または MP3パス> \
-o <出力ディレクトリ> \
-t <曲名>
※ scripts/analyze_song.py は from scripts import ... で各モジュールを解決するため、cwd を skills/analyze-song にして実行すること。
使い方(Phase 2・名曲DB登録)
cd /home/yn4416/projects/claude-config/skills/analyze-song && \
/home/yn4416/projects/claude-config/.venv/bin/python -m scripts.register_song \
<曲ID(JPOP-001等)> <YouTube URL または MP3パス> \
--title <曲名> --artist <アーティスト> \
--genre {JPOP,ROCK,HIPHOP,WAFU,WORLD} \
--commercial-rank {million,oricon1,billboard_top10,long_seller} \
--era {1970s,1980s,1990s,2000s,2010s,2020s} --selection-reason <選定理由>
- features.json → SSOT(
reference/名曲DB/<曲ID>/)・音源MP3/PNG/stems → ローカル(~/Music/名曲DB_raw/<曲ID>/)に配置分離(著作権安全・音源は公開側に置かない) _index.yamlに冪等でエントリ追記(同曲ID再登録は上書き・重複なし)- 曲ID 命名:
<GENRE>-<3桁>(JPOP-001/HIPHOP-010/WAFU-099) _candidates.yamlが ssot_db に存在する場合、登録曲の status を自動で pending→registered に更新(ruamel.yaml でコメント保持)
使い方(Phase 3・照合エンジン)
cd /home/yn4416/projects/claude-config/skills/analyze-song && \
/home/yn4416/projects/claude-config/.venv/bin/python -m scripts.match_song \
<query features.json パス> <名曲DBディレクトリ> [-o <出力 report.md>]
- query 曲(自作曲等)の features.json を名曲DB(
reference/名曲DB/)の全曲と照合し、類似度トップk + 重心(代表型)+ 改善ヒントを report.md で出力 - 出力先省略時は query と同階層に
match_report.md - 併せて
make_song_input.json(機械向け構造化JSON・make-song の Phase 0.5/1 参照用)も同階層に出力 - スコアリング4軸: BPM・key・chord・range(重みは
scripts/weights.yaml)。phrase_repetition はDB観察で100%Falseのため除外軸
Windows Desktop環境での実行(重要)
上記コマンドは.venv/bin/python(Linux ELFバイナリ)を直接実行するためWSL-CLI環境専用。Windows Desktop環境では直接実行できないため、win-wsl-exec.sh(claude-config/scripts/win-wsl-exec.sh)経由で実行すること:
- Writeツールで実行したい上記コマンドを
/tmp/<任意名>.shに書き出す(#!/bin/bashシェバン付き) bash /home/yn4416/projects/claude-config/scripts/win-wsl-exec.sh /tmp/<任意名>.shを実行 (コマンド文字列をBashツールの引数に直接書くとPreToolUse path-rewriteフックで壊れるため、必ずファイル経由にすること)
出力(<出力ディレクトリ>/ 配下)
features.json— 全特徴量(機械用)score/full-1.pngscore/full.pdf— 五線譜(人間用・MuseScore環境依存で省略の場合あり)report.md— サマリ+工程ログ(人間用)make_song_input.json— make-song 連携用構造化JSON(query特徴・類似名曲ランキング・重心・推奨パラメータ・ジャンル分布)※Phase3照合時のみ
Phase(1a/1b/2/3 実装済み)
- 1a: 音源取得+分析エンジン(librosa/basic_pitch/music21・Demucs無し)✅
- 1b: Demucs音源分離で精度UP(drums BPM・vocals/accompaniment別MIDI・phrase/音域改善)✅
- 2: 名曲特徴量DB(features.json蓄積+_index.yaml・登録パイプライン・30曲登録済)✅
- 3: 照合エンジン実装済✅(4軸重み付けスコアリング・ランキング・重心・改善ヒント・make-song連携JSON出力)
既知の制限(Phase 1b)
- BPM: drums stem推定で実曲精度UP(Stayin' Alive 104→103.36)。AI生成ドラムonset特殊音源は外れ値あり(yoen-v3_1: 85指定→112推定)
- phrase_repetition: vocals.mid 単離で改善済み
- 楽譜PNG: libpipewire-0.3-0 導入で headless WSL2 のセグフォ解消(PNG/PDF生成可能)
- vocals 性別推定: ピッチ中央値のヒューリスティック(median MIDI ≤A3=male/超=female)。falsetto 判定不可(MIDI単体・倍音構造必要)
- instrumentation: 楽器カテゴリ推定のみ(具象名=エレキピアノ等は Phase2+)。stem名+音響特徴量ハイブリッド
- Phase2 名曲DB: 30曲登録済(JPOP/ROCK/HIPHOP/WAFU/WORLD・
reference/名曲DB/)。phrase_repetition はDB観察で100%FalseのためPhase3除外軸・range は低域誤検出あり - テスト戦略: 正解定義型ゴールドセット(ジャンル判別を想定)は、3指標×重み調整の全組合せで判別不可を実証し廃止(
01_DECISIONS/ai-music/2026-06-24_analyze-song-chord指標見直し-不可能性証明.md)。代わりにプロパティベーステスト(対称性sim(A,B)=sim(B,A)・スコア∈[0,1]・BPM単調減少)でエンジン健全性を保証。ジャンル/主観に依存しない・本体コード不変。
前提知識(進行開始前に必ず読み込む)
- venv:
/home/yn4416/projects/claude-config/.venv(変更禁止) - MuseScore:
/home/yn4416/tools/MuseScore-Studio-4.7.3.AppImage - spec:
obsidian-ssot/docs/superpowers/specs/2026-06-19-analyze-song-design.md - plan:
obsidian-ssot/docs/superpowers/plans/2026-06-19-analyze-song-design.md - Phase2 spec:
obsidian-ssot/docs/superpowers/specs/2026-06-21-analyze-song-phase2-famous-songs-db-design.md - Phase2 plan:
obsidian-ssot/docs/superpowers/plans/2026-06-21-analyze-song-phase2-famous-songs-db.md - Phase3 spec:
obsidian-ssot/docs/superpowers/specs/2026-06-22-analyze-song-phase3-matching-engine-design.md - Phase3 plan:
obsidian-ssot/docs/superpowers/plans/2026-06-22-analyze-song-phase3-matching-engine.md