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.cpp、src/track/vocal/melody_designer.cpp

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

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

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

アーキテクチャ ​

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

  1. MelodyDesigner(melody_designer.cpp)- 評価付きテンプレート駆動のピッチ選択
  2. Vocal Generator(vocal.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エッジー、型破り非コードトーン、境界破壊

フレーズキャッシュ ​

各セクションタイプの最初の出現がキャッシュされ、同じタイプの後続セクションすべてで再生されます。歌詞を変えても同じ旋律を繰り返すポップスの作法に沿ったものです。キャッシュのキーはセクションタイプだけです。

cpp
std::unordered_map<SectionType, CachedPhrase> phrase_cache;  // A、B、Chorus 等

開始コードはあえてキーに含めません。進行はセクションごとに頭から始まり、再生時に当たるコードへの対応は再生側の衝突回避パスが担います。長さの異なる後続セクションは、キャッシュと共通する小節だけを再生します。短いセクションはキャッシュした冒頭で終わり、長いセクションは残りの小節を新しく書きます。キャッシュされるのは解決済みの旋律で、次セクションへのアプローチとフックの強調は含まれません。これらは再提示側が自分の文脈から決めます。

再提示が完全一致になる確率は、フレーズを再利用するたびに下がります。1回目の再提示は 80%、2回目は 60%、3回目以降は 30% で、後ろのセクションほど新鮮になります。また、完全一致が2回続いた時点で、次は必ずバリエーションが入ります。

8小節以上のサビは、フックを2回提示します(フック、答え、フック)。冒頭2小節がサビの中間で再提示されるため、2回目も同じフックとして聴こえます。フックスケルトンが Repeat、TripleHit、RhythmRepeat、StutterRepeat、Ostinato のいずれかのときは、サビ冒頭が1つのコードトーン上で3〜6拍チャントされ、再提示にもそのチャントが引き継がれます。RhythmSync ではリードの音型も中間に重ねて置かれます。控えめなサビ(落ちサビ)は同じ旋律をより薄く歌いますが、2小節のフックはそのまま残ります。

これとは別に、レシテーションは、フレーズの頭に置かれる4〜8音の速い同音連打です。1セクションにつき最大1回で、多くはサビへ向かうセクションに入り、すでに早口の連打を含むサビには入りません。確率はボーカルスタイルごとの比率にセクションごとの重みを掛けたもので、Vocaloid と UltraVocaloid が 0.9、KPop と Idol が 0.7、Anime が 0.6、Ballad は 0、ほかのスタイルはその間です。

フレーズバリエーション

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

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

フックで始まるフレーズ(サビやドロップ)ではLateOnsetは使われず、フックはダウンビートで入ります。

音域制約 ​

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

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

サビは曲の旋律上の最高点として保たれます。AとBは、テシトゥーラの中心音、およびその2半音上より先へは上がりません。サビの最高音を超えそうな非サビのフレーズは、音ごとにクランプされるのではなく、最小のダイアトニックな移動量でフレーズ全体が下げられるため、輪郭が崩れません。2回目以降のサビの冒頭は、最初のサビの冒頭より必ず少し高く持ち上げられます。比較は実際に鳴っている調で行うため、転調も上昇分として数えられます。

非和声音による装飾 ​

ボーカルトラックは非和声音(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 ​

各ボーカルスタイルの統一プロファイルは2つの部分からなります。バイアススコアに使う4つの音程構成の重みと、スタイルスコアの評価重みです。8つのプロファイルを14のボーカルスタイルが共有します(Idol/BrightKira/CuteAffected → Idol、Vocaloid/UltraVocaloid/CoolSynth → Vocaloid、Rock/PowerfulShout → Rock、Auto/Standard → Standard)。

プロファイル同音順次進行スキップ跳躍歌唱性サプライズ
Standard1.001.001.000.500.150.15
Idol1.251.451.000.450.180.05
Rock0.800.801.000.800.150.20
Ballad1.001.601.000.200.300.05
Anime1.301.001.200.600.100.15
Vocaloid0.900.701.001.000.100.20
CityPop0.901.201.100.400.150.15
KPop1.400.901.100.600.120.18

UltraVocaloidモード ​

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

  • マシンガンリズム: ボカロ曲に特徴的な連射的16分音符シーケンス
  • ブレスポイント: 密度の高いパッセージでもフレージング用のマイクロポーズを自動挿入
  • セクション別リズムロック: 各セクションが一貫したリズムアイデンティティを維持
プロファイルパラメータ
  • 同音、順次進行、スキップ(3度)、跳躍(5度以上): 候補内で各種の音程がどれだけ現れるかにかける倍率です(1.0が中立)。候補ごとに各種の割合を重み付けして正規化した値がバイアススコアになります。同音の重みが高いほど繰り返しの多い旋律が選ばれやすくなります
  • 歌唱性: 人間が歌いやすいメロディの重み(高いほど歌いやすい)
  • サプライズ: 予想外のメロディ展開の重み(高いほどダイナミック)

プロファイルは音域の高低には作用しません。旋律がボーカル音域のどこに位置するかは、スタイルではなくセクションごとの音域シフトとテシトゥーラで決まります。

メロディ評価システム ​

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): サビ冒頭と中間(8小節以上のサビの中間)
  • Strong (3): サビ冒頭、サビ中間、各Bセクションの冒頭
  • Maximum (4): 反復を最大化し、単純なパターンのみを使用

AセクションとBridgeがフックポイントになることはありません。各フックポイントでは、最初の2拍以内にある先頭の1音(Light)、2音(Normal)、3音(Strong・Maximum)が長く、強くなります。

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

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

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全音符コードトーンパッド

MotifCounter は、音ごとにボーカルの進行方向と逆へ3半音ずつ動き、ボーカルが動かないあいだは同じ音高を保ちます。ボーカルが低い場合はボーカルの最低音より下(最高でもG4)に置かれ、鳴っているボーカルの音と半音でぶつかる位置にしか置けないときは、鳴らさずに休みます。

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 でボーカルとの不協和音を回避

サビでの挙動 ​

サビではBlueprintのchorus_functionが実行され、音域・ベロシティ・密度は機能の種類で決まります。比率にはBlueprintのvelocity_scaleとdensity_scaleが掛かります。

サビの機能音域オフセット音域幅ベロシティ比密度比
EmotionalPad、SustainPad-12120.600.80
リズム系の機能(PulseLoop、GrooveAccent、MelodicHookなど)-6120.750.95
Unison0120.751.00

Unisonはリードのリズムが十分に安定している場合(リズム安定度0.5以上)だけ実行されます。そうでなければ、リズム系の設定でMelodicHookに切り替わります。UltraVocaloidでボーカル密度がフルのサビは、常にGrooveAccent(オフセット-6、ベロシティ0.75、密度0.80)を使います。


コードトラック ​

ソース: 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 はベースがすでに鳴らしているルートを省くボイシング候補で、後述の確率とムード条件で選ばれます。

ボイシングタイプは小節ごとにセクションから決まります。イントロ・インタールード・アウトロ・チャント・Aは常にClose、MixBreakは常にOpenで、B・サビ・ブリッジはCloseとOpenから選びます(BはOpen 40%、サビはOpen 60%、ブリッジはOpen 50%)。バラード系のムードではBとブリッジがClose、サビがOpenに固定されます。PeakLevel::MediumまたはPeakLevel::Maxのセクションでは、Closeが選ばれてもそれぞれ70%・90%の確率でOpenに置き換わります。

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

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

ベースとの協調 ​

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

  • buildBassPitchMask は小節の1拍目と3拍目でベースが保持しているピッチクラスを集めます。短2度またはトライトーンで衝突する候補ボイシングは除外されます。
  • BassAnalysis::analyzeBar は1拍目にベースがルートを鳴らしているかを判定します。鳴らしていて、かつムードがCityPop・Nostalgic・Dramatic・ModernPopのときに限り、Open/Closeの選択の代わりにルートレスボイシングが選ばれることがあります(確率はBセクション20%、サビ30%、ブリッジ25%)。それ以外ではルートを残したボイシングのままです。

音域制約 ​

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_below_vocal有効にすると、メロディのマスキングを避けるため、各セクションのボーカル最低音より2半音以上下にギターボイシングを収めます。ボーカルのないセクションや、ボーカルがギターの下限付近にあるセクションは制約されません
guitar_style_hintBlueprintのSectionSlotで定義されるセクションごとのスタイルヒント(0-7)。0 = ムードとエネルギーに基づいて自動選択

生成 ​

  • ギターはコードトラックの後に生成され、既存の和声ボイシングを補完
  • パターンはセクションエネルギーとムードに適応
  • セクションごとのguitar_style_hint(0-7)でギター伴奏スタイルに影響を与えることが可能
  • MIDIチャンネル6に出力。フォールバックのプログラムはElectric Guitar clean(27)で、ムードによって別のギタープログラムが割り当てられることがあります
  • ボーカルと同じ音高になるギターの音は、重ねずに見送られます
  • パワーコードにはそのコード自身の5度が使われるため、ディミニッシュ(vii、#IVdim)では減5度になります
  • ストラム(声部が約8ティック刻みでずれて鳴る奏法)の一部の声部がボーカルより上に出た場合、その声部だけを下げることはせず省くため、ストラムの弦の順序が保たれます

同じ規則は、セクション終わりのサスティンにも及びます。Chord、Motif、Arpeggio、Guitar、Bass の音を伸ばす終端パターンは、ボーカルが同じ音高を鳴らす手前で打ち切られます。


ベーストラック ​

ソース: 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) に収めるために必要なときだけです。

パターンは、ムードに対応するジャンルの行(セクションごと)から選ばれます。確率はプライマリが60%、セカンダリが30%、ターシャリが10%です。次の2つの場合は、行の中の特定の1つに絞られます。ドラムがオフのときは、ベースがリズムを担うため行内で最も密なパターンになります。A・B・サビでは、ボーカルの密度が0.6を超えると行内で最も疎なパターン(サビとピークのセクションでは適用されません)、0.3を下回ると最も密なパターンになります。PedalTone は、アルペジオがあるとき WholeNote に差し替えられます(ブリッジを除く)。ボーカルの動きに応じて変わるのは、小節のルートが置かれるオクターブだけで、音名は変わりません。

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

アプローチノート ​

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

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


ドラムトラック ​

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

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

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() がセクションの組み合わせ・ドラムスタイル・次セクションのエネルギーから選択します。

フィルはフィル区間のすべての拍を埋める必要はありません。そのフィルタイプが特に置く音を持たない拍では、無音にせずセクション本来のパターンが維持されます。控えめなフィル(SimpleCrash、BreakdownFill、HalfTimeFill)は1拍目と2拍目には何も書かないため、高エネルギーのセクションがフィル区間を早く開いても、その間はグルーブが保たれます。

フィルが置かれるのはセクション最後の小節だけで、次のセクションがフィルを求める(fill_before)か、通常の重みのサビである場合に限ります。静かなサビ(落ちサビ)の手前にはフィルを置きません。フィルの開始位置はエネルギーが低いセクションで4拍目、中程度で3拍目、高いセクションで1拍目(小節全体)です。最後のセクションはフィルを置かず、最後のサビへ入る小節はグルーブを保ったまま最後の1拍を空けます。

DramaticまたはDrumHitのサビドロップでは、最後のドロップ区間でキットも短縮されます。DrumHitはサビの入りに必ずクラッシュを置き、Dramaticは短縮でエントリークラッシュが失われた場合にだけそれを復元します。どちらもサビの到着マーカーが残ります。静かなサビ(落ちサビ)にはエントリークラッシュがなく、直前のセクションより低い音量で入らないようにするエネルギーの持ち上げも行われません。

ユークリッドドラム ​

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

ドラムの役割(Drum Role) ​

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

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

ゴーストノート ​

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

cpp
// ゴーストのベロシティは拍のベロシティに対する倍率(セクションと位置で0.25-0.65、
// さらにランダムな0.85-1.15)を20-100にクランプした値で、絶対値ではありません。

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

  • エネルギッシュなムード(EnergeticDance・IdolPop・Anthem・AnimeHighEnergy・LatinPop・Trap): サビで最大 45% の出現確率
  • 穏やかなムード(Ballad・Sentimental・Chill・Lofi): 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 倍してからクランプします。

ヒューマナイゼーション ​

ドラムのヒューマナイゼーションは小さく、対象はキックだけです。

  • キックのジッター: 最大±2ティック(16分音符の2%)で、humanize_timingに比例して縮みます。オフセットは整数ティックに切り捨てられるため、設定が低いとジッターはありません
  • ベロシティのヒューマナイズ処理はなし: ドラムの強弱はパターン、セクション、ゴーストノートとアクセントの規則で決まります(生成パイプラインを参照)
  • ハイハットアクセントパターン: ダウンビートへの自然な強調

グルーブのオフセットは別の仕組みです。セクションのタイムフィールがドラムのオンセットをずらし(レイドバックは約+10ms、プッシュは約-7ms、テンポに応じて換算)、ドライブ感のマイクロタイミング処理がドラムとベースをポケットに置きます。

ボーカル同期 ​

drums_sync_vocalが有効な場合、ドラムは補助のキックを足してボーカルに寄り添います。スタイル本来のキックパターンは常に書かれます。RhythmSync ではボーカルのオンセットにキックが加わり、1小節あたり最大3つで、1拍目と3拍目には置かれません。MelodyDriven では、ボーカルが密な小節に限ってオフビート(1.5拍と3.5拍)のキックが加わり、FourOnFloor と Sparse のスタイルには加わりません。

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 パターンを曲全体で使うかセクションタイプごとに持つかを決めます。ただしこれが効くのは Free ポリシーのときだけで、ロック系や Evolving ではキャッシュ済みのリフを再生または変化させます。 基準音 高音域なら 67、 それ以外は 60 リズム位置 密度と長さから決定。 リズムテンプレートも可 音数 1 サイクル 3–8 音、 既定は 6 ピッチ列 1 音ごとに 1 ステップ、 幅はモーションが決める MotifMotion Stepwise 2 度のみ GentleLeap 3 度まで WideLeap 5 度まで NarrowStep ±1 スケール度 Disjunct 不規則な跳躍 Ostinato 同一ピッチクラス Blueprint 専用 リピートスコープ FullSong 曲全体で 1 パターン Section セクションタイプごとに 1 パターン リフポリシーが優先 スコープが効くのは Free のときだけ モーションタイプが決めるのは 1 歩の幅だけで、リズムのグリッドはピッチより先に確定します。

MotifMotionの値(API: 0-5):

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

音域 ​

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

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

ボーカルがある場合、使用できる音域はボーカルの中央値を基準に狭められます。下限は中央値の15半音下(C4より下にはなりません)、上限は3半音上(C8を超えません)で、幅は常に1オクターブ以上あります。これによりモチーフが音域の上端に集中しなくなります。キャッシュされたモチーフや再生されたモチーフのセクションは、そのセクション自身の密度まで間引かれ、不協和なコードチェンジをまたいで保持されるモチーフの音は、チェンジの手前で解放されます。

反復 ​

Freeポリシーでは、repeat_scopeがFullSong(デフォルト)なら曲全体で1つのモチーフを保ち、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 になります。

アルペジオは元の進行ではなく、実際に鳴っているコードに従います。代理コード、再提示されたループ、先取り、小節の途中でのコードチェンジのすべてに追従します。PeakLevel::Max のセクションでは octave_range が1オクターブ増え(上限は3)、Blueprint の prefer_stepwise 制約があると1に固定されます。RhythmSync でも、明示した speed と gate はそのまま保たれ、Sixteenth の速度と 0.95 以上のゲートが適用されるのは Auto のときだけです。

スピード変換 ​

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中レベル