On Fri, 5 Sep 2003, Julien Claassen wrote:
First of all: Thank you for giving me a pointer into the fluidsynth program.
    I just looked it up again. You go into your
directory src, then you edit the
 file: fluid_voice.c.
   There you go to line 1372 (for version 1.0.3) and there you'll find:
     count = calculate_hold_decay_buffers(voice, GEN_VOLENVDECAY,
 GEN_KEYTOVOLENVDECAY, 1); /* 1 for decay */
   After this line you can directly insert something like:
   if (count <98) count = 98; 
This didn't help but I changend in line 1362 after:
  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 = 1771;
                            ^^^^^
Now the strings hold the tone but there is a small problem in release.
 I assume I could fix this similary. But more interesting is: I printed out the
"count" values at
        GEN_VOLENVHOLD
        GEN_VOLENVDECAY (GEN_VOLENVSUSTAIN, GEN_KEYTOVOLENVDECAY)
        GEN_MODENVRELEASE
If I play the strings (program number 48 in GM scale) the values are:
        GEN_MODENVRELEASE: 1191
        GEN_VOLENVHOLD: 1771
        GEN_VOLENVDECAY: 1771
If I do the same wit choir A  (program number 52 in GM scale) the values are:
        GEN_MODENVRELEASE: 728
        GEN_VOLENVHOLD: 792
        GEN_VOLENVDECAY: 19464
The difference is surprising because the strings and the choirA have certainly a
similar envelope.
Therefore I changed again at:
        case GEN_VOLENVHOLD:                 /* SF2.01 section 8.1.3 # 35 */
        case GEN_KEYTOVOLENVHOLD:
                count = calculate_hold_decay_buffers(voice, GEN_VOLENVHOLD,
GEN_KEYTOVOLENVHOLD, 0); /* 0 means: hold */
                if (count < 98) count = 19464;
                                        ^^^^^
and at:
        case GEN_VOLENVDECAY:               /* SF2.01 section 8.1.3 # 36 */
        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;
                            ^^^^          ^^^^^
... and the strings are still too quietly but if I increase the volume of the single
NOTE_ON commands the strings
sound (almost) like on hardware wavetable synthesizer (with small distortions).
Because of the great differences (1771 << 19464)  I assume still a SF2
interpretation error.
Feel free to give me instructions about what else shall I test.
--
J.Anders, Chemnitz, GERMANY (ja(a)informatik.tu-chemnitz.de)