跳至主要內容

高级功能

大约 4 分钟

高级功能

本页面讲解 DyNode 包含的进阶编辑功能。

表达式

注意

这是一个十分初期的实验性的功能,其可能会在接下来几个版本中频繁发生变动,且使用前建议对项目进行必要的备份

使用 0 来输入表达式。

一个合法的表达式是由一系列运算符、数字与变量排列组合构成的一个有意义的式子,例如:a=10+b*c100>90等。

表达式支持基本的四则运算符 +,-,*,/,%,位运算符 <<,>>,|,&,逻辑运算符 &&,||,!,关系运算符 >,<,>=,<=,==,!=,赋值 = 等。

你可以以符合直觉的方式以类似C语言的语法来撰写该表达式,一些合法的表达式例子如下:

a=(10+20)*30     // a=900
b=a              // b=900
b=a=20           // b=(a=20),右结合
c=10*20/20       // c=(10*20)/20,左结合

你可以通过表达式的计算来批量修改全部音符/选中音符的属性。

当前支持的属性变量见下表:

属性作用单位音符限制
time音符所在的时间ms
pos音符所在的位置
wid音符的宽度
len音符的持续时间msHOLD
htime音符头部的所在时间msHOLD
etime音符尾部的所在时间msHOLD

表达式在每个音符上的计算是独立的。表达式计算的过程可以概括如下:

  • 根据音符的属性初始化表达式的变量。
  • 计算表达式,中途表达式的变量产生变化。
  • 读取表达式的变量,根据变量的变化修改音符的属性。

在 DyNode 中,输入的表达式以 ; 分隔,他们将依次按顺序执行。变量的存储类型为双精度浮点数。

特别的,一些变量存在音符限制,这意味着他们只在一部分音符上能够生效。所有表达式的计算都将忽略 SUB 类型的音符(HOLD 尾部音符),详见 HOLD 属性的修改

下面是一些表达式的合法实例,其中一行代表一个例子:

wid=wid*2                   // 音符的宽度翻倍
pos=2.5                     // 音符的位置全部设置为2.5
time=time+10                // 音符的所在时间+10ms(添加音符延迟)

pos=2*2.5-pos               // 将音符按照屏幕的中线进行对称(屏幕中线的位置为2.5)
time=time/1.5;len=len/1.5   // 谱面1.5倍速(所有音符的时间除以1.5,所有HOLD的长度除以1.5)
a=20;time=a                 // 定义变量a,并将a赋值给time

HOLD 属性的修改

所有表达式的计算都将忽略 SUB 类型的音符,取而代之的是针对 HOLD 类型的音符存在一些特殊的属性变量。

属性作用单位
len音符的持续时间ms
htime音符头部的所在时间ms
etime音符尾部的所在时间ms

这意味着当你修改 HOLD 的 time 属性时,它实际不会修改 HOLD 的持续时间,也即修改 time 意味着将 HOLD 进行整体的移动而非头部与尾部分别进行修改。

如果你想实现头部与尾部分别进行修改,你需要修改 htimeetime 属性,而非 time 属性。

你可能发现这三个属性实际上会产生冲突,即若你修改了 htimeetime,那么 len 属性理论上也会发生变化,但当前在表达式的计算过程中变量不会绑定,也即一个变量不会因为另一个变量的变动而变动。

在实际的操作中,我们不推荐你在一个表达式中同时出现两个与 HOLD 属性相关的变量。以下是 DyNode 对 HOLD 属性相关变量冲突的处理方法:

  • time 属性与 htime 属性同时被修改,htime 的修改将覆盖 time 的修改。
  • len 属性与 etime 属性同时被修改,len 的修改将覆盖 etime 的修改。

下面是一些合法的修改 HOLD 属性的表达式例子:

htime=htime+10;etime=etime-10       // 所有HOLD音符的头部时间+10,所有HOLD音符的尾部时间-10
len=len/2                           // 所有HOLD的持续时间除以2
htime=100                           // 修改所有HOLD音符的头部时间为100
htime=100;len=100                   // 等价于 time=100;len=100