初学者数字合成器
时间:2020-03-05 18:45:35 来源:igfitidea点击:
我正在考虑用Java编写音频合成器,并且想知道是否有人对编写这样的程序有任何建议或者良好的资源。我正在寻找有关生成原始声波,如何将其输出为可用形式(通过扬声器播放)以及有关该主题的一般理论的信息。谢谢你们。
解决方案
回答
看看Frinika。它是用Java(开源)实现的功能齐全的音乐工作站。使用API,我们可以通过合成器运行midi事件,读取原始声音输出,并将其写入WAV文件(请参见下面的源代码链接)。
添加信息:
- Frinika开发人员专区
- Midi渲染器工具的源代码
回答
- 这个问题基本上是关于将函数映射到数字数组。支持一流功能的语言在这里非常有用。
- 请访问http://www.harmony-central.com/Computer/Programming和http://www.developer.com/java/other/article.php/3071021了解一些与Java相关的信息。
- 如果我们不了解编码声音数据的基本概念,请阅读http://en.wikipedia.org/wiki/Sampling_rate
- 规范的WAVE格式非常简单,请参见http://www.lightlink.com/tjweber/StripWav/Canon.html。标头(前44个字节)+ wave数据。我们不需要任何库即可实现该功能。
在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。我想我们必须将"结构"替换为"类",将" void *数据"替换为" char []数据"或者" short []数据"或者" int []数据",这对应于每位的位数样本,如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,但是如果将空指针转换为对应于比特率的数组,则转换应该很简单。
然后,只需将整个结构写入文件即可获得可播放的wave文件。
回答
在攻读学位期间,我的论文项目是创建一个基于Java的模块化合成器,而我所研究的大学认为适合公开发表我的报告:
Java中基于软件的模块化合成器
回答
我不知道这是否有帮助,但是如果我们可以将MIDI用于任何事物,则应查看JFuge。