Skip to content

钢琴块 2 谱面格式说明

钢琴块 2 谱面采用 JSON 格式,可以使用任何文本编辑器进行编写。

概念

WARNING

以下概念为笔者设定仅方便理解,不代表官方定义。

我们约定:

  • 在谱面字符串中:

    • 音符拍数符号玩法/奏法/动效标记:完整列表详见附录

    • 音块:通过分隔符,;分隔的基本单元,它有音符块或休止符块两种形式。

      • 音符块的格式为音符[音符拍数符号](多个音符以奏法标记分隔)[音符拍数符号]
        例:G-1[M] (D-1.d)[K] (#d1@g1@#a1@#d2)[JK]
      • 休止符块的格式为休止符拍数符号
        例:V TU QST UUUU
      • 音符块开头可以添加!(作用未知),如!(c.e.g)[K]
      • 音符块或休止符块结尾可以添加动效标记{动效ID}表示动效,如f2[L]{3}
      • 特别地,对于多音符块,允许使用Q R S T U V W X Y Z充当音符作为不发音的音符;但不建议使用(若试听片段包含此类音符则试听会闪退);建议以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字段的内容。

  • 四种合法乐器:piano bass bass2 drum

结构

根结构 root

  • baseBpm int基准 BPM,游戏内不读取此项。

  • musics Array<Music>音乐(分段)列表,应至少有一个元素。

    • 该列表元素个数在大多数谱面中为 3(对应 1~3 星分段)。

    • 实际分段顺序取决于该列表元素id

  • audition Audition试听片段,可选,若无此项则试听内容为整个谱子。

音乐 Music

  • bpm int每分钟节拍数,游戏内不读取此项。

    • 游戏内读取的是 music_json.csv 的BPM列对应值。
  • baseBeats float基础拍数,表示该分段单位长度的拍数。

    参与该分段的音组长度计算:音组长度等于音组拍数除以baseBeats

  • scores Array<string>(分段)谱面列表,表示分段谱面或音轨(旋律)。

    该列表第一个元素为主音轨,通常为主旋律;跟在后面的元素为子音轨,通常为伴奏。

    游玩时,只有主音轨的玩法标记会生效,所有音轨的动效标记均会生效(需要验证)。

  • id int分段序号,对应 music_json.csv 的Id列末位数字。

    • 该值能被正常读取的范围是 1~9 的整数。

    • 通常为1 2 3,分别表示 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 的音块:

json
{"audition":{"start":[0,0],"end":[0,27]}}

附录

音符

该表包含了合法乐器能够使用的 90 种音符,包括 88 个琴键、1 个无声音符和 1 个串烧音效。

音符琴键MIDI音符琴键MIDI音符琴键MIDI
A-3A021#dD#351a2A581
#A-3A#022eE352#a2A#582
B-3B023fF353b2B583
C-2C124#fF#354c3C684
#C-2C#125gG355#c3C#685
D-2D126#gG#356d3D686
#D-2D#127aA357#d3D#687
E-2E128#aA#358e3E688
F-2F129bB359f3F689
#F-2F#130c1C460#f3F#690
G-2G131#c1C#461g3G691
#G-2G#132d1D462#g3G#692
A-2A133#d1D#463a3A693
#A-2A#134e1E464#a3A#694
B-2B135f1F465b3B695
C-1C236#f1F#466c4C796
#C-1C#237g1G467#c4C#797
D-1D238#g1G#468d4D798
#D-1D#239a1A469#d4D#799
E-1E240#a1A#470e4E7100
F-1F241b1B471f4F7101
#F-1F#242c2C572#f4F#7102
G-1G243#c2C#573g4G7103
#G-1G#244d2D574#g4G#7104
A-1A245#d2D#575a4A7105
#A-1A#246e2E576#a4A#7106
B-1B247f2F577b4B7107
cC348#f2F#578c5C8108
#cC#349g2G579mute--
dD350#g2G#580chuanshao--

TIP

对于不合法/自定义乐器,该表不生效;由下载的 <自定义乐器名>.cfg 的data.pitches数组的name覆盖,允许该表以外的名称(但不建议使用,因为未下载状态采用备选乐器时,该表仍然生效)。

拍数符号

音符休止符对应的拍数备注
HQ8四个全音符/休止符
IR4两个全音符/休止符
JS2全音符/休止符
KT1二分音符/休止符
LU0.5四分音符/休止符
MV0.25八分音符/休止符
NW0.125十六分音符/休止符
OX0.0625三十二分音符/休止符
PY0.03125六十四分音符/休止符

玩法标记

下表的 n 表示音组的音块数量,h 表示音组长度。

对于主音轨无玩法标记的音块,若为休止符块且对应区域的伴奏无音符块则玩法为空白;不为空白时长度大于 1 为长块,否则为单黑。

  • 1< 无效果:同“无玩法标记”的情况。
  • 2< 单黑:长度 1,在 1~4 轨随机出现单个黑块(不与上一个黑块、长块连续)。
    • 点击后播放音块及其伴奏,得 1 分。
  • 3< 狂戳:长度 2,出现横跨 2/3 轨的大黑块,大黑块上面的数字与 n 相等,表示要狂戳对应的次数。
    • 每次点击后依次播放音块及其伴奏并伴随减速效果(需要补充),得 1 分;累计得 n 分。
  • 5< 双黑:长度 1,在 1/3 轨或 2/4 轨出现两个黑块(不与上一个黑块、长块连续)。
    • 全部点击后播放音块及其伴奏,得 4 分。
  • 6< 长块:长度 h,在 1~4 轨随机出现长块(不与上一个黑块、长块连续)。
    • 点击后播放音块及其伴奏,中途松开会中断伴奏。
    • 会根据按住的时长得 0h+1.5 分。
    • 按到长块末尾会在末尾上方显示蓝色的 +h+1
  • 7< 滑块:长度 h,横跨整个屏幕宽度(不折叠)。
    • 点击后播放音块及其伴奏,滑出判定范围(需要验证)会中断伴奏,不得分。
    • 按到滑块末尾得 h+1.5 分,并在末尾上方显示红色的 +h+1
  • 8< 连滑:长度 h,横跨整个屏幕宽度(每 1.45 长度折叠一次)。
    • 点击后播放音块及其伴奏,滑出判定范围会中断伴奏,不得分。
    • 按到连滑末尾得 h+1.5 分,并在末尾上方显示红色的 +h+1
    • Bug 若最后的折叠长度小于 0.00145 则会使前面一个折叠不渲染。
    • Bug 最多折叠 20 次(尝试渲染超过 20 个折叠即闪退),即 h 最长为 29.001452。
  • 9< 伴奏:长度 h,在 1 或 4 轨出现长块(不与上一个黑块、长块连续),并在 3/4 或 2/1 轨交替出现伴奏块(青色单黑)。
    • 点击长块后播放音块及其伴奏,中途松开会中断伴奏。
    • 会根据按住的时长得 0h+1.5 分。
    • 按到长块末尾会在末尾上方显示蓝色的 +h+1
    • 点击伴奏块会播放与之对应的伴奏,但不得分。
  • 10< 爆裂:长度 n+2,即 2爆裂主块长度+0.5间隙+(n-1)爆裂子块数目+0.5间隙;第一个音块作为横跨 2/3 轨的爆裂主块(六边形),音块长度一般为 4;剩下的音块作为爆裂子块(橙色单黑),音块长度一般为 1。
    • 点击爆裂主块后播放该音块并得 1 分,同时短暂减速并爆出所有的爆裂子块(不连续)。
    • 点击爆裂子块(无顺序要求)会依次播放剩下的音块但不得分。
    • Bug n 超过 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(前左折)轨。

  • 滑块与连滑两条斜边距离固定为 0.2W

  • 定义参数 p1=H4hWp2=0.2,则有:

    滑块斜率 k=p1+p21+p12p221p22;底边宽度 a=p1p21+p12p22p22p12p22W

    对于连滑,取 h=1.45 ,每段折叠的斜率和底边宽度也可以用上面的公式求得(不足3轨必会怼到3轨,仍需验证)。

WARNING

  • 任一分段开头不能为空白,否则闪退。
  • 第一段至少 5 个音组,除非每一段音符数相等(这种情况十分怪异,暂不细究)。
  • 尝试应用不存在的玩法标记(例如4< 11<)会闪退(需要验证)。
  • 1<是唯一允许空置(形如...,1<>,...)的标记,其它标记空置时会卡死(需要验证)。
  • 滑块与连滑似乎会改变奏法标记的行为(需要验证)。

奏法标记

下表的 n 表示多音符块的音符数量,t 表示音符拍数。

  • . 和弦 Chrod:同时弹奏前后音符。
  • ~ 连音 Legato:以 tn 拍为间隔依次弹奏音符。
  • @ 琶音 Arpeggio:以 0.1t{n1n=2n2n3 拍为间隔依次弹奏音符。
  • & 波音 Mordent:以 0.08s(12.5 音符/秒)为间隔循环弹奏两个音符。
  • ^ 颤音 Trill:奏法同 &
  • $ 回音 Turn:奏法同 ~
  • % 长倚音 Appoggiatura:以 0.3tn1 拍为间隔依次弹奏音符。
  • ! 短倚音 Acciaccatura:以 0.15tn1 拍为间隔依次弹奏音符。

例:(#d1@g1@#a1@#d2)[JK]n 为 4,t 为 3,因此这个音符的奏法是以 0.1×342=0.15 拍为间隔、依次弹奏#d1 g1 #a1 #d2

TIP

  • ~ @ & ^ $ % !不可相互混用,否则会出 bug。
    混用的结果是以最后一个除.外的标记为准,可以简记为后来居上。
  • ~ @ $弹奏的 n 内部是计算相同标记的数量+1,因此会吃掉除.外的音符数量。
    例:(e~f@g)等于(e@f)(e@f~g)等于(e~f)
    • 也因此~ @ $可与.混用,不会出 bug。
  • & ^弹奏的 n 内部是计算该音符时值(秒)乘以 12.5 再向上取整得到的。
    例:bpm为 2 的情况下,(f&g)[M]时值为 7.5 秒,7.5 × 12.5 = 93.75,因此这个音符的奏法是以 12.5 音符/秒的速度循环弹奏fg共 94 次。
  • & ^最多连接 2 个音符,音符数目不等于 2 时不发声。
    • 也因此& ^不可与.混用,否则会出 bug。
      例:(c&e&g) (c.e&g)均等于mute
  • % !弹奏的 n 内部也是计算音符数量,因此会吃掉除.外的音符但保留数量。
    例:(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} 切换回蓝色

(需要补充)

CC-BY-NC-4.0 Licensed