钢琴块 2 谱面格式说明
钢琴块 2 谱面采用 JSON 格式,可以使用任何文本编辑器进行编写。
概念
WARNING
以下概念为笔者设定仅方便理解,不代表官方定义。
我们约定:
在谱面字符串中:
音符、拍数符号、玩法/奏法/动效标记:完整列表详见附录。
音块:通过分隔符
,或;分隔的基本单元,它有音符块或休止符块两种形式。- 音符块的格式为
音符[音符拍数符号]或(多个音符以奏法标记分隔)[音符拍数符号]。
例:G-1[M](D-1.d)[K](#d1@g1@#a1@#d2)[JK] - 休止符块的格式为
休止符拍数符号。
例:VTUQSTUUUU - 音符块开头可以添加
!(作用未知),如!(c.e.g)[K]。 - 音符块或休止符块结尾可以添加动效标记
{动效ID}表示动效,如f2[L]{3}。 - 特别地,对于多音符块,允许使用
QRSTUVWXYZ充当音符作为不发音的音符;但不建议使用(若试听片段包含此类音符则试听会闪退);建议以mute代替。
例:(Z~f1~#a1)[L](d~e~Z)[K] - 允许分隔符之间为空字符串,但空字符串不被视为音块。
- 音符块的格式为
音组:用玩法标记(形如
数字<开头和>结尾)括住的若干音块,或未被括住的单个音块。例:
5<#f2[M],f2[M]>,5<#f2[M],#g2[M]>,#a2[L],#f2[L],包含 4 个音组(共 6 个音块)。音轨:若干音组通过
,或;分隔组合在一起,构成音轨(如#f[L],#g[M];#a[K])。谱面:若干音轨组成的数组,即
scores字段的内容。
四种合法乐器:
pianobassbass2drum。
结构
根结构 root
baseBpm
int:基准 BPM,游戏内不读取此项。musics
Array<Music>:音乐(分段)列表,应至少有一个元素。该列表元素个数在大多数谱面中为 3(对应 1~3 星分段)。
实际分段顺序取决于该列表元素
id。
audition
Audition:试听片段,可选,若无此项则试听内容为整个谱子。
音乐 Music
bpm
int:每分钟节拍数,游戏内不读取此项。- 游戏内读取的是 music_json.csv 的
BPM列对应值。
- 游戏内读取的是 music_json.csv 的
baseBeats
float:基础拍数,表示该分段单位长度的拍数。参与该分段的音组长度计算:音组长度等于音组拍数除以
baseBeats。scores
Array<string>:(分段)谱面列表,表示分段谱面或音轨(旋律)。该列表第一个元素为主音轨,通常为主旋律;跟在后面的元素为子音轨,通常为伴奏。
游玩时,只有主音轨的玩法标记会生效,所有音轨的动效标记均会生效(需要验证)。
id
int:分段序号,对应 music_json.csv 的Id列末位数字。该值能被正常读取的范围是 1~9 的整数。
通常为
123,分别表示 0~1、1~2、2~3 星段。
instruments
Array<string>:(默认)乐器列表,表示游戏内默认乐器。存在此项时,该列表元素个数通常与
scores数组长度相等,与相同下标的音轨依次对应。若无此项,默认值为
["piano", "piano", ...]("piano"个数与scores数组长度相等)。alternatives
Array<string>:备选(乐器)列表,表示游戏内备选乐器。若
instruments包含的乐器都合法,则试听乐器为instruments;否则退化到alternatives(需要验证)。
WARNING
游戏内,instruments要么为空数组(会自动补全视为合法的"piano"),要么全部元素合法(注意:空字符串""也不合法);若不满足上述条件,即instruments不合法时,如果 level.csv 的Type列对应谱面值为16会触发乐队(自定义乐器/音色)下载;不为16则会退化到alternatives,如果此时alternatives也不合法则会闪退。
试听 Audition
表示试听片段。若无此项则试听内容为整个谱子(等同于{"start":[0,0],"end":[0,0]})。
start
[int, int]:表示试听片段开始位置(包含)。end
[int, int]:表示试听片段结束位置(包含)。
试听片段至少包含 3 个音组,否则游玩创建的歌单会闪退。
此例表示试听片段为从分段 1 下标为 0 的音块到分段 1 下标为 27 的音块:
{"audition":{"start":[0,0],"end":[0,27]}}附录
音符
该表包含了合法乐器能够使用的 90 种音符,包括 88 个琴键、1 个无声音符和 1 个串烧音效。
| 音符 | 琴键 | MIDI | 音符 | 琴键 | MIDI | 音符 | 琴键 | MIDI |
|---|---|---|---|---|---|---|---|---|
A-3 | A0 | 21 | #d | D#3 | 51 | a2 | A5 | 81 |
#A-3 | A#0 | 22 | e | E3 | 52 | #a2 | A#5 | 82 |
B-3 | B0 | 23 | f | F3 | 53 | b2 | B5 | 83 |
C-2 | C1 | 24 | #f | F#3 | 54 | c3 | C6 | 84 |
#C-2 | C#1 | 25 | g | G3 | 55 | #c3 | C#6 | 85 |
D-2 | D1 | 26 | #g | G#3 | 56 | d3 | D6 | 86 |
#D-2 | D#1 | 27 | a | A3 | 57 | #d3 | D#6 | 87 |
E-2 | E1 | 28 | #a | A#3 | 58 | e3 | E6 | 88 |
F-2 | F1 | 29 | b | B3 | 59 | f3 | F6 | 89 |
#F-2 | F#1 | 30 | c1 | C4 | 60 | #f3 | F#6 | 90 |
G-2 | G1 | 31 | #c1 | C#4 | 61 | g3 | G6 | 91 |
#G-2 | G#1 | 32 | d1 | D4 | 62 | #g3 | G#6 | 92 |
A-2 | A1 | 33 | #d1 | D#4 | 63 | a3 | A6 | 93 |
#A-2 | A#1 | 34 | e1 | E4 | 64 | #a3 | A#6 | 94 |
B-2 | B1 | 35 | f1 | F4 | 65 | b3 | B6 | 95 |
C-1 | C2 | 36 | #f1 | F#4 | 66 | c4 | C7 | 96 |
#C-1 | C#2 | 37 | g1 | G4 | 67 | #c4 | C#7 | 97 |
D-1 | D2 | 38 | #g1 | G#4 | 68 | d4 | D7 | 98 |
#D-1 | D#2 | 39 | a1 | A4 | 69 | #d4 | D#7 | 99 |
E-1 | E2 | 40 | #a1 | A#4 | 70 | e4 | E7 | 100 |
F-1 | F2 | 41 | b1 | B4 | 71 | f4 | F7 | 101 |
#F-1 | F#2 | 42 | c2 | C5 | 72 | #f4 | F#7 | 102 |
G-1 | G2 | 43 | #c2 | C#5 | 73 | g4 | G7 | 103 |
#G-1 | G#2 | 44 | d2 | D5 | 74 | #g4 | G#7 | 104 |
A-1 | A2 | 45 | #d2 | D#5 | 75 | a4 | A7 | 105 |
#A-1 | A#2 | 46 | e2 | E5 | 76 | #a4 | A#7 | 106 |
B-1 | B2 | 47 | f2 | F5 | 77 | b4 | B7 | 107 |
c | C3 | 48 | #f2 | F#5 | 78 | c5 | C8 | 108 |
#c | C#3 | 49 | g2 | G5 | 79 | mute | - | - |
d | D3 | 50 | #g2 | G#5 | 80 | chuanshao | - | - |
TIP
对于不合法/自定义乐器,该表不生效;由下载的 <自定义乐器名>.cfg 的data.pitches数组的name覆盖,允许该表以外的名称(但不建议使用,因为未下载状态采用备选乐器时,该表仍然生效)。
拍数符号
| 音符 | 休止符 | 对应的拍数 | 备注 |
|---|---|---|---|
H | Q | 8 | 四个全音符/休止符 |
I | R | 4 | 两个全音符/休止符 |
J | S | 2 | 全音符/休止符 |
K | T | 1 | 二分音符/休止符 |
L | U | 0.5 | 四分音符/休止符 |
M | V | 0.25 | 八分音符/休止符 |
N | W | 0.125 | 十六分音符/休止符 |
O | X | 0.0625 | 三十二分音符/休止符 |
P | Y | 0.03125 | 六十四分音符/休止符 |
玩法标记
下表的
对于主音轨无玩法标记的音块,若为休止符块且对应区域的伴奏无音符块则玩法为空白;不为空白时长度大于 1 为长块,否则为单黑。
1<无效果:同“无玩法标记”的情况。2<单黑:长度,在 1~4 轨随机出现单个黑块(不与上一个黑块、长块连续)。 - 点击后播放音块及其伴奏,得 1 分。
3<狂戳:长度,出现横跨 2/3 轨的大黑块,大黑块上面的数字与 相等,表示要狂戳对应的次数。 - 每次点击后依次播放音块及其伴奏并伴随减速效果(需要补充),得 1 分;累计得
分。
- 每次点击后依次播放音块及其伴奏并伴随减速效果(需要补充),得 1 分;累计得
5<双黑:长度,在 1/3 轨或 2/4 轨出现两个黑块(不与上一个黑块、长块连续)。 - 全部点击后播放音块及其伴奏,得 4 分。
6<长块:长度,在 1~4 轨随机出现长块(不与上一个黑块、长块连续)。 - 点击后播放音块及其伴奏,中途松开会中断伴奏。
- 会根据按住的时长得
至 分。 - 按到长块末尾会在末尾上方显示蓝色的
。
7<滑块:长度,横跨整个屏幕宽度(不折叠)。 - 点击后播放音块及其伴奏,滑出判定范围(需要验证)会中断伴奏,不得分。
- 按到滑块末尾得
分,并在末尾上方显示红色的 。
8<连滑:长度,横跨整个屏幕宽度(每 1.45 长度折叠一次)。 - 点击后播放音块及其伴奏,滑出判定范围会中断伴奏,不得分。
- 按到连滑末尾得
分,并在末尾上方显示红色的 。 - Bug 若最后的折叠长度小于 0.00145 则会使前面一个折叠不渲染。
- Bug 最多折叠 20 次(尝试渲染超过 20 个折叠即闪退),即
最长为 29.001452。
9<伴奏:长度,在 1 或 4 轨出现长块(不与上一个黑块、长块连续),并在 3/4 或 2/1 轨交替出现伴奏块(青色单黑)。 - 点击长块后播放音块及其伴奏,中途松开会中断伴奏。
- 会根据按住的时长得
至 分。 - 按到长块末尾会在末尾上方显示蓝色的
。 - 点击伴奏块会播放与之对应的伴奏,但不得分。
10<爆裂:长度,即 2爆裂主块长度+0.5间隙+(n-1)爆裂子块数目+0.5间隙;第一个音块作为横跨 2/3 轨的爆裂主块(六边形),音块长度一般为 4;剩下的音块作为爆裂子块(橙色单黑),音块长度一般为 1。 - 点击爆裂主块后播放该音块并得 1 分,同时短暂减速并爆出所有的爆裂子块(不连续)。
- 点击爆裂子块(无顺序要求)会依次播放剩下的音块但不得分。
- Bug
超过 21 个即闪退(即爆出的子块最多 20 个)。 - Bug 谱面的前 4 个音组不能为爆裂块,否则无法判定。
TIP
1<2<9<未在任何官方常规谱面中出现。空白也是有位置的,例如两个双黑之间夹一个空白,这两个双黑必在同一个位置。
狂戳同上。
滑块开始必在1(前34)或4(前12)轨,后面的黑块必在12(前4)或34(前1)轨。
连滑开始必在1(前34)或4(前12)轨,后面的黑块必在1(前右折)或4(前左折)轨;长度不足3轨时随机14轨(单)或必在24(前右折)或13(前左折)轨。
滑块与连滑两条斜边距离固定为
。 定义参数
, ,则有: 滑块斜率
;底边宽度 对于连滑,取
,每段折叠的斜率和底边宽度也可以用上面的公式求得(不足3轨必会怼到3轨,仍需验证)。
WARNING
- 任一分段开头不能为空白,否则闪退。
- 第一段至少 5 个音组,除非每一段音符数相等(这种情况十分怪异,暂不细究)。
- 尝试应用不存在的玩法标记(例如
4<11<)会闪退(需要验证)。 1<是唯一允许空置(形如...,1<>,...)的标记,其它标记空置时会卡死(需要验证)。- 滑块与连滑似乎会改变奏法标记的行为(需要验证)。
奏法标记
下表的
.和弦 Chrod:同时弹奏前后音符。~连音 Legato:以拍为间隔依次弹奏音符。 @琶音 Arpeggio:以拍为间隔依次弹奏音符。 &波音 Mordent:以(12.5 音符/秒)为间隔循环弹奏两个音符。 ^颤音 Trill:奏法同&。$回音 Turn:奏法同~。%长倚音 Appoggiatura:以拍为间隔依次弹奏音符。 !短倚音 Acciaccatura:以拍为间隔依次弹奏音符。
例:(#d1@g1@#a1@#d2)[JK]的 #d1 g1 #a1 #d2。
TIP
~@&^$%!不可相互混用,否则会出 bug。
混用的结果是以最后一个除.外的标记为准,可以简记为后来居上。~@$弹奏的内部是计算相同标记的数量+1,因此会吃掉除 .外的音符数量。
例:(e~f@g)等于(e@f),(e@f~g)等于(e~f)。- 也因此
~@$可与.混用,不会出 bug。
- 也因此
&^弹奏的内部是计算该音符时值(秒)乘以 12.5 再向上取整得到的。
例:bpm为 2 的情况下,(f&g)[M]时值为 7.5 秒,7.5 × 12.5 = 93.75,因此这个音符的奏法是以 12.5 音符/秒的速度循环弹奏f和g共 94 次。&^最多连接 2 个音符,音符数目不等于 2 时不发声。- 也因此
&^不可与.混用,否则会出 bug。
例:(c&e&g)(c.e&g)均等于mute。
- 也因此
%!弹奏的内部也是计算音符数量,因此会吃掉除 .外的音符但保留数量。
例:(e~f~g!a)等于(e!f!g!a)。- 也因此
%!不可与.混用,否则会出 bug。
例:(a.mute%c)不等于(a%c)而是等于(a%c%mute)。
- 也因此
动效标记
存在七种动效标记:{1} {2} {3} {4} {5} {6} {7}
对于 level.csv 的Type列值为16的谱面,有:
{1}强烈震动{2}背景正方形震动{3}背景几何体震动{4}同{2}{5}切换为红色{6}切换回蓝色
(需要补充)