问题描述
什么是产生在Java中的所有频率的正弦波声音最简单的方法?
样本量超过2个字节会有所帮助,但它其实并不重要。
What's the simplest way to generate a sine wave sound at any frequency in Java?A sample size more than 2 bytes would help, but it doesn't really matter.
感谢
推荐答案
请参见一个自包含的例子。
See Beeper
for a self-contained example.
也许更简单的东西?
这51行代码段(下面重复 - 间隔了单行和放大器;在线评论)作为链接的答案的顶部显示,大约是生成色调简单得(OK,你可以拿出5+线谐波)。
That 51 lines of snippet (repeated below - spaced out for single line & in-line comments) as shown at the top of the linked answer, is about as simple as generating a tone gets (OK, you can take out 5+ lines for the harmonic).
人们似乎认为它应该是建立在工具箱产生纯音的方法。实在不行,和需要一点点的计算进行一次。
People seem to assume it should be a method built into the toolkit to produce a pure tone. It is not, and takes a little calculating to make one.
/** Generates a tone, and assigns it to the Clip. */
public void generateTone()
throws LineUnavailableException {
if ( clip!=null ) {
clip.stop();
clip.close();
} else {
clip = AudioSystem.getClip();
}
boolean addHarmonic = harmonic.isSelected();
int intSR = ((Integer)sampleRate.getSelectedItem()).intValue();
int intFPW = framesPerWavelength.getValue();
float sampleRate = (float)intSR;
// oddly, the sound does not loop well for less than
// around 5 or so, wavelengths
int wavelengths = 20;
byte[] buf = new byte[2*intFPW*wavelengths];
AudioFormat af = new AudioFormat(
sampleRate,
8, // sample size in bits
2, // channels
true, // signed
false // bigendian
);
int maxVol = 127;
for(int i=0; i<intFPW*wavelengths; i++){
double angle = ((float)(i*2)/((float)intFPW))*(Math.PI);
buf[i*2]=getByteValue(angle);
if(addHarmonic) {
buf[(i*2)+1]=getByteValue(2*angle);
} else {
buf[(i*2)+1] = buf[i*2];
}
}
try {
byte[] b = buf;
AudioInputStream ais = new AudioInputStream(
new ByteArrayInputStream(b),
af,
buf.length/2 );
clip.open( ais );
} catch(Exception e) {
e.printStackTrace();
}
}
这篇关于正弦波声音发生器在Java中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!