TL;DR(概要)
RaspberryPi 3 に MIDI キーボードをつなげ、受け取った MIDI シーケンスデータが、 $ amidi --port="hw:1,0,0" --dump で表示される内容と、$ amidi --port="hw:1,0,0" --dump | php sample.php でパイプでプログラムに渡された内容が異なる。
押下/押上の結果
続けて「ド・レ・レ」と弾いた場合の信号の違いは以下の通りです。
「Dump RAW」は $ amidi --port="hw:1,0,0" --dump の値、「パイプ経由」は $ amidi --port="hw:1,0,0" --dump | php sample.php で標準入力をおうむ返しした値です。
| ノート番号 | 操作 | Dump RAW | パイプ経由 |
|---|---|---|---|
| 3C | 押下↓ | 90 3C 33 | 80 3C 00 |
| 3C | 押上↑ | 80 3C 00 | 90 3C 74 |
| 3E | 押下↓ | 90 3E 42 | 80 3C 00 |
| 3E | 押上↑ | 80 3E 00 | 90 3E 24 |
| 3E | 押下↓ | 90 3E 2C | 80 3E 00 |
| 3E | 押上↑ | 80 3E 00 | 90 3E 64 |
備考
- MIDIチャンネル「
0」 - 押下 =
9x xx xx(ノート・オン) - 押上 =
8x xx xx(ノート・オフ) - ド = 真ん中のC(
3C) - レ = 真ん中のD(
3E) - 3バイト目の値はベロシティなので
00以外は毎回ランダム
パイプで受け取るプログラム例(PHP)
lang
1<?php 2/* sample.php */ 3while (true) { 4 $input = trim(fgets(STDIN)); 5 echo $input . PHP_EOL; 6}
問題点
上記「Dump RAW」($ amidi --port="hw:1,0,0" --dump でダンプした値)は正常に表示されているのですが、それをパイプでプログラムに渡すとズレが発生します。
他に試したこと
$ mkfifo pipemidi で名前付きパイプを作成し、$ amidi --port="hw:1,0,0" --dump > pipemidi と別ターミナルから $ cat pipemidi で正常に受け取れることを確認後、sample.phpを以下のように変更しましたが、同じズレが発生しました。
lang
1<?php 2 3$path_file_pipe_midi = './pipemidi'; 4 5if(! file_exists($path_file_pipe_midi)){ 6 die('Can not read file.'); 7} 8 9$file = new NoRewindIterator( new SplFileObject($path_file_pipe_midi, 'r') ); 10 11$file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE); 12 13foreach ($file as $n => $line) { 14 if (false === $line) continue; 15 echo "$n $line", PHP_EOL; 16}
環境/条件
ビット長
- 1 アクションで受け取るMIDIデータ = 3バイト
FF FF FF
ビットマスク
| 項目 | ビットマスク |
|---|---|
| キー Down/Up | F0 00 00 |
| MIDI チャンネル | 0F 00 00 |
| ノート番号 | 00 FF 00 |
| ベロシティー | 00 00 FF |
MIDIデータの値
| 項目 | 値 |
|---|---|
| MIDI チャンネル | 0(Ch0) |
| ノート | C3 = 真ん中のド(60=0xC3) |
| ノート | 3E = 真ん中のレ(62=0x3E) |
| 押下アクション | 8x xx xx9x xx xx |
| 押上アクション | 9x xx xx8x xx xx |
検証環境
| 項目 | 内容 |
|---|---|
| 本体 | RaspberryPi3 B |
| MIDI キーボード | AKAI MPKmini MK2 |
| MIDI 接続 | USB ケーブル直結 |
| SSH 接続 | WiFi 経由 |
| PHP | v7.0.27-0+deb9u1 (cli) |
MIDI ポート($ amidi -l) | IO hw:1,0,0 MPKmini2 MIDI 1 |
$amidi --version | v1.0.28 |
| OS | Jessie, ヘッドレス |
$ lsb_release -a | (以下を参照) |
| No LSB modules are available. | |
| Distributor ID: | Raspbian |
| Description: | Raspbian GNU/Linux 8.0 (jessie) |
| Release: | 8.0 |
| Codename: | jessie |
回答1件
あなたの回答
tips
プレビュー