用java设计节拍器_具有高速的Java节拍器

关于Thread.sleep()不可靠的答案是正确的:你不能指望它完全返回你指定的时间.事实上,我很惊讶你的节拍器可以使用,特别是当你的系统负载不足时.阅读Thread.sleep()的文档以获取更多详细信息.关于MIDI的Max Beikirch的答案是一个很好的建议:MIDI处理时机非常好.

但你问如何用音频做到这一点.诀窍是打开音频流并在节拍器点击之间填充静音,并将节拍器点击插入所需的位置.当您这样做时,您的声卡以恒定速率播放样本(无论它们是否包含咔嗒声或静音).这里的关键是保持音频流打开,永不关闭它.那么,时钟是音频硬件,而不是你的系统时钟 – 一个微妙但重要的区别.

因此,假设您正在以44100 Hz生成16位单声道样本.这是一个以所需速率创建咔嗒声的功能.请记住,这种咔嗒声对扬声器(和你的耳朵)来说是不好的,所以如果你真的使用它,请以低音量播放. (此外,此代码未经测试 – 只是为了演示这个概念)

int interval = 44100; // 1 beat per second, by default

int count = 0;

void setBPM( float bpm ) {

interval = ( bpm / 60 ) * 44100 ;

}

void generateMetronomeSamples( short[] s ) {

for( int i=0; i

s = 0;

++count;

if( count == 0 ) {

s = Short.MAX_VALUE;

}

if( count == interval ) {

count = 0;

}

}

}

使用setBPM设置速度后,可以重复调用generateMetronomeSamples()函数生成的样本,并使用JavaSound将输出流式传输到扬声器. (请参阅JSResources.org以获得一个很好的教程)

一旦你有了这个工作,你就可以用从WAV或AIFF或短音或其他任何东西获得的声音来代替刺耳的咔嗒声.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值