java midi 延迟
Posted
技术标签:
【中文标题】java midi 延迟【英文标题】:java midi latency 【发布时间】:2012-01-29 23:46:21 【问题描述】:我正在尝试制作一个能够在检测到 midi 设备后在计算机上播放音符的 java 应用程序。
一旦获得所需的 MIDI 设备,我将设置接收器,设备的发射器将向其发送 MIDI 消息。
device.getTransmitter().setReceiver( new MyReceiver()) ;
MyReceiver 类看起来像:
public class MyReceiver implements Receiver
MidiChannel[] channels ;
public MyReceiver ()
try
Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
channels = synthesizer.getChannels();
channels[0].programChange( 22 ) ;
catch ( Exception e )
e.printStackTrace() ;
public void noteOff ( int nota )
channels[0].noteOff(nota);
public void noteOn ( int nota )
channels[0].noteOn( nota , 100);
public void send(MidiMessage msg, long timeStamp )
byte[] b = msg.getMessage ();
String tmp = bits ( b [0] ) ;
int message = convertBits ( tmp ) ;
int note1 = convertBits ( bits ( b [ 1 ] ) ) ;
// note on in the first channel
if ( message == 144 )
noteOn( note1 ) ;
// note off in the first channel
if ( message == 128 )
noteOff( note1 ) ;
public String bits(byte b)
String bits = "";
for(int bit=7;bit>=0;--bit)
bits = bits + ((b >>> bit) & 1);
return bits;
public int convertBits ( String bits )
int res = 0 ;
int size = bits.length () ;
for ( int i = size-1 ; i >= 0 ; i -- )
if ( bits.charAt( i ) == '1' )
res += 1 <<(size-i-1) ;
return res ;
public void close()
当我运行我的代码并开始在我的 MIDI 设备上播放时,我的延迟很高(我无法立即听到音符)。
我该如何解决这个问题?
【问题讨论】:
我的延迟为 69660(微秒)... 【参考方案1】:由于您的平台上有限的音频支持,这个问题可能是不可避免的 - 例如,Windows 无法通过通常的音频 API 提供低延迟,因此它也不是由 VM 实现的。
OS X 和 Linux 通常都可以,但如果您调整系统音频设置/驱动程序可能会更快。
Windows 上似乎存在解决方法 (http://www.jsresources.org/faq_misc.html#asio) 但我还没有尝试过...
【讨论】:
我无法让代码运行...但我在同一个网站上找到了一些有关延迟的信息...谢谢【参考方案2】:我正在使用 JAsioHost 项目,该项目使用 asio 驱动程序来避免延迟
【讨论】:
以上是关于java midi 延迟的主要内容,如果未能解决你的问题,请参考以下文章