@@ -12,9 +12,7 @@ namespace EddiSpeechService.SpeechEffects
1212{
1313 public static class SpeechFX
1414 {
15- private static SpeechServiceConfiguration Configuration => SpeechService . Instance . Configuration ;
16-
17- public static IWaveProvider addEffectsToSource ( Stream stream , int chorusLevel , int reverbLevel , int echoDelay , int distortionLevel , bool radio )
15+ public static IWaveProvider addEffectsToSource ( Stream stream , int targetVolume , int fxLevel , int distortionLevel , int echoDelay , bool radio )
1816 {
1917 using ( var source = new WaveFileReader ( stream ) )
2018 {
@@ -32,12 +30,14 @@ public static IWaveProvider addEffectsToSource ( Stream stream, int chorusLevel,
3230
3331 var signal = new DiscreteSignal ( source . WaveFormat . SampleRate , trimmedBuffer ) ;
3432 var sampleRate = source . WaveFormat . SampleRate ;
35- var damageAdjustedFxLevel = FxParameters . DamageAdjustedFxLevel ( distortionLevel , Configuration . EffectsLevel ) ;
33+ var damageAdjustedFxLevel = FxParameters . DamageAdjustedFxLevel ( distortionLevel , fxLevel ) ;
34+
35+ Logging . Debug ( $ "Effects level is { damageAdjustedFxLevel } , echo delay is { echoDelay } " ) ;
3636
37- Logging . Debug ( $ "Effects level is { damageAdjustedFxLevel } , chorus level is { chorusLevel } , reverb level is { reverbLevel } , echo delay is { echoDelay } " ) ;
37+ var resolvedReverbLevel = 0 ;
3838
3939 // Chorus - We always apply chorus effects.
40- signal = ApplyChorus ( signal , chorusLevel , damageAdjustedFxLevel , sampleRate ) ;
40+ signal = ApplyChorus ( signal , damageAdjustedFxLevel , sampleRate , out var resolvedChorusLevel ) ;
4141
4242 // Radio (highpass)
4343 if ( radio )
@@ -51,13 +51,13 @@ public static IWaveProvider addEffectsToSource ( Stream stream, int chorusLevel,
5151 signal = ApplyEcho ( signal , echoDelay , sampleRate ) ;
5252
5353 // Reverb
54- signal = ApplyReverb ( signal , reverbLevel , damageAdjustedFxLevel , sampleRate ) ;
54+ signal = ApplyReverb ( signal , damageAdjustedFxLevel , sampleRate , out resolvedReverbLevel ) ;
5555
5656 // Distortion (apply last)
5757 signal = ApplyDamageDistortion ( signal , distortionLevel ) ;
5858 }
5959
60- signal = new DiscreteSignal ( signal . SamplingRate , NormalizeSamples ( signal ) ) ;
60+ signal = new DiscreteSignal ( signal . SamplingRate , NormalizeSamples ( signal , targetVolume ) ) ;
6161
6262 // Generate the processed signal in mono
6363 var processedSampleProvider = new DiscreteSignalSampleProvider ( signal ) . ToMono ( ) ;
@@ -71,7 +71,7 @@ public static IWaveProvider addEffectsToSource ( Stream stream, int chorusLevel,
7171 // Convert to 16-bit PCM (typical format for standard audio)
7272 IWaveProvider waveProvider = new SampleToWaveProvider16 ( processedSampleProvider ) ;
7373
74- if ( chorusLevel != 0 || reverbLevel != 0 || echoDelay != 0 )
74+ if ( resolvedChorusLevel != 0 || resolvedReverbLevel != 0 || echoDelay != 0 )
7575 {
7676 var extMs = Convert . ToInt32 ( 500 + Math . Max ( 0 , ( damageAdjustedFxLevel - 50 ) * 10 ) ) ;
7777 Logging . Debug ( "Extending duration by " + extMs + "ms" ) ;
@@ -82,12 +82,13 @@ public static IWaveProvider addEffectsToSource ( Stream stream, int chorusLevel,
8282 }
8383 }
8484
85- private static DiscreteSignal ApplyChorus ( DiscreteSignal signal , int chorusLevel , int damageAdjustedFxLevel , int sampleRate )
85+ private static DiscreteSignal ApplyChorus ( DiscreteSignal signal , int damageAdjustedFxLevel , int sampleRate , out int resolvedChorusLevel )
8686 {
87- if ( chorusLevel != 0 )
87+ resolvedChorusLevel = ( int ) ( 60 * ( damageAdjustedFxLevel / 100M ) ) ;
88+ if ( resolvedChorusLevel != 0 )
8889 {
89- var rate = Math . Max ( 0.1f , chorusLevel / 20f ) ; // e.g., 1–5 Hz Frequency scaling
90- var width = Math . Max ( 0.005f , damageAdjustedFxLevel / 10f * .001f ) ; // 5-10 ms delay
90+ var rate = Math . Max ( 0.1f , resolvedChorusLevel / 20f ) ; // e.g., 1–5 Hz Frequency scaling
91+ var width = Math . Max ( 0.005f , resolvedChorusLevel / 10f * .001f ) ; // 5-10 ms delay
9192
9293 var chorus = new ChorusEffect ( sampleRate , new [ ] { rate } , new [ ] { width } ) ;
9394 chorus . WetDryMix ( damageAdjustedFxLevel / 100f ) ;
@@ -143,14 +144,15 @@ private static DiscreteSignal ApplyRadio (DiscreteSignal signal, int sampleRate)
143144 return signal ;
144145 }
145146
146- private static DiscreteSignal ApplyReverb ( DiscreteSignal signal , int reverbLevel , int damageAdjustedFxLevel , int sampleRate )
147+ private static DiscreteSignal ApplyReverb ( DiscreteSignal signal , int damageAdjustedFxLevel , int sampleRate , out int resolvedReverbLevel )
147148 {
148- if ( reverbLevel != 0 )
149+ resolvedReverbLevel = ( int ) ( 80 * ( damageAdjustedFxLevel / 100M ) ) ;
150+ if ( resolvedReverbLevel != 0 )
149151 {
150152 // Map reverbLevel to number of echoes and decay
151- var numEchoes = 1 + ( reverbLevel / 50 ) ; // 1 to 3 echoes
152- var baseDecay = 0.1f + ( 0.2f * ( reverbLevel / 100f ) ) ; // 0.1 to 0.3
153- var baseDelayMs = 30 + ( int ) ( 120 * ( reverbLevel / 100f ) ) ; // 30ms to 150ms
153+ var numEchoes = 1 + ( resolvedReverbLevel / 50 ) ; // 1 to 3 echoes
154+ var baseDecay = 0.1f + ( 0.2f * ( resolvedReverbLevel / 100f ) ) ; // 0.1 to 0.3
155+ var baseDelayMs = 30 + ( int ) ( 120 * ( resolvedReverbLevel / 100f ) ) ; // 30ms to 150ms
154156
155157 for ( var i = 0 ; i < numEchoes ; i ++ )
156158 {
@@ -166,7 +168,7 @@ private static DiscreteSignal ApplyReverb ( DiscreteSignal signal, int reverbLev
166168 return signal ;
167169 }
168170
169- private static float [ ] NormalizeSamples ( DiscreteSignal signal )
171+ private static float [ ] NormalizeSamples ( DiscreteSignal signal , int targetVolume )
170172 {
171173 var samples = signal . Samples ;
172174
@@ -189,7 +191,7 @@ private static float[] NormalizeSamples ( DiscreteSignal signal )
189191 }
190192 }
191193
192- var volumeScale = Math . Max ( 0 , Math . Min ( 100 , Configuration . Volume ) ) / 100f ;
194+ var volumeScale = Math . Max ( 0 , Math . Min ( 100 , targetVolume ) ) / 100f ;
193195 for ( var i = 0 ; i < samples . Length ; i ++ )
194196 {
195197 // Apply configuration volume scaling (percent 0-100)
0 commit comments