你如何在数据结构中表现音乐?

时间:2009-01-22 03:43:27

标签: data-structures music-notation

您如何为使用常规标准符号编写的单个乐器制作简单的乐谱?当然,有很多图书馆正是这样做的。我对在数据结构中表示音乐的不同方式感到好奇。什么运作良好,什么不运作?

忽略一些像动态这样棘手的方面,显而易见的方法是将所有内容直接翻译成对象 - 得分是由Notes组成的。我想,合成将意味着计算每个音符的开始/结束时间并混合正弦波。

明显的方式是好方法吗?有什么其他方法可以做到这一点?

6 个答案:

答案 0 :(得分:7)

许多人在做新的西方音乐符号项目时都会使用MusicXML作为起点。它提供了音乐符号的完整表示,您可以将其分组以满足您的需求。现在有一个XSD架构定义,像ProxyMusic一样用于创建MusicXML对象模型。 ProxyMusic在Java中创建它们,但您应该能够使用其他语言中的其他XML数据绑定工具执行类似的操作。

正如一位MusicXML客户所说:

“就我而言,你对MusicXML的所有努力工作的一个非常重要的好处是,我将它用作一个清晰,结构化,非常'真实世界实用'的音乐'是'的规范,以便设计并实现我的应用程序的内部数据结构。“

有更多可用信息 - XSD和DTD,示例文件,教程,支持的应用程序列表,出版物列表等 -

http://www.makemusic.com/musicxml

对于标准乐谱中的简单乐谱,MIDI不是一个非常好的模型。 MIDI缺少音乐符号的许多基本概念。它被设计为性能格式,而不是表示格式。

音乐符号确实不是等级的。由于XML是分层的,因此MusicXML使用成对的起止元素来表示非分层信息。本机数据结构可以更直接地表示事物,这是MusicXML只是数据结构起点的一个原因。

为了更直接地表示捕获其同时水平和垂直结构的音乐符号,请查看Humdrum格式,该格式使用更多电子表格/点阵模型。 Humdrum特别适用于音乐学和音乐分析应用,其数据结构特别适用。

答案 1 :(得分:5)

MIDI文件是执行此操作的常用方法。 MIDI是一种标准格式,用于存储有关音符的数据,包括开始和结束时间,音符音量,播放的乐器以及各种特殊特征;您可以找到大量预先编写的库(包括一些开源),用于读取和写入文件,并根据数组或对象表示文件中的数据,尽管它们通常不会通过为每个音符设置一个对象来实现,加起来大量的内存开销。

MIDI中定义的乐器只是1到128之间的数字,它们具有象征性的名字,如小提琴或小号,但MIDI本身并没有说明乐器的实际声音。这是合成器的工作,它将高级MIDI数据转换为声音。原则上,是的,您可以通过叠加正弦波来创建任何声音,但这在实践中效果不佳,因为一旦您并行播放几首曲目,它就变得计算密集;另外,当你试图重现乐器的真实声音和人类演奏它的表现力时,一个简单的傅里叶谱(正弦波的相对强度)是不够的。 (我写了一个简单的合成器来做到这一点,所以我很难知道它可以产生一个不错的声音)在合成科学中进行了大量的研究,更普遍的是DSP(数字信号处理),所以你应该如果你愿意的话,当然能够找到大量的书籍和网页来阅读。

此外,这可能只是与问题相关,但您可能对名为ChucK的音频编程语言感兴趣。它是由人们在编程和音乐的十字路口设计的,你可以通过玩它来很好地了解声音合成的当前状态。

答案 2 :(得分:3)

数据结构中的音乐,标准符号,......

听起来你会对LilyPond感兴趣。

关于乐谱的大多数事情几乎都是纯机械的(即使是复杂的,非平凡的乐谱部分也有规则和指导),LilyPond在处理所有这些机械方面做得很漂亮。剩下的是在任何文本编辑器中编写简单的输入文件。除PDF之外,LilyPond还可以生成Midi文件。

如果您有这种倾向,可以使用程序实时生成文本文件,并调用LilyPond将其转换为符号和midi文件。

我怀疑你能找到比LilyPond的输入文件更完整,更简洁的表达音乐的方式。

请理解 音乐和音乐符号不是等级,并且不能通过严格遵守等级思维来建模(好)。 Read this了解有关该主题的信息。

玩得开心!

答案 3 :(得分:2)

嗯,有趣的问题。

实际上,我很想把它和Composite一起变成Command模式。这有点像正常的OO方法,因为你在某种意义上使模型对象动词而不是名词。它会是这样的:

注意是一个有一种方法的类,play(), and a ctor takingand音。“

你需要一个定义合成器行为的乐器:音色,攻击等。

您将获得一个具有TimeSignature的分数,并且是一个包含Measures的复合模式; “措施”包含说明。

实际上播放它意味着解释其他一些东西,比如其他容器的Repeats和Codas。要播放它,您可以解释Composite的层次结构,将注释插入队列;当笔记根据tempi在队列中移动时,每个Note都会调用其play()方法。

嗯,可能会反过来;每个音符作为乐器的输入,通过根据需要合成波形来解释它。这又回到了原来的计划之类。

分解的另一种方法是应用Parnas定律:你分解以保持需求可能改变的秘密地方。但我认为最终会出现类似的分解;你可以改变时间签名和调音,你可以改变乐器---如果你用小提琴,钢琴或马林巴演奏它,音符就不在乎了。

有趣的问题。

答案 4 :(得分:2)

我的音乐创作软件(请参阅我的个人资料中的链接)使用Notes作为主要单元(具有起始位置,长度,音量,平衡,发布持续时间等属性)。注释被分组为模式(具有自己的起始位置和重复属性),这些模式被分组到轨道(具有自己的乐器或乐器)。

混合正弦波是合成声音的一种方法,但它非常罕见(它很昂贵且听起来不太好)。波表合成(我的软件使用)计算成本低廉且相对容易编码,并且在它可以产生的各种声音方面基本上是无限的。

答案 5 :(得分:1)

模型的有用性只能在给定的上下文中进行评估。你试图用这个模型做什么?

许多受访者表示音乐是非等级的。我不同意这一点,但建议可以从许多不同的角度分层次地观看音乐,每个观点都会产生不同的等级。我们可能希望将其视为语音列表,每个语音都有开/关/速度/等属性的注释。或者我们可能希望将其视为垂直声响,以进行谐波分析。或者我们可能希望以适合对位分析的方式查看它。或许多其他可能性。更糟糕的是,我们可能希望从单一目的的不同观点来看待它。

为了产生物种对抗,分析和声和音调中心以及许多其他事情,我曾多次尝试模拟音乐,我一直对音乐不愿意屈服于我的建模技巧感到沮丧。我开始认为最佳模型可能是关系型的,仅仅是因为在很大程度上,基于数据关系模型的模型力求不对使用环境采取观点。但是,这可能只是将问题推到了其他地方。