public void NoteOffAll(bool immediate) { var node = _voiceManager.ActiveVoices.First; if (immediate) {//if immediate ignore hold pedals and clear the entire registry _voiceManager.ClearRegistry(); while (node != null) { node.Value.StopImmediately(); var delnode = node; node = node.Next; _voiceManager.ActiveVoices.Remove(delnode); _voiceManager.FreeVoices.AddFirst(delnode.Value); } } else {//otherwise we have to check for hold pedals and double check the registry before removing the voice while (node != null) { VoiceParameters voiceParams = node.Value.VoiceParams; if (voiceParams.State == VoiceStateEnum.Playing) { //if hold pedal is enabled do not stop the voice if (_synthChannels[voiceParams.Channel].HoldPedal) { voiceParams.NoteOffPending = true; } else { node.Value.Stop(); _voiceManager.RemoveVoiceFromRegistry(node.Value); } } node = node.Next; } } }
public Voice() { VoiceParams = new VoiceParameters(); }