音乐节奏、动态与表示的技术解析
1. 可变节奏函数的开发与应用
在开发节奏函数时,需要在两个方面加以注意。首先,函数的取值范围必须是现实合理的,节奏值不能为负数,当然也不能为 0,同时通常不应超过 300,且要以每分钟节拍数(BPM)为有意义的单位。其次,节奏设置要与周围的音乐事件相协调,就像图 11.11 所示,节奏曲线在前后事件之间应实现无缝过渡,虽然可以有跳跃,如使用节奏事件时那样,但必须符合音乐逻辑。
可变节奏给 MIDI 事件生成和时间转换带来了困难,因为节奏在整个音符时间间隔内不会保持固定。为解决这个问题,我们采用“离散化”函数的方法,将函数分解成小片段,在短时间内近似准确的节奏,用静态节奏事件来完善节奏事件序列,替代节奏函数。
具体来说,我们要在规则的离散实时时刻对节奏函数进行采样,并将采样的节奏事件替换事件序列中的节奏函数事件。采样是在离散实时进行的,这意味着:
- 使用实时而非全音符时间进行采样。
- 在节奏函数的全音符时间域上,以小的实时间隔进行采样。
增量采样实时 ∆𝑡 应足够小,以使产生的节奏采样值变化看起来是无缝的,与节奏函数的行为相匹配。读者可以从 ∆𝑡 = 50 毫秒开始,根据需要进行调整。
计算 ∆𝜏 的公式为:
∆𝜏 = 𝑓(𝜏) ∗ ∆𝑡 ∗ 𝑏𝑒𝑎𝑡_𝑑𝑢𝑟𝑎𝑡𝑖𝑜𝑛 / (60 * 1000)
以下是采样节奏函数的代码示例:
def sample_tempo(tempo_function_event, delta_ms, beat_d