teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

おかげさまで解決したので、今後参照される方のために、質問本文を問題点のみに絞り、タイトルを内容にあわせて修正。

2018/05/08 09:12

投稿

KEINOS
KEINOS

スコア15

title CHANGED
@@ -1,1 +1,1 @@
1
- RPi で `amidi` の MIDI ダンプをパイプで受け取ると Key Down の Note が1つ前のものになる
1
+ RPi 3 'amidi' の MIDI ダンプをパイプで受け取るとMIDIシーケンスが1つ前のものになる
body CHANGED
@@ -1,7 +1,32 @@
1
- ## エラー概要
1
+ ## TL;DR(概要
2
2
 
3
- ラズパイ3 に MIDI キーボードをつなげ、受け取った MIDI シーケンスデータが、 `$ amidi --port="hw:1,0,0" --dump` で表示される内容と、`$ amidi --port="hw:1,0,0" --dump | php sample.php` でパイプでプログラムに渡された内容が異なる。
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
- MIDIチャンネル`0`」から、鍵盤の真ん中の「ド(C)= 60(`0x3C`)を押して(`8x xx xx`)離した(`9x xx xx`後、隣鍵盤「レ(D)= 62(`0x3E`)」を押下/押上し続けて同じキー押下/押上た時の出力結果
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
- <?PHP
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

2018/05/08 09:12

投稿

KEINOS
KEINOS

スコア15

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 **2C 00** |
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** |