回答編集履歴

3

追記

2024/08/16 10:10

投稿

TN8001
TN8001

スコア9807

test CHANGED
@@ -73,3 +73,37 @@
73
73
  }
74
74
  ```
75
75
  ![アプリ動画](https://ddjkaamml8q8x.cloudfront.net/questions/2024-08-16/127ce758-fe41-4a74-ae98-b1033302bd28.gif)
76
+
77
+ ---
78
+
79
+ > (追記)pocket midiのfileからpreferenceからdetailsで詳細を表示することができました。
80
+ > ですが、channelは10で出力されていることがわかりました。また一行目の三つ目の数字71番が音の強さによって変化するので、velocityに関係していると考えられます。しかし、どこがpitch,number,valuesに対応しているかどうかは分かっておりません。
81
+
82
+ ```
83
+ Port1 Ch10 NoteOn 99 28 71 [E1 ( 40), 113]
84
+ Port1 Ch10 NoteOn 99 28 00 [E1 ( 40), 0]
85
+ ```
86
+
87
+ まず「99 28 71」ここの数字は16進数です(ややこしいので以下16進数には0xを付けます)
88
+
89
+ 最初の0x99は2つの意味があり、0x90番台が`NoteOn`です。
90
+ 一の位はチャンネル番号です(0x0~0xFの16個でチャンネル1~16を表します)
91
+ 0x90だったら「Ch 1 NoteOn」で、0x9Fだったら「Ch16 NoteOn」です。
92
+ 0x99は「Ch10 NoteOn」ということです(ドラムパートは通常Ch10)
93
+ `int channel`に入ってくるのは0~15のようです。
94
+ `NoteOff`は本来0x80番台なのですが、`NoteOn`でベロシティが0の場合`NoteOff`のコードに来ます。
95
+
96
+ 次の0x28はノート番号です(10進数で40)
97
+ E1は16進数ではなくドレミのCDEです(低いミ)
98
+ `int pitch`がそのままノート番号で音階になりますが、ドラムの場合は割り当てられた「なにかの音」となります。
99
+
100
+ 最後0x71はベロシティです(10進数で113)
101
+ 厳密には違いますが音量と思えばいいでしょう。
102
+ `int velocity`は0~127です。
103
+
104
+ つまり「99 28 71」が元になる生データで、それをわかりやすく表示すると「Ch10 NoteOn [E1 ( 40), 113]」になるということです。
105
+
106
+ `controllerChange`の`int number`・`int value`は本当にいろいろなものがあるので、実際に操作した時の数値とマニュアルや解説ページ等を見比べて頑張って解読してください^^;
107
+ [MIDI:それ何? | DTM Solutions](https://dtm-solutions.jp/midi.html)
108
+
109
+ ゲーム?に使う範囲内なら「この数値がきたらこうする」等決め打ちでいい気がします。

2

別クラスを使用する例 追加

2024/08/15 15:58

投稿

TN8001
TN8001

スコア9807

test CHANGED
@@ -42,3 +42,34 @@
42
42
  }
43
43
  ```
44
44
  [HexFormat (Java SE 17 & JDK 17)](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/HexFormat.html)
45
+
46
+ ---
47
+
48
+ ### 別クラスを使用する例
49
+
50
+ ```Processing
51
+ import java.util.HexFormat;
52
+ import themidibus.*;
53
+
54
+ MidiBus myBus;
55
+ HexFormat hex = HexFormat.ofDelimiter(" ").withUpperCase();
56
+
57
+ void setup() {
58
+ MidiBus.list();
59
+
60
+ myBus = new MidiBus(new MidiReceiver(), 2, 5); // 別クラスのインスタンスを渡す
61
+ }
62
+
63
+ void draw() {
64
+ }
65
+
66
+ // 別クラスを用意(クラス名は任意)
67
+ public class MidiReceiver {
68
+ // noteOn等が欲しい場合こちらに書く
69
+
70
+ void rawMidi(byte[] data) {
71
+ println(hex.formatHex(data));
72
+ }
73
+ }
74
+ ```
75
+ ![アプリ動画](https://ddjkaamml8q8x.cloudfront.net/questions/2024-08-16/127ce758-fe41-4a74-ae98-b1033302bd28.gif)

1

rawMidi

2024/08/15 09:38

投稿

TN8001
TN8001

スコア9807

test CHANGED
@@ -31,3 +31,14 @@
31
31
 
32
32
  Pocket MIDIの設定で「Details」にチェックを入れると、10進も併記されるようです。
33
33
  [Pocket MIDI マニュアル for Windows/Mac](https://www.morson.jp/pocketmidi-webpage/manual/pocketmidi/pocketmidi_operation_manual_ja.html#_preferences)
34
+
35
+ ---
36
+
37
+ `rawMidi`を使うと、Pocket MIDIの出力と合わせられますね(わかりやすいとは言っていない^^;
38
+ ```Processing
39
+ java.util.HexFormat hex = java.util.HexFormat.ofDelimiter(" ").withUpperCase();
40
+ void rawMidi(byte[] data) {
41
+ println(hex.formatHex(data));
42
+ }
43
+ ```
44
+ [HexFormat (Java SE 17 & JDK 17)](https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/util/HexFormat.html)