Skip to content

トラック生成

MIDI Sketchの各トラック生成器を詳しく解説します。

トラック概要

MIDI Sketchは8つのトラックを異なるMIDIチャンネルに生成します:

チャンネル割り当て

トラックチャンネルプログラム役割
Vocal0Piano (0)主旋律
Aux5Pad (89)副旋律サポート
Chord2E.Piano (4)和声バッキング
Bass3E.Bass (33)ベース
Motif4Synth (81)BackgroundMotifスタイル
Arpeggio5Synth (81)SynthDrivenスタイル
Drums9GMドラムリズム
SE15-セクションマーカー

ボーカルトラック

ソース: src/track/vocal.cpp(約470行)、src/track/melody_designer.cpp(約520行)

ボーカルシステムはテンプレート駆動型メロディデザイナーを使用し、予測可能でスタイルに正確なメロディを生成します。

アーキテクチャ

ボーカル生成は2つのコンポーネントに分割されています:

  1. MelodyDesignermelody_designer.cpp)- テンプレート駆動のピッチ選択
  2. Vocal Generatorvocal.cpp)- セクション構造と調整

メロディテンプレート

7つのメロディテンプレートがメロディ特性を定義:

ID名前Plateau最大ステップ用途
0Auto--VocalStyle基準で選択
1PlateauTalk0.652NewJeans、Billie Eilishスタイル
2RunUpTarget0.204YOASOBI、Adoスタイル
3DownResolve0.303Bセクション、プリコーラス
4HookRepeat0.403TikTok、K-POPフック
5SparseAnchor0.502Official髭男dism、バラード
6CallResponse--デュエットパターン
7JumpAccent--感情的ピーク
  • Plateau ratio: 同じピッチに留まる確率(高いほど繰り返しが多い)
  • Max step: 半音単位の最大音程(低いほど滑らか)

生成フロー

ピッチ選択(4択のみ)

MelodyDesignerはピッチ選択を4つのオプションに制限:

cpp
enum class PitchChoice {
    Same,       // 現在のピッチに留まる(plateau_ratio)
    StepUp,     // +1半音
    StepDown,   // -1半音
    TargetStep  // ターゲット方向へ±2(テンプレートにターゲットがある場合)
};

この制約されたアプローチにより、より自然で歌いやすいメロディが生成されます。

ボーカルアティチュード

アティチュード説明実装
Clean保守的、歌いやすいコードトーンのみ、オンビート
Expressive感情的、ダイナミックテンション許可、タイミング変動
Rawエッジー、型破り非コードトーン、境界破壊

フレーズキャッシュ

音楽的な一貫性のためセクションタイプ別にフレーズをキャッシュ:

cpp
std::map<SectionType, std::vector<Phrase>> phraseCache_;

// Aセクションは繰り返し時に同じ/類似フレーズを使用
// サビはメロディのアイデンティティを維持

音域制約

cpp
struct VocalRange {
    uint8_t low = 60;   // C4
    uint8_t high = 79;  // G5
};

Auxトラック

ソース: src/track/aux_track.cpp(約440行)

Aux(補助)トラックは主旋律に対する副旋律サポートを提供します。対旋律ではなく、主旋律を強化する「知覚制御レイヤー」です。

目的

役割説明
中毒性パルスループで繰り返しのキャッチーなパターンを生成
身体性グルーブアクセントで体が動く感覚を追加
安定感フレーズ終端で解決感を提供
構造認識セクション境界の認識を支援

Aux機能

5つの補助機能が利用可能:

ID機能説明
APulseLoop同音または固定音程の繰り返しパターン
BTargetHintコードトーンで主旋律のターゲットを暗示
CGrooveAccentスタッカートでリズミックなアクセント
DPhraseTailフレーズ終端の下降解決
EEmotionalPad長い持続音のコードトーン

テンプレート → Auxマッピング

各メロディテンプレートは適切なaux機能を自動選択:

テンプレートAux機能理由
PlateauTalkA(PulseLoop)Ice Cream/ミニマルスタイル
RunUpTargetB + DYOASOBI上昇→解決
HookRepeatA + CTikTok繰り返しフック
SparseAnchorE + Dバラードの感情サポート

生成制約

  • 常にボーカルのに生成(衝突回避)
  • ボーカルより狭い音域(50-70%)
  • 低いベロシティ(0.5-0.8×ボーカル)
  • HarmonyContextでボーカルとの不協和音を回避

コードトラック

ソース: src/track/chord_track.cpp(約820行)

ボイスリーディング最適化を伴う和声ボイシングを生成。

ボイシングタイプ

ボイスリーディングアルゴリズム

cpp
int voiceLeadingDistance(Voicing& prev, Voicing& next) {
    int distance = 0;
    for (int i = 0; i < 4; i++) {
        distance += abs(prev.notes[i] - next.notes[i]);
    }
    return distance;
}

// 距離を最小化するボイシングを選択
Voicing selectBestVoicing(Voicing& prev, vector<Voicing>& candidates) {
    return min_element(candidates, [&](auto& a, auto& b) {
        return voiceLeadingDistance(prev, a) < voiceLeadingDistance(prev, b);
    });
}

ベースとの協調

BassAnalysisを使用して音の重複を回避:

cpp
if (bassAnalysis.hasRootOnBeat1) {
    // ルートレスボイシングを使用 - ベースがルートを担当
    voicing = generateRootlessVoicing(chord);
} else {
    // コードボイシングにルートを含める
    voicing = generateFullVoicing(chord);
}

音域制約

cpp
constexpr uint8_t CHORD_LOW = 48;   // C3
constexpr uint8_t CHORD_HIGH = 84;  // C6

ベーストラック

ソース: src/track/bass.cpp(約450行)

ルート重視のパターンで和声的基盤を生成。

パターンタイプ

パターン説明リズム
Sparseミニマル、バラードスタイル1拍目のみ
Standardポップ/ロックベースライン1、3拍目にフィル
Drivingエネルギッシュ、前進的全体で8分音符

生成ロジック

アプローチノート

4拍目は次のルートへの半音アプローチを使用可能:

cpp
// 次のコードルートがCの場合
// 4拍目はB(半音下)またはDb(半音上)
uint8_t approachNote = nextRoot - 1; // 半音アプローチ

ドラムトラック

ソース: src/track/drums.cpp(約680行)

フィルとダイナミクスを含むドラムパターンを生成。

GMドラムマップ

cpp
constexpr uint8_t KICK = 36;
constexpr uint8_t SNARE = 38;
constexpr uint8_t SIDE_STICK = 37;
constexpr uint8_t CLOSED_HH = 42;
constexpr uint8_t OPEN_HH = 46;
constexpr uint8_t RIDE = 51;
constexpr uint8_t CRASH = 49;
constexpr uint8_t TOM_HIGH = 50;
constexpr uint8_t TOM_MID = 47;
constexpr uint8_t TOM_LOW = 45;

パターンスタイル

フィルタイプ

cpp
enum class FillType {
    TomDescend,    // ハイ → ミッド → ロータム
    TomAscend,     // ロー → ミッド → ハイタム
    SnareRoll,     // 連続スネアヒット
    Combo          // 混合要素
};

フィルの挿入位置:

  • セクション遷移
  • 4または8小節ごと
  • サビ前

ゴーストノート

グルーブのためのベロシティ軽減スネアアーティキュレーション:

cpp
// メインスネア: ベロシティ 100
// ゴーストノート: ベロシティ 40-60

モチーフトラック

ソース: src/track/motif.cpp(約470行)

BackgroundMotifコンポジションスタイル用。繰り返しパターンを生成。

パラメータ

cpp
struct MotifParams {
    MotifLength length;           // TwoBars, FourBars
    RhythmDensity rhythm_density; // Sparse, Medium, Driving
    MotifMotion motion;           // Stepwise, GentleLeap
    RepeatScope repeat_scope;     // FullSong, PerSection
    MotifRegister register_;      // Mid, High
};

パターン生成

音域レンジ

レジスター範囲
MidC3 (48) - C5 (72)
HighC4 (60) - C6 (84)

アルペジオトラック

ソース: src/track/arpeggio.cpp(約200行)

SynthDrivenコンポジションスタイル用。アルペジオパターンを生成。

パラメータ

cpp
struct ArpeggioParams {
    ArpeggioPattern pattern;  // Up, Down, UpDown, Random
    ArpeggioSpeed speed;      // Eighth, Sixteenth, Triplet
    uint8_t octave_range;     // 1-3オクターブ
    float gate;               // ノート長比率 (0.0-1.0)
    bool sync_chord;          // コードチェンジに追従
};

パターンタイプ

スピード変換

cpp
Tick getNoteDuration(ArpeggioSpeed speed) {
    switch (speed) {
        case Eighth:    return TICKS_PER_BEAT / 2;    // 240
        case Sixteenth: return TICKS_PER_BEAT / 4;    // 120
        case Triplet:   return TICKS_PER_BEAT / 3;    // 160
    }
}

SEトラック

ソース: src/track/se.cpp(約15行)

セクションマーカー用の最小トラック(テキストイベントのみ)。

cpp
void generateSE(Song& song) {
    for (auto& section : song.arrangement.sections) {
        MidiEvent marker;
        marker.tick = section.start_tick;
        marker.type = MidiEventType::Text;
        marker.text = section.name;
        song.se.addEvent(marker);
    }
}

ベロシティ計算

全トラック共通のベロシティ計算式:

cpp
uint8_t calculateVelocity(
    uint8_t baseVelocity,
    int beat,
    SectionType section,
    float trackBalance
) {
    float beatAdjust = getBeatAccent(beat);      // 強拍: +10
    float sectionMult = getSectionEnergy(section); // Chorus: 1.2

    return clamp(
        baseVelocity * beatAdjust * sectionMult * trackBalance,
        1, 127
    );
}

トラックバランス

トラックバランス備考
Vocal1.00リード楽器
Aux0.50-0.80副旋律サポート
Chord0.75サポート
Bass0.85ベース
Drums0.90タイミングドライバー
Motif0.70バックグラウンド
Arpeggio0.85中レベル

Released under the MIT License.