JSPM

midi-controller

0.3.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 10
  • Score
    100M100P100Q38465F
  • License MIT

Create buttons and note matrices from duplex midi streams for midi controllers such as Launchpad.

Package Exports

  • midi-controller

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (midi-controller) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

midi-controller

Create buttons and note matrices from duplex midi streams for midi controllers such as Launchpad.

Install

$ npm install midi-controller

Example

var MidiStream = require('midi-stream')
var MidiController = require('midi-controller')

var duplexStream = MidiStream('Launchpad')
var launchpad = MidiController(duplexStream)

// clear launchpad
duplexStream.write([176, 0, 0])

var colors = {
  green: 60,
  red: 13,
  amber: 63,
  amberLow: 29
}

var learnButton = launchpad.createButton([176, 104], function down(){
  this.turnOn(colors.green)
}, function up(){
  this.turnOff()
})

// after 10 seconds change the button's off color to amberLow
setTimeout(function(){
  learnButton.setOff(colors.amberLow)
}, 10000)

// flash the learn button red every second (with 100ms duration)
setInterval(function(){
  learnButton.flash(colors.red, 100)
}, 1000)


// map launchpad grid to chromatic midi notes (starting at 30)
var mapping = []
var offset = 30
for (var y=0;y<8;y++){
  for (var x=0;x<8;x++){
    var id = (y*16) + x
    mapping.push([
      [144, id],       // input midi message
      [144, offset++]  // output midi message
    ])
  }
}

var noteMatrix = launchpad.createNoteMatrix(mapping, colors.amber)
noteMatrix.on('data', function(midiNote){
  if (midiNote[2]){ // note on
    noteOn(midiNote[1])
  } else { // note off
    noteOff(midiNote[1])
  }
})

noteMatrix.pipe(noteMatrix) // echo the notes back to light up buttons

// screen synth
var onNotes = {}
function noteOn(note){
  onNotes[note] = setInterval(function(){
    console.log(note)
  }, 50)
}
function noteOff(note){
  if (onNotes[note]){
    clearInterval(onNotes[note])
    onNotes[note] = null
  }
}


// highlight pressed notes when mixer button held down
var selectionReleases = []
var selecting = false

noteMatrix.on('data', function(note){
  if (note[2] && selecting){
    var button = noteMatrix.getButton(note)
    var release = button.light(colors.red)
    selectionReleases.push(release)
  }
})

var mixerButton = launchpad.createButton([176, 111], function down(){
  selecting = true
}, function up(){
  selectionReleases.forEach(function(f){f()})
  selectionReleases = []
  selecting = false
})