From e631c0ece704d5d30e5d4e2be35dcfcdb9cb288e Mon Sep 17 00:00:00 2001 From: Toshiya Nakakura Date: Sat, 22 Nov 2014 11:23:08 +0900 Subject: [PATCH] add midi/midi.d.ts --- midi/midi-tests.ts | 69 ++++++++++++++++++++++++ midi/midi.d.ts | 131 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 midi/midi-tests.ts create mode 100644 midi/midi.d.ts diff --git a/midi/midi-tests.ts b/midi/midi-tests.ts new file mode 100644 index 0000000000..cf8566f7fb --- /dev/null +++ b/midi/midi-tests.ts @@ -0,0 +1,69 @@ +/// +/// + +if (navigator.requestMIDIAccess !== undefined) { + navigator.requestMIDIAccess().then(onSuccessCallback, onErrorCallback); +} + +var onSuccessCallback = (item: Midi.MIDIAccess)=>{ + this._midiPort = item; + + item.onconnect = (event: Midi.MIDIConnectionEvent)=>{ + console.log("onconnect"); + console.log(event); + }; + + item.ondisconnect = (event: Midi.MIDIConnectionEvent)=>{ + console.log("ondisconnect"); + console.log(event); + }; + + console.log("sysexenabled"); + console.log(item.sysexEnabled); + + /* + console.log(item.inputs.get("701435409")); + console.log(item.inputs.has("701435409")); + console.log(item.inputs.keys()); + console.log(item.inputs.keys().next()); + console.log(item.inputs.values()); + var inputs = this._midiPort.inputs.values(); + console.log(this._midiPort.inputs.entries().next()); + console.log(this._midiPort.inputs.entries().next().done); + */ + + var inputs = this._midiPort.inputs.values(); + + /* + console.log(item.outputs.get("384570428")); + console.log(item.outputs.has("384570428")); + console.log(item.outputs.keys()); + console.log(item.outputs.keys().next()); + console.log(item.outputs.values()); + console.log(this._midiPort.outputs.entries().next()); + console.log(this._midiPort.outputs.entries().next().done); + */ + + for(var o = inputs.next(); !o.done; o = inputs.next()){ + this._inputs.push(o.value); + console.log(o.value); + } + + var outputs = item.outputs.values(); + for(var op = outputs.next(); !op.done; op = outputs.next()){ + this._outputs.push(op.value); + op.value.send([ 0x90, 0x45, 0x7f ] ); + } + + for(var cnt = 0; cnt < this._inputs.length; cnt++){ + this._inputs[cnt].onmidimessage = (event: Midi.MIDIMessageEvent)=>{ + this.onMidiMessage(event.data); + }; + } +}; + +var onErrorCallback = (access: Error)=>{ }; + +var onMidiMessage = (event: Uint8Array)=>{ + console.log(event); +}; \ No newline at end of file diff --git a/midi/midi.d.ts b/midi/midi.d.ts new file mode 100644 index 0000000000..59250c3e4a --- /dev/null +++ b/midi/midi.d.ts @@ -0,0 +1,131 @@ +// Type definitions for Web MIDI API +// Project: http://www.w3.org/TR/webmidi/ +// Definitions by: Toshiya Nakakura +// Definitions: https://github.com/borisyankov/DefinitelyTyped + +/// + +interface Navigator { + /** + * When invoked, returns a Promise object representing a request for access to MIDI devices on the user's system. + * @param options settings that may be provided to the requestMIDIAccess request. + */ + requestMIDIAccess (options?: Midi.MidiOptions): Promise; +} + +declare module Midi{ + /** + * optional settings that may be provided to the requestMIDIAccess request. + */ + export interface MidiOptions{ + sysex: boolean; + } + + export interface IteratorItem{ + value: S; + done: boolean; + } + + export interface Iterator{ + next(): IteratorItem; + } + + interface Tuple2 { + fst: A + snd: B + } + + /** + * This type is used to represent all the currently available MIDI input ports as a MapClass-like interface + */ + export interface MIDIInputMap{ + size: number; + keys: ()=>Iterator; + entries: ()=>Iterator>; + values(): Iterator; + get(key: string): MIDIInput; + has(key: string): boolean; + } + + /** + * This type is used to represent all the currently available MIDI output ports as a MapClass-like interface. + */ + export interface MIDIOutputMap{ + size: number; + keys: ()=>Iterator; + entries: ()=>Iterator>; + values(): Iterator; + get(key: string): MIDIOutput; + has(key: string): boolean; + } + + /** + * This interface provides the methods to list MIDI input and output devices, and obtain access to an individual device. + */ + export interface MIDIAccess extends EventTarget{ + inputs: MIDIInputMap; + outputs: MIDIOutputMap; + onconnect: (event: MIDIConnectionEvent)=>void; + ondisconnect: (event: MIDIConnectionEvent)=>void; + sysexEnabled: boolean; + } + + /** + * This interface represents a MIDI input or output port. + */ + export enum MIDIPortType{ + input, + output + } + + /** + * This interface represents a MIDI input or output port. + */ + export interface MIDIPort extends EventTarget { + id: string; + manufacture?: string; + name?: string; + type: MIDIPortType; + version?: string; + ondisconnect: Function; + } + + /** + * Interface for midi inputs + */ + export interface MIDIInput{ + onmidimessage: (event: MIDIMessageEvent)=>void; + } + + /** + * Interface for midi outputs + */ + export interface MIDIOutput{ + send(data: Array, timestamp?: number): void; + } + + /** + * An event object implementing this interface is passed to a MIDIInput's onmidimessage handler when MIDI messages are received. + */ + export interface MIDIMessageEvent extends Event{ + receivedTime: number; + data: Uint8Array; + } + + export interface MIDIMessageEventInit{ + receivedTime: number; + data: Uint8Array; + } + + /** + * An event object implementing this interface is passed to a MIDIAccess' ondisconnect handler + */ + export interface MIDIConnectionEvent extends Event{ + port: MIDIPort; + } + + export interface MIDIConnectionEventInit{ + port: MIDIPort; + } +} +