できた
MIDIコントローラ、安いしツマミとかスライダーがいっぱい付いてて便利だと思う。ツマミで色相(hue)、スライダーでbrightness(輝度)を調整できる。
動画では使ってないけど横のボタンで彩度(saturation)を0にして真っ白にもできる。
— oʇoɯıɥsɐɥ oɥs (@shokai) February 15, 2015
ソースコード
これをgit cloneしてnpm installしてnpm startすれば起動する。https://github.com/shokai/hue-korg-control
MIDIコントローラの制御にはkorg-nano npmを使っている。KORG nanoKontrolを操作すると”knob:1″とか”slider:3″とか”button:play”というイベントを発火させてくれるのでEventEmitterで受けるだけでいい。
Hueの操作は、nodeのhueライブラリにどうもしっくり来るものが無かったので1から自作した。HueのAPIは単純なのに、どれもなんだか過剰にwrapしすぎているように見える。
Web+DB Press vol.83でHueのAPIについては解説してて、それを見たらすぐ実装できた。
MIDIコントローラ
家にたまたまあったKORG nanoKontrolで操作している。nanoKontrolは絶版になってて中古で1万円ぐらいなんだけど、後継機のnanoKontrol2が3〜4千円ぐらいで売ってる。たぶんそっちでも同じように使える。USB接続で、ドライバなしでMacに接続していきなり使えて便利だった。なんか便利っぽいのでもう1,2個ぐらいほしい。
売り上げランキング: 481
NodeでMIDI
MIDIデバイスはUSBで接続できるやつも最近はたくさんあるみたいだし、ツマミ・スライダー・ボタンがたくさん付いているのでコントローラとして優秀だと思う。Node.jsの場合はmidi npmでMIDIデバイスとやりとりできる。midi npmはRtMidiというMac/Windows/Linux対応してるC++ライブラリのラッパーなので、Raspberry Piとかでも動かせそう。
midiは大変簡単なバイナリプロトコルで、1byte(8bit)の1番上の1bitが1ならコマンド、0ならデータで、のこり7byteにコマンドやデータ内容が書かれている。
今回はkorg-nano npmを使っているが、midiデバイスをNodeで扱うとしたらこんな感じでできる。
EventEmitter = require('events').EventEmitter
midi = require 'midi'
debug = require('debug')('midi-device')
module.exports = class Device extends EventEmitter
constructor: (device_name=".*") ->
@input = new midi.input
for i in [0...@input.getPortCount()]
name = @input.getPortName i
debug "found device [#{i}] \"#{name}\""
if new RegExp(device_name, 'i').test name
debug "openPort #{i}"
@input.openPort i
break
## midi messageを受信
@input.on 'message', (delta, raw) =>
@emit 'message', {delta: delta, raw: raw}
device = new Device("keyboard")
device.on 'message', (data) ->
console.log data.raw
Rubyではmidi gemというのがあって、試してないけどgithubを見た感じよくメンテナンスされているように見えるので、これでもいい気がする。