ボイス・アサイナ (9)

「ノートオン・カウント」を導入したシングル・アサイン・アルゴリズムでの「同音連打」の例を示します。
まず、ノートオン・カウントを書き加えた初期状態の図を下に示します。
「@1」のように表示してあるのがノートオン・カウントです。

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

「フリー・キュー」内のボイスのノートオン・カウントがゼロなのは自明ですが、「ホールド・キュー」内のボイスは、ダンパー・ペダルが踏まれた状態でノートオフ・メッセージが到着することによりアクティブ・キューからホールド・キューに移されるので、ノートオフ・メッセージの処理によりノートオン・カウントがゼロになっています。
ゼロでないノートオン・カウントを持つのはアクティブ・キュー内のボイス 4 (C#) だけになっています。
ここに、「一部がオーバーラップする 2 つの音」の 2 音目の C# に対するノートオン・メッセージが到着した場合を考えます。

  • アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を取り外す
  • 発音中の音の強制ダンプ処理を行う
  • C# の音の再発音 (アタック開始) を行う
  • ボイス 4 のノートオン・カウントを 1 増やして 2 にする
  • ボイス 4 をアクティブ・キューの最後尾に追加する

という処理を経て、下の図のような状態になります。

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

これは、「トポロジー」的には初期状態と同じですが、C# を発音しているボイス 4 のノートオン・カウントが「2」になっている部分が違っています。
次に、ダンパー・ペダルが踏まれたまま、C# の音の 1 回目のノートオフ・メッセージが到着すると、

  • アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を見つける
  • ノートオン・カウントを 1 減らした結果、ノートオン・カウントは 1 になる
  • ノートオン・カウントがゼロではないので、何もしない

という手順で、ボイス 4 のノートオン・カウントを 1 減らす以外の処理は行いません。
この結果、下図の初期状態に戻ります。

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

ここで、仮に、ダンパー・ペダルを離したとしても、ボイス 4 の C# の音はアクティブ・キュー内に保持されているので、C# の音が消えてしまうことはありません。
つづいて、ダンパー・ペダルが踏まれたまま C# の音の 2 回目のノートオフ・メッセージが到着すると、今度は、

  • アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を見つける
  • ノートオン・カウントを 1 減らした結果、ノートオン・カウントは 0 になる
  • ノートオン・カウントがゼロであり、ダンパー・ペダルが踏まれているので、ボイス 4 をアクティブ・キューから外して、ホールド・キューの最後尾に追加する

という手順で、下の図のような状態になります。

ACTV

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

この状態で、ダンパー・ペダルを離すと、すべての音が消えることになります。
次回は、フリー・キューが空となり、現在発音中のボイスのどれかを「奪って」割り当てない限り、新たな音が発音できない場合について考えます。