質問編集履歴
2
おかげさまで解決したので、今後参照される方のために、質問本文を問題点のみに絞り、タイトルを内容にあわせて修正。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
RPi で
|
1
|
+
RPi 3 で 'amidi' の MIDI ダンプをパイプで受け取るとMIDIシーケンスが1つ前のものになる
|
test
CHANGED
@@ -1,8 +1,58 @@
|
|
1
|
-
##
|
1
|
+
## TL;DR(概要)
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
-
|
5
|
+
RaspberryPi 3 に MIDI キーボードをつなげ、受け取った MIDI シーケンスデータが、 `$ amidi --port="hw:1,0,0" --dump` で表示される内容と、`$ amidi --port="hw:1,0,0" --dump | php sample.php` でパイプでプログラムに渡された内容が異なる。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
### 押下/押上の結果
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
続けて「ド・レ・レ」と弾いた場合の信号の違いは以下の通りです。
|
14
|
+
|
15
|
+
「Dump RAW」は `$ amidi --port="hw:1,0,0" --dump` の値、「パイプ経由」は `$ amidi --port="hw:1,0,0" --dump | php sample.php` で標準入力をおうむ返しした値です。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|ノート番号| 操作 | Dump RAW | パイプ経由 |
|
20
|
+
|
21
|
+
|:--:|:--- | :--- | :--- |
|
22
|
+
|
23
|
+
| 3C | 押下↓ | 90 3C 33 | 80 3C 00 |
|
24
|
+
|
25
|
+
| 3C | 押上↑ | 80 3C 00 | 90 3C 74 |
|
26
|
+
|
27
|
+
| 3E | 押下↓ | 90 3E 42 | 80 3C 00 |
|
28
|
+
|
29
|
+
| 3E | 押上↑ | 80 3E 00 | 90 3E 24 |
|
30
|
+
|
31
|
+
| 3E | 押下↓ | 90 3E 2C | 80 3E 00 |
|
32
|
+
|
33
|
+
| 3E | 押上↑ | 80 3E 00 | 90 3E 64 |
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
#### 備考
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
- MIDIチャンネル「`0`」
|
42
|
+
|
43
|
+
- 押下 = `9x xx xx`(ノート・オン)
|
44
|
+
|
45
|
+
- 押上 = `8x xx xx`(ノート・オフ)
|
46
|
+
|
47
|
+
- ド = 真ん中のC(`3C`)
|
48
|
+
|
49
|
+
- レ = 真ん中のD(`3E`)
|
50
|
+
|
51
|
+
- 3バイト目の値はベロシティなので`00`以外は毎回ランダム
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
#### パイプで受け取るプログラム例(PHP)
|
6
56
|
|
7
57
|
|
8
58
|
|
@@ -24,57 +74,11 @@
|
|
24
74
|
|
25
75
|
|
26
76
|
|
27
|
-
## 押下/押上の結果
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
MIDIチャンネル「`0`」から、鍵盤の真ん中の「ド(C)= 60(`0x3C`)」を押して(`8x xx xx`)離した(`9x xx xx`)後、隣の鍵盤「レ(D)= 62(`0x3E`)」を押下/押上し、続けて同じキーを押下/押上した時の出力結果。
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|ノート番号| 操作 | Dump RAW | パイプ経由 |
|
36
|
-
|
37
|
-
|:--:|:--- | :--- | :--- |
|
38
|
-
|
39
|
-
| 3C | 押下 | 80 3C 33 | 80 3C **00** |
|
40
|
-
|
41
|
-
| 3C | 押上 | 90 3C 00 | 90 3C **74** |
|
42
|
-
|
43
|
-
| 3E | 押下 | 80 3E 42 | 80 **3C 00** |
|
44
|
-
|
45
|
-
| 3E | 押上 | 90 3E 00 | 90 3E **24** |
|
46
|
-
|
47
|
-
| 3E | 押下 | 80 3E 2C | 80 3E **00** |
|
48
|
-
|
49
|
-
| 3E | 押上 | 90 3E 00 | 90 3E **64** |
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
※ 3バイト目の値はベロシティなので`00`以外は毎回ランダム
|
54
|
-
|
55
|
-
※ 各バイトのプロトコルは下記参照
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
## 問題
|
77
|
+
## 問題点
|
60
|
-
|
61
|
-
|
62
|
-
|
78
|
+
|
79
|
+
|
80
|
+
|
63
|
-
上記「D
|
81
|
+
上記「Dump RAW」(`$ amidi --port="hw:1,0,0" --dump` でダンプした値)は正常に表示されているのですが、それをパイプでプログラムに渡すとズレが発生します。
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
ノートとベロシティが1ステップずつズレている気がしますが、**キーの押下/押上は正常に渡されている**ので合点がいきません。何を見落としているのでしょう、、、
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
1. キー押下時のベロシティーが、パイプ渡しの場合に`00`になる。
|
72
|
-
|
73
|
-
1. キー押上時のベロシティーが、パイプ渡しの場合に `00` にならない。
|
74
|
-
|
75
|
-
1. **異なるキーの初回押下**時、ノート番号が1つ前のものになる。
|
76
|
-
|
77
|
-
|
78
82
|
|
79
83
|
|
80
84
|
|
@@ -88,7 +92,7 @@
|
|
88
92
|
|
89
93
|
```lang-php
|
90
94
|
|
91
|
-
<?
|
95
|
+
<?php
|
92
96
|
|
93
97
|
|
94
98
|
|
@@ -168,9 +172,9 @@
|
|
168
172
|
|
169
173
|
|ノート| `3E` = 真ん中のレ(`62`=`0x3E`)|
|
170
174
|
|
171
|
-
|押下アクション | `8x xx xx`|
|
175
|
+
|押下アクション | ~~`8x xx xx`~~`9x xx xx`|
|
172
|
-
|
176
|
+
|
173
|
-
|押上アクション | `9x xx xx`|
|
177
|
+
|押上アクション | ~~`9x xx xx`~~`8x xx xx`|
|
174
178
|
|
175
179
|
|
176
180
|
|
1
typo
test
CHANGED
File without changes
|
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
| 3C | 押上 | 90 3C 00 | 90 3C **74** |
|
42
42
|
|
43
|
-
| 3E | 押下 | 80 3E 42 | 80 **
|
43
|
+
| 3E | 押下 | 80 3E 42 | 80 **3C 00** |
|
44
44
|
|
45
45
|
| 3E | 押上 | 90 3E 00 | 90 3E **24** |
|
46
46
|
|