我正在尝试制作一段可以连续播放正弦波的代码。我希望能够播放 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 库,或者我只是犯了一个愚蠢的错误?提前致谢。
噜噜哒
Cats萌萌
相关分类