Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无限期播放正弦波-java_Java_Audio_Sine Wave - Fatal编程技术网

无限期播放正弦波-java

无限期播放正弦波-java,java,audio,sine-wave,Java,Audio,Sine Wave,我正在尝试制作一段可以连续播放正弦波的代码。我希望能够播放MIDI音符的频率。java中的MIDI库感觉有点马虎(当我告诉它播放时,按键和音符播放之间有一个小延迟) 我看到过这样一个示例:生成一个确定长度的正弦波,然后通过给SourceDataLine一个字节数组来播放它。 这是可行的,但字节数组只能如此之长,最终将停止播放 我的下一个想法是不断地向行中写入一个字节,计算下一行并继续。这是我的密码: inti=0; int-sampleRate=8000; intfreq=440; while(

我正在尝试制作一段可以连续播放正弦波的代码。我希望能够播放MIDI音符的频率。java中的MIDI库感觉有点马虎(当我告诉它播放时,按键和音符播放之间有一个小延迟)

我看到过这样一个示例:生成一个确定长度的正弦波,然后通过给
SourceDataLine
一个字节数组来播放它。 这是可行的,但字节数组只能如此之长,最终将停止播放

我的下一个想法是不断地向行中写入一个字节,计算下一行并继续。这是我的密码:

inti=0;
int-sampleRate=8000;
intfreq=440;
while(true){
双采样间期=(双)(取样器/频率);
双角度=(2.0*Math.PI*i)/samplingInterval;
字节toPlay=(字节)(数学sin(角度)*127);
写入(新字节[]{toPlay},0,1);
i++;
}
我希望这会给我一个频率为440hz的恒定输出,但它给了我这个错误:

java.lang.IllegalArgumentException:写入非整数帧(1字节,frameSize=2字节)的非法请求


如果没有,有没有办法加快java中MIDI库的速度,还是我犯了一个愚蠢的错误?提前感谢。

对于这个特别的想法,您可以使用

while (true) {
    double samplingInterval = (double) (sampleRate / freq);
    double angle = (2.0 * Math.PI * i) / samplingInterval;
    byte toPlay = (byte) (Math.sin(angle) * 127);
    byte[] data=new byte[1024];
    for(int j=0; j<data.length; j++) data[j]=toPlay;
    line.write(data, 0, data.length);
    i++;
}
while(true){
双采样间期=(双)(取样器/频率);
双角度=(2.0*Math.PI*i)/samplingInterval;
字节toPlay=(字节)(数学sin(角度)*127);
字节[]数据=新字节[1024];

对于(int j=0;j音频帧是一个或多个同时计时的音频样本。在您的情况下,立体声(
帧==2
)。在流中,它们通常是交错的(例如,L、R、L、R…)

您可以通过将每个示例编写两次来解决此问题

虽然Java(或任何其他带有stop the world garbage collection的JITd语言运行时)从来都不是低延迟音频软件的实现选择,但我怀疑您检测到的“邋遢”实际上是一个很长的音频缓冲期:缓冲期的默认设置可能只是一秒钟的一小部分