[gmpi] Re: Parameters / controls / GMPI event system - refreshment

  • From: thockin@xxxxxxxxxx
  • To: gmpi@xxxxxxxxxxxxx
  • Date: Thu, 1 Dec 2005 09:09:36 -0800

On Fri, Dec 02, 2005 at 02:16:36AM +1300, Jeff McClintock wrote:
> >You should be able to use a new VVID for every note the user
> >sequences.  With 2^32 or 2^31 VVIDs per channel, you should never have to
> >wrap in a sequence.  That doesn't exuse us from solving the wrap problem,
> >though.
> 
> Take for example Beethoven's Fifth, approx 64,000 notes.

A good argumnent for 2^32 or 2^31 VVIDs rather than 2^16 :)

> Your scheme sends 64,000 different VVIDs to the synth.

Over time.  All 64000 are not actively being used simultaneously.

>   The synth attempts to track as many VVIDs as possible but 'drops' 
> (loses track of) an unspecified number.
>   The host is unsure exactly how many VVIDs are being tracked accurately.
>   The synth requires storage for parameters on several thousand VVIDs?.

No, only the ones that are active.  See below.

> My scheme allocates one VVID per key.  Maximum 88 total for the entire 
> performance.  The synth perfectly retains the state of all controllers 
> on all VVIDs though to the score end.  No information is dropped.

That means that I can not have an 89th active and event-enabled voice?

> But what about more demanding material?
> Even a micro-tuned performance on a simulated 900 key keyboard has 
> better playback under my simpler system, because the Synth has less 
> total VVIDs to keep track of.

You only need to track VVIDs that are actually playing.

Sticking with Beethoven's Fifth, and example.  Imagine a piano-like synth.
For a refresher, the first bar is:

- 1/8 rest
- 1/8 G
- 1/8 G
- 1/8 G
- 1/2 E

Here's how the host/synth can tango (please excuse the length of this, but
it shows more clearly what I mean):

 1) Host tells plugin:
        @time0: VVID(1) note-on
        @time0: VVID(1) pitch=G
        @time0: VVID(1) velocity=100

 2) Plugin allocates RealVoice(a) for VVID(1) and starts playing it.

 3) Host tells plugin:
        @time1: VVID(1) note-off

 4) Plugin puts RealVoice(a) into the release stage of the envelope.  It
    still has to recognize events for VVID(1) while the tail is playing.

 5) Host tells plugin:
        @time2: VVID(2) note-on
        @time2: VVID(2) pitch=G
        @time2: VVID(2) velocity=99

 6) Plugin allocates RealVoice(b) for VVID(2) and starts playing it.  Two
    RealVoices are now playing.  One VVID is ACTIVE, one VVID is in
    RELEASE.

 7) Host tells plugin:
        @time3: VVID(2) note-off

 8) Plugin puts RealVoice(b) into the release stage of the envelope.  It
    still has to recognize events for VVID(2) while the tail is playing.
    Two VVIDs are in RELEASE.

 9) Host tells plugin:
        @time4: VVID(3) note-on
        @time4: VVID(3) pitch=G
        @time4: VVID(3) velocity=90

10) Plugin allocates RealVoice(c) for VVID(3) and starts playing it.  At
    the same time, RealVoice(a) finishes it's tail.  Plugin deallocates
    RealVoice(a) and forgets VVID(1).  Two RealVoices are now playing.
    One VVID is ACTIVE, one VVID is in release.

11) Host tells plugin:
        @time5: VVID(3) note-off

12) Plugin puts RealVoice(c) into the release stage of the envelope.  It
    still has to recognize events for VVID(3) while the tail is playing.
    Two VVIDs are in RELEASE.

13) Host tells plugin:
        @time5: VVID(4) note-on
        @time5: VVID(4) pitch=E
        @time5: VVID(4) velocity=120

14) Plugin allocates RealVoice(a) for VVID(4) and starts playing it.  At
    the same time, RealVoice(b) finishes it's tail.  Plugin deallocates
    RealVoice(b) and forgets VVID(2).  Two RealVoices are now playing.
    One VVID is ACTIVE, one VVID is in release.

15) This is a longer note, so time passes..

16) At some point, RealVoice(c) finishes it's tail.  Plugin deallocates
    RealVoice(c) and forgets VVID(3).  One RealVoice is now playing. One
    VVID is ACTIVE.

17) Host tells plugin:
        @time6: VVID(4) note-off

18) Plugin puts RealVoice(a) into the release stage of the envelope.  It
    still has to recognize events for VVID(4) while the tail is playing.
    One VVID is in RELEASE.

19) Time passes.

20)  At some point, RealVoice(a) finishes it's tail.  Plugin deallocates
     RealVoice(a) and forgets VVID(4).  No RealVoices are playing, no
     VVIDs are alive.


In this example, you see that no VVID was ever re-used, but a RealVoice
was.  Multiple VVIDs were alive at the same time, but once the RealVoice
for a VVID goes away, that VVID can be forgotten.  During that process, if
the plugin received an event for a VVID that was not alive, it would have
simply dropped it.  Doesn't get much easier.

But it could!  The example assumed that each note had a tail and that the
tails could continue while the same not was triggered again.  The synth
could recognize that the same note was played twice and cut short the
first RealVoice.  In effect, there could be one RealVoice for each piano
key.  The beauty is that this is all internal to the sytnth.  The host
plays it the same way, with a very large VVID pool.

Is that clearer?

Tim

----------------------------------------------------------------------
Generalized Music Plugin Interface (GMPI) public discussion list
Participation in this list is contingent upon your abiding by the
following rules:  Please stay on topic.  You are responsible for your own
words.  Please respect your fellow subscribers.  Please do not
redistribute anyone else's words without their permission.

Archive: //www.freelists.org/archives/gmpi
Email gmpi-request@xxxxxxxxxxxxx w/ subject "unsubscribe" to unsubscribe

Other related posts: