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