对于用常规标准符号编写的单个乐器,您如何为简单的乐谱建模?当然,有很多图书馆正是这样做的.我对在数据结构中表示音乐的不同方式感到好奇.什么运作良好,什么不运作?
忽略一些像动态这样棘手的方面,显而易见的方法是将所有内容直接翻译成对象 - 得分是由Notes组成的.我想,合成将意味着计算每个音符的开始/结束时间并混合正弦波.
这显然是一种好方法吗?有什么其他方法可以做到这一点?
许多人在做新的西方音乐符号项目时都会使用MusicXML作为起点.它提供了音乐符号的完整表示,您可以将其分组以满足您的需求.现在有一个XSD架构定义,像ProxyMusic一样用于创建MusicXML对象模型.ProxyMusic在Java中创建它们,但是您应该能够使用其他语言中的其他XML数据绑定工具执行类似的操作.
正如一位MusicXML客户所说:
"就我而言,你对MusicXML的所有努力工作的一个非常重要的好处是,我将它用作一个清晰,结构化和非常'真实世界的实用'规范,用于设计和实现音乐'是'我的应用程序的内部数据结构."
有更多可用的信息 - XSD和DTD,示例文件,教程,支持的应用程序列表,出版物列表等 - at
http://www.makemusic.com/musicxml
对于标准乐谱中的简单乐谱,MIDI不是一个非常好的模型.MIDI缺少音乐符号的许多基本概念.它被设计为性能格式,而不是表示格式.
音乐符号确实不是等级的.由于XML是分层的,因此MusicXML使用成对的起止元素来表示非分层信息.本机数据结构可以更直接地表示事物,这是MusicXML只是数据结构起点的一个原因.
有关表示捕获其同时水平和垂直结构的音乐符号的更直接方式,请查看使用更多电子表格/点阵模型的Humdrum格式.Humdrum特别用于音乐学和音乐分析应用,其数据结构特别有效.
MIDI文件是通常的方法.MIDI是一种标准格式,用于存储有关音符的数据,包括开始和结束时间,音符音量,播放的乐器以及各种特殊特征; 您可以找到大量预先编写的库(包括一些开源),用于读取和写入文件,并根据数组或对象表示文件中的数据,尽管它们通常不会通过为每个音符设置一个对象来实现,加起来大量的内存开销.
MIDI中定义的乐器只是1到128之间的数字,它们具有象征性的名字,如小提琴或小号,但MIDI本身并没有说明乐器的实际声音.这是合成器的工作,它将高级MIDI数据转换为声音.原则上,是的,您可以通过叠加正弦波来创建任何声音,但这在实践中效果不佳,因为一旦您并行播放几首曲目,它就变得计算密集; 另外,当你试图重现乐器的真实声音和人类演奏它的表现力时,一个简单的傅里叶谱(正弦波的相对强度)是不够的.(我写了一个简单的合成器来做到这一点,所以我很难知道它可以产生一个体面的声音)
此外,这可能只是与问题相关,但您可能对名为ChucK的音频编程语言感兴趣.它是由人们在编程和音乐的十字路口设计的,你可以通过玩它来很好地了解声音合成的当前状态.