[linux-audio-user] fluidsynth: Sustain bug ?

Joerg Anders j.anders at informatik.tu-chemnitz.de
Fri Sep 5 12:10:01 EDT 2003


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 at informatik.tu-chemnitz.de)



More information about the Linux-audio-user mailing list