/// <summary> /// Генерация новых выходных данных. /// </summary> /// <returns>Выходной сигнал.</returns> public float Process() { // Вызовы этих методов обновляют значение параметров, которые подвержены сглаживанию. OscAManager.Process(); OscBManager.Process(); FilterManager.Process(); OscAVolumeEnvelopeManager.Process(); OscBVolumeEnvelopeManager.Process(); FilterCutoffEnvelopeManager.Process(); float sum = 0; for (int i = 0; i < activeVoices.Count;) { var voice = activeVoices[i]; sum += voice.Process(); if (!voice.IsActive) { // StopVoice помечает голос как свободный // и удаляет его из массива activeVoices. // При этом инкрементировать значение i не нужно, потому что // все элементы activeVoices сдвигаются влево StopVoice(voice); } else { i += 1; } } return(sum); }
/// <summary> /// Возвращает новый объект голоса, связанный с этим объектом. /// </summary> /// <returns></returns> private Voice CreateVoice() { var voiceOscA = OscAManager.CreateNewOscillator(); var voiceOscB = OscBManager.CreateNewOscillator(); var voiceFilter = FilterManager.CreateNewFilter(); var oscAEnvelope = OscAVolumeEnvelopeManager.CreateNewEnvelope(); var oscBEnvelope = OscBVolumeEnvelopeManager.CreateNewEnvelope(); var filterEnvelope = FilterCutoffEnvelopeManager.CreateNewEnvelope(); filterEnvelope.SetAmplitude(0); var voice = new Voice(Plugin, voiceOscA, voiceOscB, voiceFilter, oscAEnvelope, oscBEnvelope, filterEnvelope); voice.Modulation = modulationType; return(voice); }