我需要在Java中创建一个函数,为音频添加一定频率和长度的音符。我的频率为双倍,音符长度以毫秒为单位。
完整功能描述:
This method takes one AudioInputStream and adds the sound of a certain pure frequency to the FRONT of it, lasting a certain length of time.
So the method takes two additional parameters: frequency and noteLengthInMilliseconds. The amplitude of the additional sound should be 64*256.
但是,我需要在帧中以及字节和Ints中找到音符的长度。
此外,关于如何将注释创建为样本数据数组(使用java.sound.sampled包)的任何建议都会有所帮助。
FRAME&样本率:44100.0hz
编码:PCM_SIGNED
答案 0 :(得分:1)
由于您的帧速率和采样率相同,我们假设您指的是PCM帧。 PCM帧是每个通道一个样本。如果您只有一个音频通道,每个样本16位,则每两个字节获得一个帧。如果每个样本有16位立体声音频,则每四个字节就会得到一帧。
要计算出长度,请取出采样率并将其分开。如果我的采样率为44.1 kHz,我想要一个音符持续半秒:
44,100 * 0.5 = 22,050 samples (22,050 frames)
如果您知道音频是16位,并且只有一个频道,那么就从那里开始:
22,050 * 2 (bytes per channel) * 1 (channels) = 44,100 bytes
答案 1 :(得分:1)
帧中的长度是一个简单的计算,它依赖于AudioFormat中的信息。具体来说,检查属性" frameRate"。 frameSize属性覆盖每帧的字节数。
使您的音频数据阵列涉及几个步骤。可以通过运行Math.sin函数来创建纯音的值。 Math.PI * 2相当于一个完整的周期(我希望你已经知道了 - 这是非常基本的),所以使用除法来计算每一步的增量有多小。
Math.sin函数的结果是-1和1之间的双倍。您必须将此数字转换为适合赋值的数据范围。这是通过将音频值乘以因子来完成的。例如,乘以32767将导致填充Short或16位有符号的范围。
从Short到bytes的转换部分取决于你是big-endian还是little-endian。此外,您还必须管理是否有多个曲目(例如,立体声很常见)。所有这些步骤都已在其他Stackoverflow帖子中介绍过。
如果您拥有数据阵列,它如何与现有音频结合使用,部分取决于您是输出音频还是尝试创建要导出的新wav文件。 Java Tutorial Audio Trail的部分内容包括播放,保存文件,以及文件格式和格式转换的优秀部分(强烈建议您阅读本文)。