LNNBot/指令/musicjs*:修订间差异
外观
小无编辑摘要 |
小无编辑摘要 |
||
| 第155行: | 第155行: | ||
辅助函数作者:{{U|6xL-Bro islptng}} | 辅助函数作者:{{U|6xL-Bro islptng}} | ||
<code>ip7()</code> 函数接受一个乐谱字符串和一个 BPM 数字,使用一种相比于 <code>aj()</code> 更加紧凑的语法。乐谱语法如下: | <code>ip7()</code> 函数接受一个乐谱字符串和一个 BPM 数字,使用一种移植自[https://test.vudrux.site/islp/music.html 网页版谱曲工具]的、相比于 <code>aj()</code> 更加紧凑的语法。乐谱语法如下: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ 乐谱语法说明 | |+ 乐谱语法说明 | ||
| 第229行: | 第229行: | ||
| 休止符,暂停一个音符的时值。 | | 休止符,暂停一个音符的时值。 | ||
|- | |- | ||
| *时值计数器 | |colspan=2| *时值计数器决定下一个音符的长度,默认为 1。音符播放后重置。 | ||
|} | |} | ||
[ | {{collapse|示例:《月半小夜曲》前半段|<syntaxhighlight lang="javascript">ip7("=>[3d7d--3-3d7d--4-2767--2-2544--3-3d7d--3-36dm--rr---7--(dr)m-#5-76---3d7d--3--355--(64--22)767--2-(22)544-(45-3--33)d7d--3-36dm--!rr--!_dd---7-rd!~d!~7__(33)d7d--33-355--642767--22-544-4533d7d--d3-/36d;m--rr--dd--d7-7d76---67dd---r-765-3(56----)67d---7-d-f------(mr)m---_7drmdm!d!~mdrms--ff---rd7!6!~557rf-m!r!~m367d7d7-67dm--r(r----rmr)(d----drd)7-7d76------__<6-[#5|3]>(33)d7d--3--355--64(22)767--222544-4533d7d--d336dm--rr--dd--d7-7!d!~76---67d[d---|6---][r-|7-]765-3(56)6-67d---7-d-f------(mr)m----<<|p___6mltD---26rmf---5rslt---15d-37m-,L36dmlm-26rflRlf37m#st---6mltD---6mlmD---26rflR--5rslt---15d-37m-6mltD---26rmf---dfDf7rf-37rm#s---,L36dmlm-26rfl---,S25rs---15dm37m-,L36dm-l-26rmf-r-4dld37#s-,L367d---4dfl5rt-37s-6mD-4dfl,T7df37rmlmR_7(#sm7#5m,T),M---,L-{[m-|d-|6-]:::}2-{[f-|r-|d-|6-]:::},S-{[t-|s-|f-]:::}1-[m-|d-|5-]3-[t-|#s-|m-],L-{[m-|d-|6-]:::}2-{[f-|r-|6-]:::}4df-37m-,L37dm7dm37m7t---,L367dmd-26rflfr-,S5rsr7r-15dm37#s-,L36dmlm-26rflfr-4dfd37#s-,L367d---4dld5rsr37s-,L3d-4dfd,T7df37rmlmr-7(#sm7#5m,T),M---]", 184)</syntaxhighlight>}} | ||
=== <code>tr3()</code> === | === <code>tr3()</code> === | ||
辅助函数作者:{{U|cycwin}} | 辅助函数作者:{{U|cycwin}} | ||
<code>tr3()</code> 函数接受一个乐谱字符串和分隔符(可省略,默认为;),使用一种相对松散的语法, | <code>tr3()</code> 函数接受一个乐谱字符串和分隔符(可省略,默认为;),使用一种相对松散的语法,音符可以连写。返回的是音符列表字符串,需搭配模板代码使用(参见示例)。乐谱语法如下: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ <code>tr3()</code> 乐谱语法 | |+ <code>tr3()</code> 乐谱语法 | ||
| 第249行: | 第247行: | ||
|- | |- | ||
| <code>#</code> | | <code>#</code> | ||
| 后缀,将 | | 后缀,将前面的音符升高半度。最多连用两个。 | ||
|- | |- | ||
| <code>b</code> | | <code>b</code> | ||
| 后缀,将 | | 后缀,将前面的音符降低半度。最多连用两个。不得与<code>#</code>同时使用。 | ||
|- | |- | ||
| <code>.</code> | | <code>.</code> | ||
| 后缀,将 | | 后缀,将前面的音符'''延长'''一拍。可连用。 | ||
|- | |- | ||
| <code>/</code> | | <code>/</code> | ||
| 后缀,将 | | 后缀,将前面的音符时值除以2。可连用。 | ||
|- | |- | ||
| <code>n</code> | | <code>n</code> | ||
| 第271行: | 第269行: | ||
| <code>r...</code> | | <code>r...</code> | ||
| 将时间往回调...'''拍''',可利用此做和弦之类。 | | 将时间往回调...'''拍''',可利用此做和弦之类。 | ||
|} | |} | ||
{{collapse|示例: 《热异常》副歌四句歌词(似乎有问题) |<syntaxhighlight lang="javascript">//musicjs* | {{collapse|示例: 《热异常》副歌四句歌词(似乎有问题) |<syntaxhighlight lang="javascript">//musicjs* | ||
| 第282行: | 第278行: | ||
== <code>infxdi8music()</code> == | == <code>infxdi8music()</code> == | ||
<code>infxdi8music()</code> 函数接受一个[[希吕表声法]]字符串并解析、播放。目前实现并不完整。 | |||
<code>infxdi8music()</code> 函数接受一个[[希吕表声法]]字符串并解析、播放。 | |||
2026年1月5日 (一) 00:07的版本
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 及圆括号的层数共同定义一“拍”的时长。
| 字符 | 名称 | 作用 |
|---|---|---|
1–7
|
音符 | 以当前的一拍为时值创建对应的简谱音符。 |
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) | 将前一个音符实际播放的时间延长一拍,不影响下一个音符开始的时间。 可连用,可套在减时线内使用来延长更短的时长。 |
//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() 更加紧凑的语法。乐谱语法如下:
| 字符 | 作用 |
|---|---|
1 2 3 4 5 6 7
|
代表低音区七个音符,从 C3 到 B3。 |
d r m f s l t
|
代表中音区七个音符,从 C4 到 B4。 |
D R M F S L T
|
代表高音区七个音符,从 C5 到 B5。 |
#
|
将接下来的音符升高半音。 |
b
|
将接下来的音符降低半音。 |
'
|
将接下来的音符升高三个八度。 |
,
|
将接下来的音符降低三个八度。 |
-
|
延长前一个音符的时值。 |
~
|
时值计数器增加 1。 |
!
|
时值计数器除以 2。 |
(
|
整体速度乘以 2。 |
)
|
整体速度乘以 0.5。 |
... + /
|
开始连音组(三连音无需加点,x 连音加点数为 x-3)。 |
... + ;
|
结束连音组(三连音无需加点,x 连音加点数为 x-3)。 |
<
|
将后续音符移低 12 个半音(一个八度)。 |
>
|
将后续音符移高 12 个半音(一个八度)。 |
+
|
将后续音符移高 1 个半音。 |
=
|
将后续音符移低 1 个半音。 |
p
|
音量降低至原来的 1/1.5。 |
P
|
音量增强至原来的 1.5 倍。 |
[ ... | ... ]
|
并行播放多个音符或和弦。 |
{ ... : ... : ... }
|
重复段落。用冒号分隔不同段落,每轮重复依次播放对应段落。 |
_
|
休止符,暂停一个音符的时值。 |
| *时值计数器决定下一个音符的长度,默认为 1。音符播放后重置。 | |
ip7("=>[3d7d--3-3d7d--4-2767--2-2544--3-3d7d--3-36dm--rr---7--(dr)m-#5-76---3d7d--3--355--(64--22)767--2-(22)544-(45-3--33)d7d--3-36dm--!rr--!_dd---7-rd!~d!~7__(33)d7d--33-355--642767--22-544-4533d7d--d3-/36d;m--rr--dd--d7-7d76---67dd---r-765-3(56----)67d---7-d-f------(mr)m---_7drmdm!d!~mdrms--ff---rd7!6!~557rf-m!r!~m367d7d7-67dm--r(r----rmr)(d----drd)7-7d76------__<6-[#5|3]>(33)d7d--3--355--64(22)767--222544-4533d7d--d336dm--rr--dd--d7-7!d!~76---67d[d---|6---][r-|7-]765-3(56)6-67d---7-d-f------(mr)m----<<|p___6mltD---26rmf---5rslt---15d-37m-,L36dmlm-26rflRlf37m#st---6mltD---6mlmD---26rflR--5rslt---15d-37m-6mltD---26rmf---dfDf7rf-37rm#s---,L36dmlm-26rfl---,S25rs---15dm37m-,L36dm-l-26rmf-r-4dld37#s-,L367d---4dfl5rt-37s-6mD-4dfl,T7df37rmlmR_7(#sm7#5m,T),M---,L-{[m-|d-|6-]:::}2-{[f-|r-|d-|6-]:::},S-{[t-|s-|f-]:::}1-[m-|d-|5-]3-[t-|#s-|m-],L-{[m-|d-|6-]:::}2-{[f-|r-|6-]:::}4df-37m-,L37dm7dm37m7t---,L367dmd-26rflfr-,S5rsr7r-15dm37#s-,L36dmlm-26rflfr-4dfd37#s-,L367d---4dld5rsr37s-,L3d-4dfd,T7df37rmlmr-7(#sm7#5m,T),M---]", 184)
|
tr3()
辅助函数作者:cycwin
tr3() 函数接受一个乐谱字符串和分隔符(可省略,默认为;),使用一种相对松散的语法,音符可以连写。返回的是音符列表字符串,需搭配模板代码使用(参见示例)。乐谱语法如下:
| 字符 | 作用 |
|---|---|
1–7
|
音符do–ti。 |
#
|
后缀,将前面的音符升高半度。最多连用两个。 |
b
|
后缀,将前面的音符降低半度。最多连用两个。不得与#同时使用。
|
.
|
后缀,将前面的音符延长一拍。可连用。 |
/
|
后缀,将前面的音符时值除以2。可连用。 |
n
|
休止符,被视作一个正常音符处理。 |
b...
|
调整bpm到... |
m...
|
将后面的音符整体增加...个音(12平均律)。...可以为负数。 |
r...
|
将时间往回调...拍,可利用此做和弦之类。 |
//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
|
infxdi8music()
infxdi8music() 函数接受一个希吕表声法字符串并解析、播放。目前实现并不完整。