我正在检查这个问题Terminate Java Midi output
基于此文档https://www.csie.ntu.edu.tw/~r92092/ref/midi/
我想在受控模式中包含一些额外的事件......
这里是 Midi 代码:
import javax.sound.midi.*;
class TestMidiSound {
public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) {
ShortMessage a = new ShortMessage();
try {
a.setMessage(comd, chan, one, two);
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
return new MidiEvent(a, tick);
}
public static void main(String[] args) {
try {
final Sequencer seq = MidiSystem.getSequencer();
seq.open();
int[] events = {125};
seq.addControllerEventListener(new ControllerEventListener() {
@Override
public void controlChange(ShortMessage event) {
System.out.println(
"event.getCommand():" + event.getCommand()
+ "\tevent.getChannel():" + event.getChannel()
+ "\tevent.getData1():" + event.getData1()
+ "\tevent.getData2():" + event.getData2()
+ "\tevent.toString():" + event.toString());
}
}, events);
Sequence s = new Sequence(Sequence.PPQ, 4);
Track t = s.createTrack();
for (int i = 5; i < 60; i += 4) {
t.add(MySound.makeEvent(/*144*/ShortMessage.NOTE_ON, 1 /*channel*/, i/*pitch*/, 100 /*velocity*/, i /*tick*/));
// No will be controlled
t.add(MySound.makeEvent(/*176*/ShortMessage.CONTROL_CHANGE, 1/*channel*/, 127 /*[Channel Mode Message] Poly Mode On (+ mono off, +all notes off)*/, 0, i/*tick*/));
t.add(MySound.makeEvent(/*176*/ShortMessage.CONTROL_CHANGE, 1/*channel*/, 125 /*[Channel Mode Message] Omni Mode On (+ all notes off)*/, 0, i + 2/*tick*/));
t.add(MySound.makeEvent(/*128*/ShortMessage.NOTE_OFF, 1/*channel*/, i/*pitch*/, 100/*velocity*/, i + 2/*tick*/));
}
seq.setSequence(s);
seq.addMetaEventListener(new MetaEventListener() {
@Override
public void meta(MetaMessage metaMsg) {
if (metaMsg.getType() == 0x2F) {
seq.close();
}
}
});
seq.setTempoInBPM(220);
seq.start();
} catch (InvalidMidiDataException e) {
e.printStackTrace();
} catch (MidiUnavailableException e) {
e.printStackTrace();
}
}
}
这里是我的活动
- 时间签名
- 密钥签名
- 设定速度
- MIDI 端口前缀
- MIDI 通道前缀
- SMPTE 偏移
如何包含元事件类型?.