Bluetooth LE MIDI
This is for MIDI over Bluetooth. There's also a module for Wired MIDI.
Bluetooth Espruino devices like Puck.js can be programmed to appear as any type of Bluetooth LE device, and this includes a Bluetooth LE MIDI controller.
Joe Bowbeer and George Mandis did the original work on this. However it's now been converted into the ble_midi (About Modules) module to make it easier to use.
You can simply use the module as follows:
var midi = require("ble_midi");
midi.init();
setWatch(function() {
// When a button is pressed...
digitalPulse(LED,1,10);
// midi.send(channel, controller, value);
midi.send(0, 60, 100);
}, BTN, { repeat:true, edge:"rising", debounce:10 });
Then when you next connect to your Puck.js device it will be treated
as a MIDI instrument. When you press the button, a MIDI command will be sent
using the send function.
You can then even use the Web MIDI APIs to receive the MIDI data inside a web page!
Note: Because of the way advertising data is modified to allow the long
BLE UUID to be transmitted, this will change the name of the Puck.js device to PuckCC.
Note: You may require a Mac for this work automatically.
midi.send sends a 'control change' command. Often you'll want
to send a midi.noteOn(0,note,velocity) or midi.noteOff(0,note,0)
command instead.
Receiving MIDI
When notes are sent to the midi device, the raw MIDI message is output
in midi event which you can handle with midi.on('midi', ...).
The example below echoes received MIDI events back one 5th higher, as well as lighting LED3 if the note sent has any velocity value.
var midi = require("ble_midi");
midi.init();
midi.on('midi', function(data) {
var cmd = data[2] & 0xF0; // command
var chn = data[2] & 0x0F; // channel
switch(cmd) {
case 0x80: // noteOff
case 0x90: // noteOn
var num = data[3]; // note number
var val = data[4]; // note velocity
if (val) LED3.set(); else LED3.reset();
midi.cmd(cmd+chn, num+7, val);
break;
}
});
Reference
Channels sent to these functions are zero-based, so channel
0 in a function call actually represents channel 1.
// Turns the device into a MIDI controller
exports.init = function () { ... }
// Sends a raw MIDI command
exports.cmd = function (cmd, d1, d2) { ... }
// Send a 'control change' (0xB0) MIDI command
exports.send = function (channel, controller, value) { ... }
// Send a 'note on' (0x90) MIDI command
exports.noteOn = function (channel, note, velocity) { ... }
// Send a 'note off' (0x80) MIDI command
exports.noteOff = function (channel, note, velocity) { ... }
This page is auto-generated from GitHub. If you see any mistakes or have suggestions, please let us know.