Antoine, I was hoping you are listening :)

It is not quite clear to me why you need the system timer for scheduling those 
patterns, could you pls. elaborate? I would assume that you add a 
FLUID_SEQ_TIMER event to the synth and once you get the callback via 
fluid_event_callback_t you are provided with a timestamp by the sequencer. The 
timestamp currently comes from fluid_sequencer_get_tick(). Why does it matter 
that you need fluid_curtime() rather than currentMs which is provided by the 
synth?

seq->useSystemTimer ? (int) fluid_curtime() : 
fluid_atomic_int_get(&seq->currentMs);


> then we open ourselves up to bug reports where people ask: why does this 
> (broken) MIDI file sound different in Fluidsynth than in almost all other 
> MIDI players?

Not quite, because for now this change would be limited to the sequencer only, 
the fluid_player will be unchanged. The sequencer is a fluidsynth specific 
component, so I do believe that we have the freedom to tweak things here and 
there. So far I can't see any drawbacks of the event ordering I've proposed. 
And if we ever decide to make the fluid_player use the sequencer, we can just 
assign an alternative ordering function internally, that restores the FIFO 
ordering.


> Why would we need a deprecation period? Are you intending to change the 
> behaviour or API of the sequencer?

I don't think an API change will be necessary. The deprecation just came to my 
mind because of the possible transition from C to C++.


> it surely can also be improved using an optimization of the current C 
> implementation

The problem seems to be the heavy usage of linked lists. Lists have a poor 
cache performance. One would need to rewrite it using a contiguous container...


> Couldn't we simply implement that kind of heap/queue in C?

... we could. But I'm not a friend of adding yet another custom heap/queue 
implementation to the code base, when we can simply use one from a library.


[For the record, I'm appending Marcus' last mail below, which he mistakenly 
only sent to me]

Tom


10. Dezember 2019, 18:26:35 CET:
> Hi again,
> 
> Am Di., 10. Dez. 2019 um 11:03 Uhr schrieb Tom M. <tom.m...@googlemail.com>:
> 
> > > Why is "Note-On last" the better order? How do you know that that
> > > special (and seemingly Fluidsynth specific) ordering is what the author of
> > > the MIDI file wanted?
> >
> > When something happens at the same tick, I don't claim to know anything.
> > My proposed solution is simply the best guess I can come up with in such a
> > situation. Two examples:
> >
> > a) NoteOn and ProgChange happen in that order at the same tick. Would it
> > make sense to turn on the note using the old instrument, although we are
> > just about to receive a new program at the same tick? I don't think so. The
> > NoteOn, although first in the stream, should use the new program.
> >
> > b) NoteOn at tick 0, after e.g. 100 ticks: NoteOn and NoteOff. All three
> > note events happen in the given order on the same channel and trigger the
> > same key. How would fluidsynth interpret them currently? The first note is
> > triggered, it sounds for a while until the second NoteOn arrives. That
> > second NoteOn kills overlapping notes, i.e. it kills the first note. But
> > oops, just after that second note was turned on, it will be turned off
> > right again, because we have a NoteOff at the same tick, which apparently
> > was meant to turn off the first note though.
> >
> > For case b) I have MIDI files that do such things. Ofc you are right
> > Marcus, technically the MIDI converter program is to blame. I cannot really
> > change the converter though. I would alternatively need to handle those
> > cases in my program. I was just thinking of a possibly acceptable way for
> > fluidsynth to handle such "corner-cases".
> >
> 
> I understand where you are coming from and I share your pain. But the ugly
> truth is: MIDI events on the same tick don't have a defined order in the
> spec. The only real extra information that we have that might carry some
> extra information about the intention of the author of the file is the
> order of events in the stream. All other orderings are completely
> artificial and by definition non-standard. And as you mention that almost
> all MIDI players use the stream order in these cases, that comes close to a
> agreed solution by the community in my opinion. And we would have to have a
> real good reason not to go along with the established standard.
> 
> If we implement our own ordering, then we open ourselves up to bug reports
> where people ask: why does this (broken) MIDI file sound different in
> Fluidsynth than in almost all other MIDI players? And responding with
> "because it's broken" doesn't really work, because it works in almost all
> other players.
> 
> 
> > > > 3. Simpler implementation?
> > > What trips me up though: if your program was really stuck in that loop
> > > for seconds, I'm wondering how many events you were actually adding to the
> > > sequencer... Millions?
> >
> > I'm takling about ten-thousands of events. Here are some measurements:
> >
> 
> Wow, that's quite a difference, thanks for the info!
> 
> 
> > > > 5. The system timer
> > > isn't there a global timing event that MIDI devices can send to each
> > > other to synchronise playback position and playback speed?
> >
> > You seem to refer to "System Real Time Messages". But I don't know how
> > this could be integrated into fluidsynth.
> >
> 
> On second thought, this is probably out of scope for Fluidsynth. And to be
> honest, I don't really understand why we have two timing sources.
> 
> 
> > > adding another implementation in C++ is not cleanup IMO... it adds more
> > > technological debt because we now have to keep two different
> > > implementations in sync.
> >
> > Having two implementations would be temporarily. First add an
> > "experimental" C++ impl., then deprecate the current C implementation while
> > using the C++ impl. by default and finally remove the deprecated.
> >
> 
> Why would we need a deprecation period? Are you intending to change the
> behaviour or API of the sequencer?
> 
> > > But I do wonder: what can C++ do that C can't? And especially: why can
> > > C++ do it faster?
> >
> > Simply that I'm more familiar how to do those things in C++ rather than
> > with glib. And I'm not sure what Carlo, you, and the other embedded system
> > guys said, if we fortify the glib dependency. I'm not sure how they think
> > about a dependency to the C++ std lib either...
> >
> 
> I'm not worried about glib, but Carlo probably has quite a different
> opinion :-)
> 
> If what I found online is correct, then std::priority_queue uses a max-heap
> structure to store the data, hence its speed. Couldn't we simply implement
> that kind of heap/queue in C? I'm sure there is tried and tested code
> around that we could simply adopt.
> 
> Cheers,
> Marcus
> 
_______________________________________________
fluid-dev mailing list
fluid-dev@nongnu.org
https://lists.nongnu.org/mailman/listinfo/fluid-dev

Reply via email to