class MidiOut {
  constructor(midiOutNamePort){
		MidiOut.namePort = midiOutNamePort;

    if (navigator.requestMIDIAccess)
      navigator.requestMIDIAccess().then(this.success, this.failure);
  }

  get outputMIDI() {
    return this.moutputMIDI;
  }

  set outputMIDI(value){
    this.moutputMIDI = value;
  }

  success(midi) {
    MidiOut.allmidi = midi;

  	for (var out of MidiOut.allmidi.outputs.values()) {
			if (out.name == MidiOut.namePort) {
    		MidiOut.moutputMIDI = out;
    		break;
			} else {
				throw `"${MidiOut.namePort}" not a MIDI output.`;
			}
  	}
  }

  sendNotes(notesObject) {
    if (MidiOut.moutputMIDI != undefined) {
      Object.keys(notesObject.notes).forEach(function(k) {
        MidiOut.moutputMIDI.send([0x90, notesObject.notes[k], notesObject.vel]);
      });

      Object.keys(notesObject.notes).forEach(function(k) {
        MidiOut.moutputMIDI.send([0x80, notesObject.notes[k], 0x00],performance.now()+notesObject.dur);
      });
    }
  }

  failure() {
    throw 'No MIDI found';
  }

  onMIDIMessage (message) {
    console.log('onMIDIMessage ', message.data);
  }
}