java - 无限期播放正弦波-Java

标签 java audio sine-wave

我正在尝试编写一段可以连续播放正弦波的代码。我希望能够播放MIDI音符的频率。 Java中的MIDI库感觉有些草率(当我告诉它播放时,在按下键和弹奏音符之间会有很小的延迟)。

我看过一个示例,在该示例中,您生成了确定长度的正弦波,然后通过给SourceDataLine一个字节数组来播放它。
这行得通,但字节数组只能这么长,最终将停止播放。

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

int i = 0;
int sampleRate = 8000;
int freq = 440;

while (true) {
    double samplingInterval = (double) (sampleRate / freq);
    double angle = (2.0 * Math.PI * i) / samplingInterval;
    byte toPlay = (byte) (Math.sin(angle) * 127);
    line.write(new byte[] {toPlay}, 0, 1);
    i++;
}


我希望这会给我恒定的440hz频率输出,但是却给了我这个错误:
java.lang.IllegalArgumentException: illegal request to write non-integral number of frames (1 bytes, frameSize = 2 bytes)
如果没有,是否有办法加快Java中的MIDI库,或者我刚刚犯了一个愚蠢的错误?提前致谢。

最佳答案

音频帧是一个或多个同时定时的音频样本。就您而言,是立体声(frames ==2)。在流中,它们通常是交错的(例如L,R,L,R ....)。

您可以通过编写每个样本两次来解决此问题。

虽然Java(或其他具有世界末日垃圾回收功能的JITd语言运行时)从来都不是低延迟音频软件的实现选择,但我怀疑您检测到的“草率”实际上是漫长的音频缓冲时间:默认设置缓冲期的时间可能会占很大一部分。

关于java - 无限期播放正弦波-Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57346645/

相关文章:

java - PostgreSQL 上带有参数名称的 CallableStatement

java - 为什么这个流不返回任何元素?

audio - 在 Livecode 中播放多个声音文件

matlab - 如何将正弦波转换为音频?

javascript - 动画正弦波,固定起点和终点

JavaCPP 在函数消歧方面失败

显示奖励视频时 Admob 中的 java.lang.NullPointerException

audio - 如何在 Ionic 2 上录音和播放?

iphone - 如何预加载声音?

arrays - 寻找正弦波阵列的频率