Symi 语法
音高
倍音、频率、音名、平均律等
Symi支持多种方式来指定音高信息。
频率
直接使用赫兹数值指定音高,例如:
261.63,440,261.63,523.26,
使用频率指定的音高不受基准音的影响。频率必须是正数,可以是整数或小数。
此外,由于频率在实际编曲中较少用到,在平均律的语法糖启用下,整数会被视作平均律级数而非频率值解析,具体场景见下文。
音名
使用音名指定音高,例如:
C4,
D#4,
Bb3,
音名后的八度数字是可选的,如果省略,则会解析为从基准音向上数的第一个该音名。例如:
<A4=440>
A, // 解析为A4
B, // 解析为B4
C, // 解析为C5
可以使用+或-来指定相对于上述解析结果的八度偏移,具体可见音高后缀语法。例如:
<C4=261.63>
C, // 解析为C4
C+, // 解析为C5
C-, // 解析为C3
C++, // 解析为C6
音名对应的频率会受到基准音的影响,例如:
<C4=440>
C, // 解析为440Hz
A, // 解析为739.98Hz
倍音
使用相对于基准音的频率倍数指定音高,语法为分子/分母,例如:
<C4=261.63>
1/1, // 解析为261.63Hz
3/2, // 解析为392.44Hz
2/1, // 解析为523.26Hz
倍数必须写成分数的形式,并且分子分母都必须是正整数。
平均律
使用相对于基准音的平均律级数指定音高,语法为级数\平均律数,例如:
<C4=261.63>
0\12, // 解析为261.63Hz
49\31, // 解析为782.54Hz
-8\17, // 解析为188.81Hz
级数可以是整数,但是平均律数必须是正整数。
在书写了一个平均律音高后,平均律语法糖被启用,此时整数会被解析为平均律级数而非频率值,例如:
<C4=261.63>
0\12, // 解析为261.63Hz
7, // 解析为7\12,即392.00Hz
5\31, // 解析为292.58Hz
29, // 解析为29\31,即500.38Hz
如果需要关闭平均律语法糖,再书写一个小数频率即可,例如:
<C4=261.63>
0\12, // 解析为261.63Hz
10, // 解析为10\12
440.0, // 关闭平均律语法糖,解析为440Hz
5, // 解析为5Hz
音分
使用相对于基准音的音分数值指定音高,语法为音分数值c,例如:
<C4=261.63>
0c, // 解析为261.63Hz
20c, // 解析为264.67Hz
-140c, // 解析为241.30Hz
音分数值只能是整数,正数表示升高,负数表示降低。
音高链
音高链允许通过多个音高信息的组合来指定一个音高,运算符号@从右向左运算,例如:
<C4=261.63>
-20c@G, // 解析为G4上降低20音分的音高
2/1@-140c@A, // 解析为A4上,降低140音分,再把频率乘以2的音高
技术上其实现方式为,临时将右侧的音设置为基准音,用于解析左侧的音高信息,如此递归进行。
音高链中的每一段都可以是:
- 普通音高(音名、频率、倍音、平均律、音分)
- 宏标识符(仅支持可展开为单个音高链的 alias macro)
音高后缀 + / -
任意音高项后都可以直接跟若干个+或-。
+等价于在该位置插入@2/1-等价于在该位置插入@1/2
示例:
3/2+, // 等价于 3/2@2/1
3/2--, // 等价于 3/2@1/2@1/2
C4+@G-, // 混合用法
它们只是音高链语法糖,不改变@右结合的计算规则。
与宏结合
音高链可直接与宏结合,例如:
a = 3/2@5/4 // alias macro(单行、无冒号)
C4@a,
当标识符出现在音高链中时,必须能解析为一个 alias macro。
更多宏语法见宏。