时间
时间在Symi中是一个核心概念,所有事件都是基于时间发生的。本文使用时间戳来表示事件发生的时间点,使用时值来表示事件持续的时间长度。
时间戳
行内分隔记号
时间戳的主要推移方式是使用逗号 ,,每个 , 表示对应一个当前量化单位的时间。例如
(60)
{4}C,D,E,F,
上述内容表示在BPM=60、量化为四分音符的情况下,C、D、E、F分别在0秒、1秒、2秒、3秒时发生。
使用分号;可以临时将当前量化细分为更小的单位,例如:
(60)
{4}C;D;E,,,,
这里的两个分号将当前的四分音符量化平均分为三份,因此C、D、E分别在0秒、0.333秒、0.667秒时发生,后续的逗号将时间戳推移到下一拍的开始,即1秒。
换言之,在两个逗号之间有n个分号时,每个分号以及最后的逗号将时间戳推移1/(n+1)倍量化。
使用冒号:可以分隔同时发生的事件,例如:
(60)
{4}C:E:G,
上述内容表示在0秒时C、E、G同时发生,即一个C大三和弦。
上述记号可以组合使用,结合优先级为:冒号 > 分号 > 逗号。
根据上述描述可以发现,逗号总是将时间戳推移一个量化,而分号和冒号只是局部的细分和分组,并不会改变整体时间戳的推移。
小节分隔记号
如果一行出现了逗号或分号,则行末换行时会开始下一小节。
在一行的开头使用等号 =,表示在这一行结束时将时间戳重置回行首的时间戳,换言之这一行和下一行会同时播放。例如:
(60)
<D>
={4}D,C#-,B-,A-,
={4}F#,E,D,C#-,
{4}A,G,F#,E,
和
(60)
<D>
D:F#:A,C#-:E:G,B-:D:F#,A-:C#-:E,
是等价的,但是显然前者更清晰易读。此外,前者还可以实现在同一小节中有节奏完全不同的两个声部同时演奏。
时值
上述的逗号、分号、冒号等记号虽然会影响时间戳的推移,但并不直接表示事件的时值。
在没有时值标记的情况下,事件会持续到下一个分号或逗号的位置,例如:
(60)
{4}C,,E,F, //第一拍是C,第二拍休止,第三拍是E,第四拍是F
{4}C;;D, //第一拍的C持续1/3拍,休止1/3拍,再是1/3拍的D
简易标记
通过使用[]括起逗号,可以额外延长事件的持续时间,例如:
(60)
{4}C[,,],D, //第一拍是C,持续3拍,第四拍是D
{4}C:D[,],E,F, //第一拍是C和D,共同持续2拍,第三拍是E,第四拍是F
分数标记
通过 [分母:分子] 的形式可以将事件的持续时间指定为等同于若干分音符的时值。其中如果分子为1,可以和冒号一并省略。例如:
(60)
{4}C[8],D[8],E[8],F[8], //C,D,E,F分别持续一个八分音符
{4}C[8:3],;D,E[2],F, //C持续一个八分之三音符,D在第二拍的后半拍开始,持续半拍,E持续二分音符,F持续四分音符
使用分数标记可以极为灵活地指定时值,可以令事件之间重叠、断奏。分子分母均为正整数即可,分母不必是二的幂次。
分数标记还可以是负数,这种情况下事件的结束时间会被移动到开始时间,而开始时间则由时值决定。例如:
(60)
{4}C,D[-64]:E,-,F[-64]:G, //D和F在第2、4拍*之前*开始,并在第2、4拍结束,均持续一个64分音符。
这种语法主要用于便捷地实现装饰音,避免了计算复杂的量化和时间戳。
延音符号
使用短横线 - 可以延长事件的持续时间,其作用效果为将所有结束在当前时间戳的事件的时值延长至自身的结束时间。例如:
(60)
{4}C,-,-,D, //第一拍是C,持续3拍,第四拍是D
{4}C,-;D, //第一拍是C,持续1.5拍,D在第二拍的后半拍开始,持续半拍。
需要注意的是,延音符号会影响所有在当前时间戳(±0.1ms)结束的事件,无论是和弦、其他声部、之前已经被延长的事件甚至是宏中的事件,因此在复杂的环境中需要小心使用。
延音符号本身也可以被上述的其他方法指定时长以修改自身的持续时间,如{4}C,-[8],中的-[8]将使得延音符号持续一个八分音符的时值,从而使得C持续一个四分音符加一个八分音符的时值。
综合运用
当被:分隔的事件中有被指定了时值的事件时,时值会从后向前生效,例如:
(60)
{4}G:E[8]:C:C-[,,],,
C和C-均持续三拍,而E和G均持续一个八分音符。
:和;分隔的事件)的最后一个事件中使用简易标记[,,]。否则该标记中的逗号实际不会推移时间戳,这导致逗号的简写功能失效。