关闭midi合成器回声

时间:2012-02-27 18:59:43

标签: java midi javasound

我正在编写基于Java的钢琴应用程序。一切都运作到目前为止,但现在我有一个问题。这是一个更详细的细节,但这是一个非常糟糕的用户体验,所以我不能这样做。

以下是一些代码:

合成器设置

try {
    synthesizer = MidiSystem.getSynthesizer();
    synthesizer.open();
    synthesizer.loadAllInstruments(synthesizer.getDefaultSoundbank());
} catch (MidiUnavailableException e) {
    e.printStackTrace();
}

try {
    synthReceiver = synthesizer.getReceiver();
} catch (MidiUnavailableException e) {
    e.printStackTrace();
}

// load instrument's configuartion
int instrumentNumber = settings.getInteger("sound.instrument", 0);
Instrument instrument = synthesizer.getDefaultSoundbank().getInstruments()[instrumentNumber];

// Set the instrument on channel 0
ShortMessage message = new ShortMessage();
try {
    message.setMessage(ShortMessage.PROGRAM_CHANGE, 0, instrumentNumber, 0);
} catch (InvalidMidiDataException ex) {
    Logger.getLogger(TypePiano.class.getName()).log(Level.SEVERE, null, ex);
}
synthReceiver.send(message, -1);

synthesizer.loadInstrument(instrument);
synthesizer.getChannels()[0].programChange(instrumentNumber);

播放音符

// create the message
ShortMessage message = new ShortMessage();

try {
    message.setMessage(ShortMessage.NOTE_ON, settings.getInteger("piano.instrument", 1), note, 100);
} catch (InvalidMidiDataException e) {
    e.printStackTrace();
}

// send it
synthReceiver.send(message, -1);

// and update note stand
noteStand.notePlayed(note);

现在的问题是笔记,不要停止播放。只是不要完全消失。你在这里他们并没有自动停用。我不知道问题出在哪里......

如果您需要更多代码或其他内容,请说出来 很难得到这个问题的答案,我已经尝试解决了两个多小时......

1 个答案:

答案 0 :(得分:4)

MIDI音符需要两个单独的消息 - 一个音符消息(您正在发送)和一个单独的音符关消息,以便稍后结束音符。要做到这一点,你可以使用实际的Note Off事件类型,或者为同一音高发送另一个Note On,但速度值(第二个字节)为零。

使用带有零速度的音符On更常见,因为这样可以让系统使用运行状态字节,从而可以更有效地使用MIDI流。