const MIDI_UUID = '03b80e5a-ede8-4b33-a751-6ce34ec4c700'; const MIDI_CHARA_UUID = '7772e5db-3868-4112-a1a9-f2669d106bf3'; const SERVICE_UUID = MIDI_UUID; // connected device value var connectDevice = null; var connectService = null; var connectChar = null; var midioutport = document.getElementById("midiOutput"); // disconnect process function disconnect () { if (!connectDevice || !connectDevice.gatt.connected) return; connectDevice.gatt.disconnect(); } // connect process function connect () { navigator.bluetooth.requestDevice({ filters: [{ services: [MIDI_UUID] }] }) .then(device => { connectDevice = device; console.log('device', device); return device.gatt.connect(); }) .then(server => { console.log('server', server); server.getPrimaryService(SERVICE_UUID) .then(service => { connectService = service; // start service is here startMIDIService(service, MIDI_CHARA_UUID); // set interval timer }) }) .catch(error => { console.log(error); }) } // start service event function startMIDIService (service, charUUID) { service.getCharacteristic(charUUID) .then(characteristic => { console.log('char', characteristic); connectChar = characteristic; characteristic.startNotifications() .then(char => { messagelog.innerHTML = ""; midilog.innerHTML = ""; alert('Connected'); characteristic.addEventListener('characteristicvaluechanged', // event is here onMIDIEvent); }) }) .catch(error => { console.log(error); }) } function printString(str) { var messagelog = document.getElementById('messagelog'); messagelog.innerHTML += str + "\n"; messagelog.scrollTop = messagelog.scrollHeight; } function printReceivedMessage(data) { var str =""; for (var i = 0; i < data.buffer.byteLength; i++) { let val = data.getUint8(i); if (val < 0x10) { str += "0"; } str += val.toString(16) + " "; } printString(str); } function onMIDIEvent (event) { printReceivedMessage(event.target.value); printReceivedMessageMIDI(event.target.value); } function printStringMIDI(str) { var midilog = document.getElementById('midilog'); //midilog.innerHTML += str + "\n"; midilog.innerHTML += str; midilog.scrollTop = midilog.scrollHeight; } function printReceivedMessageMIDI(data) { if(data.buffer.byteLength == 3 && data.getUint8(2) == 254){ //active sensing return; } var str =""; var timestampHigh = "0" + data.getUint8(0).toString(16); var timestampLow = "0" + data.getUint8(1).toString(16); var timestamp = (timestampHigh.substr(-2,2) + ":" + timestampLow.substr(-2,2) + " ").toUpperCase(); printStringMIDI(timestamp); for (var i = 2; i < data.buffer.byteLength; i++) { let val = data.getUint8(i); var msgBuf =[]; var strBuf =""; switch (val){ } if(val> 0x80 && val < 0xF0){ val = val & 0xf0; } switch (val){ //2 Byte Channel Messages case 0x80: //NoteOff : case 0x90: //NoteOn : case 0xA0: //AfterTouchPoly : case 0xB0: //ControlChange : case 0xE0: //PitchBend : //case 0xF0: //sysex : msgBuf[0] = data.getUint8(i); msgBuf[1] = data.getUint8(i+1); msgBuf[2] = data.getUint8(i+2); midioutport.sendRawMessage([msgBuf[0], msgBuf[1], msgBuf[2]]); i += 3; printBuf(msgBuf); break; //1 Byte Channel Messages case 0xC0: //ProgramChange : case 0xD0: //AfterTouchChannel : msgBuf[0] = data.getUint8(i); msgBuf[1] = data.getUint8(i+1); midioutport.sendRawMessage([msgBuf[0], msgBuf[1]]); i += 2; printBuf(msgBuf); break; case 0xF6: //tune request // System realtime message case 0xF8: //MIDI Clock //case 0xF9: // -- case 0xFA: //Start case 0xFB: //Continue case 0xFC: //Stop //case 0xFD: // -- case 0xFE: //active sencing msgBuf[0] = data.getUint8(i); midioutport.sendRawMessage([msgBuf[0]]); i += 1; break; default: break; } str += val.toString(16) + " "; } //printStringMIDI(str + "\n"); printStringMIDI("\n"); } function printBuf(data){ var strBuf = ""; for (var i = 0; i < data.length; i++) { let val = data[i]; if (val < 0x10) { strBuf += "0"; } strBuf += val.toString(16).toUpperCase() + " "; } printStringMIDI("[" + strBuf.trim() + "] "); } function panic () { console.log("panic"); // check whether midi out is set or not for(var i=0; i < 16; i++){ // midioutport.sendRawMessage([0xB0 + i, 0x79, 0]); //reset all controlers midioutport.sendRawMessage([0xB0 + i, 0x7b, 0]); //allnoteoff midioutport.sendRawMessage([0xB0 + i, 0x78, 0]); //allsoundoff } }