java - 无限期地播放正弦波 - java
问题描述
我正在尝试制作一段可以连续播放正弦波的代码。我希望能够播放 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 库或者我只是犯了一个愚蠢的错误?提前致谢。
解决方案
对于这个特定的想法,您可以使用
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++;
}
或者长度为 4 就足够了。
推荐阅读
- c++ - 默认情况下停用预编译的标头 Visual Studio C++
- tensorflow - mobilenet迁移学习后验证准确率低
- r - read.csv() 中的非英文字符 - R
- c - printf() 精度
- apache-nifi - Apache Nifi中PutHBaseRecord中具有多个字段的行标识符
- amazon-web-services - “kubectl”未从我的本地 Windows 工作站连接到 aws EKS 集群
- javascript - 如何在 Jasmine 的单元测试中模拟 super.ngOnInit()?如何在基类/父类方法上创建间谍以仅涵盖派生/子类代码?
- postgresql - 使用 Codeigniter 3.1.10 将数组和 JSON 插入 PostgreSQL 时出错
- javascript - 快速回复 Facebook Messenger 问题
- c# - C# 中的单行 if-else