0

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

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

打印出来Gervill,如Gervills 主页所述,它支持调优标准。

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

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

如果 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();
// ...
4

1 回答 1

0

正如您在 MIDI 实现图表中所见,Gervill(与几乎任何其他软件合成器一样)不发送任何 MIDI 消息。

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

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

于 2014-08-29T10:49:34.457 回答