だから私はJavaでMIDIプログラムを作っています。バッファがあります。これは、バッファからメッセージを取得し、それらを表示するウィンドウクラスに渡すために使用しているスレッドです。
ArrayIndexOutOfBounds
パラメータが2つしかないメッセージを送信すると、エラーが発生し続けます。別の配列とifステートメントを使用してみましたが、どちらも機能しないようです。エラーは、ifステートメント/3番目のパラメーター変数と関係があることを示しています。
受信しているメッセージのタイプを判別するためにswitchステートメントとマスキングを使用しましたが、3つではなく2つのパラメーターを持つメッセージはエラーをスローし、配列とパラメーターの数に関係があります。
public class DisplayThread extends Thread {
Buffer bufferObj;
MidiMonitorWindow window = new MidiMonitorWindow("MIDI Devices");
DisplayThread(Buffer bufferObj) {
this.bufferObj = bufferObj;
}
public void run() {
while (true) {
byte[] getMessages = bufferObj.get();
if (getMessages != null) {
int statusValue = getMessages[0] & 0xF0;
int [] paramArray = new int[3];
paramArray[0] = getMessages [0] & 0xFF;
paramArray[1] = getMessages [1] & 0xFF;
if (getMessages[2] != 0){
paramArray[2] = getMessages [2] & 0xFF;
}
switch (statusValue) {
case NOTE_OFF:
System.out.println("Note Off");
window.showNoteOff(paramArray[0], paramArray[1], paramArray[2]);
break;
case NOTE_ON:
System.out.println("Note On");
window.showNoteOn(paramArray[0], paramArray[1], paramArray[2]);
break;
case POLY_PRESSURE:
System.out.println("Poly Pressure");
window.showPolyKeyPressure(paramArray[0], paramArray[1], paramArray[2]);
break;
case CONTROL_CHANGE:
System.out.println("Control Change");
window.showControlChange(paramArray[0], paramArray[1], paramArray[2]);
break;
case PROGRAM_CHANGE:
System.out.println("Program Change");
window.showProgramChange(paramArray[0], paramArray[1]);
break;
case CHANNEL_PRESSURE:
System.out.println("Channel Pressure");
window.showChannelPressure(paramArray[0], paramArray[1]);
break;
case PITCH_BEND:
System.out.println("Pitch Bend");
window.showPitchBend(paramArray[0], paramArray[1], paramArray[2]);
break;
default:
System.out.println("System Message");
window.showSystemExclusive();
break;
}
}
}
}
}
あなたが提供できるアドバイスは最も役に立ちます!