W3C home > Mailing lists > Public > public-audio@w3.org > April to June 2012

Re: Timing limitations when programming MIDI with Javascript

From: Chris Wilson <cwilso@google.com>
Date: Mon, 4 Jun 2012 14:22:34 -0700
Message-ID: <CAJK2wqUb-b+wzjKzcgTgoc9q1BzqUZCe9vEK-oAQ3R1asEVWug@mail.gmail.com>
To: Jussi Kalliokoski <jussi.kalliokoski@gmail.com>
Cc: James Ingram <j.ingram@netcologne.de>, public-audio@w3.org
On Mon, Jun 4, 2012 at 1:57 PM, Jussi Kalliokoski <
jussi.kalliokoski@gmail.com> wrote:

> On Mon, Jun 4, 2012 at 11:25 PM, Chris Wilson <cwilso@google.com> wrote:
>
>> On Mon, Jun 4, 2012 at 12:50 PM, Jussi Kalliokoski <
>> jussi.kalliokoski@gmail.com> wrote:
>>
>>> On Mon, Jun 4, 2012 at 10:35 PM, Chris Wilson <cwilso@google.com> wrote:
>>>
>>>> On Mon, Jun 4, 2012 at 12:20 PM, Jussi Kalliokoski <
>>>> jussi.kalliokoski@gmail.com> wrote:
>>>>
>>>>> On Mon, Jun 4, 2012 at 9:14 PM, Chris Wilson <cwilso@google.com>wrote:
>>>>>
>>>>>> boolean  createMIDIMessage (short status, short channel, short?
>>>>>> data1, short? data2);
>>>>>
>>>>>
>>>>> I agree, the createMIDIMessage is awkward for most use cases right
>>>>> now, but it was designed to address all the use cases. I originally had an
>>>>> overload similar to this in mind, I just haven't added it yet because I'm
>>>>> not completely sure what the form should be (as in what arguments it would
>>>>> take). This looks like a pretty clean form, but I would add the optional
>>>>> timestamp as a last argument.
>>>>>
>>>>
>>>> I would leave timestamps to the createMM path - because not all short
>>>> MIDI messages have three bytes.  For example, program change, channel
>>>> aftertouch...  I'd expected that if the parameters were null, they would
>>>> not be sent.  In order to add timestamp and have it be uniformly usable, it
>>>> would have to go at the front of the data bytes - and then, of course, you
>>>> would have to specify it every time you wanted to send a note on/off
>>>> message.
>>>>
>>>> Of course, not all messages have a channel either - so that should be
>>>> optional - but some of the messages don't have a channel, but do need
>>>> additional bytes (e.g. song select - actually, it's only song
>>>> select/position pointer/MIDI Time Code and sysex that do this).  I think
>>>> that would look okay.
>>>>
>>>> And GAH, I copied/pasted too aggressively.  I meant to say (presuming
>>>> we define some constants):
>>>>
>>>
>>> Hmm, for consistency, instead of constants we could just use a
>>> dictionary (simpler too):
>>>
>>> MIDIAccess.createMIDIMessage("noteon", notenumber, velocity);
>>> MIDIAccess.createMIDIMessage("start");
>>>
>>
>> Simpler, but I'm not sure that's as efficient, and we use constants in
>> Web Audio and elsewhere - and I still have a feeling authors are going to
>> want to know the actual status codes.  Maybe I'm mistaken.
>>
>
> Yes, Web Audio API uses constants but I don't recall seeing much of them
> elsewhere in the web APIs, canvas.getContext() uses a dictionary (although
> in that case I think it wasn't a good idea, it's hard to feature test, but
> doesn't affect this case), as well as document.createElement(),
> getUserMedia() and so forth.
>

Right, but the MIDI API actually does translate to numbers in the actual
transport; there's an actual reason

>
> What are you referring to with efficiency? The speed of converting the
> string to the number value? About the same as the overhead of the scope
> lookup, object property solving and integer conversion for having it as a
> property of some constant-hoisting interface.
>

True.  But the developer can also use well-known MIDI constants (e.g. 0x90
for note on).


>  boolean  sendShortMIDIMessage (short status, short channel?, short?
>>>> data1, short? data2);
>>>>
>>>
>>> What about we make the MIDIMessage properties writable, and then we
>>> could just have a short form overload of createMIDIMessage:
>>>
>>> MIDIMessage createMIDIMessage (short status, short? data0, short? data1,
>>> ..., short? dataX);
>>>
>>> And you could tinker the values you want to change if you need to change
>>> them.
>>>
>>
>> So you mean you'd actually do
>> out.sendMIDIMessage( out.createMIDIMessage( out.NOTEON, channel,
>> notenumber, velocity ) );
>>
>> Eh.  I still think the transient MIDIMessage object is unnecessary, and
>> the single short send call is worth having.
>>
>
> I kind of disagree, because we either need a lot of different short calls
> (ones that include timestamps, ones that don't, ones that have channels,
> ones that don't) or horrible overloads no-one remembers. I'd go for letting
> the cows pave the path again and see if some short form single-shot send
> call takes prevalence and maybe standardize that later.
>

I was suggesting one long-form, that followed the create/send pattern, and
one short-form as above (boolean  sendShortMIDIMessage (short status, short
channel?, short? data1, short? data2);)  I think in this case the overloads
are natural, the channel is only there when it's needed except for the
transport controls, and I wouldn't put timestamps in the short form at all.
 I think the case of "send this MIDI short message immediately" is a very
common one;  I can of course just write a shim for it, though.

-C
Received on Monday, 4 June 2012 21:23:07 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 4 June 2012 21:23:08 GMT