Skip to content

ハーモニーとコード進行

MIDI Sketchの和声システムを解説します。

注記

このページでは音楽理論の専門用語を使用しています。これらの概念はシステムが自動的に処理しますが、理解することでより適切なパラメータ選択が可能になります。

コード進行

MIDI Sketchには一般的なポップミュージックパターンをカバーする22の内蔵コード進行があります。

コード進行とは?

コード進行とは、楽曲の和声的な骨格を形成するコードの連続です。音楽に動きと感情を与えるものです。同じメロディでも、異なるコード進行の上では全く違う印象になります。

4コード進行

ID名前ディグリー特徴
0Pop4I-V-vi-IV定番ポップ
1Axisvi-IV-I-Vメランコリック
2Komurovi-IV-V-I明るいJ-pop
3CanonI-V-vi-iii-IVクラシック
4Emotional4vi-V-IV-Vエモーショナルビルド
5MinimalI-IVシンプルな2コード
6AltMinimalI-Vパワーポップ
7Progression3I-vi-IV3コード
8Rock4I-bVII-IV-Iロック感
これらの進行を理解する
  • Pop4 (I-V-vi-IV): 現代音楽で最も人気のある進行。数千のヒット曲で使用。満足感のある馴染みやすいサウンド。
  • Axis (vi-IV-I-V): マイナーコードから始まり、即座に切なさを演出。多くのエモーショナルバラードで使用。
  • Komuro (vi-IV-V-I): 日本のプロデューサー小室哲哉にちなんで命名。最後のV→I解決が明るく前向きな印象を生み出す。
  • Canon (I-V-vi-iii-IV): パッヘルベルのカノンに基づく。時代を超えたエレガントさ。
  • Rock4 (I-bVII-IV-I): bVII(フラットセブン)コードがロック/ブルース的な風味を加える。

5コード進行

ID名前ディグリー特徴
9Extended5I-V-vi-iii-IV拡張カノン
10Emotional5vi-IV-I-V-ii複雑なエモーショナル

全進行リスト

合計22の進行:

  • ポップバリアント(ブライト、ダーク)
  • エモーショナルバリアント
  • ミニマル(2-3コード)パターン
  • ロック影響
  • ii-Vを含むジャズ影響

ディグリーシステム

ディグリー(度数)とは?

コードディグリー(I, ii, iii, IV, V, vi, vii)は、キー内でのコードの位置を示します。大文字 = メジャーコード、小文字 = マイナーコード。例:Cメジャーでは I = Cメジャー、ii = Dマイナー、V = Gメジャー。

コードディグリーは整数で表現:

cpp
enum Degree {
    I   = 0,   // トニック
    ii  = 1,   // サブドミナント
    iii = 2,   // メディアント
    IV  = 3,   // サブドミナント
    V   = 4,   // ドミナント
    vi  = 5,   // サブメディアント
    vii = 6,   // リーディングトーン
    bVII = 10  // フラットセブン(借用)
};

コードクオリティ

メジャーとマイナー

  • メジャーコードは明るく、ハッピーで安定した響き(C, F, G)
  • マイナーコードは暗く、切なく、感情的な響き(Dm, Em, Am)
  • ディミニッシュコードは緊張感があり不安定(ポップでは稀に使用)

メジャーキーのディグリーによってクオリティが決定:

cpp
ChordQuality getQuality(Degree degree) {
    switch (degree) {
        case I: case IV: case V: case bVII:
            return Major;
        case ii: case iii: case vi:
            return Minor;
        case vii:
            return Diminished;
    }
}

コードエクステンション

エクステンションは基本トライアドに彩りを加える:

エクステンションの使いどころ

  • 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
9th+ 7度 + 9度C-E-G-B-D

エクステンション適用ルール

設定

cpp
struct ChordExtensionParams {
    bool enable_sus = false;
    bool enable_7th = false;
    bool enable_9th = false;
    bool tritone_sub = false;          // AccompanimentConfig only
    float sus_probability = 0.2f;     // 20% chance
    float seventh_probability = 0.15f; // 15% chance
    float ninth_probability = 0.25f;   // 25% chance
    float tritone_sub_probability;     // AccompanimentConfig only
};

ムード依存の確率自動調整

chordExtProbExplicit=false(デフォルト)の場合、ムードがスタイルに合わせてコードエクステンション確率を自動調整します。chordExtProbExplicit=trueに設定すると全てのエクステンション確率を手動制御できます。

ボイスリーディング

ボイスリーディングとは?

ボイスリーディングとは、個々の音が一つのコードから次のコードへどのように動くかということです。良いボイスリーディングは滑らかで繋がりのあるコード遷移を生み出します。悪いボイスリーディングはぎこちなく不自然に聞こえます。MIDI Sketchは生成される全てのコード進行に最適化されたボイスリーディングを自動適用します。

原則

  1. 動きを最小化: 各声部は最小の音程で移動
  2. 共通音: コード間で共有される音を保持
  3. 平行5度/8度を避ける: クラシック的制約
  4. 滑らかなベース: 順次進行または小さな跳躍を優先

アルゴリズム

cpp
Voicing optimizeVoicing(Voicing prev, Chord next) {
    vector<Voicing> candidates = generateAllVoicings(next);

    return min_element(candidates, [&](auto& a, auto& b) {
        int distA = totalVoiceDistance(prev, a);
        int distB = totalVoiceDistance(prev, b);

        // 大きな跳躍にもペナルティ
        int leapA = maxSingleVoiceDistance(prev, a);
        int leapB = maxSingleVoiceDistance(prev, b);

        return (distA + leapA * 2) < (distB + leapB * 2);
    });
}

ボイシングタイプ

ボイシングの解説
  • クローズポジション: 全ての音が1オクターブ内。コンパクトで直接的なサウンド。ポップで一般的。
  • オープンポジション: 音が複数オクターブに広がる。広がりのあるフルなサウンド。バラードに最適。
  • ルートレス: ルート音を省略(ベースが弾く)。クリアで濁りのないサウンドを生む。一般的なアレンジテクニック。

ベース-コード協調

コードトラックはベース分析を使用して重複を回避:

cpp
struct BassAnalysis {
    bool hasRootOnBeat1;   // ダウンビートでルート
    bool hasRootOnBeat3;   // 3拍目でルート
    bool hasFifth;         // 5度あり
    Tick accentTicks[];    // 強拍位置
};

// ベースがルートを持つ場合、コードはルートレスボイシングを使用
if (bassAnalysis.hasRootOnBeat1) {
    voicing = generateRootlessVoicing(chord);
}

セカンダリードミナント

セカンダリードミナントは、トニック以外のダイアトニックコードに解決するドミナントコード(V7)です。より強い和声的引力を生み出し、和声的な多様性を加えます。

セカンダリードミナントとは?

IVからVに直接進む代わりに、V/V(Vに解決するドミナントコード)を挿入するとより強い動きの感覚が生まれます。例えばCメジャーでは、F → D7 → G は F → G より説得力があります。D7(V/V)がGに「解決したがっている」からです。

一般的なセカンダリードミナント

記号解決先Cでの例
V/VV(ドミナント)D7 → G
V/vivi(平行短調)E7 → Am
V/iiii(上主音)A7 → Dm
V/IVIV(下属音)C7 → F

自動挿入

MIDI Sketchは以下の条件に基づいてセカンダリードミナントを自動挿入します:

  • コードの長さ: 長いコードは準備の候補
  • セクションタイプ: Bメロセクションはセカンダリードミナントを好む
  • スタイル: ジャズやシティポップはより多くのセカンダリードミナントを使用
cpp
// 例: V前にV/Vを挿入
// オリジナル: IV → V → I
// 強化後: IV → V/V → V → I

トライトーン代理

トライトーン代理はV7コードをbII7コード(トライトーン離れたドミナント7th)で置き換えます。これにより半音進行のベースモーションが生まれ、和声的な洗練さが加わります。

設定

トライトーン代理は以下から利用可能:

  • AccompanimentConfig: chordExtTritoneSub(有効化)とchordExtTritoneSubProb(確率 0.0-1.0)
  • C++ SongConfig JSON: chord_extension.tritone_subchord_extension.tritone_sub_probability(C++ readFrom経由)

注:これらのパラメータは現在JS SongConfig型(types.ts)では公開されていません。アクセスにはAccompanimentConfigまたはC++ JSON APIを使用してください。

ムード依存のコードエクステンション確率

chordExtProbExplicit=falseの場合、ムードがスタイルに合わせてコードエクステンション確率を自動調整します:

ムード7th確率9th確率Sus確率備考
CityPop40%25%-ジャズ影響のボイシング
RnBNeoSoul50%35%-リッチな拡張ハーモニー
Ballad/Sentimental30%-25%表現力豊かなsus解決
Nostalgic/Chill25%--穏やかなエクステンション
Lofi40%30%-暖かいローファイキャラクター

明示的 vs 自動

chordExtProbExplicit=trueに設定すると全てのエクステンション確率を手動制御でき、falseのままにするとムードシステムが自動的に適切な値を選択します。

EventDataにおけるChordEvent

EventDataのJSON出力にはセクションごとの詳細なコード情報を含むchords配列が含まれるようになり、セカンダリードミナントのアノテーションも含まれます。これにより外部ツールで和声構造を可視化・分析できます。

キー転調

なぜ転調するのか?

キー転調(曲の途中でキーを変える)は、興奮と感情的な高揚を加える強力なテクニックです。最後のサビで1-2半音上げる転調は「次のレベルに引き上げる」感覚を生み出します。これは数え切れないほどのヒット曲で使われる定番テクニックです。

転調パラメータ

パラメータ範囲説明
modulationTiming0-4転調タイミング(0=無効)
modulationSemitones1-4転調量(timingが0でない場合は必須)

WARNING

modulationTimingが0以外の場合、modulationSemitonesは1-4に設定する必要があります。ボーカルの高音域は、転調後に最終セクションが音域を超えないよう自動的に調整されます。

転調ポイント

構造転調ポイント
StandardPopB → Chorus+1半音
RepeatChorusChorus 1 → 2+1半音
BalladB → Chorus+2半音
Full patterns様々+1 ~ +4

実装

cpp
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;
        }
    }
}

コードトーン分析

メロディ生成で音の協和度を判定するために使用:

cpp
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;
}

テンションノート

テンションノートとは?

テンションノートは現在のコードに属さないが、意図的に音楽的興味を生み出すために使用される音です。「解決したい」という感覚を生み出します。答えを待つ音楽的な問いかけのようなものです。上手く使うと、メロディはより表現力豊かで感情的に魅力的になります。

メロディに興味を加える非コードトーン:

テンション音程解決
9th長2度ルートへ下降
11th完全4度3度へ下降
13th長6度5度へ下降
b9短2度ルートへ下降
#11増4度5度へ

ボーカルアティチュードによる使用

拍の配置

弱拍(4/4拍子の2拍目と4拍目)はテンションノートを置くのに安全な場所です。強拍(1拍目と3拍目)で確立された和声的基盤を崩さないためです。

アティチュード許可されるテンション音楽的効果
Cleanなし(コードトーンのみ)安全、協和、歌いやすい
Expressive弱拍で9th、13thカラフル、感情的、表現力豊か
Raw全テンション、任意の拍エッジー、予測不能、強烈

ボーカルアティチュードの選び方

  • Clean: シンプルなポップ、子供向け、歌いやすさが重要な場合に最適
  • Expressive: バラード、R&B、シティポップに最適 - 感情的な深みを加える
  • Raw: ロック、オルタナティブ、実験的に最適 - 緊張感とエッジを生み出す

ハーモニーとメロディの統合

ボーカル生成システムは、音楽的に整合性のあるメロディを作成するためにハーモニー情報を広範に活用しています。

HarmonyContext

HarmonyContextシステムは生成された全トラックを追跡し、衝突のないピッチ候補を提供します:

HarmonyContextが重要な理由

HarmonyContextがなければ、メロディが伴奏と衝突する可能性があります。例えば、ベースがEを弾いているときにメロディがFを同時に鳴らすと、厳しい短2度の不協和音になります。HarmonyContextはメロディピッチを提案する前に全てのアクティブなノートをチェックすることでこれを防ぎます。

衝突タイプ

音程衝突タイプ結果
短2度(1半音)重大常に回避
長7度(11半音)重大常に回避
トライトーン(6半音)軽度コンテキスト依存
完全5度、オクターブなし和声的に安定

コード認識メロディ生成

MelodyDesignerは複数の段階でコード情報を使用します:

強拍ルール: 1拍目と3拍目では、メロディは強くコードトーンを優先します。これにより、メロディが強拍間で自由に動いても和声的な安定感が生まれます。

VocalStyleProfileとハーモニー

VocalStyleProfileは、メロディがハーモニーとどう相互作用するかを設定します:

プロファイルコードトーン優先度テンション使用アプローチ
Standard強拍で高い時々9th安全、歌いやすい
Idol非常に高い最小限キャッチー、シンプル
CityPop中程度頻繁な9th、13th洗練
Vocaloid低いアグレッシブ意外性
Ballad高い表現力豊かな倚音エモーショナル

スタイルとハーモニーのマッチング

最良の結果を得るには、コードエクステンションをボーカルスタイルに合わせましょう:

  • Idol/Standard: エクステンションを低めに(sus、時々7th)
  • CityPop/Jazz: 高いエクステンション確率(7th、9th)
  • Vocaloid: エクステンションはあまり重要でない(メロディがより自由)

メロディ評価:ハーモニー要素

メロディ評価システムにはハーモニースコアリングが含まれます:

cpp
float evaluateHarmonyFit(const MelodyCandidate& melody, const Chord& chord) {
    float score = 0.0f;

    for (auto& note : melody.notes) {
        if (isStrongBeat(note.tick)) {
            // 強拍: コードトーン = +1.0, テンション = +0.3, その他 = -0.5
            if (isChordTone(note.pitch, chord)) score += 1.0f;
            else if (isTension(note.pitch, chord)) score += 0.3f;
            else score -= 0.5f;
        } else {
            // 弱拍: より寛容
            if (isChordTone(note.pitch, chord)) score += 0.5f;
            else if (isScaleTone(note.pitch)) score += 0.2f;
        }
    }

    return score / melody.notes.size();
}

フックシステムとハーモニー

フックシステム(サビセクションで使用)は、記憶に残るパターンを作成しながらハーモニーを尊重します:

フックスケルトン和声的振る舞い
Repeat単一のコードトーンに留まる
Ascendingコードアルペジオを上昇
AscendDropアルペジオ上昇後、下降解決
LeapReturnテンションへジャンプ、コードトーンへ戻る

フック + コード同期

フックはコード変化と整合するときに最も効果的です。hookIntensityパラメータは、フックがコードトーンを強調するか、テンションでメロディの興味を生み出すかを制御します。

ピアノロールセーフティAPI

外部ツール(ピアノロールエディタなど)向けに、PianoRollSafety APIはハーモニー認識のピッチ提案を提供します:

cpp
// 特定のtickで安全なピッチを取得
vector<SafePitch> getSafePitches(Tick tick) {
    Chord currentChord = getChordAt(tick);
    vector<uint8_t> activePitches = getActiveNotesAt(tick);

    vector<SafePitch> result;
    for (uint8_t pitch = vocalLow; pitch <= vocalHigh; pitch++) {
        CollisionType collision = checkCollision(pitch, activePitches);
        bool isChordTone = currentChord.contains(pitch % 12);

        result.push_back({
            pitch,
            collision,
            isChordTone ? PitchSafety::Recommended : PitchSafety::Acceptable
        });
    }
    return result;
}

これにより、視覚的なフィードバックを表示できます:

  • : コードトーン(推奨)
  • : スケールトーン(許容)
  • : 衝突ピッチ(回避)

実践ガイド

推奨の組み合わせ

スタイル進行エクステンションアティチュード
シンプルポップPop4 (0)低 (10-20%)Clean
エモーショナルバラードAxis (1)中 (30%)Expressive
J-PopKomuro (2)中 (30%)Expressive
シティポップExtended5 (9)高 (50%+)Expressive
ロックRock4 (8)低 (10%)Raw

クイックスタート推奨設定

初心者向け

以下の安全なデフォルト設定から始めましょう:

  • 進行: Pop4 (ID 0) - ほぼ何にでも合う
  • エクステンション: 全確率を30%以下に
  • アティチュード: Clean - 最も作業しやすいメロディ
  • 転調: なし、またはLastChorusで+1半音

慣れてきたら、より複雑な進行や高いエクステンション確率を試してみましょう。

Released under the MIT License.