12月5日にもレビューしましたが、アップデートされていますので再度レビューします。
仕様はここを参照しています。(hogeは前回のレビューからの変更点です。漏れがあったらごめんなさい><)
最初に全体的な構成です。
(i)がinterface、(m)がmethodを示しています。また「->」の意味ですが、例えば「A -> return B」だとすると「Aを実行すると戻り値としてBがくる」という意味で使っています。
(i)Navigator
(m)requestMIDIAccess -> return void;
(i)MIDIAccess
(m)getInputs -> return sequence<(i)MIDIPort>
(m)getOutputs -> return sequence<(i)MIDIPort>
(m)getInput -> return (i)MIDIInput
(m)getOutput -> return (i)MIDIOutput
(i)MIDIPort
(i)MIDIInput
(i)MIDIOutput
(m)send -> return void
(i)MIDIEvent
次に(i)のついているinterfaceを説明します。
Navigator
interface Navigator {
void requestMIDIAccess(successCallback, optional errorCallback)
}
MIDIAccess
(UserAgentに接続されているMIDI機器のリストアップ、またアクセスを可能にします)
interface MIDIAccess {
sequence<MIDIPort> getInputs();
sequence<MIDIPort> getOutputs();
MIDIInput getInput(MIDIPort or DOMString or short target);
MIDIOutput getOutput(MIDIPort or DOMString or short target);
}
MIDIPort
(MIDIのInput/Outputポートで、名前、製造会社、MIDIポートのタイプ(input/output)、ユニークIDを提供します)
interface MIDIPort {
DOMString id;
DOMString? manufacturer;
DOMString? name;
MIDIPortType type; // input or output
DOMString? version;
}
MIDIInput
(onmessageはMIDIメッセージを取得した時のEventHandlerを定義します)
interface MIDIInput : MIDIPort {
attribute EventHandler onmessage;
}
MIDIOutput
(MIDIPortに組み込まれていて、またMIDIメッセージをOutputポートへ送信するメソッドを提供します)
interface MIDIOutput {
void send(sequence<octet> data, optional double timestamp);
}
(※octetとはココで定義されている通りで「[0, 255]の値をとる符号なしInteger」です)
(※SysExのような長いMIDIデータを効率的に渡す手段としてUint8Arrayも使用可能です)
MIDIEvent
MIDIInputのonmessage handlerに渡されたEventオブジェクトで、
MIDI data byteに加えてtimestampも含まれています。
interface MIDIEvent: Event {
attribute double receivedTime;
attribute Uint8Array data;
}
(※Uint8ArrayのdataにはMIDIメッセージが1つずつ入ってきます)
最後に(m)のついているmethodの説明です。
requestMIDIAccess(successCallback, optional errorCallback)
(ユーザーシステムにあるMIDI機器のリスト、アクセスを取得します)
successCallback: MIDI機器が取得できた場合のCallback
errorCallback: なんらかの理由でMIDI機器を取得できなった場合のCallback
getInputs()
引数なし
利用可能なMIDI input port[(i)MIDIInput]のリストを配列で返す
getOutputs()
引数なし
利用可能なMIDI output port[(i)MIDIOutput]のリストを配列で返す
getInput(target)
target: (i)MIDIPort、または、(i)MIDIPortのid[DOMString]、
または、 getInputs()で取得したindex[short]
getOutput(target)
target: (i)MIDIPort、または、(i)MIDIPortのid[DOMString]、
または、getOutputs()で取得したindex[short]
send(sequence<octet> data, optional double timestamp)
data: sequence<octet>
timestamp: double
といった仕様になっています。
前回のレビューとの差分をリストアップすると以下の通りです。
Method名の変更
- getMIDIAccess() → requestMIDIAccess()
- enumerate{Inputs, Outputs}() → get{Inputs, Outputs}()
Attribute名の変更
- (i)MIDIPort: fingerprint → Id
型の変更
- data(@(i)MIDIOutput)): Uint8Array → sequence
- timestamp: DOMHighResTimeStamp → double (millisec order)
- onmessage(@(i)MIDIInput): callback → EventHandler
以下のようなOpen Issueもありますので、今後も仕様の更新は続くはずです。