用java设计节拍器_具有高速的Java节拍器
關(guān)于Thread.sleep()不可靠的答案是正確的:你不能指望它完全返回你指定的時(shí)間.事實(shí)上,我很驚訝你的節(jié)拍器可以使用,特別是當(dāng)你的系統(tǒng)負(fù)載不足時(shí).閱讀Thread.sleep()的文檔以獲取更多詳細(xì)信息.關(guān)于MIDI的Max Beikirch的答案是一個(gè)很好的建議:MIDI處理時(shí)機(jī)非常好.
但你問如何用音頻做到這一點(diǎn).訣竅是打開音頻流并在節(jié)拍器點(diǎn)擊之間填充靜音,并將節(jié)拍器點(diǎn)擊插入所需的位置.當(dāng)您這樣做時(shí),您的聲卡以恒定速率播放樣本(無論它們是否包含咔嗒聲或靜音).這里的關(guān)鍵是保持音頻流打開,永不關(guān)閉它.那么,時(shí)鐘是音頻硬件,而不是你的系統(tǒng)時(shí)鐘 – 一個(gè)微妙但重要的區(qū)別.
因此,假設(shè)您正在以44100 Hz生成16位單聲道樣本.這是一個(gè)以所需速率創(chuàng)建咔嗒聲的功能.請記住,這種咔嗒聲對(duì)揚(yáng)聲器(和你的耳朵)來說是不好的,所以如果你真的使用它,請以低音量播放. (此外,此代碼未經(jīng)測試 – 只是為了演示這個(gè)概念)
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設(shè)置速度后,可以重復(fù)調(diào)用generateMetronomeSamples()函數(shù)生成的樣本,并使用JavaSound將輸出流式傳輸?shù)綋P(yáng)聲器. (請參閱JSResources.org以獲得一個(gè)很好的教程)
一旦你有了這個(gè)工作,你就可以用從WAV或AIFF或短音或其他任何東西獲得的聲音來代替刺耳的咔嗒聲.
總結(jié)
以上是生活随笔為你收集整理的用java设计节拍器_具有高速的Java节拍器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 办信用卡没接到电话怎么办 办信用卡没有回
- 下一篇: java自适应table_Java 设置