質問編集履歴
2
おかげさまで解決したので、今後参照される方のために、質問本文を問題点のみに絞り、タイトルを内容にあわせて修正。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
RPi で
|
1
|
+
RPi 3 で 'amidi' の MIDI ダンプをパイプで受け取るとMIDIシーケンスが1つ前のものになる
|
body
CHANGED
@@ -1,7 +1,32 @@
|
|
1
|
-
##
|
1
|
+
## TL;DR(概要)
|
2
2
|
|
3
|
-
|
3
|
+
RaspberryPi 3 に MIDI キーボードをつなげ、受け取った MIDI シーケンスデータが、 `$ amidi --port="hw:1,0,0" --dump` で表示される内容と、`$ amidi --port="hw:1,0,0" --dump | php sample.php` でパイプでプログラムに渡された内容が異なる。
|
4
4
|
|
5
|
+
### 押下/押上の結果
|
6
|
+
|
7
|
+
続けて「ド・レ・レ」と弾いた場合の信号の違いは以下の通りです。
|
8
|
+
「Dump RAW」は `$ amidi --port="hw:1,0,0" --dump` の値、「パイプ経由」は `$ amidi --port="hw:1,0,0" --dump | php sample.php` で標準入力をおうむ返しした値です。
|
9
|
+
|
10
|
+
|ノート番号| 操作 | Dump RAW | パイプ経由 |
|
11
|
+
|:--:|:--- | :--- | :--- |
|
12
|
+
| 3C | 押下↓ | 90 3C 33 | 80 3C 00 |
|
13
|
+
| 3C | 押上↑ | 80 3C 00 | 90 3C 74 |
|
14
|
+
| 3E | 押下↓ | 90 3E 42 | 80 3C 00 |
|
15
|
+
| 3E | 押上↑ | 80 3E 00 | 90 3E 24 |
|
16
|
+
| 3E | 押下↓ | 90 3E 2C | 80 3E 00 |
|
17
|
+
| 3E | 押上↑ | 80 3E 00 | 90 3E 64 |
|
18
|
+
|
19
|
+
#### 備考
|
20
|
+
|
21
|
+
- MIDIチャンネル「`0`」
|
22
|
+
- 押下 = `9x xx xx`(ノート・オン)
|
23
|
+
- 押上 = `8x xx xx`(ノート・オフ)
|
24
|
+
- ド = 真ん中のC(`3C`)
|
25
|
+
- レ = 真ん中のD(`3E`)
|
26
|
+
- 3バイト目の値はベロシティなので`00`以外は毎回ランダム
|
27
|
+
|
28
|
+
#### パイプで受け取るプログラム例(PHP)
|
29
|
+
|
5
30
|
```lang-php
|
6
31
|
<?php
|
7
32
|
/* sample.php */
|
@@ -11,39 +36,16 @@
|
|
11
36
|
}
|
12
37
|
```
|
13
38
|
|
14
|
-
##
|
39
|
+
## 問題点
|
15
40
|
|
16
|
-
|
41
|
+
上記「Dump RAW」(`$ amidi --port="hw:1,0,0" --dump` でダンプした値)は正常に表示されているのですが、それをパイプでプログラムに渡すとズレが発生します。
|
17
42
|
|
18
|
-
|ノート番号| 操作 | Dump RAW | パイプ経由 |
|
19
|
-
|:--:|:--- | :--- | :--- |
|
20
|
-
| 3C | 押下 | 80 3C 33 | 80 3C **00** |
|
21
|
-
| 3C | 押上 | 90 3C 00 | 90 3C **74** |
|
22
|
-
| 3E | 押下 | 80 3E 42 | 80 **3C 00** |
|
23
|
-
| 3E | 押上 | 90 3E 00 | 90 3E **24** |
|
24
|
-
| 3E | 押下 | 80 3E 2C | 80 3E **00** |
|
25
|
-
| 3E | 押上 | 90 3E 00 | 90 3E **64** |
|
26
|
-
|
27
|
-
※ 3バイト目の値はベロシティなので`00`以外は毎回ランダム
|
28
|
-
※ 各バイトのプロトコルは下記参照
|
29
|
-
|
30
|
-
## 問題
|
31
|
-
|
32
|
-
上記「Damp RAW」(`$ amidi --port="hw:1,0,0" --dump` でダンプした値)は正常に表示されているが、それをパイプでプログラムに渡すとズレが発生します。
|
33
|
-
|
34
|
-
ノートとベロシティが1ステップずつズレている気がしますが、**キーの押下/押上は正常に渡されている**ので合点がいきません。何を見落としているのでしょう、、、
|
35
|
-
|
36
|
-
1. キー押下時のベロシティーが、パイプ渡しの場合に`00`になる。
|
37
|
-
1. キー押上時のベロシティーが、パイプ渡しの場合に `00` にならない。
|
38
|
-
1. **異なるキーの初回押下**時、ノート番号が1つ前のものになる。
|
39
|
-
|
40
|
-
|
41
43
|
### 他に試したこと
|
42
44
|
|
43
45
|
`$ mkfifo pipemidi` で名前付きパイプを作成し、`$ amidi --port="hw:1,0,0" --dump > pipemidi` と別ターミナルから `$ cat pipemidi` で正常に受け取れることを確認後、`sample.php`を以下のように変更しましたが、同じズレが発生しました。
|
44
46
|
|
45
47
|
```lang-php
|
46
|
-
<?
|
48
|
+
<?php
|
47
49
|
|
48
50
|
$path_file_pipe_midi = './pipemidi';
|
49
51
|
|
@@ -83,8 +85,8 @@
|
|
83
85
|
|MIDI チャンネル | `0`(`Ch0`)|
|
84
86
|
|ノート| `C3` = 真ん中のド(`60`=`0xC3`)|
|
85
87
|
|ノート| `3E` = 真ん中のレ(`62`=`0x3E`)|
|
86
|
-
|押下アクション | `8x xx xx`|
|
88
|
+
|押下アクション | ~~`8x xx xx`~~`9x xx xx`|
|
87
|
-
|押上アクション | `9x xx xx`|
|
89
|
+
|押上アクション | ~~`9x xx xx`~~`8x xx xx`|
|
88
90
|
|
89
91
|
### 検証環境
|
90
92
|
|
1
typo
title
CHANGED
File without changes
|
body
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
|:--:|:--- | :--- | :--- |
|
20
20
|
| 3C | 押下 | 80 3C 33 | 80 3C **00** |
|
21
21
|
| 3C | 押上 | 90 3C 00 | 90 3C **74** |
|
22
|
-
| 3E | 押下 | 80 3E 42 | 80 **
|
22
|
+
| 3E | 押下 | 80 3E 42 | 80 **3C 00** |
|
23
23
|
| 3E | 押上 | 90 3E 00 | 90 3E **24** |
|
24
24
|
| 3E | 押下 | 80 3E 2C | 80 3E **00** |
|
25
25
|
| 3E | 押上 | 90 3E 00 | 90 3E **64** |
|