/// <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)); }