Skip to content

Phichain 谱面格式

Phichain 谱面格式是制谱器使用的谱面格式,包含高阶功能

格式版本

Phichain 谱面格式通常会随制谱器的功能变化产生频繁更新

当前 Phichain 谱面格式的版本为 3

在制谱器中打开低版本的 Phichain 谱面时,制谱器将自动尝试迁移谱面至最新版本

结构

typescript
// 谱面根节点
type PhichainChart = {
  // 谱面的格式版本,目前恒定为 3
  format: number
  // 以毫秒为单位的谱面偏移
  offset: number
  // BPM 列表
  bpm_list: BpmList
  // 判定线列表
  lines: Line[]
}

// 拍数,[a, b, c] 代表 a+b/c 拍
type Beat = [number, number, number]

// 单个 BPM 点,代表一次 BPM 的变化
type BpmPoint = {
  // BPM 点所在的拍数
  beat: Beat
  // BPM 值
  bpm: number
}

// BPM 列表
type BpmList = BpmPoint[]

// 判定线
type Line = {
  // 判定线的名称
  name: string
  // 判定线的所有音符
  notes: Note[]
  // 判定线的所有事件
  events: Event[]
}

// 音符的类型
type NoteKind =
  | 'tap'
  | 'drag'
  | 'flick'
  // Hold 音符,包含 Hold 持续时间
  | {
      hold: { hold_beat: Beat }
    }

// 音符
type Note = {
  // 音符的类型
  kind: NoteKind
  // 音符判定的拍数
  beat: Beat
  // 音符的 x 坐标
  x: number
  // 音符是否在判定线上方
  above: boolean
  // 音符的速度因子
  speed: number
}

// 事件缓动
type Easing =
  | 'linear'
  | 'ease_in_sine'
  | 'ease_out_sine'
  | 'ease_in_out_sine'
  | 'ease_in_quad'
  | 'ease_out_quad'
  | 'ease_in_out_quad'
  | 'ease_in_cubic'
  | 'ease_out_cubic'
  | 'ease_in_out_cubic'
  | 'ease_in_quart'
  | 'ease_out_quart'
  | 'ease_in_out_quart'
  | 'ease_in_quint'
  | 'ease_out_quint'
  | 'ease_in_out_quint'
  | 'ease_in_expo'
  | 'ease_out_expo'
  | 'ease_in_out_expo'
  | 'ease_in_circ'
  | 'ease_out_circ'
  | 'ease_in_out_circ'
  | 'ease_in_back'
  | 'ease_out_back'
  | 'ease_in_out_back'
  | 'ease_in_elastic'
  | 'ease_out_elastic'
  | 'ease_in_out_elastic'
  | 'ease_in_bounce'
  | 'ease_out_bounce'
  | 'ease_in_out_bounce'
  // 自定义缓动,元组中的四个数分别代表三次贝塞尔曲线的两个控制点的坐标
  // https://cubic-bezier.com
  | { custom: [number, number, number, number] }

// 判定线事件
type Event = {
  // 事件的类型
  kind: 'x' | 'y' | 'rotate' | 'alpha' | 'speed'
  // 事件开始的拍数
  start_beat: Beat
  // 事件结束的拍数
  end_beat: Beat
  // 事件的值
  value: EventValue
}

// 事件的值
type EventValue =
  // 过渡
  | {
      transition: {
        start: number
        end: number
        easing: string
      }
    }
  // 常量
  | { constant: number }

基于 LGPL 协议发布