「ノートオン・カウント」を導入したシングル・アサイン・アルゴリズムでの「同音連打」の例を示します。
まず、ノートオン・カウントを書き加えた初期状態の図を下に示します。
「@1」のように表示してあるのがノートオン・カウントです。
「フリー・キュー」内のボイスのノートオン・カウントがゼロなのは自明ですが、「ホールド・キュー」内のボイスは、ダンパー・ペダルが踏まれた状態でノートオフ・メッセージが到着することによりアクティブ・キューからホールド・キューに移されるので、ノートオフ・メッセージの処理によりノートオン・カウントがゼロになっています。
ゼロでないノートオン・カウントを持つのはアクティブ・キュー内のボイス 4 (C#) だけになっています。
ここに、「一部がオーバーラップする 2 つの音」の 2 音目の C# に対するノートオン・メッセージが到着した場合を考えます。
- アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を取り外す
- 発音中の音の強制ダンプ処理を行う
- C# の音の再発音 (アタック開始) を行う
- ボイス 4 のノートオン・カウントを 1 増やして 2 にする
- ボイス 4 をアクティブ・キューの最後尾に追加する
という処理を経て、下の図のような状態になります。
これは、「トポロジー」的には初期状態と同じですが、C# を発音しているボイス 4 のノートオン・カウントが「2」になっている部分が違っています。
次に、ダンパー・ペダルが踏まれたまま、C# の音の 1 回目のノートオフ・メッセージが到着すると、
- アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を見つける
- ノートオン・カウントを 1 減らした結果、ノートオン・カウントは 1 になる
- ノートオン・カウントがゼロではないので、何もしない
という手順で、ボイス 4 のノートオン・カウントを 1 減らす以外の処理は行いません。
この結果、下図の初期状態に戻ります。
ここで、仮に、ダンパー・ペダルを離したとしても、ボイス 4 の C# の音はアクティブ・キュー内に保持されているので、C# の音が消えてしまうことはありません。
つづいて、ダンパー・ペダルが踏まれたまま C# の音の 2 回目のノートオフ・メッセージが到着すると、今度は、
- アクティブ・キュー内をサーチし、C# を発音しているボイス 4 を見つける
- ノートオン・カウントを 1 減らした結果、ノートオン・カウントは 0 になる
- ノートオン・カウントがゼロであり、ダンパー・ペダルが踏まれているので、ボイス 4 をアクティブ・キューから外して、ホールド・キューの最後尾に追加する
という手順で、下の図のような状態になります。
HOLD |
2 (F#) @0 |
1 (A#) @0 |
4 (C#) @0 |
この状態で、ダンパー・ペダルを離すと、すべての音が消えることになります。
次回は、フリー・キューが空となり、現在発音中のボイスのどれかを「奪って」割り当てない限り、新たな音が発音できない場合について考えます。