メロディ評価システム
このドキュメントでは、メロディ生成における候補選択と評価の仕組みを説明します。
音楽理論が初めての方へ
このページはコードトーン・経過音・モチーフ・フックといった旋律の語彙を前提にしています。馴染みがなければ、コースのメロディ・モチーフ・フックの章が再生できる譜例付きで先に解説します。
概要
MIDI Sketch は複数のメロディ候補を生成し、評価システムを通じて1つを選択します。
候補生成
セクション別の候補数
セクションごとに異なる候補数を使用します:
| セクション | 候補数 | 備考 |
|---|---|---|
| サビ (Chorus) | 100 | フックセクション |
| Bメロ (Pre-chorus) | 50 | トランジションセクション |
| ブリッジ / チャント | 30 | コントラストセクション |
| Aメロ / イントロ / アウトロ | 20 | 安定セクション。インタールード・MixBreak・Drop もここに含まれます |
生成プロセス
各候補について:
- リズムパターン - 音符の位置と長さを生成
- ピッチ選択 - メロディテンプレート (PlateauTalk, RunUpTarget 等) を適用
- 制約適用 - 歌いやすさと音域制限を適用
- 装飾 - 経過音、刺繍音を追加
アーティキュレーション・ゲート
ゲート処理は、4分音符未満のフレーズ内部の音符だけを対象にします。フレーズの開始・終了と4分音符以上の音符は短縮しません。順次進行はレガートのまま、跳躍には小さな隙間だけを入れます。最低長は16分音符なので、16分音符未満の入力はこの下限によって長くなる場合があります。
リズムロックがかかったセクション
セクションがロック済みのリズムパターンを再利用する場合は別の経路になります。候補数はセクションによらず常に 20 個で、7 つの品質次元をスタイル別の重みではなく均等に合計し、合成比率も後述の 40/40/20 ではなくスタイル 35% + ペナルティ 40% + グローバルモチーフ 25% になります。順位カットと重み付きランダム選択は同じです。
評価と選択
各候補は段階的にではなく、3 つの軸を同時に計算して一度にスコアリングされます。
- スタイルスコア(40%) — 後述の 7 つの品質次元を重み付けしたもの。
- ペナルティスコア(40%) — 1.0 から始め、歌唱難度と音楽的な問題を減点していく。
- 音程バイアススコア(20%) — 順次進行・跳躍・同音の配分が、そのボーカルスタイルの傾向にどれだけ合うか。
モチーフが設定されている場合は、さらにグローバルモチーフのボーナスが加算されます。重みはセクション別で、サビ 0.35 からブリッジ 0.05 まで変わり、重要なセクションほどモチーフの同一性を保ちます。
その後、候補をソートして下位半分を破棄します。これは絶対的な閾値ではなく順位による固定カットです。勝者は残った半分からスコアに比例した重み付きランダム選択で選ばれるため、高スコアの候補が選ばれやすいものの確定ではありません。これにより、繰り返しのセクションで同じメロディに収束するのを防いでいます。
ペナルティスコア
ペナルティスコアは 1.0 から始まり、9 種類のペナルティを引き、2 種類のボーナスを足して 0.0〜1.0 にクランプされます。ここで候補が捨てられるわけではなく、この値は候補が順位付けへ持ち込む 3 つの数値の 1 つです。
ペナルティ
| ペナルティ | 最大値 | 検出対象 |
|---|---|---|
| 高音域 | 0.5 | D5(74)以上の音が連続、または長く伸びる |
| 高音後の跳躍 | 0.4 | 5 度以上の跳躍で D5 以上に着地 |
| 急激な方向転換 | 0.3 | 8 分音符以下の間隔での方向転換が 3 回を超える |
| 孤立音 | 0.3 | 前後どちらも 5 度以上離れている音 |
| 息継ぎなし | 0.25 | 休符を挟まない短い音が 5 個を超えて連続 |
| 強拍の非コードトーン | 0.2 | 強拍でコードトーンになる音が半分未満 |
| 単調さ | 0.2 | 異なるピッチが全音符数の半分未満 |
| 結束の不足 | 約 0.18 | 結束度がスタイル別閾値を下回る(順次進行のまとまり・リズムの一貫性・セルの反復がない) |
| ギャップ率 | 約 0.375 | フレーズに対する無音の割合がスタイル別閾値を超える |
息継ぎペナルティはボカロ系スタイルでは適用されず、結束とギャップの閾値もボーカルスタイルごとに変わります。
フレーズ結束の基準
- 順次進行のラン(連続した接続音)
- 一貫したリズムパターン
- 3音セルの反復(音程 + 長さのモチーフ)
ボーナス
| ボーナス | 範囲 | 検出対象 |
|---|---|---|
| 明確なピーク | 0.0-0.15 | 最高音が 1 つだけで、フレーズの 25%〜85% の位置にある |
| モチーフ反復 | 0.0-0.2 | AAAB反復パターン |
スタイルスコア
各候補は 7 つの次元でスコアリングされ、ボーカルスタイル別の重みが掛けられます:
歌いやすさスコア
音程分布を測定:
| 音程タイプ | 目標範囲 |
|---|---|
| ステップ(1-2半音) | 40-50% |
| 同音 | 20-30% |
| 小跳躍(3-4半音) | 15-25% |
| 大跳躍(5+半音) | 5-10% |
コードトーン率
強拍でのコードトーン頻度を測定:
- 強拍: 4/4拍子の1拍目と3拍目(2拍ごと、tick % 960 == 0)
- 高い率は和声的により安定したメロディを示す
輪郭形状
メロディの形状を検出:
- アーチ: 上昇して下降
- ウェーブ: 振動パターン
- 下行: 徐々に下降
サプライズ要素
フレーズあたりの大跳躍(5+半音)を測定。目標: 1-2回。
AAABパターン
変化を伴う反復を検出 - 同じフレーズが3回繰り返された後に変化。
リズム-音程相関
音符の長さと音程幅の適合度を測定:
| 組み合わせ | スコア | 理由 |
|---|---|---|
| 長い音符 + 大きな跳躍 | 高い | 歌手は大きな跳躍に時間が必要 |
| 短い音符 + ステップ | 高い | 速いパッセージは順次進行が最適 |
| 短い音符 + 大きな跳躍 | 低い | 歌うのが困難 |
ポップボーカル理論に基づく:歌手は大きなピッチ変化に準備時間が必要です。このスコアリングは自然に歌いやすいメロディを評価します。
キャッチーさ
フックの記憶しやすさを 4 つの要素から測定します。2〜3 音の音程パターンの反復(30%)、音符の長さの一貫性(25%)、長 3 度以内の音程が占める割合(25%)、そして定番のフック輪郭の検出(20%)です。同音の連続は 2〜4 音までがボーナス、5 音以上は単調としてペナルティになります。Idol と K-Pop のプロファイルでは、この項目が単独で最も重い重みを持ちます。
スタイル別の重み
ボーカルスタイルごとに異なる評価重みを使用:
| スタイル | 歌いやすさ | サプライズ | プラトーバイアス | 高音域 |
|---|---|---|---|---|
| Standard | 0.15 | 0.15 | 1.0 | 0.8 |
| Idol | 0.18 | 0.05 | 1.25 | 0.85 |
| Rock | 0.15 | 0.20 | 0.8 | 1.2 |
| Ballad | 0.30 | 0.05 | 1.0 | 0.5 |
| Anime | 0.10 | 0.15 | 1.3 | 1.3 |
| Vocaloid | 0.10 | 0.20 | 0.9 | 1.2 |
| CityPop | 0.15 | 0.15 | 0.9 | 0.9 |
| KPop | 0.12 | 0.18 | 1.4 | 1.1 |
歌いやすさとサプライズは評価時の重みで、7 次元の合計が 1.0 になります。プラトーバイアスと高音域は候補生成時に働く傾向値なので、重みではなく 1.0 前後の倍率です。
パラメータ定義
- 歌いやすさ: 音程ベースのスコアリング重み
- サプライズ: 大跳躍検出の重み
- プラトーバイアス: 同音継続の傾向
- 高音域: 高い音への傾向
スタイル別コヒージョン閾値
スタイルによって必要なメロディのまとまり度合いが異なります:
| スタイル | コヒージョン閾値 |
|---|---|
| Ballad, CityPop | 0.50 |
| Standard その他 | 0.45 |
| Vocaloid, UltraVocaloid, Rock, PowerfulShout | 0.35 |
コヒージョン閾値を下回るメロディはペナルティを受けます。
スタイル別ギャップ閾値
| スタイル | ギャップ閾値 |
|---|---|
| Ballad | 0.50 |
| CityPop | 0.45 |
| Standard その他 | 0.40 |
| Anime | 0.35 |
| Idol, BrightKira, CuteAffected, Rock, PowerfulShout | 0.30 |
| Vocaloid, UltraVocaloid | 0.25 |
生成後の分析
不協和音アナライザーは生成後のハーモニー問題をチェックします。
問題タイプ
| タイプ | 説明 | 例 |
|---|---|---|
| 同時衝突 | 2つの音が不協和音程 | ベース E + メロディ F = 短2度 |
| 非コードトーン | 現在のコードにない音 | Cメジャーコード上のD |
| コード変化後の持続 | コード変化後に非コードトーンに | Fコード上で持続するC |
| 非ダイアトニック音 | キーのスケールにない音 | Cメジャーの F# |
深刻度レベル
| 深刻度 | 音程 | 備考 |
|---|---|---|
| High | 短2度 (1)、近接した長2度 (2)、短9度 (13)、I と IV 以外のコード上の長7度 (11) | 強い不協和 |
| Medium | 近接したトライトーン (6)、I または IV 上の長7度(意図した maj7 の可能性)、強拍の非コードトーン | 文脈依存 |
| Low | 弱拍の非コードトーン(経過音)、オクターブを跨いだ短2度・長7度、オクターブを跨いだトライトーン | 多くの場合許容 |
セクション冒頭の 1 拍目にかかる問題は、最も露出する位置のため深刻度が 1 段階引き上げられます。
CLI 使用方法
# 生成して分析
./build/bin/midisketch_cli --seed 42 --analyze
# 既存のMIDIを分析
./build/bin/midisketch_cli --input song.mid --analyze現在のレポート項目と出力例はCLIの不協和音分析リファレンスを参照してください。
パイプラインまとめ
まとめ
- セクションごとに複数の候補を生成(20-100)
- 各候補は 1 つの合成スコアを持つ:スタイル 40%・ペナルティ 40%・音程バイアス 20%
- 下位半分を順位で切り捨て、残りからスコアに比例した重み付きランダムで 1 本を選ぶ
- スタイル別の重みと閾値で評価基準を調整
- 生成後の不協和音分析が利用可能