傻乎乎制谱器

文章发布时间:

最后更新时间:

长期工程, 随便码了点字记录下想法

概述

主要思想:所有音乐游戏的谱面有一些通用的东西

已有的尝试:OMGC

希望解决的痛点

  • 工程文件和谱面文件不做区分的弊端
  • 方便利用其他游戏谱面
  • 方便支持git
  • 全平台

OMGC 的 README 里这段话我觉得很有价值

首先, 音游的灵魂在于谱面, 当你听到 无人区 这个名字时, 无论你是何种音游的玩家, 第一印象肯定是魔王曲. 也不会有哪一款音游, 会不给无人区提供高难度的谱面. 当你听到别人讨论 mopemope 时, 第一个想到的肯定是其猎奇的BGA以及游戏如何还原其名场景. 自制谱谱师和高级玩家, 往往也会从这些音游名曲中入手进行迁移和重制, 自然谱面格式成了传递数据过程中最关键的地方.

基本思想

谱面的内容主要是两个部分:谱面信息(metainfo)和谱面内容(content), 谱面内容一定是基于音乐的

谱面信息不需多言, 和曲目信息分离是为了解决一些已有问题(比如定轨下落图常用的谱包, maimai 的多难度写进同一个文件, Arcaea 的不同难度曲目可能不同)

我希望用比较解析的格式来存储音频上的时间信息, 这样作为工程文件也比较方便导出为数字形式, 同时也方便无损转换. 参考 Arcaea 的 timing group, 每个 group 给个长度, 然后比如用一个相对启动时延迟/相较某组的结尾/开头延迟来定位, 这样 note 的时间坐标就可以比较方便地对应到组中的位置, 其他的信息则不具有跨游戏的比较广泛的共性了

然后以 Phigros 为例, 可以说有四类物件:单键, 长条, 判定线和判定线的变化

每个物件的属性则又有

单键:所属判定线(id), 类型(tap, catch, flick), 时间坐标(时间组 id-拍数), 位置(相对于判定线的横向位置), 是否 fake, 透明度等 长条:少一个类型, 多一个时间坐标(起和止各一个) 判定线:没有信息 判定线表演:影响参数(平动旋转透明度流速等), 起止时间坐标, 参数值和缓动类型, 叠加模式(强制和直接叠加等)

根据经验对不同的物件进行合理的分组有助于提高效率, 从而可以挪一部分信息到组上, 并提供比较便捷的拆分/合并组等功能(例如时间组, 单键的透明度, 是否 fake 等), 也可以考虑作为可选项, 组提供默认值, 物件具体进行覆盖或叠加

项目存储结构

  • 一个谱面项目
    • 谱面项目的 metainfo
    • 谱面组
      • 谱面 1
        • 谱面 metainfo
          • 曲目 id
          • 其他可选项
        • 物件类
          • 某类物件的分组 list
          • ...
      • 谱面 2(略)
      • ...
    • 曲目组
      • 曲目 1
        • 曲目 metainfo
        • 曲目的时间轴信息
          • 时间轴的开始时刻
          • 时间轴的分组 list
            • 时间组 1
            • ...
      • 曲目 2(略)
      • ...

不同游戏的差异

需要分别实现的细节:谱面项目 info 的结构规定, 谱面的 info 的结构规定, 物件的类型规定, 绘制规则, 导出规则, 检查器等

类型规定可以加上一些限制(比如限制曲目只能有一首, 或者谱面组的谱面数量限制等, 再比如物件组的数量限制, 组内的数量限制, Arcaea 的 camera 只有一个, 或者引用规则, 例如 phigros 的 note 的判定线属性)

规划

先搭好基础框架, 然后用 4k 格式作为第一步, maimai格式作为第二步, pgr 格式作为短期目标, Arcaea 格式作为可选项

准备是用 Rust 练练手, 没接触过的领域呢, 虽然感觉拿 Rust 写有点蠢乎乎的. 图形处理音频处理抄 Phira, 哈哈.

再之后可能可以开一些插件开发接口之类的