如何接收MIDI批量调整转储请求的响应?

时间:2014-08-29 09:40:55

标签: java midi javax.sound.midi

我正在使用MIDI Tuning Standard来将音乐会音高A4 = 440 Hz的调音更改为任意的发音频率。它在Windows 7和JDK 1.8.0的机器上运行良好。 但如果调整标准可用,我想要检查。

Synthesizer synthesizer = MidiSystem.getSynthesizer();
System.out.println(synthesizer.getDeviceInfo().getName());

打印Gervill并按Gervills Homepage所述,它支持调整标准。

Gervill合成器是所有平台(Windows,Linux,Mac)上当前JRE的一部分吗?如果是的话,它会长期存在吗?

如果Gervill将被另一个不支持MIDI Tuning Standard的合成器取代,我想测试它是否可用。

如果MIDI调音标准可用,如何测试?

我的想法是发送一个 BULK TUNING DUMP REQUEST ,如果我收到回复,我肯定不会这样做。

//@formatter:off
final byte[] data = new byte[] {
        (byte) 0xf0, // SysEx Header
        (byte) 0x7e, // Non-Realtime
        (byte) 0x7f, // Target Device = All Devices
        (byte) 0x08, // MIDI Tuning
        (byte) 0x00, // Bulk Tuning Dump Request
        (byte) 0x00, // preset = 0
        (byte) 0xf7, // EOX
};
//@formatter:on
SysexMessage dumpRequest = new SysexMessage(data, data.length);

所以规范说:

  

接收仪器应通过发送下一节中描述的批量调谐转储消息来响应所寻址的调谐号码。

但我的问题是,我该如何收到此回复?

为了演奏音符并发送重调音,我以这种方式使用MIDI:

final int PPQN = 16; // Pulses/Ticks per quarter note
Sequence sequence = new Sequence(Sequence.PPQ, PPQN);
final Track track = sequence.createTrack();

// Send dump request
track.add(new MidiEvent(dumpRequest, 0));

// How to receive the response of the request?

final Sequencer sequencer = MidiSystem.getSequencer();
sequencer.setSequence(sequence);
sequencer.open();
sequencer.start();
// ...

1 个答案:

答案 0 :(得分:0)

正如你在MIDI实现图表中看到的那样,Gervill(几乎与任何其他软件合成器一样)不会发送任何MIDI信息。

您无法从代码中查看默认合成器的功能。

如果您想使用特定的合成器,则必须手动创建它。 (Gervill的课程将是com.sun.media.sound.SoftSynthesizer。)