[linux-audio-user] Recommendatio wanted

Joerg Anders j.anders at informatik.tu-chemnitz.de
Fri Nov 28 06:50:01 EST 2003


On Fri, 28 Nov 2003, Chris Cannam wrote:

> I still don't quite understand what you mean by this.  What is the 
> actual problem, in terms of what you hear?  How does a faulty string 
> envelope sound?

TiMidiy and all other synthezizers produce a long string tone 
from 8mbgmsfx.sf2 soundfont if I tie 4 or 5 whole notes.

  /---------------------------------------------.......
 /    
 |
 |
 |
 | 
 |
 |
 \
  \---------------------------------------------- .......


FluidSynth produces such an envelope:


  /---\
 /     \
 |      \
 |       \ ---------------------------------------- ...
 |
 |        /---------------------------------------- ...
 |       /
 |      /
 \     /
  \---/
> 
> I routinely use Fluidsynth with strings and haven't noticed any 
> particular problems, except that most freely available soundfonts 
> have rather too obvious short loops for their string samples.  Is it 
> something particular to the soundfont you're using?


I use the 8mbgmsfx.sf2 soundfont which was shipped with some
soundcards.

As already mentioned: I know how to "fix" this:

 diff -au fluidsynth-1.0.3/src/fluid_voice.c.ori  fluidsynth-1.0.3/src/fluid_voice.c.new
--- fluidsynth-1.0.3/src/fluid_voice.c.ori      2003-11-26 12:39:45.000000000 +0100
+++ fluidsynth-1.0.3/src/fluid_voice.c.new      2003-11-26 12:30:25.000000000 +0100
@@ -1359,6 +1359,7 @@
   case GEN_VOLENVHOLD:                 /* SF2.01 section 8.1.3 # 35 */
   case GEN_KEYTOVOLENVHOLD:            /* SF2.01 section 8.1.3 # 39 */
     count = calculate_hold_decay_buffers(voice, GEN_VOLENVHOLD, GEN_KEYTOVOLENVHOLD, 0); /* 0 means: hold */
+    if (count < 98) count = 19464;
     voice->volenv_data[FLUID_VOICE_ENVHOLD].count = count;
     voice->volenv_data[FLUID_VOICE_ENVHOLD].coeff = 1.0f;
     voice->volenv_data[FLUID_VOICE_ENVHOLD].incr = 0.0f;
@@ -1370,6 +1371,7 @@
   case GEN_VOLENVSUSTAIN:             /* SF2.01 section 8.1.3 # 37 */
   case GEN_KEYTOVOLENVDECAY:          /* SF2.01 section 8.1.3 # 40 */
     count = calculate_hold_decay_buffers(voice, GEN_VOLENVDECAY, GEN_KEYTOVOLENVDECAY, 1); /* 1 for decay */
+    if (count < 2000) count = 19464;
     voice->volenv_data[FLUID_VOICE_ENVDECAY].count = count;
     voice->volenv_data[FLUID_VOICE_ENVDECAY].coeff = 1.0f;
     voice->volenv_data[FLUID_VOICE_ENVDECAY].incr = count ? -1.0f / count : 0.0f;


But - as further mentioned - this is barbarism. Somebody with SF2 knowledge should clarify what's wrong!
-- 
J.Anders, Chemnitz, GERMANY (ja at informatik.tu-chemnitz.de)



More information about the Linux-audio-user mailing list