fluid-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [fluid-dev] [PATCH] Effect level clip


From: David Hilvert
Subject: Re: [fluid-dev] [PATCH] Effect level clip
Date: Mon, 3 Sep 2007 18:46:10 -0500

On Sun, 02 Sep 2007 20:40:35 -0700
Josh Green <address@hidden> wrote:

> I was hoping you might be able to comment on why the calls to
> fluid_voice_set_param occurs within the fluid_synth_one_block() function
> (in other words, it gets assigned every 64 output samples for each
> voice, whether the value has changed or not).  It seems like these calls
> could instead occur when the chorus or reverb levels are assigned?

Something like this?

Index: src/fluid_cmd.c
===================================================================
--- src/fluid_cmd.c     (revision 117)
+++ src/fluid_cmd.c     (working copy)
@@ -746,7 +746,7 @@
     fluid_ostream_printf(out, "rev_setlevel: Value too high! (Value of 10 =+20 
dB)\n");
     return 0;
   }
-  fluid_revmodel_setlevel(synth->reverb, level);
+  fluid_synth_set_reverb_level(synth, level);
   return 0;
 }
 
@@ -800,7 +800,7 @@
     return -1;
   }
   level = atof(av[0]);
-  fluid_chorus_set_level(synth->chorus, level);
+  fluid_synth_set_chorus_level(synth, level);
   return fluid_chorus_update(synth->chorus);
 
 }
Index: src/fluid_voice.c
===================================================================
--- src/fluid_voice.c   (revision 117)
+++ src/fluid_voice.c   (working copy)
@@ -1969,6 +1969,24 @@
   return FLUID_OK;
 }
 
+int fluid_voice_set_reverb(fluid_voice_t* voice, fluid_real_t level)
+{
+  fluid_voice_set_param(voice, GEN_REVERBSEND,
+                   1000.0
+                 * (level - FLUID_REVERB_DEFAULT_LEVEL) 
+                 / FLUID_REVERB_DEFAULT_LEVEL, 1 /* ? */);
+  return FLUID_OK;
+}
+
+int fluid_voice_set_chorus(fluid_voice_t* voice, fluid_real_t level)
+{
+  fluid_voice_set_param(voice, GEN_CHORUSSEND,
+                   1000.0
+                 * (level - FLUID_CHORUS_DEFAULT_LEVEL) 
+                 / FLUID_CHORUS_DEFAULT_LEVEL, 1 /* ? */);
+  return FLUID_OK;
+}
+
 /* - Scan the loop
  * - determine the peak level
  * - Calculate, what factor will make the loop inaudible
Index: src/fluid_voice.h
===================================================================
--- src/fluid_voice.h   (revision 117)
+++ src/fluid_voice.h   (working copy)
@@ -235,7 +235,13 @@
 /** Set the gain. */
 int fluid_voice_set_gain(fluid_voice_t* voice, fluid_real_t gain);
 
+/** Set reverb effect. */
+int fluid_voice_set_reverb(fluid_voice_t* voice, fluid_real_t level);
 
+/** Set chorus effect. */
+int fluid_voice_set_chorus(fluid_voice_t* voice, fluid_real_t level);
+
+
 /** Update all the synthesis parameters, which depend on generator
     'gen'. This is only necessary after changing a generator of an
     already operating voice.  Most applications will not need this
Index: src/fluid_synth.c
===================================================================
--- src/fluid_synth.c   (revision 117)
+++ src/fluid_synth.c   (working copy)
@@ -1513,6 +1513,22 @@
 }
 
 /*
+ * fluid_synth_set_reverb_level
+ */
+void fluid_synth_set_reverb_level(fluid_synth_t* synth, double level)
+{
+  int i;
+
+  fluid_revmodel_setlevel(synth->reverb, level);
+  for (i = 0; i < synth->polyphony; i++) {
+    fluid_voice_t* voice = synth->voice[i];
+    if (_PLAYING(voice)) {
+      fluid_voice_set_reverb(voice, level);
+    }
+  }
+}
+
+/*
  * fluid_synth_set_chorus
  */
 void fluid_synth_set_chorus(fluid_synth_t* synth, int nr, double level,
@@ -1529,6 +1545,22 @@
   fluid_chorus_update(synth->chorus);
 }
 
+/*
+ * fluid_synth_set_chorus_level
+ */
+void fluid_synth_set_chorus_level(fluid_synth_t* synth, double level)
+{
+  int i;
+
+  fluid_chorus_set_level(synth->chorus, level);
+  for (i = 0; i < synth->polyphony; i++) {
+    fluid_voice_t* voice = synth->voice[i];
+    if (_PLAYING(voice)) {
+      fluid_voice_set_chorus(voice, level);
+    }
+  }
+}
+
 /******************************************************
 
 #define COMPRESS      1
@@ -1866,8 +1898,6 @@
   fluid_real_t* chorus_buf;
   int byte_size = FLUID_BUFSIZE * sizeof(fluid_real_t);
   double prof_ref = fluid_profile_ref();
-  fluid_real_t chorus_level = fluid_chorus_get_level(synth->chorus);
-  fluid_real_t reverb_level = fluid_revmodel_getlevel(synth->reverb);
 
 /*   fluid_mutex_lock(synth->busy); /\* Here comes the audio thread. Lock the 
synth. *\/ */
 
@@ -1926,14 +1956,6 @@
       left_buf = synth->left_buf[auchan];
       right_buf = synth->right_buf[auchan];
 
-      fluid_voice_set_param(voice, GEN_CHORUSSEND,
-                            1000.0
-                          * (chorus_level - FLUID_CHORUS_DEFAULT_LEVEL) 
-                          / FLUID_CHORUS_DEFAULT_LEVEL, 1 /* ? */);
-      fluid_voice_set_param(voice, GEN_REVERBSEND,
-                            1000.0
-                          * (reverb_level - FLUID_REVERB_DEFAULT_LEVEL) 
-                          / FLUID_REVERB_DEFAULT_LEVEL, 1 /* ? */);
       fluid_voice_write(voice, left_buf, right_buf, reverb_buf, chorus_buf);
 
       fluid_profile(FLUID_PROF_ONE_BLOCK_VOICE, prof_ref_voice);
@@ -2102,6 +2124,8 @@
   int i, k;
   fluid_voice_t* voice = NULL;
   fluid_channel_t* channel = NULL;
+  fluid_real_t chorus_level = fluid_chorus_get_level(synth->chorus);
+  fluid_real_t reverb_level = fluid_revmodel_getlevel(synth->reverb);
 
 /*   fluid_mutex_lock(synth->busy); /\* Don't interfere with the audio thread 
*\/ */
 /*   fluid_mutex_unlock(synth->busy); */
@@ -2162,6 +2186,9 @@
   fluid_voice_add_mod(voice, &default_chorus_mod, FLUID_VOICE_DEFAULT);     /* 
SF2.01 $8.4.9  */
   fluid_voice_add_mod(voice, &default_pitch_bend_mod, FLUID_VOICE_DEFAULT); /* 
SF2.01 $8.4.10 */
 
+  fluid_voice_set_reverb(voice, reverb_level);
+  fluid_voice_set_chorus(voice, chorus_level);
+
   return voice;
 }
 
Index: src/fluid_synth.h
===================================================================
--- src/fluid_synth.h   (revision 117)
+++ src/fluid_synth.h   (working copy)
@@ -176,6 +176,10 @@
 
 int fluid_synth_set_reverb_preset(fluid_synth_t* synth, int num);
 
+void fluid_synth_set_reverb_level(fluid_synth_t* synth, double level);
+
+void fluid_synth_set_chorus_level(fluid_synth_t* synth, double level);
+
 int fluid_synth_one_block(fluid_synth_t* synth, int do_not_mix_fx_to_out);
 
 fluid_preset_t* fluid_synth_get_preset(fluid_synth_t* synth,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]