回答編集履歴
3
追記
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
別クラスを使用する例 追加
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
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)
|