我们不允许为书籍、工具、软件库等寻求推荐的问题。你可以编辑问题,这样就可以用事实和引文来回答问题。
Closed 3 years ago.
我正在考虑用Java编写一个音频合成器,想知道是否有人对编写这样的程序有任何建议或良好的资源。我正在寻找有关生成原始声波的信息,如何将其输出为可用的形式(在扬声器上播放),以及有关该主题的一般理论。谢谢大家。
我们不允许为书籍、工具、软件库等寻求推荐的问题。你可以编辑问题,这样就可以用事实和引文来回答问题。
Closed 3 years ago.
我正在考虑用Java编写一个音频合成器,想知道是否有人对编写这样的程序有任何建议或良好的资源。我正在寻找有关生成原始声波的信息,如何将其输出为可用的形式(在扬声器上播放),以及有关该主题的一般理论。谢谢大家。
这个问题基本上是关于将函数映射到数字数组的问题。一种支持一流函数的语言在这里会非常方便。
Check out http://www.harmony-central.com/Computer/Programming and http://www.developer.com/java/other/article.php/3071021 for some Java-related info.
如果您不知道声音数据编码的基本概念,请阅读http://en.wikipedia.org/wiki/Sampling_rate
规范的WAVE格式非常简单,请参阅http://www.lightlink.com/tjweber/StripWav/Canon.html。一个标题(前44个字节)+波形数据。您不需要任何库来实现这一点。
在C/C++中,相应的数据结构看起来像这样:
typedef struct _WAVstruct
{
char headertag[4];
unsigned int remnantlength;
char fileid[4];
char fmtchunktag[4];
unsigned int fmtlength;
unsigned short fmttag;
unsigned short channels;
unsigned int samplerate;
unsigned int bypse;
unsigned short ba;
unsigned short bipsa;
char datatag[4];
unsigned int datalength;
void* data; //<--- that s where the raw sound-data goes
}* WAVstruct;
我对Java不太确定。我想您将不得不用“class”替换“struct”,用“char[]data”或“short[]data”或者“int[]data”替换“void*data”,这与bipsa字段中定义的每个样本的位数相对应。
要用数据填充它,您可以在C/C++中使用类似的东西:
int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
result->headertag[0] = R ;
result->headertag[1] = I ;
result->headertag[2] = F ;
result->headertag[3] = F ;
result->remnantlength = 44 + datalength - 8;
result->fileid[0] = W ;
result->fileid[1] = A ;
result->fileid[2] = V ;
result->fileid[3] = E ;
result->fmtchunktag[0] = f ;
result->fmtchunktag[1] = m ;
result->fmtchunktag[2] = t ;
result->fmtchunktag[3] = ;
result->fmtlength = 0x00000010;
result->fmttag = 1;
result->channels = channels;
result->samplerate = samplerate;
result->bipsa = bipsa;
result->ba = channels*bipsa / 8;
result->bypse = samplerate*result->ba;
result->datatag[0] = d ;
result->datatag[1] = a ;
result->datatag[2] = t ;
result->datatag[3] = a ;
result->datalength = datalength;
result->data = data; // <--- that s were the data comes in
return 0; // an error code, not implemented, yet ...; in Java: return result
}
同样,我对Java不太确定,但如果将void指针转换为与比特率相对应的数组,那么转换应该很简单。
然后简单地将整个结构写入一个文件,以获得一个可播放的波形文件。
查看Frinika。这是一个用Java(开源)实现的功能齐全的音乐工作站。使用API,您可以通过合成器运行midi事件,读取原始声音输出,并将其写入WAV文件(请参阅下面的源代码链接)。
附加信息:
在攻读学位期间,我的论文项目是创建一个基于Java的模块化合成器,我就读的大学认为公开我的报告是合适的:
我不知道这是否有帮助,但如果你能用MIDI做任何事情,你应该看看JFuge。