Beispiel #1
0
        /// <summary>
        /// Генерация новых выходных данных.
        /// </summary>
        /// <returns>Выходной сигнал.</returns>
        public float Process()
        {
            if (!IsActive)
            {
                return(0);
            }

            float oscMix = 0; // Здесь хранится результат

            switch (Modulation)
            {
            case ModulationType.None:
                if (envA.IsActive)                                 // Если первый осциллятор активен, то
                {
                    oscMix += envA.Process() * oscA.Process();     // Прибавляем сигнал первого осциллятора
                    if (envB.IsActive)                             // Если второй осциллятор активен
                    {
                        oscMix += envB.Process() * oscB.Process(); // Прибавляем сигнал второго осциллятора
                    }
                }
                else
                {
                    if (envB.IsActive)                            // Если второй осциллятор активен, то
                    {
                        oscMix = envB.Process() * oscB.Process(); // Прибавляем сигнал второго осциллятора
                    }
                    else
                    {
                        // Оба осциллятора неактивны, этот голос прекратил производить сигнал
                        IsActive = false;
                        return(0);
                    }
                }
                break;

            case ModulationType.AmplitudeModulationA:
                if (envA.IsActive)     // Если несущий осциллятор активен, то
                {
                    float mod = 0;
                    if (envB.IsActive)     // Если модулирующий осциллятор активен, то
                    {
                        mod = oscB.Process() * envB.Process();
                    }
                    oscMix = oscA.Process() * envA.Process() * (1 + mod);
                }
                else
                {
                    // Несущий осциллятор не активен, этот голос прекратил производить сигнал.
                    IsActive = false;
                    return(0);
                }
                break;

            case ModulationType.AmplitudeModulationB:
                if (envB.IsActive)
                {
                    float mod = 0;
                    if (envA.IsActive)
                    {
                        mod = oscA.Process() * envA.Process();
                    }
                    oscMix = oscB.Process() * envB.Process() * (1 + mod);
                }
                else
                {
                    IsActive = false;
                    return(0);
                }
                break;

            case ModulationType.PhaseModulationA:
                if (envA.IsActive)     // Если несущий осциллятор активен
                {
                    float mod = 0;
                    if (envB.IsActive)                              // Если модулирующий осциллятор активен
                    {
                        mod = 10 * oscB.Process() * envB.Process(); // Сдвиг фазы несущего сигнала.
                    }
                    oscMix = oscA.Process(phaseModulation: mod) * envA.Process();
                }
                else
                {
                    IsActive = false;
                    return(0);
                }
                break;

            case ModulationType.PhaseModulationB:
                if (envB.IsActive)
                {
                    float mod = 0;
                    if (envA.IsActive)
                    {
                        mod = 10 * oscA.Process() * envA.Process();
                    }
                    oscMix = oscB.Process(phaseModulation: mod) * envB.Process();
                }
                else
                {
                    IsActive = false;
                    return(0);
                }
                break;
            }

            var filterEnvOut = envFilter.Process();

            return(noteVelocity * filter.Process(oscMix, filterEnvOut));
        }