Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }