文本阅读:
94第4章自动化与单音管理
侧输入口为一个标志,用来表明是开始还是停止一个具有给定标签的单音(非零数字意味着
"开始",零意味着"停止"。在输出口方面,左侧输出的是单音的编号,中间输出的是标签,右侧输出的是开始/停止标志。在MIDI应用中,标签可以是音高,而开始/停止标志可以是该音符的力度。
makenote】:提供被延时以后的音符关消息,与音符开消息相匹配。各输入口分别是标签、开始/停止标志(用于MIDI时是"音高"和"力度")以及用毫秒表示的所需持续时间。
当接收到"标签/标志"这对输入时,它们将在输出口输出;随后,经过这个延时以后,该标签与标志0将会再次发送,用以在所需的持续时间以后停止这个音符。
"音符"消息包含音高、幅度、持续时间、样本编号、样本中的开始位置、上升时间和衰减时间等字段。例如,(假设是由rnote对象接收的)消息6090100025001020
表示播放一个音符,其音高为60(MIDI单位),幅度为90dB,1秒长,来自名为"sample2"
的波表,从波表中500ms处的样点开始,上升时间和衰减时间分别为10和20ms。
在把该消息解包成7个分量以后,该音色为该音符创建一个标签。为此,在7个参数中的最后一个单独出现以后,第一个tbf对象会输出一个"bang"消息。+、f和mod对象组合在一起构成一个计数器,它会在100万步以后开始重复,这基本上会为该音符生成一个唯一的编号。
下一步是用poly对象决定哪个单音播放哪个音符。poly对象需要分立的消息来开始和停止任务(比如音符)。因此标签和持续时间先馈送给 makenote对象,该对象的右输出口输出一个标志("力度"),左输出口则将该标签再次输出。对于makenote接收到的每个标签,都会输出2对数字,一对用来开始该音符,另一对则在经过了等于音符持续时间的延时以后用来停止该音符。
在让poly处理这些分立的输入以后,我们现在还需要对这些消息进行剥离,让其与各个音符的结尾相对应,因为我们实际上只需要在"持续时间"字段上对各个"音符"消息进行合并。完成这项工作的是stripnote对象。最后,我们将已经计算的单音编号与开始的7个参数(pack对象)规划在一起,因此pack对象的输出看上去是这样的:
46090100025001020
其中"4"为poly对象输出的单音编号。单音编号用来让route对象把该消息路由给合适的单音。相应的sampvoice对象获取的是以"60"开始的那个原始列表。
在sampvoice 对象内部(图4.21),该消息用来控制tabread4~及其周围的line~和vline~对象。与前例中的采样器一样,这个控制在经过一个5ms的延时以后才发生。不过,这里我们必须存储该音符的7个参数(在前例中没有这些参数)。这是通过6个f对象以及最右侧的delay对象的右输入口完成的。这些数值在延时5ms之后被使用。这与第79页描述