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

回答編集履歴

3

9バイトの長さについて詳しく言及

2019/08/02 10:52

投稿

KEINOS
KEINOS

スコア15

answer CHANGED
@@ -18,11 +18,11 @@
18
18
 
19
19
  そのため、プログラム言語を問わず、「標準入力」もしくは(名前付きパイプ経由の)「ファイル読み込み」であっても、**データを読み込む時は9バイトを境に読み込みを区切る**必要があります。
20
20
 
21
- 区切りを9バイトにしたのは、私の MIDI 機器(AKAI MPKmini MK2)どのキーやパッドを操作しても9バイトの固定長だったためです。
21
+ 区切りを9バイトにしたのは、私の MIDI 機器(AKAI MPKmini MK2)どのキーやパッドを操作しても9バイトの固定長だったためです。
22
22
 
23
- > `\n`+`FF`+`FF`+`FF` = 9 バイト
23
+ > `\n90 3c 16` → `\n` `9` `0` ` ` `3` `C` ` ` `1` `6` = 9 バイト
24
24
 
25
- シーケンスのダンプなど、9バイトない場合は、一時的に変数に入れるなどバッファをさせる必要と思いますが、リアルタイム処理の場合はバイト長で区切った方が速そうです。
25
+ 改行区切り読み込み、一時的に変数に入れるなどバッファをさせる方法も考えました。しかし、9バイト以上のデータ(シーケンスのダンプなど)流れ可能性ない限り、リアルタイム処理の場合はバイト長で区切った方が処理が速そうです。
26
26
 
27
27
  ### パイプ渡しで確認する例
28
28
 

2

改めて読むと日本語がおかしかったので、すこし修正しました。

2019/08/02 10:52

投稿

KEINOS
KEINOS

スコア15

answer CHANGED
@@ -4,18 +4,26 @@
4
4
 
5
5
  ## TL;DR
6
6
 
7
- `amidi` のダンプデータは、1 アクションごとに出力する MIDI シーケンスの**先頭**に改行コードが付いてくる、1 アクションを検知するのは `EOL` や `\n` で判断するのではなく**読み込んだバイト数(9バイト)で判断する**必要があります。
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バイトの文字列データです。ここで注意すべきは**先頭に「`\n`」の改行コードが付いている**ことです。
11
+ MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった3バイトの MIDI 信号(シーケンス・データ)が流れてきますが、厳密には「`\n90 3c 16`」という9バイトの文字列データです。ここで注意すべきは**「`\n`」の改行コードが先頭に付いている**ことです。
12
12
 
13
- パイプ渡しによる標準入力だけでなく名前付きパイプによるファイル読み込みであっても、データを読み込む際に**ごとに読み込みなら処理す場合は注意必要**なります。
13
+ つまり「`[データ1]\n` `[データ2]\n` ...」とアクションごとに改行後に付いていと思い込んでいたこと原因です。実際は「`\n[データ1]` `\n[データ2]` ...」ということです。
14
14
 
15
- なぜなら、MIDI キーボード上でアクションを起こても**改行がいため1行のデータ」として認識されない**ので、次のアクションを起こし改行が付いて初めて1行と認識されるか。これが**1アクション、ズレる原因**した
15
+ このことから、「パイプ渡による標準力」だけで名前付きパイプによるファイル読み込み」であっても、データを読み込む際に**1行に読み込みなが処理る場合は注意必要**で
16
16
 
17
- そのため、プログラム言語問わず、標準入力も(名前付きパイプ経由)ファイル読み込みあっても**データを読み込む時は9バイトを境に読み込みを区切る**必要ります。
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

信号情報としてのバイトと、文字列データとして受け取るバイト数の違いを明記

2019/08/02 10:41

投稿

KEINOS
KEINOS

スコア15

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## TS;DR
10
10
 
11
- MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった MIDI シーケンスが流れてきますが、厳密には「`\n90 3c 16`」という9バイトの信号です。ここで注意すべきは**先頭に「`\n`」の改行コードが付いている**ことです。
11
+ MIDI キーボードのキーやパッドを押すと「`90 3C 16`」といった3バイトの MIDI 信号(シーケンス・データ)が流れてきますが、厳密には「`\n90 3c 16`」という9バイトの文字列データです。ここで注意すべきは**先頭に「`\n`」の改行コードが付いている**ことです。
12
12
 
13
13
  パイプ渡しによる標準入力だけでなく名前付きパイプによるファイル読み込みであっても、データを読み込む際に**1行ごとに読み込みながら処理する場合は注意が必要**になります。
14
14