ハーモニーとコード進行
MIDI Sketchの和声システムを解説します。
注記
このページでは音楽理論の専門用語を使用しています。これらの概念はシステムが自動的に処理しますが、理解することでより適切なパラメータ選択が可能になります。
音楽理論が初めての方へ
コードやコード進行に馴染みがなければ、まずコースをご覧ください。再生できる譜例つきで基礎から積み上げて解説しています。読んだ後にこのリファレンスへ戻ってくると理解が深まります。
コード進行
MIDI Sketchには一般的なポップミュージックパターンをカバーする22の内蔵コード進行があります。
コード進行とは?
コード進行とは、楽曲の和声的な骨格を形成するコードの連続です。音楽に動きと感情を与えるものです。同じメロディでも、異なるコード進行の上では全く違う印象になります。
4コード進行(ID 0〜19)
ID は chordProgressionId に指定します。
| ID | 名前 | ディグリー | 特徴 |
|---|---|---|---|
| 0 | FourChordPop | I-V-vi-IV | 最も素直な4コードループ。デフォルト |
| 1 | Pop1 | I-vi-IV-V | 50年代型ターンアラウンド。V が冒頭へ戻す |
| 2 | Axis | vi-IV-I-V | 平行短調から始まるため暗く響く |
| 3 | Pop2 | IV-I-V-vi | サブドミナント始まりで、偽終止の V-vi で閉じる |
| 4 | Classic | I-IV-V-I | 教科書的な I-IV-V を正格終止で締める |
| 5 | Pop3 | I-IV-vi-V | 明るく始まり vi へ沈み、V を残したまま終わる |
| 6 | Oudou | IV-V-iii-vi | 王道進行。J-POP の定番 |
| 7 | Minor1 | vi-V-IV-V | 短調のトニックを軸に IV と V を往復し、解決しない |
| 8 | Minor2 | vi-IV-V-I | Axis と同じ4和音を回転させ、V-I で終わらせた形 |
| 9 | Pop4 | I-V-iii-IV | FourChordPop の vi を iii に置き換えた、軽く落ち着かない形 |
| 10 | Pop5 | I-iii-IV-V | スケールを1段ずつ上り、V が I へ押し戻す |
| 11 | Rock1 | I-bVII-IV-I | ミクソリディアンの bVII。ロックとブルースの響き |
| 12 | Rock2 | I-IV-bVII-I | 同じ bVII の色を IV 経由で出す形 |
| 13 | Extended4 | I-V-vi-iii | パッヘルベル型の出だしを iii で止めた形 |
| 14 | Minor3 | vi-I-V-IV | 短調で始まり、以降はメジャーコードが3つ下降して続く |
| 15 | AeolianPop | vi-bVI-bVII-I | 借用した bVI と bVII が上行してトニックへ入る |
| 16 | AnimeHighEnergy1 | vi-iii-IV-I | 短調で始まり明るい I へ駆け上がる |
| 17 | JazzPop | ii-V-I-vi | ii-V-I のターンアラウンドを vi で開き直す |
| 18 | AnimeHighEnergy2 | vi-ii-V-I | 五度圏をそのまま下ってトニックへ着地 |
| 19 | CityPop | I-vi-ii-V | ポップループの中に ii-V を折り込んだシティポップのグルーヴ |
これらの進行を理解する
- FourChordPop (I-V-vi-IV): 現代のポップスで最も多用されるループです。馴染みが強く、ほとんどのメロディが無理なく乗ります。
- Axis (vi-IV-I-V): 同じ和音の集合をマイナーから始めるため、ループ全体がメランコリックに色付きます。エモーショナルなバラードでよく使われます。
- Minor2 (vi-IV-V-I): 最後の V→I が正格終止なので、短調寄りに始まったループが明るい場所へ着地します。
- Oudou (IV-V-iii-vi): 王道進行です。トニック以外から始まり vi で終わるため、常に解決しきらない浮遊感が続きます。
- Rock1 (I-bVII-IV-I): bVII は同主短調からの借用で、ミクソリディアン的なロック/ブルースの風味を加えます。
- AeolianPop (vi-bVI-bVII-I): 借用和音が2つ続けて上行しトニックへ入る、この中で最もモーダルインターチェンジの効いた進行です。
5コード進行(ID 20〜21)
| ID | 名前 | ディグリー | 特徴 |
|---|---|---|---|
| 20 | Extended5 | I-V-vi-iii-IV | パッヘルベル由来の拡張形 |
| 21 | NeapolitanPop | vi-iv-bII-V-I | 借用の iv とナポリの bII を経て正格終止へ |
全進行リスト
上記の22進行がすべてです。内訳は4コードが20種類、5コードが2種類で、以下をカバーします。
- 明るい/暗いダイアトニックなポップループ
- モーダルインターチェンジによる色付け(bVI、bVII、iv、bII)
- bVII を核にしたロック系のパターン
- ii-V を含むジャズ寄りのターンアラウンド
ディグリーシステム
ディグリー(度数)とは?
コードディグリー(I, ii, iii, IV, V, vi, vii)は、キー内でのコードの位置を示します。大文字 = メジャーコード、小文字 = マイナーコード。例:Cメジャーでは I = Cメジャー、ii = Dマイナー、V = Gメジャー。
コードディグリーは名前付きの enum ではなく素の整数で表現されるため、進行は単なるディグリー番号の配列です。
| 値 | ディグリー | 役割 | C メジャーでの例 |
|---|---|---|---|
| 0 | I | トニック | C |
| 1 | ii | 上主音(スープラトニック) | Dm |
| 2 | iii | メディアント | Em |
| 3 | IV | サブドミナント | F |
| 4 | V | ドミナント | G |
| 5 | vi | サブメディアント | Am |
| 6 | vii° | リーディングトーン | Bdim |
| 8 | bVI | 同主短調からの借用 | Ab |
| 10 | bVII | 同主短調からの借用 | Bb |
| 11 | bIII | 同主短調からの借用 | Eb |
| 12 | iv | 借用した短調のサブドミナント | Fm |
| 13 | bII | ナポリの和音 | Db |
| 14 | #IVdim | 半音階的な経過和音 | F#dim |
7 と 9 は使用しません。bII はナポリの和音、iv は短調の変格終止 iv-I を作ります。これらは飾りではなく、AeolianPop(15)は bVI と bVII を、NeapolitanPop(21)は iv と bII を実際に出力するため、ディグリーを解釈する側は 6 より大きい値を扱う必要があります。
コードクオリティ
メジャーとマイナー
- メジャーコードは明るく、ハッピーで安定した響き(C, F, G)
- マイナーコードは暗く、切なく、感情的な響き(Dm, Em, Am)
- ディミニッシュコードは緊張感があり不安定(ポップでは稀に使用)
クオリティはディグリーだけで決まります。キーやモードは参照されず、オーギュメントのクオリティは存在しません。
ChordQuality getChordQuality(int8_t degree) {
// 6 = vii, 14 = #IVdim
if (degree == 6 || degree == 14) return ChordQuality::Diminished;
// 1 = ii, 2 = iii, 5 = vi, 12 = 借用の iv
if (degree == 1 || degree == 2 || degree == 5 || degree == 12) return ChordQuality::Minor;
// I, IV, V と借用の bVI, bVII, bIII, bII
return ChordQuality::Major;
}借用した iv はマイナーです。短3度を持つことこそが借用する理由です。一方 bVI、bVII、bIII、bII はいずれもメジャートライアドになります。
コードエクステンション
エクステンションは基本トライアドに彩りを加える:
エクステンションの使いどころ
- Susコード: 解決前の緊張感を生み出す。期待感を演出する場面に最適。
- 7thコード: 洗練さとジャズ感を加える。シティポップやR&Bで一般的。
- 9thコード: 豊かで複雑なサウンド。最大限の効果のために控えめに使用。
エクステンション確率を高くすると、シティポップ、ジャズ、R&Bスタイルに適しています。シンプルなポップやロックには低めに設定しましょう。
エクステンションタイプ
| タイプ | 追加音 | 例(C) |
|---|---|---|
| Triad | ルート、3度、5度 | C-E-G |
| Sus2 | ルート、2度、5度 | C-D-G |
| Sus4 | ルート、4度、5度 | C-F-G |
| 7th | + 7度 | C-E-G-B/Bb |
| add9 | + 9度(7度なし) | C-E-G-D |
| 9th | + 7度 + 9度 | C-E-G-B-D(maj9)/C-E-G-Bb-D(dom9)/C-Eb-G-Bb-D(min9) |
エクステンション適用ルール
3つのファミリーは sus → 7th → 9th の順に判定され、最初に通ったものを返して終了します。したがって1つのコードに2つのエクステンションが付くことはありません。判定は各ファミリーが個別に乱数を振るため、片方の確率を上げても他方が痩せることはありません。
- sus は小節位置のルールです。セクションの最初の小節か最後から2番目の小節で、かつマイナーコードでないことが条件です。70% で Sus4、残りが Sus2 になります。
- 7th は B メロまたはサビ、あるいは位置を問わず V のときに適用されます。V では確率が2倍になります。
- 9th はサビ内のどのコードにも、または B メロ内の V に適用されます。iii はダイアトニックな9度がルートから見て b9 になるため、Min7 にフォールバックします。
サビのコードは先に確定する
7th が有効な場合、サビは上記の判定より前にリハーモナイズされます。V は Dom7、マイナーコードは Min7、I は Maj7、それ以外は add9 が確定的に割り当てられます。そのため上記のルールがサビで効くのは、7th を無効にしているときだけです。同じ処理は A メロで IV を ii に置き換えることもあります(その IV が V や I へ解決する場合、および ii が隣接している場合は置き換えません)。
設定
struct ChordExtensionParams {
bool enable_sus = false;
bool enable_7th = false;
bool enable_9th = false;
bool tritone_sub = false; // トライトーン代理 (V7 -> bII7)
float sus_probability = 0.2f; // 0.0-1.0 (20%)
float seventh_probability = 0.15f; // 0.0-1.0 (15%)
float ninth_probability = 0.25f; // 0.0-1.0 (25%)
float tritone_sub_probability = 0.5f; // 0.0-1.0 (有効時 50%)
};JS の SongConfig では chordExtSus / chordExt7th / chordExt9th / chordExtTritoneSub と chordExtSusProb / chordExt7thProb / chordExt9thProb / chordExtTritoneSubProb(確率はすべて 0.0-1.0)に対応します。
ムード依存の確率自動調整
chordExtProbExplicit=false(デフォルト)の場合、ムードがスタイルに合わせてコードエクステンション確率を自動調整します。chordExtProbExplicit=trueに設定すると全てのエクステンション確率を手動制御できます。
ボイスリーディング
ボイスリーディングとは?
ボイスリーディングとは、個々の音が一つのコードから次のコードへどのように動くかということです。良いボイスリーディングは滑らかで繋がりのあるコード遷移を生み出します。悪いボイスリーディングはぎこちなく不自然に聞こえます。MIDI Sketchは生成される全てのコード進行に最適化されたボイスリーディングを自動適用します。
原則
- 動きを最小化: 各声部は最小の音程で移動
- 共通音: コード間で共有される音を保持
- 平行5度/8度: 禁止ではなくペナルティ。強さはムード依存で、バラードやドラマチック系では重く、平行進行が定石のダンス/アイドル系では軽く働きます。
- 滑らかなベース: 順次進行または小さな跳躍を優先
アルゴリズム
VoicedChord selectVoicing(const VoicedChord& prev, const Chord& next, Mood mood) {
auto candidates = generateVoicings(next);
// スコアが高いほど良い。共通音の寄与が支配的で、距離はバスとソプラノを
// 2倍に重み付けする。平行5度/8度は禁止ではなく、ムード依存のペナルティ。
int score = typeBonus(candidate)
+ countCommonTones(prev, candidate) * 100
+ (hasParallelFifthsOrOctaves(prev, candidate) ? parallelPenalty(mood) : 0)
- weightedVoicingDistance(prev, candidate)
+ repetitionPenalty(candidate, prev);
// 同点はランダムに選ぶため、同じ小節でボイシングが固定されない。
return pickRandomlyAmongBest(candidates, score);
}声部ごとの跳躍量を見る項はありません。weightedVoicingDistance は声部ごとの重み付き和で、バスとソプラノが2倍、内声が1倍です。共通音は1つで 100 点あり、数半音ぶんの移動量を上回るため、共有音の保持が最も強く働く要素になります。同じボイシングが3回以上続くと、超過1回につき 50 点のペナルティが付きます。
ボイシングタイプ
ボイシングの解説
- クローズポジション: 全ての音が1オクターブ内。コンパクトで直接的なサウンド。ポップで一般的。
- オープンポジション: 音が複数オクターブに広がる。広がりのあるフルなサウンド。バラードに最適。
- ルートレス: ルート音を省略(ベースが弾く)。クリアで濁りのないサウンドを生む。一般的なアレンジテクニック。
ベース-コード協調
コードトラックはベース分析を使用して重複を回避:
struct BassAnalysis {
bool hasRootOnBeat1; // ダウンビートでルート
bool hasRootOnBeat3; // 3拍目でルート
bool hasFifth; // 5度あり
Tick accentTicks[]; // 強拍位置
};
// ベースがルートを持つとルートレスが「候補になる」だけで、実際の採用は
// ムードとセクションで絞られ、確率で決まる(B/サビ/ブリッジで20〜30%)。
if (bassAnalysis.hasRootOnBeat1 && moodSupportsRootless(mood) && rollProbability(sectionRate)) {
voicing = generateRootlessVoicing(chord);
}ルートレスボイシングはジャズ寄りのムード(CityPop、Nostalgic、Dramatic、ModernPop)かつ B・サビ・ブリッジに限られます。Aメロ、イントロ、アウトロ、バラードでは常にルートを保持します。
セカンダリードミナント
セカンダリードミナントは、トニック以外のダイアトニックコードに解決するドミナントコード(V7)です。より強い和声的引力を生み出し、和声的な多様性を加えます。
セカンダリードミナントとは?
IVからVに直接進む代わりに、V/V(Vに解決するドミナントコード)を挿入するとより強い動きの感覚が生まれます。例えばCメジャーでは、F → D7 → G は F → G より説得力があります。D7(V/V)がGに「解決したがっている」からです。
一般的なセカンダリードミナント
| 記号 | 解決先 | Cでの例 |
|---|---|---|
| V/V | V(ドミナント) | D7 → G |
| V/vi | vi(平行短調) | E7 → Am |
| V/ii | ii(上主音) | A7 → Dm |
| V/IV | IV(下属音) | C7 → F |
自動挿入
セカンダリードミナントは2つのルールで挿入されます。
- サビへ入る箇所(確定的): サビの最初のコードが ii・IV・V・vi のいずれかなら、その属和音を直前セクションの最後の半小節に置きます。
- セクション内(確率的): 1小節あたりの確率はセクションの緊張度 × 0.25。緊張度 0.5 の閾値を超えるのはサビ(0.75)・Bメロ(0.65)・ブリッジ(0.60)・MixBreak(0.55)だけで、Aメロ・イントロ・アウトロには挿入されません。
ポップスとして過密にならないよう、挿入間隔は最低2小節、1セクションあたり最大 小節数 / 8 個(8小節につき1個)に制限されます。ターゲットになるのは ii・IV・V・vi のみで、挿入される和音は常にドミナント7thです。
// 例: V前にV/Vを挿入
// オリジナル: IV → V → I
// 強化後: IV → V/V → V → Iトライトーン代理
トライトーン代理はV7コードをbII7コード(トライトーン離れたドミナント7th)で置き換えます。これにより半音進行のベースモーションが生まれ、和声的な洗練さが加わります。
設定
トライトーン代理は以下から利用可能:
- SongConfig (JS):
chordExtTritoneSub(有効化、デフォルトfalse)とchordExtTritoneSubProb(確率 0.0-1.0、デフォルト0.5) - AccompanimentConfig (JS):
chordExtTritoneSub(有効化)とchordExtTritoneSubProb(確率 0.0-1.0、デフォルト0.5) - C++ SongConfig:
chord_extension.tritone_subとchord_extension.tritone_sub_probability(0.0-1.0)
ムード依存のコードエクステンション確率
chordExtProbExplicit=falseの場合、ムードがスタイルに合わせてコードエクステンション確率を自動調整します:
| ムード | 7th確率 | 9th確率 | Sus確率 | 備考 |
|---|---|---|---|---|
| CityPop | 40% | 25% | - | ジャズ影響のボイシング |
| RnBNeoSoul | 50% | 35% | - | リッチな拡張ハーモニー |
| Ballad/Sentimental | 30% | - | 25% | 表現力豊かなsus解決 |
| Nostalgic/Chill | 25% | - | - | 穏やかなエクステンション |
| Lofi | 40% | 30% | - | 暖かいローファイキャラクター |
明示的 vs 自動
chordExtProbExplicit=trueに設定すると全てのエクステンション確率を手動制御でき、falseのままにするとムードシステムが自動的に適切な値を選択します。
EventDataにおけるChordEvent
EventData の JSON 出力には、セクションごとの詳細なコード情報を含む chords 配列があり、セカンダリードミナントのアノテーションも含まれます。これにより外部ツールで和声構造を可視化・分析できます。
キー転調
なぜ転調するのか?
キー転調(曲の途中でキーを変える)は、興奮と感情的な高揚を加える強力なテクニックです。最後のサビで1-2半音上げる転調は「次のレベルに引き上げる」感覚を生み出します。これは数え切れないほどのヒット曲で使われる定番テクニックです。
転調パラメータ
| パラメータ | 範囲 | 説明 |
|---|---|---|
modulationTiming | 0-4 | 転調タイミング(0=無効) |
modulationSemitones | 1-4 | 転調量(timingが0でない場合は必須) |
WARNING
modulationTimingが0以外の場合、modulationSemitonesは1-4に設定する必要があります。ボーカルの高音域は、転調後に最終セクションが音域を超えないよう自動的に調整されます。
転調ポイント
転調量は常に modulationSemitones(1〜4、C++ 側の未設定時のデフォルトは 2)から決まり、楽曲構造によって変わることはありません。位置は modulationTiming が決めます。
modulationTiming | 位置 |
|---|---|
| 1 LastChorus | 最後のサビの頭(最も一般的) |
| 2 AfterBridge | ブリッジ直後のサビ。無ければ最後のサビにフォールバック |
| 3 EachChorus | 最後のサビ1箇所にフォールバックし、警告を出します |
| 4 Random | シードで決まるランダムなサビ |
DirectChorus と ShortForm の構造では転調ポイントが取れないため、転調は行われません。
実装
struct Modulation {
Tick tick; // 転調タイミング
int8_t semitones; // 量(1-4半音)
};
// MIDI出力時に適用
void MidiWriter::writeTrack(MidiTrack& track, Modulation mod) {
for (auto& note : track.notes) {
if (note.tick >= mod.tick) {
note.pitch += mod.semitones;
}
}
}コードトーン分析
メロディ生成で音の協和度を判定するために使用:
bool isChordTone(uint8_t pitch, Chord chord) {
uint8_t pitchClass = pitch % 12;
// コードのピッチクラスと照合
for (auto& chordPitch : chord.pitchClasses()) {
if (pitchClass == chordPitch) return true;
}
return false;
}
uint8_t nearestChordTone(uint8_t pitch, Chord chord) {
// 半音距離で最寄りのコードトーンを検索
int minDist = 12;
uint8_t nearest = pitch;
for (auto& target : chord.pitches()) {
int dist = abs(pitch - target);
if (dist < minDist) {
minDist = dist;
nearest = target;
}
}
return nearest;
}テンションノート
テンションノートとは?
テンションノートは現在のコードに属さないが、意図的に音楽的興味を生み出すために使用される音です。「解決したい」という感覚を生み出します。答えを待つ音楽的な問いかけのようなものです。上手く使うと、メロディはより表現力豊かで感情的に魅力的になります。
テンションの可否はコードのディグリーごとに決まります。3度とぶつかるもの、b9 になるものは除外されます。
| ディグリー | 使用可能なテンション |
|---|---|
| I | 9th, 13th(11th は長3度に対する #4 になるため除外) |
| ii | 9th, 11th, 13th |
| iii | 11th, b13th(9th は b9 になるため除外) |
| IV | 9th, #11th, 13th |
| V | 9th, 13th(11th は sus4 のときのみ) |
| vi | 9th, 11th(13th は b13 になるため除外) |
| vii° | 11th のみ |
| テンション | ルートからの音程 | 典型的な解決 |
|---|---|---|
| 9th | 長2度 | ルートへ下降 |
| 11th | 完全4度 | 3度へ下降 |
| #11 | 増4度 | 5度へ上行 |
| 13th | 長6度 | 5度へ下降 |
| b13 | 短6度 | 5度へ下降 |
ボーカルアティチュードによる使用
| アティチュード | ピッチの候補 | 音楽的効果 |
|---|---|---|
| Clean | コードトーンのみ | 安全、協和、歌いやすい |
| Expressive | コードトーンに加えてルートから見た 7th・9th・11th(キー内に収まるもののみ)。長い音符にだけ付与され、8分音符より短い音符はコードトーンに戻ります。どのくらい長ければ付与するかは tensionUsage が決めます | カラフル、感情的、表現力豊か |
| Raw | ダイアトニックスケール7音すべて(コードトーンかどうかを問わない) | エッジー、予測不能、強烈 |
拍の位置ではなく音符の長さで決まる
テンションの可否は小節内の位置ではなく音符の長さで決まります。短い音符はアティチュードにかかわらずコードトーンへ戻されます。すぐ通り過ぎる不協和は安全でも、伸ばした不協和はそうではないためです。
拍の位置が効いてくる場面
拍の位置が効くのは別の処理です。MelodicEmbellisher は1拍目と3拍目をStrong、2拍目と4拍目をMedium、8分音符の裏拍をWeak、16分音符の細分をVeryWeakに分類します。経過音と刺繍音はStrong以外に置かれ、倚音と掛留音は強拍で下行解決するアクセント付きの音として扱われます。
ボーカルアティチュードの選び方
- Clean: シンプルなポップ、子供向け、歌いやすさが重要な場合に最適
- Expressive: バラード、R&B、シティポップに最適 - 感情的な深みを加える
- Raw: ロック、オルタナティブ、実験的に最適 - 緊張感とエッジを生み出す
ハーモニーとメロディの統合
ボーカル生成システムは、メロディ候補の形を整えるためにハーモニー情報を使います。
HarmonyContext
HarmonyContextシステムは生成されたトラックを追跡し、衝突を避けるためのピッチ候補を絞り込みます:
HarmonyContextが重要な理由
HarmonyContextがなければ、メロディが伴奏と衝突する可能性があります。例えば、ベースが E を弾いているときにメロディが F を同時に鳴らすと、厳しい短2度の不協和音になります。HarmonyContextはメロディピッチを提案する前にアクティブなノートをチェックし、このような衝突を多く除きます。後続の処理や意図的な音の例外は、和声の文脈に従います。
何が衝突とみなされるか
HarmonyContext が答えるのは Yes/No の1問だけです。提案されたピッチが既に鳴っている音とぶつかるかどうかを TrackCollisionDetector に問い合わせ、順位付けのない真偽値を1つ受け取ります。登録される7つのピッチ役割は Vocal・ベース・コード・モチーフ・Aux・Arpeggio・ギターです。候補自身の役割は除外し、ドラムと SE はピッチ衝突検出の対象外です。生成側は実際の半音数で判定するため、同じピッチクラスの音程でも離れ方によって結果が変わります。
| 音程 | 生成側の規則 |
|---|---|
| 短2度 | 1 または 13 半音。不協和。ただし短いメロディの1半音の重なりは通過することがあります |
| 長2度 | 2 半音。不協和。ただし14半音の長9度は対象外で、鳴っているコードに属する2音は許容されます |
| 長7度 | 11、23、35 半音。3オクターブ未満では不協和。正規化度数 I/IV(0/3)の Maj7/Maj9 に登録されたルート–長7度は例外です |
| トライトーン | 6、18、30 半音。不協和。ただしコードが V、vii°、または有効なセカンダリードミナントなら許容されます |
| その他の音程 | 短7度、長9度、36 半音以上の距離は基本規則で許容されます |
短いメロディの1半音(短2度)と2半音(長2度)の重なりは、持続するコード/ギター音が関係せず、少なくとも一方のピッチが C4 以上の場合に限り許容されます。重なりの上限は1半音が 120 tick、2半音が 240 tick で、1拍目と3拍目では半分になります。C3 未満のベースを含む長7度は11半音でブロックされ、正規化度数 I/IV(0/3)の Maj7/Maj9 に登録されたルート–長7度も、23 半音以上離れた場合だけ例外になります。生成後アナライザーは24半音超を基本カットオフとしたうえで、低音域の長7度と登録済みエクステンションを別に処理します。そのため、生成側が拒否する35半音の長7度や30半音のトライトーンがレポートに出ない場合があります。返る真偽値は候補を絞るためのもので、最終出力に不協和音がないことを保証しません。
軽度・重大 という段階付けは別のモジュールのものです。後述する読み取り専用の PianoRollSafety API が持つもので、生成を制御するのではなく表示用に深刻度を返します。
コード認識メロディ生成
メロディ生成は生成→評価→リファインの3段階ではなく、単一パスです。generateSection がフレーズプランを立て、そのtickで鳴っているコードに対して1音ずつピッチを選び、装飾を加え、最後にダウンビートの窓にある不正な音だけをコードトーンへスナップします。下行解決するアクセント付きの不協和音は許可されたまま残ります。generateSectionWithEvaluation はこのパスをラップし、1セクションあたり最大100回走らせて結果の中から選びます。
音のスコアリング: 候補を書いている最中、コードトーンは 16 点、さらにルートか5度なら 4 点、スケールトーンは 12 点です。スケール外の音はハーモニーからは何も得られず、旋律面やリズム面の項が支えたときだけ残ります。
ダウンビート規則: コードトーン適合度を測るのは1拍目と3拍目だけです。ダウンビートの窓では classifyVocalTone がコードトーンと、下行解決する倚音・掛留音のようなアクセント付きの不協和音を残し、それ以外の不正な音だけをコードトーンへ寄せます。メロディに方向性のある緊張感を残しながら、和声の足場を保ちます。
VocalStyleProfileとハーモニー
各VocalStyleProfileは、メロディがハーモニーとどう相互作用するかを設定します:
| プロファイル | コードトーン優先度 | テンション使用 | アプローチ |
|---|---|---|---|
| Standard | 強拍で高い | 時々9th | 安全、歌いやすい |
| Idol | 非常に高い | 最小限 | キャッチー、シンプル |
| CityPop | 中程度 | 頻繁な9th、13th | 洗練 |
| Vocaloid | 低い | アグレッシブ | 意外性 |
| Ballad | 高い | 表現力豊かな倚音 | エモーショナル |
スタイルとハーモニーのマッチング
最良の結果を得るには、コードエクステンションをボーカルスタイルに合わせましょう:
- Idol/Standard: エクステンションを低めに(sus、時々7th)
- CityPop/Jazz: 高いエクステンション確率(7th、9th)
- Vocaloid: エクステンションはあまり重要でない(メロディがより自由)
メロディ評価:ハーモニー要素
ハーモニーがメロディ評価に入ってくるのは、1つの比率としてです。calcChordToneRatio は1拍目または3拍目に始まる音だけを見て、そのtickで鳴っているコードと照合し、コードトーンだった割合を返します。音ごとの段階的な加点・減点はなく、弱拍の音は数えられません。強拍の音が1つもないフレーズは中立の 0.5 になります。
より細かい重み付けは、完成した候補を採点する段階ではなく、音を書いている段階で行われます。前述の 16 / 4 / 12 点のスケールがそれです。ハーモニーは、生成時のバイアスとして1回、選択時の単純な比率として1回、合わせて2度メロディを形づくります。
フックシステムとハーモニー
フックシステム(サビセクションで使用)は、記憶に残るパターンを作成しながらハーモニーを尊重します:
| フックスケルトン | 旋律の形 |
|---|---|
| Repeat | 単一のピッチを保持 |
| Ascending | スケール上を3音連続で上行 |
| AscendDrop | トライアドをアルペジオで上行し、1度分下へ戻る |
| LeapReturn | 5度上のコードトーンへ跳躍し、アンカーの2度上へ下降 |
スケルトンのオフセットはフレーズのアンカーからの音度で表されるため、鳴っているコードに合わせて同じ形が適応します。エンジンには25種類のスケルトンがあり、上記はその中で頻出のものです。
フック + コード同期
フックはコード変化と整合するときに最も効果的です。hookIntensityパラメータは、フックがコードトーンを強調するか、テンションでメロディの興味を生み出すかを制御します。
ピアノロールセーフティAPI
外部ツール(ピアノロールエディタなど)向けに、JavaScript PianoRollSafety API は各MIDIピッチの表示用安全度、理由フラグ、衝突情報を提供します。スケッチを生成した後に呼び出します:
const info = sketch.getPianoRollSafetyAt(0)
const safety = info.safety[60]
const reasons = info.reason[60]色はこの表示API独自の安全度を表します。緑は安全、黄は警告、赤は不協和音または音域外です。深刻度の規則はHarmonyContextの生成側フィルターとは別で、生成側のコード例外を引き継ぎません。
実践ガイド
推奨の組み合わせ
| スタイル | 進行 | エクステンション | アティチュード |
|---|---|---|---|
| シンプルポップ | FourChordPop (0) | 低 (10-20%) | Clean |
| エモーショナルバラード | Axis (2) | 中 (30%) | Expressive |
| J-Pop | Oudou (6) | 中 (30%) | Expressive |
| シティポップ | CityPop (19) | 高 (50%+) | Expressive |
| ロック | Rock1 (11) | 低 (10%) | Raw |
クイックスタート推奨設定
初心者向け
以下の安全なデフォルト設定から始めましょう:
- 進行: FourChordPop (ID 0) - ほぼ何にでも合う
- エクステンション: 全確率を30%以下に
- アティチュード: Clean - 最も作業しやすいメロディ
- 転調: なし、またはLastChorusで+1半音
慣れてきたら、より複雑な進行や高いエクステンション確率を試してみましょう。