回答編集履歴
3
9バイトの長さについて詳しく言及
answer
CHANGED
@@ -18,11 +18,11 @@
|
|
18
18
|
|
19
19
|
そのため、プログラム言語を問わず、「標準入力」もしくは(名前付きパイプ経由の)「ファイル読み込み」であっても、**データを読み込む時は9バイトを境に読み込みを区切る**必要があります。
|
20
20
|
|
21
|
-
区切りを9バイトにしたのは、私の MIDI 機器(AKAI MPKmini MK2)
|
21
|
+
区切りを9バイトにしたのは、私の MIDI 機器(AKAI MPKmini MK2)がどのキーやパッドを操作しても9バイトの固定長だったためです。
|
22
22
|
|
23
|
-
> `\n`
|
23
|
+
> `\n90 3c 16` → `\n` `9` `0` ` ` `3` `C` ` ` `1` `6` = 9 バイト長
|
24
24
|
|
25
|
-
|
25
|
+
改行区切りで読み込み、一時的に変数に入れるなどバッファをさせる方法も考えました。しかし、9バイト以上のデータ(シーケンスのダンプなど)が流れる可能性がない限り、リアルタイム処理の場合はバイト長で区切った方が処理が速そうです。
|
26
26
|
|
27
27
|
### パイプ渡しで確認する例
|
28
28
|
|
2
改めて読むと日本語がおかしかったので、すこし修正しました。
answer
CHANGED
@@ -4,18 +4,26 @@
|
|
4
4
|
|
5
5
|
## TL;DR
|
6
6
|
|
7
|
-
`amidi` のダンプデータは、1 アクションごとに出力する MIDI シーケンスの**先頭**に改行コードが付いて
|
7
|
+
`amidi` のダンプデータは、1 アクションごとに出力する MIDI シーケンスの**先頭**に改行コードが付いてきます。そのため、1 アクションを検知(判断)するのは `EOL` や `\n` などの改行コードではなく**読み込んだバイト数(9バイト)で判断する**必要があります。
|
8
8
|
|
9
9
|
## TS;DR
|
10
10
|
|
11
|
-
MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった3バイトの MIDI 信号(シーケンス・データ)が流れてきますが、厳密には「`\n90 3c 16`」という9バイトの文字列データです。ここで注意すべきは**
|
11
|
+
MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった3バイトの MIDI 信号(シーケンス・データ)が流れてきますが、厳密には「`\n90 3c 16`」という9バイトの文字列データです。ここで注意すべきは**「`\n`」の改行コードが先頭に付いている**ことです。
|
12
12
|
|
13
|
-
|
13
|
+
つまり「`[データ1]\n` `[データ2]\n` ...」と1アクションごとに改行が後に付いていると思い込んでいたことが原因です。実際には「`\n[データ1]` `\n[データ2]` ...」ということです。
|
14
14
|
|
15
|
-
|
15
|
+
このことから、「パイプ渡しによる標準入力」だけでなく「名前付きパイプによるファイル読み込み」であっても、データを読み込む際に**1行ごとに読み込みながら処理する場合は注意が必要**です。
|
16
16
|
|
17
|
-
|
17
|
+
単純に改行ごとに処理をしてしまうと、1発目のアクションは先頭の改行コードのせいで「空」になり、2発目のアクションで1発目のデータが流れてくることになります。これが1アクションズレる原因でした。
|
18
18
|
|
19
|
+
そのため、プログラム言語を問わず、「標準入力」もしくは(名前付きパイプ経由の)「ファイル読み込み」であっても、**データを読み込む時は9バイトを境に読み込みを区切る**必要があります。
|
20
|
+
|
21
|
+
区切りを9バイトにしたのは、私の MIDI 機器(AKAI MPKmini MK2)はどのキーやパッドを操作しても9バイトの固定長だったためです。
|
22
|
+
|
23
|
+
> `\n`+`FF`+`FF`+`FF` = 9 バイト
|
24
|
+
|
25
|
+
シーケンスのダンプなど、9バイトでない場合は、一時的に変数に入れるなどバッファをさせる必要があると思いますが、リアルタイム処理の場合は、バイト長で区切った方が速そうです。
|
26
|
+
|
19
27
|
### パイプ渡しで確認する例
|
20
28
|
|
21
29
|
```php
|
1
信号情報としてのバイトと、文字列データとして受け取るバイト数の違いを明記
answer
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
## TS;DR
|
10
10
|
|
11
|
-
MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった MIDI シーケンスが流れてきますが、厳密には「`\n90 3c 16`」という9バイトの
|
11
|
+
MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった3バイトの MIDI 信号(シーケンス・データ)が流れてきますが、厳密には「`\n90 3c 16`」という9バイトの文字列データです。ここで注意すべきは**先頭に「`\n`」の改行コードが付いている**ことです。
|
12
12
|
|
13
13
|
パイプ渡しによる標準入力だけでなく名前付きパイプによるファイル読み込みであっても、データを読み込む際に**1行ごとに読み込みながら処理する場合は注意が必要**になります。
|
14
14
|
|