Skip to content

トラック生成

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

音楽理論が初めての方へ

下のトラックは、メロディ・コード・ベース・モチーフ・アルペジオといった音楽的役割に対応します。これらの用語が初めてなら、まずコースへ。各生成器の背景にある概念を、再生できる譜例で解説します。

トラック概要

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

9 つのトラックと、それぞれが書き込まれる MIDI チャンネル トラックは 5 つのグループに分かれます。メロディレイヤーはボーカル(Ch 0)と Aux(Ch 5)、ハーモニーはコード(Ch 1)とギター(Ch 6)、リズムセクションはベース(Ch 2)とドラム(Ch 9)、シンセレイヤーはモチーフ(Ch 3)とアルペジオ(Ch 4)、マーカーは SE(Ch 15)です。各ボックスには組み込みのフォールバック GM プログラムと、そのトラックの役割も示しています。プログラムはムードプリセットによって差し替えられます。 メロディレイヤー ボーカル Ch 0 Piano (0) 主旋律 Aux Ch 5 Warm Pad (89) 副旋律サポート ハーモニー コード Ch 1 E.Piano (4) 和声バッキング ギター Ch 6 E.Guitar clean (27) 伴奏 リズムセクション ベース Ch 2 E.Bass (33) 低音の土台 ドラム Ch 9 GM ドラムキット リズム シンセレイヤー モチーフ Ch 3 Synth Lead (81) BackgroundMotif 用 アルペジオ Ch 4 Synth Lead (81) SynthDriven 用 マーカー SE Ch 15 テキストイベント セクションマーカー ノートは書きません。 各セクション境界に 名前を書き込むだけの テキストトラックです。 トラックとチャンネルの対応は固定です。GM プログラムは組み込みのフォールバックで、ムードプリセットが差し替えることがあります。 チャンネル 9 は GM のパーカッション専用のため、ドラムトラックはプログラム番号を無視します。 9 トラックが 9 つの固定チャンネルに載るので、DAW 側で音色を総入れ替えしても構成は崩れません。

チャンネル割り当て

トラックチャンネルデフォルトプログラム役割
Vocal0Piano (0)主旋律
Chord1E.Piano (4)和声バッキング
Bass2E.Bass (33)ベース
Motif3Synth Lead (81)BackgroundMotifスタイル
Arpeggio4Synth Lead (81)SynthDrivenスタイル
Aux5Warm Pad (89)副旋律サポート
Guitar6E.Guitar clean (27)伴奏ギター
Drums9GMドラムリズム
SE15-セクションマーカー

プログラムはムード依存

上記のプログラムは組み込みのフォールバック値です(src/midi/track_config.h)。実際の GM プログラムはムードごとに選択される(getMoodPrograms)ため、聴こえる楽器はムードプリセットによって変わります。

ボーカルトラック

ソース: src/track/generators/vocal.cppsrc/track/vocal/melody_designer.cpp

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

なぜ「ボーカル」トラック?

ボーカルトラックはメインメロディを生成します。歌ったりリードパートとして演奏されることを想定しているため「ボーカル」と呼ばれています。DAWではMIDIチャンネル0(ピアノ)でプレビューするか、お好みの音源を割り当ててください。

アーキテクチャ

ボーカル生成は3つの主要コンポーネントで構成されています:

  1. MelodyDesignermelody_designer.cpp)- 評価付きテンプレート駆動のピッチ選択
  2. Vocal Generatorvocal.cpp)- セクション構造、キャッシング、調整
  3. VocalStyleProfile - スタイル別の統一されたバイアス・評価設定
ボーカル生成を構成する 3 つのコンポーネントの関係 左から右へのパイプラインです。左端の VocalStyleProfile が 2 つの設定を供給します。StyleBias は生成される音の偏りを決め、EvaluatorConfig は候補の採点の重みを決めます。中央の MelodyDesigner は候補フレーズをまとめて生成し、それぞれを採点し、下位半分を切り捨てたうえで残りからスコア重み付きで抽選します。右側の Vocal Generator は制約パイプラインを通し、セクションタイプ・小節数・開始コード度数をキーとするキャッシュにフレーズを保存し、ボーカルトラックへ書き出します。 スタイルごと VocalStyleProfile StyleBias 音の選び方を偏らせる EvaluatorConfig 採点の重みを決める 1 スタイル 1 プロファイル なので生成と評価がずれません。 MelodyDesigner 候補を生成 サビ 100 · B 50 · ブリッジ 30 · その他 20 各候補を採点 スタイル 40% · カリング 40% · バイアス 20% さらにセクション別重みのモチーフ加点 上位半分を残し、重み付きで抽選 最高スコアはあくまでフォールバックで、 自動的に採用されるわけではありません Vocal Generator 制約パイプライン ボイスリーディング・安全な音程・ 音域へのオクターブフォールド フレーズキャッシュ セクションタイプ・小節数・ 開始コード度数がキー ボーカルトラックへ書き出し MidiTrack 1 本、チャンネル 0 プロファイルは 2 度読まれます。何を生成するかを偏らせるときと、何を残すかを重み付けるときです。

メロディテンプレート

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

ID名前Plateau最大ステップ用途
0Auto--VocalStyle 基準で選択
1PlateauTalk0.702語りに近い、音域の狭いポップ
2RunUpTarget0.203アニメ系ハイエナジー、ドラマチックポップ
3DownResolve0.402B セクション、プリコーラス
4HookRepeat0.552ショート尺、K-POP フック
5SparseAnchor0.304音数の少ない、伸ばし主体のバラード
6CallResponse0.353デュエットパターン
7JumpAccent0.255感情的ピーク
  • Plateau ratio: 同じピッチに留まる確率(高いほど繰り返しが多い)
  • Max step: 半音単位の最大ステップ幅(小さいほど滑らか)

生成フロー

セクションがボーカルフレーズを要求したときの流れ セクションが始まると、セクションタイプ・小節数・開始コード度数を組み合わせたキーでフレーズキャッシュを引きます。ヒットすれば保存済みのフレーズを再利用し、このセクションの頭に移して音域に合わせ直します。ミスの場合は MelodyTemplate を選び、フレーズを生成・採点してキャッシュします。いずれの場合もフレーズは 1 本にまとまり、ボイスリーディング、HarmonyContext.getSafePitch、ボーカル音域へのオクターブフォールドを経て、ボーカルトラックへ書き出されます。 セクション開始 A・サビ・ブリッジなど フレーズキャッシュ フレーズキャッシュを引く キー = セクションタイプ + 小節数 + 開始コード度数 ヒット フレーズを再利用 このセクション頭に 移し、音域に再調整 ミス 新しいフレーズを設計 MelodyTemplate を選び 生成・採点してキャッシュ このセクションのフレーズ 1 本 すべてのフレーズに対して ボイスリーディング 直前の音からなめらかにつなぐ HarmonyContext.getSafePitch 他パートと協和させる オクターブフォールド ±12 でボーカル音域へ戻す ボーカルトラックへ追加 再利用したフレーズに加わるのは軽い変化だけです。末尾の音の移動や引き伸ばし、ブレスの休符、アクセント、エコーなど。 設計処理をフルに走らせるのはキャッシュミスのときだけで、ヒットしたフレーズも同じ制約段を通ります。

オクターブフォールド(音域セーフティ)

音域外に出たノートはオクターブ単位(±12半音)で音域内に折り返され、ピッチクラスが保持されます — コードトーンはコードトーンのままです。音域境界への半音クランプは最終手段としてのみ使われます。クランプは安全な音を不協和音に変えてしまうことがあるためです(例: G をオクターブ下げても G のままですが、F# 上限へクランプするとトライトーンが生じます)。

ピッチ選択(4択のみ)

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

cpp
enum class PitchChoice {
    Same,       // 現在のピッチに留まる(plateau_ratio)
    StepUp,     // スケール上を1音上へ(半音より全音を優先)
    StepDown,   // スケール上を1音下へ
    TargetStep  // テンプレートのターゲットピッチへ向かう(max_step で制限)
};

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

ボーカルアティチュード

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

フレーズキャッシュ

音楽的な一貫性のため、複合キー(V2キャッシュ)でフレーズをキャッシュ:

cpp
struct PhraseCacheKey {
    SectionType section_type;  // A、Chorus 等
    uint8_t bars;              // セクション長(小節数)
    int8_t chord_degree;       // 開始コード度数
};

キャッシュされたフレーズの最初の再利用は必ず完全一致で、まずフレーズを定着させてから変化させます。その後は、サビの出現回数が増えるほど完全一致の確率が下がります。1回目は 80%、2回目は 60%、3回目以降は 30% となり、最後のサビが最も新鮮になります。また、完全一致が2回続いた時点で、次は必ずバリエーションが入ります。

フレーズバリエーション

完全一致にならなかった場合は、6種類のバリエーションのいずれかが適用されます。いずれもフレーズの旋律的な同一性を保つもので、移調・反転・切り貼りは行いません。

  • LastNoteShift: 最後の音をスケール上で1〜2度動かす
  • LastNoteLong: 最後の音を伸ばして終止感を強める
  • BreathRestInsert: フレーズ終端の手前に短い休符を挿入
  • DynamicAccent: 最後の音のベロシティを上げる
  • LateOnset: フレーズの開始を16分音符分遅らせる
  • EchoRepeat: 最後の音を短く弱くエコーさせる

音域制約

cpp
struct VocalRangeResult {
    uint8_t effective_low;
    uint8_t effective_high;
    float velocity_scale;
};

有効音域は歌い手の境界(vocal_lowvocal_high)から始まり、Blueprintのmax_pitch上限を適用し、後段の上方向の転調に備えて転調量だけ上限を下げます。下限は維持されます。正の転調が指定された場合は、調整後の上限を上下限の間に最低1オクターブ残すようクランプします。転調なしでBlueprintのmax_pitch上限だけが適用される場合は、1オクターブ未満になることがあります。コンポジションスタイルが変えるのはvelocity_scaleであり、VocalとMotifを前景・背景に分ける別音域を作るわけではありません。VocalがあるときにMotifの音域をVocalの中央値の周りへ狭める処理は、別の制約として残っています。

非和声音による装飾

ボーカルトラックは非和声音(NCT: Non-Chord Tone)を使用して、単純なコードトーンメロディに動きを加えます:

拍の強さ

エンジンは 4/4 の拍を4段階で扱います。強拍(1・3拍目)、中拍(2・4拍目)、弱拍(8分の裏)、最弱拍(16分)です。コードトーンと強調されたアポジャトゥーラは強拍に置かれ、経過音・刺繍音・先取音は 2・4拍目ではなく拍と拍の間の裏拍に置かれます。

NCTタイプ説明配置
ChordTone現在のコードに含まれる音(基準)強拍
PassingTone2つのコードトーン間を順次進行でつなぐ裏拍の細分位置
NeighborToneコードトーンから離れて戻る裏拍の細分位置
Appoggiatura強調された不協和音が順次解決強拍
Anticipation次のコードトーンを先取りコードチェンジ前の裏拍
Suspension前のコードから保留された音が順次下行して解決強拍(続く裏拍で解決)
Tensionコードの拡張音(9度、11度、13度)スタイルに依存

設定はムードにより変化:

  • Bright: より多くのコードトーン、少ない不協和音
  • Jazzy: より多くのテンション、シンコペーション
  • Ballad: 表現豊かなアポジャトゥーラとのバランス
  • J-POP: ペンタトニックスケール(ヨナ抜き)音程を好む

VocalStyleProfile

各ボーカルスタイルには生成バイアス評価重みの両方を制御する統一プロファイルがあります。8つのプロファイルを14のボーカルスタイルが共有します(Idol/BrightKira/CuteAffected → Idol、Vocaloid/UltraVocaloid/CoolSynth → Vocaloid、Rock/PowerfulShout → Rock、Auto/Standard → Standard)。

プロファイルPlateauバイアス高音域歌唱性サプライズ
Standard1.000.800.150.15
Idol1.250.850.180.05
Rock0.801.200.150.20
Ballad1.000.500.300.05
Anime1.301.300.100.15
Vocaloid0.901.200.100.20
CityPop0.900.900.150.15
KPop1.401.100.120.18

UltraVocaloidモード

ボカロスタイル生成の強化機能:

  • マシンガンリズム: ボカロ曲に特徴的な連射的16分音符シーケンス
  • ブレスポイント: 密度の高いパッセージでもフレージング用のマイクロポーズを自動挿入
  • セクション別リズムロック: 各セクションが一貫したリズムアイデンティティを維持
プロファイルパラメータ
  • Plateauバイアス: 同じピッチに留まる好み(高いほど繰り返しが多い)
  • 高音域: 高い音への好み(高いほど明るい)
  • 歌唱性: 人間が歌いやすいメロディの重み(高いほど歌いやすい)
  • サプライズ: 予想外のメロディ展開の重み(高いほどダイナミック)

メロディ評価システム

MelodyDesigner は候補メロディをまとめて生成し(サビ 100、B セクション 50、ブリッジとチャント 30、その他 20)、それぞれを採点します:

共有される採点の詳細はメロディ評価にまとめ、このページではトラックとの接続と制約だけを扱います。

候補メロディを採点して 1 本を選ぶ流れ まず候補フレーズをまとめて生成します。サビは 100、B セクションは 50、ブリッジは 30、それ以外は 20 本です。各候補は 3 つの観点で採点されます。スタイルスコアが 40%、ペナルティ方式のカリングスコアが 40%、音程バイアススコアが 20% です。これらを合成し、さらにセクションごとに重みの異なるグローバルモチーフ加点を加えます。その後、スコア順にソートして下位半分を切り捨て、残った候補からスコアの高いものほど当たりやすい抽選で 1 本を選びます。 候補メロディ サビ 100 · B 50 ブリッジ 30 · その他 20 スタイルスコア 40% 輪郭の一致・パターンの一貫性・意外性のバランス カリングスコア 40% 歌いにくさ・単調さ・不自然な間へのペナルティ バイアススコア 20% スタイルが好む音程分布とのずれ 総合スコア 40 / 40 / 20 に、セクション 別重みのモチーフ加点 選択 スコア降順にソート 安定ソートで同点の順序も一定 下位半分を切り捨て 抽選に残るのは上位 50% だけ 重み付きランダム抽選 スコアが高いほど当たりやすい 採点は候補を絞り込むだけで、最後の 1 本は絞った中からの抽選です。同程度に良いフレーズが回り続けます。

総合スコア:

コンポーネント重み基準
スタイルスコア40%下記の7つの重み付き項目
淘汰スコア40%減点方式:歌唱の難しさ、単調さ、不自然な間
バイアススコア20%スタイル好みに合った音程分布

これにグローバルモチーフのボーナスが加算されます。重みはセクション依存で、サビ 0.35、2回目以降の A セクション 0.25、B セクション 0.22、最初の A セクション 0.15、ブリッジは対比を優先して 0.05 です。

スタイルスコア自体が7つの項目からなり、その重みはボーカルスタイルプロファイルに由来し、合計 1.0 になります。以下は Standard プロファイルの値です:

コンポーネントStandard の重み基準
歌唱性0.15音程分布:順次進行主体、大跳躍は少なく
コードトーン比率0.15強拍に置かれるコードトーン
輪郭0.15アーチ/波形/下降といった認識しやすい形
サプライズ0.154度以上の意図的な跳躍を1〜2回
AAABパターン0.153+1 の反復構造
リズムと音程の整合0.15跳躍前は長音、順次進行は短音
キャッチーさ0.10短いセルの反復、リズムの一貫性、フック輪郭

淘汰スコアは 1.0 から減点していきます。高音の連続、高音への跳躍、急な方向転換、強拍上の非和声音、孤立した音、フレーズのまとまりの弱さ、間の多さ、短音の連続によるブレス不足が対象です。

候補は総合スコア順に並べ替えられ、下位半分が捨てられたうえで、残りからスコアに比例した確率で1つが抽選されます。最高得点の候補はフォールバックにすぎないため、同程度に良いフレーズも選ばれ続けます。

フックシステム

サビセクションでは、17のリズムパターン25のフックスケルトンからなる専用のフック生成システムを使用します。代表的なものは以下の通りです。

代表的なリズムパターン:

パターンリズム特徴
Buildup8-8-4クラシックな段階的解決
Syncopated4-8-8シンコペーション開始
FourNote8-8-8-4ハイエナジー
Powerful4-4シンプルで強力
Dotted8-4-8付点リズム
CallResponse4-8-8-8コール&レスポンス

代表的なフックスケルトン:

スケルトン説明
Repeat同じピッチを繰り返す
Ascending上昇する輪郭
AscendDrop上昇してから下降
LeapReturnジャンプして戻る
RhythmRepeatピッチは変わりリズムは一定

フック強度はフックの目立ち方を制御:

  • Off (0): フックの強調なし
  • Light (1): サビ冒頭のみ
  • Normal (2): サビ冒頭と中間
  • Strong (3): 全フックポイント
  • Maximum (4): 反復を最大化し、単純なパターンのみを使用

グローバルモチーフシステム

ボーカルトラックはサビのフックからグローバルモチーフを抽出し、以降のセクションの評価に軽いボーナスとして使います。選択にバイアスをかけるだけで、生成を拘束するものではありません。

cpp
struct GlobalMotif {
    ContourType contour_type;        // Ascending, Descending, Peak, Valley, Plateau
    int8_t  interval_signature[8];   // 相対的ピッチ変化
    uint8_t interval_count;
    uint8_t rhythm_signature[8];     // 相対的デュレーション比率
    uint8_t rhythm_count;
};

各セクションは、そのセクションに合わせて変形したモチーフと候補を比較します。サビは原形、A セクションは縮小形、B セクションは反復進行形、ブリッジは反行形、アウトロは断片化した形です。ボーナスは上記のセクション重みでスケールされるため、サビではフックの同一性が最も強く保たれ、ブリッジは対比のために自由が残されます。

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

ソース: src/core/piano_roll_safety.cpp

読み取り専用のピアノロールセーフティAPIは、外部ツール(ピアノロールエディタなど)がピッチ配置の警告を表示するために使います。checkBgmCollisionDetailedは6つのBGMトラック(Chord、Bass、Arpeggio、Aux、Motif、Guitar)で鳴っているノートをピッチクラスの音程で調べます。音程クラス1または11はSevere、6はMild、それ以外はNoneとして報告します。この表示用ヘルパーにはコード、長さ、音域、生成器固有の例外はありません。生成時に使う別のHarmonyContextフィルターはハーモニーを参照してください。

cpp
enum class CollisionType : uint8_t {
    None,    // 表示警告なし
    Mild,    // ピッチクラス音程6: 表示警告
    Severe   // ピッチクラス音程1/11: 表示警告
};

衝突検出:

ピッチクラス音程タイプ表示結果
1 または 11SevereSevere表示警告
6MildMild表示警告
その他None表示警告なし

転調対応

生成されるボーカル音域は歌い手の境界から始まり、Blueprintのmax_pitchで制限され、上方向の転調に備えてeffective_vocal_highを下げます。読み取り専用の表示ヘルパーはこの音域計算とは別で、ピッチクラスの衝突を報告するだけであり、Motif用の前景・背景分離音域を作るものではありません。


Auxトラック

ソース: src/track/generators/aux.cpp

Aux(補助)トラックはメインボーカルがある場合に副旋律サポートを提供します。BackgroundMotifではVocalを常にスキップします。Traditional/MelodyDrivenではボーカルを参照せずにAuxをMotifより先に生成し、RhythmSyncではMotifをAuxより先に保ちます。SynthDrivenではAuxをスキップします。対旋律そのものではなく、リードがある場合にアレンジを整えるレイヤーです。

目的

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

Aux機能

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

ID機能説明
0PulseLoop同音または固定音程の繰り返しパターン
1TargetHintコードトーンで主旋律のターゲットを暗示
2GrooveAccentスタッカートでリズミックなアクセント
3PhraseTailフレーズ終端の下降解決
4EmotionalPad長い持続音のコードトーン
5Unisonボーカルユニゾンダブリング
6MelodicHookメロディックフックリフ
7MotifCounterカウンターメロディ(反行)
8SustainPad全音符コードトーンパッド

Aux 機能の選択

主要なセクションでは、Aux 機能はメロディテンプレートではなく Blueprint の aux profile から選ばれます:

セクション参照元
Introキャッシュされたサビモチーフのエコー。モチーフがなければ aux_profile.intro_function
A / B / Bridgeaux_profile.verse_function
Chorusaux_profile.chorus_function

したがって Traditional ブループリントはイントロで MelodicHook、A/B で MotifCounter、サビで再び MelodicHook を使い、RhythmLock は曲全体で単一の PulseLoop セルを保ちます。残るセクションタイプ(インタールード・アウトロ・チャント・ミックスブレイク)は、メロディテンプレートが定義する最初の Aux 設定にフォールバックします:

テンプレートフォールバック機能音域オフセットベロシティ比
PlateauTalkPulseLoop-1250.6
RunUpTargetTargetHint070.5
DownResolvePhraseTail050.5
HookRepeatPulseLoop-1240.7
SparseAnchorEmotionalPad-580.4
CallResponseMotifCounter060.7
JumpAccentPhraseTail050.5

生成制約

  • Vocalがある場合はリードとの衝突を避けるためVocalの後に生成します。BackgroundMotifでTraditional/MelodyDrivenならVocalがないためAuxをMotifより先に生成し、RhythmSyncならMotifをAuxより先に保ちます。SynthDrivenではAuxを生成しません
  • Vocalがある場合、音域はそのテッシトゥーラを中心にrange_offsetでずらした半音単位の絶対幅(4〜12半音)です。Vocalがない場合は設定またはデフォルトのテッシトゥーラを使います。どちらもG3 (55) - C6 (84) にクランプされます
  • ベロシティ比 0.4-0.8 は、ボーカルのベロシティではなく固定のベース値 80 に掛かります。Blueprint の velocity_scale はこの比にさらに掛かります
  • HarmonyContext でボーカルとの不協和音を回避

サビでの挙動

サビセクションではAuxトラックの挙動が適応されます:

  • 密度低下: ボーカルを引き立てるためAuxは控えめに
  • 低音域化: ボーカルとの衝突を避けるため低い音域へ移動
  • パターン簡素化: より持続的なノート、ビジーさの軽減
  • フレーズ終端: 適切な解決を伴いフレーズ境界を尊重

コードトラック

ソース: src/track/generators/chord.cpp

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

ボイシングタイプ

3 種類のコードボイシング(下が低音) 同じコードトーンを 3 通りに積んだ図です。クローズボイシングはルート・3rd・5th・7th を 1 オクターブに収めます。オープンボイシングはその積みから上から 2 番目の声部を 1 オクターブ下げるため、5th がルートより下に来ます。ほかに Drop 3 と Spread の変種があります。ルートレスボイシングはベースが押さえているルートを省き、3rd・5th・7th を積み、2 声しか残らない場合は 9th を足します。採用されるのは、直前のコードからの移動量が最も小さい候補です。 クローズ 7th 5th 3rd ルート 1 オクターブに収めた形です。 隣り合う長 2 度は、コード自体が その音程を持つ場合を除いて除外。 オープン 7th 3rd ルート 5th、1 オクターブ下 4 声のときは上から 2 番目の声部 が 1 オクターブ下がります。ほかに Drop 3 と Spread があります。 ルートレス 9th(必要なら) 7th 5th 3rd ルートはベースが押さえているため 省きます。2 声しか残らないときは 9th(または 11th)で補います。 ボイスリーディングで選ぶ 直前のコードからの移動量が最小の候補が採用されます ベースがルートを担うときはルートレス 1 拍目と 3 拍目のベース音のピッチクラスマスクで判断します 3 つとも鳴らすコードトーンは同じで、違うのは配置と、ベースが担うぶんの省略だけです。

ボイシングタイプは3種類です。Close はコードトーンを1オクターブ内に収めます。Open は Drop 2 ボイシングで、上から2番目の声部が1オクターブ下がるため、ルート-3度-5度-7度の積みは 5度-ルート-3度-7度になります。Drop 3 と Spread はその別バリアントで、セクションとムードに応じて選ばれます。Rootless はベースがすでに鳴らしているルートを省き、2声しか残らない場合は9度を補います。

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

  1. セクションのボイシングタイプから候補を生成(クローズ、オープン/Drop2、Drop3、スプレッド、ルートレス)
  2. 直前のボイシングからの移動量で採点。最大5音を対象に、外声(バスとソプラノ)は2倍、内声は1倍で重み付け
  3. 共通音の保持を加点
  4. 平行5度・平行8度を減点。減点量はムード依存で、クラシック系・洗練系は厳しく、ポップ系・ダンス系は緩やか
  5. 同一ボイシングが3回続く場合を減点

ベースとの協調

コードトラックはベースの後に生成されるため、ベースが実際に何を弾いているかを読み取れます。これを使う仕組みは2つあります。

  • buildBassPitchMask は小節の1拍目と3拍目でベースが保持しているピッチクラスを集めます。短2度またはトライトーンで衝突する候補ボイシングは除外されます。
  • BassAnalysis::analyzeBar は1拍目にベースがルートを鳴らしているかを判定します。鳴らしている場合はルートレスボイシングが優先され、ルートの重複を避けます。

音域制約

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

ギタートラック

ソース: src/track/generators/guitar.cpp

ギタートラックは専用のMIDIチャンネル(Ch 6)に伴奏ギターパターンを生成します。コードトラックを補完するリズミック&ハーモニックサポートを提供します。

パラメータ

パラメータデフォルト説明
guitarEnabledtrueギタートラック生成の有効/無効(JS・C++ ともデフォルト有効)

Blueprintの制約

ギター生成はBlueprintの制約に影響を受けます:

制約説明
guitar_skillスキルレベル(Beginner/Intermediate/Advanced/Virtuoso)がパターンの複雑さやボイシングの洗練度に影響
guitar_below_vocal有効にすると、メロディのマスキングを避けるためギターボイシングをボーカル音域の下(vocal_low - 2半音)に配置
guitar_style_hintBlueprintのSectionSlotで定義されるセクションごとのスタイルヒント(0-7)。0 = ムードとエネルギーに基づいて自動選択

生成

  • ギターはコードトラックのに生成され、既存の和声ボイシングを補完
  • パターンはセクションエネルギーとムードに適応
  • セクションごとのguitar_style_hint(0-7)でギター伴奏スタイルに影響を与えることが可能
  • MIDIチャンネル6に出力。フォールバックのプログラムはElectric Guitar clean(27)で、ムードによって別のギタープログラムが割り当てられることがあります

ベーストラック

ソース: src/track/generators/bass.cpp

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

パターンタイプ

BassPattern は17種類です。使用するパターンはムードとセクションに基づいて自動選択されるか、Blueprint の SectionSlot で bass_style_hint(0=自動、1-17 は BassPattern+1 にマッピング)を指定してセクションごとに固定できます。代表的なもの:

パターン説明リズム
WholeNote持続するルートで安定感(バラード、イントロ)2分音符、次小節へのアプローチ付き
RootFifth古典的なポップのルート-5度交替4分音符、3拍目に5度
Syncopated裏拍アクセントでグルーブ(プリコーラス)ルートと裏拍の5度
Drivingエネルギッシュ、前進的(サビ)全体で8分音符
Walking4分音符のスケールウォーク(ジャズ、シティポップ)4分音符4つ、半音アプローチ

残りはジャンル特化のパターンです:RhythmicDrive、PowerDrive、Aggressive、SidechainPulse、Groove、OctaveJump、PedalTone、Tresillo、SubBass808、RnBNeoSoul、SlapPop、FastRun。

生成ロジック

ベース 1 小節分の組み立て方 その小節のコードからルートと和声機能を取り出します。続いてパターンを決めます。ムードとセクションタイプから 17 種類の中で自動選択されるか、Blueprint の bass_style_hint でセクションごとに固定されます(0 は自動)。ルートのオクターブは、E1 から G3 のベース音域に収めるために必要なときだけ動かします。小節内では 1 拍目にルートが置かれ、中間の拍はパターン次第、4 拍目の後半に次の小節のルートへ向かうアプローチノートが入ります。多くは 5 度下で、半音の入りはウォーキングラインが中心です。 この小節のコード ルートと和声機能 パターン選択 自動:ムードとセクションタイプ 全音符から 16 分音符まで 17 パターン bass_style_hint セクション単位 — 0 = 自動、1–17 で固定 オクターブは音域用 E1–G3 に収めるため だけに上下します コードの機能が、 次の小節のルートへの 入り方を決めます。 1 小節 = 4 拍 1 拍目 ルートが置かれる 2 拍目 パターン次第 3 拍目 パターン次第 4 拍目の後半 次の小節のルートへ入るアプローチノート。 多くは 5 度下、ウォーキングでは半音下から どのパターンを使うかはセクションタイプが左右しますが、オクターブは音域に収めるためだけに動きます。

セクションタイプが選ぶのはパターンだけで、オクターブは動かしません。ルートがオクターブ移動するのは、ベース音域 E1 (28) - G3 (55) に収めるために必要なときだけです。

ピーク処理はパターン選択の後に行われます。PeakLevel::Mediumでは選ばれたパターンを密度1段階分、PeakLevel::Maxでは2段階分だけ引き上げます。bass_style_hintで明示したパターンにも適用され、ヒントはベースパターンを指定するだけでピークによる高密度化を無効にしません。

アプローチノート

4拍目の後半には、次の小節のルートへ向かうアプローチノートが置かれるのが基本です。常に半音アプローチではなく、コードの機能に応じて選ばれます。トニックとドミナントには次のルートの完全5度下、サブドミナントには全音下が優先され、導音・全音上・完全4度下がフォールバックになります。ターゲットのコードが実際に鳴らす音と衝突する候補は除外されます。これはセカンダリードミナントで重要で、その3度は上がり7度は下がるため、ダイアトニックの三和音とは異なるからです。

半音下からのクロマチックアプローチはウォーキングライン専用で、次のルートが全音または短3度離れている場合に限られます。


ドラムトラック

ソース: src/track/generators/drums.cpp

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

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;

パターンスタイル

ムードプリセットがどのドラムスタイルに対応するか ドラムスタイルは 8 種類あり、ムードプリセットが 1 つを選びます。Blueprint の drum_style_hint で固定することもできます(0 は自動)。Sparse は Ballad・Chill・Lofi・EmotionalPop、Standard は StraightPop・CityPop・Sentimental・Nostalgic・RnBNeoSoul、FourOnFloor は EnergeticDance・ElectroPop・DarkPop、Upbeat は BrightUpbeat・MidPop・ModernPop・IdolPop・Anthem、Rock は LightRock・Dramatic、Synth は AnimeHighEnergy・Synthwave・FutureBass に対応します。Trap と Latin はそれぞれ 1 つのムード専用です。 ムードプリセット 24 プリセット、それぞれ 1 スタイル drum_style_hint Blueprint で上書き — 0 = 自動 DrumStyle Sparse Ballad · Chill · Lofi · EmotionalPop Standard StraightPop · CityPop · Sentimental · Nostalgic · RnBNeoSoul FourOnFloor EnergeticDance · ElectroPop · DarkPop Upbeat BrightUpbeat · MidPop · ModernPop · IdolPop · Anthem Rock LightRock · Dramatic Synth AnimeHighEnergy · Synthwave · FutureBass Trap Trap ハーフタイムのスネア Latin LatinPop デンボウのキック&スネア スタイルは曲全体で固定され、フィルを書き込む土台となるキック・スネア・ハイハットのグリッドを決めます。

フィルタイプ

FillType は13種類あります。よく使われるのは SnareRoll・TomDescend・TomAscend・SnareTomCombo で、残りはより疎な場面や慣用句的な場面をカバーします(SimpleCrash、LinearFill、GhostToAccent、BDSnareAlternate、HiHatChoke、TomShuffle、BreakdownFill、FlamsAndDrags、HalfTimeFill)。selectFillType() がセクションの組み合わせ・ドラムスタイル・次セクションのエネルギーから選択します。

フィルはフィル区間のすべての拍を埋める必要はありません。そのフィルタイプが特に置く音を持たない拍では、無音にせずセクション本来のパターンが維持されます。

フィルの挿入位置:

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

DramaticまたはDrumHitのサビドロップでは、最後のドロップ区間でキットも短縮されます。その短縮でエントリークラッシュが失われた場合、後処理が次のセクション境界にクラッシュを復元するため、サビの到着マーカーが残ります。

ユークリッドドラム

Blueprintにはユークリッド分岐を選ぶ際にドラム生成器がサンプリングするeuclidean_drums_percentフィールドがあります。ユークリッドリズムは指定されたステップ数に対してヒットをできるだけ均等に分配するパターンです。ただしBlueprintのフィールド計上では現在 UnprovenLiveness に分類されており、可聴な効果は保証されません。確実な調整用コントロールではなく予約フィールドとして扱ってください。

ドラムの役割(Drum Role)

BlueprintのSectionSlotでセクションごとのdrum_roleを指定してドラム挙動を制御:

ロール説明
Full標準フルドラムキット
Ambient控えめ、アトモスフェリック
Minimalスパース、ミニマルパターン
FXOnlyエフェクトのみ、標準キットなし

ゴーストノート

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

cpp
// ゴーストのベロシティはセクションベロシティに対する倍率(0.25-0.65)で、絶対値では
// ありません。実際には概ね 25-35 の帯に収まります。

密度はセクションとムードカテゴリによるテーブル参照で 0%・15%・30%・45% のいずれかが決まり、その後テンポとバッキング密度に応じて調整されます。

  • エネルギッシュなムード(EnergeticDance・IdolPop・Anthem・AnimeHighEnergy): サビで最大 45% の出現確率
  • 穏やかなムード(Ballad・Sentimental・Chill): A メロではなし、他は控えめ

スウィングタイミング

スウィングはムードのグルーブフィールが Swing か Shuffle のときだけ適用されます(Sentimental・Chill・Ballad・Nostalgic・CityPop がスウィング、RnBNeoSoul と Lofi がシャッフル)。それ以外のムードはストレートで、オフセットは 0 です。

セクションスウィング量挙動
Intro0.25最も浅い
A / Bridge / Interlude / MixBreak0.35一定
B0.40一定
Chorus0.50最も深く、一定
Outro0.40 → 0.20終わりに向かって二次関数的に減衰

セクション内で量を一定に保つのは意図的です。小節ごとに揺れるとグルーブが不安定に感じられるためです。Blueprint の SectionSlot は swing_amount(0.0-0.7)で上書きできます。

スウィングは別グリッドではありません。オフビートの音は swing_amount に応じて三連符の位置へ押し出されます。8分グリッドで最大 +80 ティック、16分グリッドで最大 +40 ティックで、swing_amount = 1.0 でちょうど三連符位置に一致します。Shuffle は量を 1.5 倍してからクランプします。

ヒューマナイゼーション

微妙なタイミングとベロシティの変化でパターンの機械的さを軽減:

  • タイミングジッター: グリッドから±5-15ティック
  • ベロシティ変動: 基本ベロシティから±5-10
  • ハイハットアクセントパターン: ダウンビートへの自然な強調

ボーカル同期

drums_sync_vocalが有効な場合、キックドラムはボーカルのオンセット位置に揃います:

cpp
void generateDrumsTrackWithVocal(
    MidiTrack& track,
    const Song& song,
    const GeneratorParams& params,
    std::mt19937& rng,
    const VocalAnalysis& vocal_analysis  // 事前分析されたボーカルデータ
);

この「リズムロック」効果により、グルーブがメロディに追従します。現代のポップ制作で一般的な手法です。


モチーフトラック

ソース: src/track/generators/motif.cpp

BackgroundMotifコンポジションスタイル(BGM専用モード)用。Vocalは常にスキップされ、モチーフが主旋律要素になります。SynthDriven、RhythmSyncパラダイム、Blueprintのセクションフローが要求する場合にも生成されます。

パラメータ

cpp
struct MotifParams {
    MotifLength length;                 // Bars1, Bars2(デフォルト), Bars4
    uint8_t note_count;                 // 1サイクル 3-8 音、デフォルト 6
    bool register_high;                 // false = mid, true = high
    MotifRhythmDensity rhythm_density;  // Sparse, Medium(デフォルト), Driving
    MotifMotion motion;                 // Stepwise, GentleLeap, WideLeap,
                                        // NarrowStep, Disjunct, Ostinato
    MotifRepeatScope repeat_scope;      // FullSong(デフォルト), Section
};

MotifLength の単位は拍ではなく小節です。レジスターは列挙型ではなく真偽値で、MotifRegister という型は存在しません。

オーバーライドパラメータ

設定でモチーフオーバーライドが指定されている場合、以下のパラメータがスタイルのデフォルトより優先されます:

パラメータ説明
motifLengthint (0=auto, 1/2/4)モチーフ長のオーバーライド(小節単位、0 はデフォルトで2小節)
motifNoteCountint (0=auto, 3-8)モチーフの音数をオーバーライド(0はデフォルトで6)
motifMotionint (0xFF=preset, 0-5)モーションタイプのオーバーライド(0=Stepwise, 1=GentleLeap, 2=WideLeap, 3=NarrowStep, 4=Disjunct, 5=Ostinato)
motifRegisterHighint (0=auto, 1=low, 2=high)モチーフが組み立ての基準にするレジスターのオーバーライド
motifRhythmDensityint (0xFF=preset, 0-2)リズム密度のオーバーライド(0=Sparse, 1=Medium, 2=Driving)

パターン生成

モチーフパターンの組み立てと、モーションタイプが変えるもの モチーフは基準音から始まります。高音域なら 67、そうでなければ 60 です。次にリズム位置を決めます。リズム密度とモチーフ長から導くか、ロックされたリズムテンプレートを使います。音数は 3〜8 に収められ、既定は 6 です。そのあとで初めてピッチ列を生成し、1 音ごとに 1 ステップ進めます。歩幅を決めるのがモーションタイプで、Stepwise は 2 度まで、GentleLeap は 3 度、WideLeap は 5 度、NarrowStep はスケール 1 度、Disjunct は不規則な跳躍、Ostinato は同一ピッチクラスの反復です。最後にリピートスコープが、1 パターンを曲全体で使うかセクションごとに作り直すかを決めます。ただしリフポリシーが毎セクション作り直しを強制している場合はそちらが優先されます。 基準音 高音域なら 67、 それ以外は 60 リズム位置 密度と長さから決定。 リズムテンプレートも可 音数 1 サイクル 3–8 音、 既定は 6 ピッチ列 1 音ごとに 1 ステップ、 幅はモーションが決める MotifMotion Stepwise 2 度のみ GentleLeap 3 度まで WideLeap 5 度まで NarrowStep ±1 スケール度 Disjunct 不規則な跳躍 Ostinato 同一ピッチクラス Blueprint 専用 リピートスコープ FullSong 曲全体で 1 パターン Section セクションごとに新パターン リフポリシーが優先 Free ポリシーでは毎セクション作り直し モーションタイプが決めるのは 1 歩の幅だけで、リズムのグリッドはピッチより先に確定します。

MotifMotionの値(API: 0-5):

名前説明
0Stepwiseスケールステップのみ(2度)
1GentleLeap3度まで
2WideLeap5度まで
3NarrowStep狭いスケール度数(ジャジー)
4Disjunct不規則な跳躍(実験的)
5Ostinato同一ピッチクラスの繰り返し

音域

モチーフトラックは C4 (60) - C8 (108) を占めます。レジスターのフラグは固有の音域ではなく、組み立ての基準音を選ぶものです:

レジスター基準音
Mid(デフォルト)C4 (60)
HighG4 (67)

ボーカルがある場合、使用できる音域はボーカルの中央値を基準に狭められます。上限は中央値の3半音上まで下がり、下限は15半音下まで上がるため、モチーフが音域の上端に集中しなくなります。

反復

Freeポリシーでは、repeat_scopeFullSongなら各セクションに新しいモチーフを生成し、Sectionならセクションタイプごとにパターンをキャッシュして再利用します。ロック系のポリシー(LockedContour・LockedPitch・LockedAll)は繰り返しのセクションタイプでキャッシュ済みパターンを再生します。Evolvingはキャッシュ済みのリフを各セクションで変化させながら、同一性を保ちます。phrase_tail_restが有効な場合、モチーフは末尾の最後の小節で半分を過ぎた位置から新しい音を開始しません。Coordinatorが凍結小節をコピーするときも、生成器へこのカットオフを問い合わせます。


アルペジオトラック

ソース: src/track/generators/arpeggio.cpp

SynthDrivenコンポジションスタイル(BGM専用モード)用。エレクトロニックスタイルのトラックで主要なハーモニック/メロディック要素として機能するアルペジオパターンを生成します。

パラメータ

cpp
struct ArpeggioParams {
    ArpeggioPattern pattern = Auto;  // Up, Down, UpDown, Random, Pinwheel,
                                     // PedalRoot, Alberti, BrokenChord, Auto
    ArpeggioSpeed speed = Auto;      // Eighth, Sixteenth, Triplet, Auto
    uint8_t octave_range = 2;        // 1-3オクターブ
    float gate = -1.0f;              // ノート長比率 (0.0-1.0)、-1 はスタイル既定
    bool sync_chord = true;          // コードチェンジに追従
    uint8_t base_velocity = 90;      // アルペジオノートのベースベロシティ
};

パターンタイプ

8 種類のアルペジオパターン(先頭 3 種は音の並びを明示) 1 オクターブの C メジャートライアドを例にすると、Up は C・E・G、Down は同じ並びを逆順にした G・E・C、UpDown は C・E・G と上がってから両端を重ねずに下降し E で終わります。octave_range を上げるとトライアド全体が 1 オクターブ上に重なるため、Up は 2 オクターブにまたがる C・E・G・C・E・G になります。残りの 5 パターンは Random・Pinwheel・PedalRoot・Alberti・BrokenChord です。スピードは 1 音の長さだけを変えます。 音の順序 — C メジャートライアド、1 オクターブ Up C E G 音域内のコードトーンを上昇 Down G E C 同じ並びを逆順に UpDown C E G E 上昇後、両端を重ねずに下降 octave_range を上げるとトライアド全体が 1 オクターブ上に重なり、Up は 2 オクターブの C E G C E G になります。 残り 5 パターン Random 任意のコードトーン Pinwheel 1-5-3-5 の交互進行 PedalRoot 1-3-1-5-1-7 Alberti 1-5-3-5(古典的) BrokenChord 1-3-5-8-5-3 スピードが変えるのは 1 音の長さだけです。8 分 240 ティック、16 分 120、三連 160(1 拍 480 ティック)。
IDパターン説明
0Upコードトーンを上昇
1Downコードトーンを下降
2UpDown上昇後に下降(端の音は重複しない)
3Randomコードトーンをシャッフルした順序
4Pinwheelルート - 5度 - 3度 - 5度
5PedalRootルートと各上声を交互に鳴らす
6Alberti古典的な 低-高-中-高。Pinwheel と同じ音型
7BrokenChord上昇して下降。UpDown と同じ音型
255Autoムードまたは Blueprint 既定のパターンを使用(JS のデフォルト)

パターンを適用する前に、コードトーンは octave_range オクターブ分だけ積み上げられます。したがってデフォルトの 2 では、C メジャーの Up アルペジオは C E G C ではなく C E G C E G になります。

スピード変換

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/generators/se.cpp

SE トラックは各セクションの先頭にテキストマーカーを、転調がある場合は転調位置にもマーカーを書き込みます。ピッチの衝突検出には参加しません。

コールが有効な場合は、コール&レスポンスのチャントも書き込まれます。チャントセクションとミックスブレイクにはそれぞれのプリセットパターン、サビにはコール密度に応じた確率で短いコール、B → サビの遷移直前の小節には PPPH、各イントロにはイントロミックスのパターンが置かれます。コールのノートは任意で、無効にするとテキストマーカーだけが書き込まれます。コールのノートはすべて C3 (48) 固定のため、アレンジ全体に影響を与えずにミュートしたり別の音源へ差し替えたりできます。


ベロシティ計算

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

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ベース
Guitar0.70伴奏
Drums0.90タイミングドライバー
Motif0.70バックグラウンド
Arpeggio0.85中レベル