音乐乐谱的建模与实现
1. 乐谱基础概念
在音乐乐谱中,存在着时间线来指示节奏(tempo)或节拍(time signature)的指定与变化。元素与位置的组合被称为事件(event),这里的元素并非单纯的节奏和节拍指定,而是这些指定与时间位置的结合。有两条时间线分别表示节奏事件集和节拍事件集。
乐谱通常有多个乐器参与,每个乐器一般有一个或多个谱表(staffs)或声部(voices),这体现了乐器的多样性,每个谱表对应一个声部。例如,可能有两支单簧管、四支法国号,甚至一架钢琴使用两个谱表。因此,每种乐器类型与其参与的声部之间存在一对多的关系。
为了应对这种复杂性,引入了乐器声部(InstrumentVoice)的概念。它引用某种乐器类型,并且有一组由该特定乐器类型演奏的声部。通常,在整个乐谱中,每种乐器类型的乐器声部是唯一的,但并非必须如此。在实际应用中,乐器到声部的分配具有灵活性。
2. 乐谱的类模型
将概念模型转换为 Python 类模型相对直接。主要的类包括 InstrumentVoice、Voice、EventSequence 等,它们对应着前面提到的概念模型元素。
以下是相关类关系的说明:
| 线条类型 | 含义 |
| ---- | ---- |
| 虚线 | 表示引用或指针关系 |
| 实心箭头 | 表示一对多关系 |
| 白头箭头 | 表示继承关系 |
乐谱类模型大致分为两部分:一部分涉及乐器和声部的组织,另一部分涉及节奏和节拍事件的管理。前者更为复杂,后者主要涉及一些简单的继承和事件集合管理。