[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [fluid-dev] invalid instrument/drum selection problem
From: |
jimmy |
Subject: |
Re: [fluid-dev] invalid instrument/drum selection problem |
Date: |
Mon, 26 Jan 2009 10:41:23 -0800 (PST) |
Hi Josh,
Oops, my bad on the source code path mentioned in the last email. For this
particlular song
www.sternton.com/midi/xgmidi/orion_xg.mid
the problem includes invocation of fluid_synth_program_change() for unavailable
or invalid "prognum" on channels 2, 3, 4 (counting from 0) and maybe a few
other channels, too.
I now track it down to the function.
src/fluid_synty.c: fluid_synth_program_change()
at:
>>>>>
} else {
preset = fluid_synth_find_preset(synth, banknum, prognum);
}
sfont_id = preset? fluid_sfont_get_id(preset->sfont) : 0;
fluid_channel_set_sfontnum(channel, sfont_id);
fluid_channel_set_preset(channel, preset);
return FLUID_OK;
}
FLUID_LOG(FLUID_ERR, "Index out of range (chan=%d, prog=%d)", chan, prognum);
return FLUID_FAILED;
}
<<<<<
And I believe when the "preset" variable above is NULL, the channel got set to
a NULL-preset.
Jimmy
--- On Mon, 1/26/09, jimmy <address@hidden> wrote:
> From: jimmy <address@hidden>
> Subject: Re: [fluid-dev] invalid instrument/drum selection problem
> To: "Josh Green" <address@hidden>
> Cc: address@hidden
> Date: Monday, January 26, 2009, 7:05 AM
> Hi Josh,
>
> I am replying to an old message so you can hunt down the
> original messages with the same email subject line if it may
> help refresh your memory. This time, similar problem,
> different midi song.
>
> Let me refresh your memory of the scenario. The result was
> that even if an invalid bank_num, or prog_num was selected,
> fluidsynth keeps the existing instrument already in that
> channel. Previously, fluidsynth assigned invalid bank_num,
> or prog_num to the channel anyway which causes the channel
> to point to non-existing instrument so the whole channel was
> muted. From what I understand, hardware soundcards would
> keep existing instruments and won't allow invalid
> selection of bank_num, or prog_num to mute the channel, it
> just keep playing the already loaded instrument.
>
> I think the ticket number was:
>
> http://fluidsynth.resonance.org/trac/ticket/8
>
> The midi files to test were:
>
> www.geocities.com/TheTropics/Cabana/4967/inicial.html
> www.geocities.com/TheTropics/Cabana/4967/Amor_Eterno.mid
> www.geocities.com/TheTropics/Cabana/4967/Ansiedad.mid
> www.geocities.com/TheTropics/Cabana/4967/allanera.mid
> www.geocities.com/TheTropics/Cabana/4967/Bailamos.mid
> www.geocities.com/TheTropics/Cabana/4967/bamboleo.mid
> www.geocities.com/TheTropics/Cabana/4967/besame.mid
> www.geocities.com/TheTropics/Cabana/4967/caballo.mid
>
>
> You did fix up fluidsynth using those midi files as test
> cases.
>
> Recently, I try listening to some at
> www.sternton.com/midi/xgmidi/ . I try to play this midi
> file:
>
> www.sternton.com/midi/xgmidi/orion_xg.mid
>
> For what it's worth, Debian timidity 2.13.2-20 plays it
> just fine, so does a SoundBlaster 5.1 Live! PCI card.
>
> However, I try with both Debian fluidsynth 1.0.8-1.1, and
> fluidsynth.svn.20090108. What I seem to get is that the
> drum channel still plays drum just fine, but a few channels
> seem to load up invalid instrument, and causes the channel
> to turn mute.
>
> So far, I tracked it down to the following code in
> src/fluid_synth.c:
>
> >>>
>
> int fluid_synth_program_select( . . .)
>
> . . .
>
> preset = fluid_synth_get_preset(synth, sfont_id,
> bank_num, preset_num);
> if (preset == NULL) {
> FLUID_LOG(FLUID_ERR,
> "There is no preset with bank number %d and
> preset number %d in SoundFont %d",
> bank_num, preset_num, sfont_id);
> return FLUID_FAILED;
> }
>
> <<<
>
> I believe the "preset" variable should have been
> set to NULL because the bank_num is not available for the
> loaded soundfonts, but fluid_synth_get_preset() returns a
> non-NULL value. So the "preset" would be used a
> few statements below that to select the invalid instrument.
>
> Can you take a look when you have a chance? This is low
> priority, casual listening for me. Let me know if you can
> reproduce the problem, or if I could be of any further help.
> Thanks,
>
> Jimmy
>
>
>
> --- On Wed, 1/9/08, jimmy <address@hidden> wrote:
>
> > From: jimmy <address@hidden>
> > Subject: Re: [fluid-dev] invalid instrument/drum
> selection problem
> > To: "Josh Green" <address@hidden>
> > Cc: address@hidden
> > Date: Wednesday, January 9, 2008, 10:50 AM
> > --- Josh Green <address@hidden> wrote:
> >
> > > Hello Jimmy,
> > >
> > > On Mon, 2008-01-07 at 16:15 -0800, jimmy wrote:
> > > > For quick test, I use Kmid to play the MIDI
> > files,
> > > > connect to Qsynth/FluidSynth wiht QJackctl.
> I
> > > drag
> > > > the MIDI file to Kmid and it interrupts the
> > > existing
> > > > playing, starting to play the new file. So
> > > probably
> > > > Fluidsynth doesn't know much (or just
> > guessing)
> > > about
> > > > a new file being played.
> > > >
> > > > But how about using FluidSynth as a sound
> module
> > > for
> > > > praticing or live playing? If a
> > > song/accompaniment
> > > > ends, I may still want to have my preloaded
> > > > instruments exactly the way they are, so I
> can
> > > > continue on to the next song and not have to
> > > reselect
> > > > all the instruments again.
> > > >
> > >
> > > If MIDI files were played directly with
> FluidSynth,
> > > then it would have a
> > > concept of when a new one started and could reset
> > > accordingly. In the
> > > case where the MIDI sequencer of FluidSynth
> isn't
> > > being used, then it
> > > could still listen for SYSEX messages requesting
> GM,
> > > GS or other modes.
> > > Not all MIDI files have them, but I have seen
> quite
> > > a few of them that
> > > do.
> >
> > OK, right now I don't often play a midi file by
> > fluidsynth directly. I do use Kmid, PyKaraoke, or
> > even some Timidity GUI as Jack client to FluidSynth.
> > Have a separate FluidSynth instance for praticing my
> > keyboarding. Recently found Stygmorgan as a software
> > arranger (for accompaniment). I don't know how
> well
> > each of those apps filter out, or reset in between
> > segments for the time being. If they are troublesome,
> > I may haev to track them down.
> >
> >
> > > > If I misunderstand the purpose of that flag,
> my
> > > bad.
> > > > Maybe we need a new/different
> variable/constant.
> > > >
> > >
> > > No you were right. The code was not correct. It
> > > shouldn't be used as a
> > > flag at all though, but instead as a constant
> value
> > > of 128. From what I
> > > can tell SoundFont isn't supposed to have any
> bank
> > > #s above 128.
> >
> > Good, I trust you to make the call on what to do
> > there. Though, it is a #define so any existing apps
> > that uses it may have to be recompiled.
> >
> >
> > > > I think the single midi file in my first
> post on
> > > this
> > > > list uses a program change on drum channel
> with
> > > bank
> > > > number less than 128 (I suppose GS
> instruments
> > can
> > > > accommodate drum channel offset of 128),
> > that's
> > > what
> > > > led me to think the flag value should be
> 128.
> > > > Especially where it is being used, to check
> for a
> > > > valid drum bank. I think I might have seen
> drum,
> > > or
> > > > special effect bank number 129 before.
> > That's why
> > > I
> > > > think it is an offset, not an absolute
> number
> > 128.
> > >
> > > > Thus the use of "|" or
> "+"
> > 128 in my code patch.
> > > >
> > >
> > > I would be really curious to see a SoundFont that
> > > has a bank # above 128
> > > and what software created it. The format itself
> can
> > > do it, but the
> > > standard says its not supposed to sound. If you
> see
> > > one, do let me
> > > know!
> >
> > I'll keep an eye out for that.
> >
> >
> > > > So even if GS spec says to use instrument [0
> 0],
> > > the
> > > > keyboard/sound module maps the drum channel
> to
> > the
> > > > equivalent of [128 0]. The [128 0] is the
> same
> > > thing
> > > > if used in other channels. That's how I
> > interpret
> > > the
> > > > GS or any other specs, because drum channel
> > should
> > > > never use a bank below 128 - unless there is
> no
> > > bank
> > > > 128, of course.
> > > >
> > >
> > > Agreed, in GM/GS mode FluidSynth should behave
> that
> > > way. I would like
> > > to keep it general purpose though too, so that if
> > > someone wants to do
> > > something else with Channel #10 than percussion,
> > > they can.
> >
> > Gerald just mentioned he used channel #10 for
> > non-drums and all 16 channels. I mentioned that there
> > could be more than 16 channels if he needs more
> > channels to use, but you are right to keep it general
> > purpose. For breaking existing MIDIs and apps are not
> > a good thing to do.
> >
> > I see you will get pretty busy now at the start of the
> > year with all these postings :-) Saw your other
> > posted messages, too. I think I'll let you work
> with
> > other issues on the list.
> >
> > Thanks for all the good work. Take care,
> >
> > Jimmy
> >
> >
> >
> >
> >
> ____________________________________________________________________________________
> > Be a better friend, newshound, and
> > know-it-all with Yahoo! Mobile. Try it now.
> >
> http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ