高级功能
高级功能
本页面讲解 DyNode 包含的进阶编辑功能。
表达式
注意
这是一个十分初期的实验性的功能,其可能会在接下来几个版本中频繁发生变动,且使用前建议对项目进行必要的备份。
使用 0 来输入表达式。
一个合法的表达式是由一系列运算符、数字与变量排列组合构成的一个有意义的式子,例如:a=10+b*c
,100>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 | 音符的持续时间 | ms | HOLD |
htime | 音符头部的所在时间 | ms | HOLD |
etime | 音符尾部的所在时间 | ms | HOLD |
表达式在每个音符上的计算是独立的。表达式计算的过程可以概括如下:
- 根据音符的属性初始化表达式的变量。
- 计算表达式,中途表达式的变量产生变化。
- 读取表达式的变量,根据变量的变化修改音符的属性。
在 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 进行整体的移动而非头部与尾部分别进行修改。
如果你想实现头部与尾部分别进行修改,你需要修改 htime
与 etime
属性,而非 time
属性。
你可能发现这三个属性实际上会产生冲突,即若你修改了 htime
与 etime
,那么 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