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。

更多宏语法见