ボイス・アサイナ (7)

「マルチ・アサイン」設定では、「同音連打」に対しても普通の音と同様に扱い、特別なことはしていません。
したがって、前の説明で尽くされていますが、一応、同音連打の場合についても簡単に説明しておきます。
まず、下の初期状態から始めます。

ACTV 4 (C#)
HOLD 2 (F#) 1 (A#)
FREE  0   5   3 

現在、C# が発音中ですから、C# の音の同音連打を考えます。
まず、ノートオンとノートオフとが、直接 1 対 1 に対応しており、各音はオーバーラップせず、それぞれが独立した音となる場合を仮定します。
ノートオンを「開く」カッコ、ノートオフを「閉じる」カッコとすると、

   ( ) ( ) ( ) ...

のように表される場合です。
初期状態から C# の鍵盤を 離す / 押す / 離す / 押す して、全体で 3 個目の音の発音中の場合を図示すると次のようになります。

ACTV 5 (C#-3)
HOLD 2 (F#) 1 (A#) 4 (C#-1) 0 (C#-2)
FREE  3 

音名に「-1」、「-2」のようにサフィックスを付け、何番目の音であるかを識別できるようにしてあります。
いま、Hold1 はオン、つまり、ダンパー・ペダルは踏まれた状態ですから、最初のボイス 4 で発音していた C#-1 は、最初のノートオフでフリー・キューには回収されずに、発音を続けたままホールド・キューに収容されます。
同様に、次のノートオンでフリー・キューからボイス 0 を割り当てられた C#-2 の音は、ノートオフでホールド・キューの中に入れられます。
そして、最後のノートオンでフリー・キューからボイス 5 を割り当てられた C#-3 の音は、まだノートオン中なので、アクティブ・キュー内に保持されています。
次の音のノートオンが来る前に、必ず前の音のノートオフが来ますから、前の音はフリー・キューに回収されるか、ホールド・キューに収容されるかして、アクティブ・キューから取り除かれた状態で、次の同音のノートオンを待つ形となります。
したがって、このオーバーラップしない状態では、アクティブ・キュー内には同じ音程のボイスは高々 1 個しか保持されないことになります。
次に、ノートオンが連続して到来し、各音がオーバーラップする場合を考えます。
カッコの記法で表すと、

  (    ( )    )

のようになります。
この場合、以前に述べたように、「長い音の中に入れ子になった短い音」ではなく、「一部がオーバーラップしたふたつの音」

  (     )
      (     )

と見なします。
初期状態から C# の音のノートオンが到着した状態を考えると、

ACTV 4 (C#-1) 0 (C#-2)
HOLD 2 (F#) 1 (A#)
FREE  5   3 

のようになります。
まだ最初の音 (C#-1) のノートオフが来ていませんので、アクティブ・キューの中に C#-1 と C#-2 のふたつの音が同居しています。
ここで C# のノートオフが到着すると、アクティブ・キューを先頭からサーチして最初に見つかった C#-1 を発音しているボイス 4 をキューから取り外します。

4 (C#-1)

ACTV 0 (C#-2)
HOLD 2 (F#) 1 (A#)
FREE  5   3 

この処理は、同音連打ではない他の音の処理と同様で、目的の音程が見つかればサーチを止めるので、アクティブ・キュー内の、もうひとつの C#-2 (ボイス 0) の存在に気付くこともありません。
Hold1 がオンなので、アクティブ・キューから外したボイス 0 の行き先はホールド・キューであり、最終的には次のようになります。

ACTV 0 (C#-2)
HOLD 2 (F#) 1 (A#) 4 (C#-1)
FREE  5   3 

この後、C# のノートオフが来れば、アクティブ・キューをサーチしてボイス 0 の C#-2 が見つかることになるので、前述のように、同音連打を「一部がオーバーラップしたふたつの音」として扱うことが分かります。