2012-02-27 2 views
1

Я программирую приложение для фортепиано на основе Java. Все работает до сих пор, но теперь у меня проблема. Это более подробная информация, но это очень плохой пользовательский интерфейс, поэтому я не могу оставить его таким.выключить midi синтезатор echo

Вот код:

Synthesizer Настройка

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); 

Теперь проблема заключается в том, что ноты, не остановить воспроизведение. Просто не исчезают полностью. Вы здесь, и они не деактивируются автоматически. Я не знаю, где проблема ...

Если вам нужно больше кода или что-то еще, просто скажите об этом.
Было бы здорово получить ответ на эту проблему, я уже пытаюсь решить, так как более двух часов ...

ответ

4

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

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

+0

Спасибо. Я уже немного поиграл с Note Note, но я не привёл его к работе. Теперь с Note On с 0 скоростью он работает :) – evotopid

+0

@evotopid, Не все синтезаторы отвечают на Note Off, поэтому проблема может быть не в вас. – Brad

Смежные вопросы