выключить миди синтезатор эхо - PullRequest
1 голос
/ 27 февраля 2012

Я программирую приложение для фортепиано на основе 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 Ответ

4 голосов
/ 27 февраля 2012

MIDI-нотам нужны два отдельных сообщения - сообщение Note On (которое вы отправляете) и отдельное сообщение Note Off для завершения ноты, когда-нибудь позже. Для этого вы можете либо использовать фактический тип события Note Off, либо отправить другой Note On для того же шага, но со значением скорости (второго байта), равным нулю.

Использование Note On с нулевой скоростью встречается чаще, поскольку это позволяет системе использовать текущие байты состояния, что позволяет более эффективно использовать поток MIDI.

...