using System; using Sandbox; namespace SFXR; [Title( "Vibrato" )] [Category( "SFXR Effects" )] [Icon( "waves" )] public class SFXRVibrato : SFXREffect { /// /// Amount by which the frequency is changed /// (Default: 0, Range: 0 - 1) /// [Property, Range( 0f, 1f, 0.01f )] public float Depth { get; set; } = 0.3f; /// /// Frequency of the vibrato in Hz /// (Default: 0, Range: 0 - 100) /// [Property, Range( 0f, 100f )] public float Speed { get; set; } = 40; public override short[] Apply( short[] samples, SFXRComponent sound ) { if ( Depth == 0 || Speed == 0 ) { return samples; } short[] outputSamples = new short[samples.Length]; double oscillatorPosition = 0; double oscillatorIncrement = 2 * Math.PI * Speed / (double)sound.SampleRate; for ( int i = 0; i < samples.Length; i++ ) { oscillatorPosition += oscillatorIncrement; if ( oscillatorPosition > 2 * Math.PI ) { oscillatorPosition -= 2 * Math.PI; } double vibrato = Math.Sin( oscillatorPosition ) * Depth; outputSamples[i] = (short)(samples[i] * (1 + (float)vibrato)); } return outputSamples; } }