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 xx 9x xx xx |
押上アクション | 9x xx xx 8x 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
プレビュー