声部アーキテクチャ
MIDI Sketch Bach の楽曲における各声部は独立した旋律線です。声部数は形式が決定し、各声部が何をするかも形式が決めます。声部数オプションは存在しません。
声部とは?
バロック音楽では「声部」は独立した旋律線です — 歌われるか演奏されるかを問いません。3声のフーガには3つの同時進行する線があり、それぞれが独自のリズム、輪郭、個性を持ちます。MIDI Sketch Bachでは、各声部が個別のMIDI トラックになります。
トラックは出力コンテナ、声部は音楽上の役割
MIDI ファイルでは DAWが扱えるようにトラックを使います。一方、作曲エンジンは対位法の検査に必要な独立した音楽線として声部を扱います。通常は一つの声部が一つのトラックに対応します。
声部数は形式が決定
声部数は形式ごとに固定されます。形式を選ぶことがテクスチュアを選ぶことです。
| 形式 | 声部数 |
|---|---|
fugue、prelude_and_fugue、trio_sonata、toccata_and_fugue、fantasia_and_fugue、goldberg_variations | 3 |
chorale_prelude、passacaglia、chaconne | 2 |
cello_prelude | 1 |
numVoices/num_voices の指定は後方互換のため受理されますが無視されます。拍子と基準長を含む完全な表は楽曲形式を参照してください。
ボイスインテント
形式ディレクターは、楽曲の小節スパンにわたって各声部にボイスインテントを割り当てます — 各時点でその声部が果たす役割です。エンジンには30種類の名前付きインテントが定義されており(voice_intent.h)、いくつかの系統にまとまります。
| 系統 | 代表的なインテント | 役割 |
|---|---|---|
| フーガの提示 | SubjectCarrier, AnswerCarrier, CountersubjectCarrier | 主唱(主調)、応唱(属調)、そして繰り返し寄り添う対主題 |
| 展開 | MiddleEntryCarrier, StrettoCarrier, PedalCarrier, CodaCarrier | 近親調の中間入り、重なり合うエントリ、保続音、終結素材 |
| 嬉遊部 | Episode, FortspinnungSpan | 主題の動機から導かれる、調から調へ移動するゼクエンツ素材 |
| 固定線 | GroundCarrier, PassacagliaGround, CantusFirmusCarrier | 不変の反復バスとコラール旋律 |
| 音型 | FigurationCarrier, ArpeggioFlow, ToccataCarrier, FantasiaCarrier | 連続する固有の音型と、セクション構成の独奏書法 |
| 変奏 | VariationCarrier と役割別の変種 | 固定バス上で再創造される上声部素材 |
| テクスチュア | RhythmCarrier, NctCarrier, 自由対位法 | 弱起・ヘミオラのリズム型、宣言された非和声音の音型、候補探索が選ぶ伴奏線 |
素材を担うインテント(主題、グラウンド、定旋律)は固定され、残りの線は候補探索によって埋められます。
主題、応答、グラウンド、定旋律
主題はフーガの中心になる旋律です。応答は、別の声部に入る主題で、多くの場合は属調側へ移されます。グラウンドバスは反復する低音パターンです。定旋律は長い音符で置かれる固定旋律です。
声部の独立性
声部間の独立性の維持はバロック対位法の中核原則です。エンジンは次の方法でこれを支えます。
リズムの差別化
声部は補完的なリズムパターンを使い、足並みを揃えて動かないようにします — ある声部が持続するとき、別の声部が活発になる傾向があります。この補完性はバッハの書法の特徴です。
旋律の差別化
各声部は独自の音程傾向と方向性の傾向を持ち、主題素材を独立して展開します。
音域の差別化
声部は明確に異なる音域を保ちます。声部交差は最小化され、声部が互いに接近すると離れる傾向があります。候補探索は各拍を和声音に固定し、声部が独立を保ちながら和声を明瞭にします。
音域と声部交差
音域は音の高さの範囲です。バスは低く、ソプラノ的な線は高い、という区別です。声部交差は、本来低い声部が高い声部を追い越したり、高い声部が低い声部の下に入ったりすることです。線の追跡が難しくなるため制限されます。
声部とトラックの割り当て
各声部は独自のチャンネルとプログラムを持つ個別のMIDI トラックに割り当てられます。
const events = generator.getEvents()
for (const track of events.tracks) {
console.log(`Voice: ${track.name}`) // トラック名
console.log(`Channel: ${track.channel}`) // MIDI チャンネル(0-15)
console.log(`Program: ${track.program}`) // GMプログラム番号
console.log(`Notes: ${track.note_count}`) // ノート数
}すべてのノートは source 由来タグ("material"、"compose"、"ornament")も持ちます — JavaScript APIを参照してください。
General MIDI プログラムの割り当て
| 楽器 | GMプログラム | 音色 |
|---|---|---|
| オルガン | 19 | チャーチオルガン |
| チェンバロ | 6 | チェンバロ |
| ピアノ | 0 | アコースティックグランドピアノ |
| ヴァイオリン | 40 | ヴァイオリン |
| チェロ | 42 | チェロ |
| ギター | 24 | アコースティックギター(ナイロン) |
出力は声部ごとに1トラックを持つType 1 の標準 MIDI ファイルであり、DAW で声部ごとに楽器を再割り当てできます。