跳转到内容

LNNBot/指令/musicjs*:修订间差异

此后如竟没有炬火,我便是唯一的光。
Cycwin留言 | 贡献
Cycwin留言 | 贡献
第195行: 第195行:


|}
|}
{{collapse|示例: 《热异常》前两句歌词 |<syntaxhighlight lang="javascript">//musicjs*  
{{collapse|示例: 《热异常》副歌四句歌词(似乎有问题) |<syntaxhighlight lang="javascript">//musicjs*  
for(let i of eval(tr3("g0 b183 n 1.# 5.# r1 2.# r1 7b 1.# 1. r1 4 r1 2# 6b 4/ r0.5 1/ 3/4/3/ 4 r1 2b r1 7b_ n/ g0.6 3b.******/ r3.5 5b******/ n/ n/// 1.#/// 2b.**// 3b./ 4./ 6b/ 7b/ n 3b/ 4/4/3b/4/3b/ n/3b46b/6/7b r1 4 r1 2b 5_b/ 4/ n/ 5_b/2b/ r0.5 7_b/1/6_b/n/6_b/n/3b/6_b/1"," ")))note(eval(i[0]),i[1])
for(let i of eval(tr3("g0 b183 n 1.# r1 6b r1 4 6.b r1 2b r1 6b 1.# r1 6b r1 4 1. r1 5b r1 1. r1 5b r1 1 6b r1 5b r1 2b 4/3/4/4#/4 r1 2b r1 6_b n/ 3b/ 4 r1 2b 3b/4/ 3b r1 1 r1 6_ 3b r1 1 r1 6_ 4 r1 1 r1 6_ 6b/ r0.5 4/ r0.5 3b/ 6/ 7b r1 4 r1 2b 6.b r1 2b r1 6b 1.# r1 6b r1 4 1./ r0.5 4/ r0.5 2b/ 7b/ 6b r1 2b r1 7_b 4/3/4/ r0.5 2b/ 3/ 4 n 4/ r0.5 1/ 3b/4/3b/4/ r0.5 1#/ 3b/4/ r0.5 1/ r0.5 6_/3b/4/3b/4 r1 3b r1 1 2b../ r0.5 2b./ 1../ r0.5 1./ 7.b r1 4. r1 2.b r1 7b 2..b r1 2b. 6..b r1 2b. r1 6.b 2b.. r1 2.b 1.. r1 6b. r1 4. r1 1. 6b. r1 6b 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ 3./ r0.5 3/ 4.**/ r1.5 2.b**/ r1.5 7b**/ r1.5 4**/ 3.b/ 4. r1 2.b r1 7b r1 4# 3.b/ 4./ 3.b r1 1. r1 6b r1 4 3.b 4. r1 1. r1 6 r1 4 6.b/ r0.5 6b/ 6./ r0.5 6/ 7.b r1 4. r1 2.b r1 7b 6..b r1 6.b 2..b r1 6.b r1 4. r1 2.b 1../ r0.5 1./ 7.b/ r0.5 7b/ 6.b r1 4. r1 2.b r1 6b 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ n/ n 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ 3.b/ 4./ r0.5 1./ r0.5 6/ 3.b/ 2.b/ 1./ 7b"," ")))note(eval(i[0]),i[1]) //right hand
time=0
time=0
for(let i of eval(tr3("b183 7___b r1 7____b 7__b/ 4_ 7_b/ 2b/ 4**/ 2b_**/ r1.5 2b__**/ 4__**/ r1.5 4___**/ 5__b/ r0.5 5___b/ 7___b/ 5___b/ 5__b************/ 7__b r1 7___b 7___b/ 4__ 7b__ 7b_**/ r1.5 6b_**/ r1.5 4_**/ 7b__/ 7b___**/ 7b___/ 4__/ r0.5 4___/ 6___b/ 5__b**/ r1.5 5___b**/ 5__b/ 2b_****/ 4_ 2b_4_/4__/6__b/"," ")))note(eval(i[0]),i[1])</syntaxhighlight>}}
for(let i of eval(tr3("b183 7b__ r1 4__ r1 7b___ 7b__**/ r1.5 4_**/ r1.5 6_b**/ 7b__/ 7b___/ 4__/ 4#__**/ 4#__ 4_/ r0.5 2_b/ 7_b r1 5_b 2b__ r1 2b___ 6b__/ 2b_/ 4_/ 6__b**/ r1 4_ r1 2_b 4__**/ r1.5 4___**/ 4__ 1_/ 4__ 7b__ r1 4__ r1 7b___ 6_b**/ r1.5 4_**/ r1.5 7__b**/ 7__b/ 7___b/ 4__/ 4#__**/ r1.5 4#___**/ 7_b r1 4_# 4_/ r1 2_b/ 7__b/ 4__#/ 2__b r1 2___b 6__b**/ r1.5 2_b**/ r1.5 4_**/ 6__b/ 4_ r1 2_b 4__ r1 4___ 4__/ 1_/ 4_/ 1_**/ r1 4_ r1 6_ 7__b r1 7___b 7___b/ 7__b/ 5___b/ r0.5 2___b/ 7__b/ 5___b/ r0.5 2___b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7b___/ 7b__/ r0.5 4__/ 7b___/ 7b__/ r0.5 4__/ 5___b/ 5__b/ r0.5 2__b/ 5___b/ 5__b/ r0.5 2__b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7___b/ 7__b/ r0.5 4__/ 7___b/ 7__b/ r0.5 4__/ 4___/ 2b__/ r0.5 5b__/ 4___/ 2b__/ r0.5 5b__/ g0.8 7__b/ 5___b/ r0.5 2___b/ 7__b/ 5___b/ r0.5 2___b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7b___/ 7b__/ r0.5 4__/ 7b___/ 7b__/ r0.5 4__/ 5___b/ 5__b/ r0.5 2__b/ 5___b/ 5__b/ r0.5 2__b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ n 7__b r1 4__ r1 7___b"," ")))note(eval(i[0]),i[1])//left hand
</syntaxhighlight>

2026年1月3日 (六) 20:50的版本

musicjs*
属性 别名指令
父级指令 musicjs

musicjs*musicjs 的衍生指令,提供了辅助函数用于更便捷地编写旋律。

用法

musicjs* <code...>

musicjs 提供的函数和变量之外,musicjs* 还提供一些由用户定义的函数用来用更简洁的语法编写旋律。

用户可以使用 eval 指令向 musicjs* 添加辅助函数,只需在对象 storage.musicjsX 上创建属性,名称建议与辅助函数名称相同,值为函数声明的 JavaScript 源代码。

aj()

辅助函数作者:DGCK81LNN

aj()(“ASCII 谱”)函数接受一个乐谱字符串,可以通过一种受简谱启发的语法编写乐曲。

此辅助函数还定义了一个变量 dd,控制音符 6 与基准音(由 baseFrequency 定义,默认为 440 Hz)相差的半音数,初始为 0(即 1=C4),使用 >< 会增减其值。例如使用 5 个 > 可使 1=F4。

aj() 每次被调用时,会将 gain 设为 0.5,并将内部的“时值乘数”变量初始化为 1,它与 bpm 及圆括号的层数共同定义一“拍”的时长。

aj() 乐谱语法
字符 名称 作用
17 音符 以当前的一拍为时值创建对应的简谱音符。
0 休止符 休止一拍。
, 低音点 将前一个音符降低一个八度。
' 高音点 将前一个音符升高一个八度。
. 附点 将前一个音符的时值延长半拍。
连用多个时,每个后续附点延长的时值是前一个附点的一半。
- 延音线 将前一个音符的时值延长一拍。可以跨过小节线甚至减时线的起止。
| 小节线 无作用,仅辅助阅读。
( ) 减时线 括号内一拍的时长减半,可以嵌套。
b 降号 使下一个音符降低一个半音。不会影响后续的音符。
# 升号 使下一个音符升高一个半音。不会影响后续的音符。
[ / ] 分声部 方括号内由斜杠分隔的各部分将同时开始演奏。
顺序最后的一个部分演奏结束时,无论其他各部分是否演奏完毕,都会继续演奏方括号之后的乐谱。
> 升调 升调一个半音。
< 降调 降调一个半音。
p 力度:弱 gain 设为 0.33,若已经是 0.33 则设为 0.18。
m 力度:中 gain 设为 0.5。
f 力度:强 gain 设为 0.75,若已经是 0.75 则设为 1。
t 开始三连音或结束连音(triplet/tuplet) 如果当前时值乘数为 1,则将其设为 2 / 3;否则设为 1。
dN[1] 开始 N 连音(irregular division) N 是 2 的正整数次幂,则将时值乘数设为 0.75;否则设为 N 为 1 时实际效果为结束连音。
rM:N[1] 开始 M:N 连音(ratio) 将时值乘数设为 N / M
s 延长(sustain) 将前一个音符实际播放的时间延长一拍,不影响下一个音符开始的时间。
可连用,可套在减时线内使用来延长更短的时长。
  1. 1.0 1.1 MN 可以是正整数或小数;在这些指令之后不可直接跟音符或休止符,需要加空格分隔开。
示例:《Somebody That I Used To Know》副歌
//musicjs*
bpm=129
aj('>>>>>') // 1=F
aj(`[f
0(5561'1'6)|4'.(3')3'-|
0(2'3'2'2'2'2'|5'5'5'5'4')3'(2')|
1'-(61'1'6)|4'.(3')3'(66)|
(2'3'3'3'3'.(2')2'6)|655-|
/pp
3''--0|00(5''--2''|
-3''----)0|1''-(5'--2''|
-3''----)0|00(5''--2''|
-3''----02''|-1''-----2''|-)
/m
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
]`)
aj(`[f
0(5561'1'6)|4'.(3')3'-|
0(2'3'2'2'2'2'|5'5'5'5'4')3'(2')|
1'-(61'1'6)|3'.(2')2'-|
(2'3'3'3'1'2'2'2')|2'1'1'-|
/pp
(03''----)0|00(5''--2''|
-3''----)0|1''-(5'--2''|
-3''----)0|00(5''--2''|
-3''----02''|-1''-----2''|-)
/m
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
]`)
aj(`[f
0000|0000|
(2'3'3'3'1'2'2'2')|2'1'1'-|
0000|0000|
(2'3'3'3'1'2'2'(2'3'))|2'1'1'-|
/p
(50502'02'0|3'4'5'3')2'0|
(1'01'07070|6060)50|
(50502'02'0|3'4'5'3')2'0|
(60)00(70)|(60)00((2'3')0)|
/pp
(03''----)0|00(5''--2''|
-3''----)0|1''-(5'--2''|
-3''----)0|00(5''--2''|
-3''----02''|-1''----)0|
/m
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|
6,,.(6,,)5,,.(5,,)|4,,.(4,,)5,,.(5,,)|6,,
]`)

ip7()

辅助函数作者:6xL-Bro islptng

ip7() 函数接受一个乐谱字符串和一个 BPM 数字,使用一种相比于 aj() 更加紧凑的语法。乐谱语法见此页面:ip7 music

tr3()

辅助函数作者:cycwin

tr3() 函数接受一个乐谱字符串和分隔符(可省略,默认为;),使用一种相对松散的语法,在音符间可以省略空格。返回的是音符列表字符串,需搭配模板代码使用(参见示例)。乐谱语法如下:

tr3() 乐谱语法
字符 作用
1–7 音符do–ti。
# 后缀,将最前面第一个音符升高半度。最多连用两个。
b 后缀,将最前面第一个音符降低半度。最多连用两个。不得与#重复。
. 后缀,将最前面第一个音符延长一拍。可复用。
/ 后缀,将最前面第一个音符时值除以2。可复用。
n 休止符,被视作一个正常音符处理。
b... 调整bpm到...
m... 将后面的音符整体增加...个音(12平均律)。...可以为负数。
r... 将时间往回调...,可利用此做和弦之类。


{{collapse|示例: 《热异常》副歌四句歌词(似乎有问题) |

//musicjs* 
for(let i of eval(tr3("g0 b183 n 1.# r1 6b r1 4 6.b r1 2b r1 6b 1.# r1 6b r1 4 1. r1 5b r1 1. r1 5b r1 1 6b r1 5b r1 2b 4/3/4/4#/4 r1 2b r1 6_b n/ 3b/ 4 r1 2b 3b/4/ 3b r1 1 r1 6_ 3b r1 1 r1 6_ 4 r1 1 r1 6_ 6b/ r0.5 4/ r0.5 3b/ 6/ 7b r1 4 r1 2b 6.b r1 2b r1 6b 1.# r1 6b r1 4 1./ r0.5 4/ r0.5 2b/ 7b/ 6b r1 2b r1 7_b 4/3/4/ r0.5 2b/ 3/ 4 n 4/ r0.5 1/ 3b/4/3b/4/ r0.5 1#/ 3b/4/ r0.5 1/ r0.5 6_/3b/4/3b/4 r1 3b r1 1 2b../ r0.5 2b./ 1../ r0.5 1./ 7.b r1 4. r1 2.b r1 7b 2..b r1 2b. 6..b r1 2b. r1 6.b 2b.. r1 2.b 1.. r1 6b. r1 4. r1 1. 6b. r1 6b 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ 3./ r0.5 3/ 4.**/ r1.5 2.b**/ r1.5 7b**/ r1.5 4**/ 3.b/ 4. r1 2.b r1 7b r1 4# 3.b/ 4./ 3.b r1 1. r1 6b r1 4 3.b 4. r1 1. r1 6 r1 4 6.b/ r0.5 6b/ 6./ r0.5 6/ 7.b r1 4. r1 2.b r1 7b 6..b r1 6.b 2..b r1 6.b r1 4. r1 2.b 1../ r0.5 1./ 7.b/ r0.5 7b/ 6.b r1 4. r1 2.b r1 6b 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ 3./ r0.5 3/ 4./ r0.5 4/ n/ n 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ r0.5 2.b/ r0.5 7b/ 3.b/ 4./ 3.b/ 4./ r0.5 1./ r0.5 6/ 3.b/ 2.b/ 1./ 7b"," ")))note(eval(i[0]),i[1]) //right hand
time=0
for(let i of eval(tr3("b183 7b__ r1 4__ r1 7b___ 7b__**/ r1.5 4_**/ r1.5 6_b**/ 7b__/ 7b___/ 4__/ 4#__**/ 4#__ 4_/ r0.5 2_b/ 7_b r1 5_b 2b__ r1 2b___ 6b__/ 2b_/ 4_/ 6__b**/ r1 4_ r1 2_b 4__**/ r1.5 4___**/ 4__ 1_/ 4__ 7b__ r1 4__ r1 7b___ 6_b**/ r1.5 4_**/ r1.5 7__b**/ 7__b/ 7___b/ 4__/ 4#__**/ r1.5 4#___**/ 7_b r1 4_# 4_/ r1 2_b/ 7__b/ 4__#/ 2__b r1 2___b 6__b**/ r1.5 2_b**/ r1.5 4_**/ 6__b/ 4_ r1 2_b 4__ r1 4___ 4__/ 1_/ 4_/ 1_**/ r1 4_ r1 6_ 7__b r1 7___b 7___b/ 7__b/ 5___b/ r0.5 2___b/ 7__b/ 5___b/ r0.5 2___b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7b___/ 7b__/ r0.5 4__/ 7b___/ 7b__/ r0.5 4__/ 5___b/ 5__b/ r0.5 2__b/ 5___b/ 5__b/ r0.5 2__b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7___b/ 7__b/ r0.5 4__/ 7___b/ 7__b/ r0.5 4__/ 4___/ 2b__/ r0.5 5b__/ 4___/ 2b__/ r0.5 5b__/ g0.8 7__b/ 5___b/ r0.5 2___b/ 7__b/ 5___b/ r0.5 2___b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ 4___/ 4__/ r0.5 1__/ 4___/ 4__/ r0.5 1__/ 7b___/ 7b__/ r0.5 4__/ 7b___/ 7b__/ r0.5 4__/ 5___b/ 5__b/ r0.5 2__b/ 5___b/ 5__b/ r0.5 2__b/ 2____b/ 5___b/ r0.5 1___/ 2____b/ 5___b/ r0.5 1___/ n 7__b r1 4__ r1 7___b"," ")))note(eval(i[0]),i[1])//left hand