Raspberry Pi と UX-16 で電子ピアノの MIDI データを取る方法の作業メモ

https://github.com/justinlatimer/node-midi を使う。

USB-MIDIインターフェースとして、UX-16を使う。

Prerequisitesの確認

$ g++ --version
g++ (Raspbian 4.9.2-10) 4.9.2
$ python --version
Python 2.7.9
$ aplay --version
aplay: version 1.0.28 by Jaroslav Kysela <perex@perex.cz>
sudo apt-get install libasound2-dev

npmのインストール

sudo apt-get install npm

nodeもバージョン上げたほうがいいんだろうか。とりあえずこのまま進む。

UX-16の接続

電子ピアノに繋いだUX-16をRaspberry Piつなぐ

$ lsusb
Bus 001 Device 006: ID 0499:1009 Yamaha Corp. UX16 MIDI I/F
...

ある。

$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 20:0    UX16                             UX16 MIDI 1

みえてる。
http://ub.workdesign.jp/tag/ux16 を参考にピアノ側で音楽流してみる

aplaymidi -p20:0 sample.mid

電子ピアノから音が流れた!

nodeでMIDI情報を取得

npm install midi

失敗!

$ npm install midi
|
> midi@0.9.5 install /home/pi/dev/hikigatari/node_modules/midi
> node-gyp rebuild
make: Entering directory '/home/pi/dev/hikigatari/node_modules/midi/build'
  CXX(target) Release/obj.target/midi/src/node-midi.o
In file included from ../src/node-midi.cpp:1:0:
../node_modules/nan/nan.h:324:47: error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’
   static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
                                               ^
midi.target.mk:84: recipe for target 'Release/obj.target/midi/src/node-midi.o' failed
make: *** [Release/obj.target/midi/src/node-midi.o] Error 1
make: Leaving directory '/home/pi/dev/hikigatari/node_modules/midi/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/usr/share/node-gyp/lib/build.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:809:12)
gyp ERR! System Linux 4.4.11-v7+
gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild"
gyp ERR! cwd /home/pi/dev/hikigatari/node_modules/midi
gyp ERR! node -v v0.10.29
gyp ERR! node-gyp -v v0.12.2
gyp ERR! not ok
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian

npm ERR! midi@0.9.5 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the midi@0.9.5 install script.
npm ERR! This is most likely a problem with the midi package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls midi
npm ERR! There is likely additional logging output above.

npm ERR! System Linux 4.4.11-v7+
npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "midi"
npm ERR! cwd /home/pi/dev/hikigatari
npm ERR! node -v v0.10.29
npm ERR! npm -v 1.4.21
npm ERR! code ELIFECYCLE
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/pi/dev/hikigatari/npm-debug.log
npm ERR! not ok code 0
npm WARN This failure might be due to the use of legacy binary "node"

といっているので、nodeのバージョンを上げる

参考: http://thisdavej.com/beginners-guide-to-installing-node-js-on-a-raspberry-pi/

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs
以下の追加パッケージがインストールされます:
  rlwrap
以下のパッケージは「削除」されます:
  nodejs-dev nodejs-legacy nodered npm
以下のパッケージが新たにインストールされます:
  rlwrap
以下のパッケージはアップグレードされます:
  nodejs
アップグレード: 1 個、新規インストール: 1 個、削除: 4 個、保留: 41 個。
$ node -v
v6.3.0

もう一度

$ npm install midi

> midi@0.9.5 install /home/pi/dev/hikigatari/node_modules/midi
> node-gyp rebuild

make: Entering directory '/home/pi/dev/hikigatari/node_modules/midi/build'
  CXX(target) Release/obj.target/midi/src/node-midi.o
  SOLINK_MODULE(target) Release/obj.target/midi.node
  COPY Release/midi.node
make: Leaving directory '/home/pi/dev/hikigatari/node_modules/midi/build'
/home/pi/dev/hikigatari
└─┬ midi@0.9.5
  ├── bindings@1.2.1
  └── nan@2.3.5

npm WARN enoent ENOENT: no such file or directory, open '/home/pi/dev/hikigatari/package.json'
npm WARN hikigatari No description
npm WARN hikigatari No repository field.
npm WARN hikigatari No README data
npm WARN hikigatari No license field.

今度は成功。

電子ピアノのデータを取ってみる。
nodeのコンソールで

var midi = require('midi');

// Set up a new input.
var input = new midi.input();

// Count the available input ports.
input.getPortCount();

// Get the name of a specified input port.
input.getPortName(1); // サンプルと違って1なので注意

// Configure a callback.
input.on('message', function(deltaTime, message) {
  // The message is an array of numbers corresponding to the MIDI bytes:
  //   [status, data1, data2]
  // https://www.cs.cf.ac.uk/Dave/Multimedia/node158.html has some helpful
  // information interpreting the messages.
  console.log('m:' + message + ' d:' + deltaTime);
});

// Open the first available input port.
input.openPort(1);// サンプルと違って1なので注意

// Sysex, timing, and active sensing messages are ignored
// by default. To enable these message types, pass false for
// the appropriate type in the function below.
// Order: (Sysex, Timing, Active Sensing)
// For example if you want to receive only MIDI Clock beats
// you should use
// input.ignoreTypes(true, false, true)
input.ignoreTypes(false, false, false);

// ... receive MIDI messages ...

// Close the port when done.
input.closePort();

電子ピアノの鍵盤を押すと反応することがわかる。
ここまでできれば、適当にコーディングする。

最終的に作った作品はこれ

セッショニスト: 鍵盤で弾けてパーカッションがセッションしてくれるハンドベル

You may also like...

コメントを残す

メールアドレスが公開されることはありません。