Re: [linux-audio-user] Recommendatio wanted

New Message Reply About this list Date view Thread view Subject view Author view Other groups

Subject: Re: [linux-audio-user] Recommendatio wanted
From: Joerg Anders (j.anders_AT_informatik.tu-chemnitz.de)
Date: Fri Nov 28 2003 - 13:50:01 EET


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)


New Message Reply About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b28 : Fri Nov 28 2003 - 13:50:19 EET