2012-02-27 31 views
1

我正在编程一个基于Java的钢琴应用程序。一切工作到目前为止,但现在我有一个问题。这更多的是细节,但这是一个非常糟糕的用户体验,所以我不能这样离开它。关闭midi合成器回声

下面是一些代码:

合成器设置

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音符需要两个独立的消息 - 一张纸条消息(你发送)和单独的注释关闭消息以在稍后的某个时间结束注释。要做到这一点,您可以使用实际的音符关闭事件类型,或发送另一个音符为相同的音调,但速度值(第二个字节)为零。

使用备注使用零速度更常见,因为它可让系统使用运行状态字节,从而可以更有效地使用MIDI数据流。

+0

谢谢。我已经使用Note Off Messages播放了一些内容,但是我没有启用它。现在与注意与0速度它工作:) – evotopid 2012-02-27 20:49:14

+0

@evotopid,并非所有的合成器响应笔记关闭,所以问题可能不是你。 – Brad 2012-02-28 17:05:42