.osu
是一种简单易懂的,用于存储 osu! 谱面难度信息的文件格式。
文件第一行描述了谱面文件存储格式的版本。目前,osu file format v14
是最新版。
之后的内容分为多个章节,并由方括号包裹的章节标题所分隔。
章节 | 描述 | 内容类型 |
---|---|---|
[General] |
谱面的总体信息 | 键: 值 对 |
[Editor] |
可在谱面编辑器内显示的信息 | 键: 值 对 |
[Metadata] |
用于识别谱面的元数据 | 键:值 对 |
[Difficulty] |
即谱面难度设定 | 键:值 对 |
[Events] |
谱面显示设定,故事板事件 | 逗号分隔的列表 |
[TimingPoints] |
时间轴设定 | 逗号分隔的列表 |
[Colours] |
连击、皮肤颜色 | 键 : 值 对 |
[HitObjects] |
击打物件 | 逗号分隔的列表 |
项目 | 数据类型 | 描述 | 默认值 |
---|---|---|---|
AudioFilename |
String(字符串) | 音频文件的相对路径 | |
AudioLeadIn |
Integer(整型) | 音频文件播放之前预留的空白时间 | 0 |
AudioHash |
String(字符串) | 已弃用 | |
PreviewTime |
Integer(整型) | 在选中谱面时的歌曲预览点位置(毫秒) | -1 |
Countdown |
Integer(整型) | 在第一个物件之前出现的倒计时速度 (0 = 无倒计时, 1 = 正常速度, 2 = 一半速度, 3 = 二倍速度) |
1 |
SampleSet |
String(字符串) | 当时间点(红线、绿线)未覆盖设置时的默认音效组(Normal 、Soft 、Drum ) |
Normal |
StackLeniency |
Decimal(精准小数) | 当物件重叠在同一个位置时,决定物件之间是否出现堆叠效果的阈值(0-1) | 0.7 |
Mode |
Integer(整型) | 游戏模式(0 = osu!、1 = osu!taiko、2 = osu!catch、3 = osu!mania) |
0 |
LetterboxInBreaks |
Boolean(布尔值) | 是否开启谱面休息段使用黑边填充设置 | 0 |
StoryFireInFront |
Boolean(布尔值) | 已弃用 | 1 |
UseSkinSprites |
Boolean(布尔值) | 是否允许故事板使用玩家皮肤元素 | 0 |
AlwaysShowPlayfield |
Boolean(布尔值) | 已弃用 | 0 |
OverlayPosition |
String(字符串) | 设置物件皮肤覆盖层与数字层之间的关系(NoChange = 使用玩家皮肤设定, Below = 覆盖层绘制于数字之下,Above = 覆盖层绘制于数字之上) |
NoChange |
SkinPreference |
String(字符串) | 推荐在游玩时使用的皮肤名称 | |
EpilepsyWarning |
Boolean(布尔值) | 是否开启谱面闪烁(癫痫)警告 | 0 |
CountdownOffset |
Integer(整型) | 谱面第一个物件之前的倒计时的偏移值(拍子) | 0 |
SpecialStyle |
Boolean(布尔值) | 是否在 osu!mania 谱面中启用 BMS 风格(N+1 键)的键位设置 | 0 |
WidescreenStoryboard |
Boolean(布尔值) | 是否开启故事板的宽屏显示 | 0 |
SamplesMatchPlaybackRate |
Boolean(布尔值) | 是否允许当变速类型模组开启时,改变音效的播放速率 | 0 |
这些设置只在谱面编辑器内有效,不影响谱面的实际游玩。
项目 | 数据类型 | 描述 |
---|---|---|
Bookmarks |
逗号分隔的 Integer(整型)数组 | 书签(蓝线)的位置(毫秒) |
DistanceSpacing |
Decimal(精准小数) | 间距锁定倍率 |
BeatDivisor |
Integer(整型) | 节拍细分 |
GridSize |
Integer(整型) | 网格大小 |
TimelineZoom |
Decimal(精准小数) | 物件时间轴的缩放倍率 |
项目 | 数据类型 | 描述 |
---|---|---|
Title |
String(字符串) | 歌曲标题的罗马音 |
TitleUnicode |
String(字符串) | 歌曲标题 |
Artist |
String(字符串) | 艺术家的罗马音 |
ArtistUnicode |
String(字符串) | 艺术家 |
Creator |
String(字符串) | 谱师(谱面创建者) |
Version |
String(字符串) | 难度名 |
Source |
String(字符串) | 歌曲信息与档案的来源 |
Tags |
空格分隔的 String(字符串)数组 | 易于搜索的标签 |
BeatmapID |
Integer(整型) | 难度 ID(BID) |
BeatmapSetID |
Integer(整型) | 谱面 ID(SID) |
项目 | 数据类型 | 描述 |
---|---|---|
HPDrainRate |
Decimal(精准小数) | HP 值(0-10) |
CircleSize |
Decimal(精准小数) | CS 值(0-10) |
OverallDifficulty |
Decimal(精准小数) | OD 值(0-10) |
ApproachRate |
Decimal(精准小数) | AR 值(0-10) |
SliderMultiplier |
Decimal(精准小数) | 基础滑条速度倍率,乘以 100 后可得到该速度下每拍内滑条会经过多少 osu! 像素 |
SliderTickRate |
Decimal(精准小数) | 滑条点倍率,每拍中滑条点的数量 |
事件语法: 类型,开始时间,参数
类型
(字符串或者整型): 事件类型,可以用名称或数字来表示。开始时间
(整型): 事件开始时间,以谱面音频开始为原点,单位是毫秒。如果事件的开启时间未确定,则默认为 0。参数
(逗号分隔的数组): 特定的, 在不同事件类型中发挥作用的参数。背景语法:0,0,文件名,x 轴位置,y 轴位置
文件名
(字符串): 背景图片在谱面文件夹内的文件名或者相对路径。若文件路径周围包含英文双引号,则也可被识别。x 轴位置
(整型) 和 y 轴位置
(整型): 以屏幕中心为原点的背景图片位置偏移值,单位是 osu! 像素。例如,50,100
表示这张背景图片在游玩时,需要移动至屏幕中心向右移动 50 osu! 像素,向下移动 100 osu! 像素显示。如果偏移值为 0,0
,也可以忽略不写。视频语法:Video,开始时间,文件名,x 轴位置,y 轴位置
Video
可用 1
代替。
文件名
(字符串)、x 轴位置
(整型)、 y 轴位置
(整型) 的效果与背景图片一致。休息段语法:Break,开始时间,结束时间
Break
可用 2
代替。
结束时间
(整型): 休息段的结束时间。以谱面音频开始为原点,单位是毫秒。获取更多故事板语法,参见:编写故事板代码。
故事板代码可编写并存储至独立的 .osb
扩展名文件内,且这个文件包含的故事板代码,将能在谱面内所有难度运行并显示。
你可以为谱面内的不同难度制作它们专属的故事板,也可以与以上提到的公用故事板结合使用。
每个时间点都会控制谱面的一部分,又常称为“时间轴区间”。.osu
格式要求这些时间点在记录时,需要按时间顺序排序。
时间语法:时间,拍长,节拍,音效组,音效参数,音量,是否为非继承时间点(红线),效果
时间
(整型): 时间轴区间的开始时间,以谱面音频开始为原点,单位是毫秒。这个时间轴区间的结束时间即为下一个时间点的开始时间(如果这是最后一个时间点,则无结束时间)。拍长
(精准小数): 这个参数有两种含义:
-50
代表这一时间段的滑条速度均为基础滑条速度
的 2 倍。节拍
(整型): 一小节中的拍子数量。继承时间点(绿线)的这个值无效果。音效组
(整型): 物件使用的默认音效组(0 = 谱面默认设置(SampleSet
),1 = normal,2 = soft,3 = drum)。音效参数
(整型): 物件使用的自定义音效参数。 0
表示使用 osu! 默认的音效。音量
(整型): 击打物件的音量(0 - 100)。是否为非继承时间点(红线)
(布尔值): 字面意思。效果
(整型): 一位影响时间点特殊效果的参数。参见:效果部分。时间点可以通过在效果
(整型)参数中,通过修改参数值为 1 或者 8(二进制下,是第 0 位和第 3 位),来开启两种特殊效果。
若想同时开启两种效果,则可填 9(1 + 8 = 9)。其余的二进制位暂不使用。
10000,333.33,4,0,0,100,1,1
12000,-25,4,3,0,100,0,1
10 秒处的第一个时间点为非继承时间点(红线),并包含以下的设置:
1 / 333.33 * 1000 * 60
)12 秒处的第二个时间点为继承时间点(绿线),改变滑条速度为 4 倍,并将这一段的音效组切换成 drum 音效组。
本节的所有设置均为颜色设置。这里的颜色为用逗号分隔的 RGB 数组(0 - 255),分别代表此颜色中的红、绿、蓝分量。
项目 | 描述 |
---|---|
Combo# , # 处是整型数据 |
自定义的 Combo 颜色 |
SliderTrackOverride |
自定义的滑条轨道颜色 |
SliderBorder |
滑条边界颜色 |
打击物件语法:x,y,时间,物件类型,打击音效,物件参数,打击音效组
时间
(整型): 物件精确击打的时间。以谱面音频开始为原点,单位是毫秒。物件类型
(整型): 一位标记物件类型的数据。参见:类型部分。打击音效
(整型): 一位标记物件打击音效的数据。参见:音效部分。物件参数
(逗号分隔的数组): 根据物件类型不同附加的一些参数。物件类型参数是一个 8 位整数,每一位都有特殊的含义。
位次序 | 含义 |
---|---|
0 | 将物件标记为圆圈 |
1 | 将物件标记为滑条 |
2 | 标记新 Combo 起始物件 |
3 | 将物件标记为转盘 |
4, 5, 6 | 一个 3 位整数,指定要跳过多少 Combo 颜色(即“跳过连击色 (Colour hax)”)。仅在物件位于新 Combo 开始时才相关。 |
7 | 将物件标记为 osu!mania 长按音符 |
音效
数据用于标记物件的打击音效:
位次序 | 含义 |
---|---|
0 | Normal(普通) |
2 | Whistle(口哨) |
4 | Finish(镲) |
8 | Clap(鼓掌) |
如果没有设置打击音效,则默认为 Normal。
除了 osu!mania 模式之外,在其他模式中游玩,无论皮肤设置的 LayeredHitSounds(总是播放 Normal 音效)
设为何种状态,它都将默认强制启用。
使用打击音效组
数据能更细化地自定义物件的音效。如果没有设置特殊参数,则默认为 0:0:0:0:
。
打击音效组语法:普通音效组:附加音效组:参数:音量:文件名
普通音效组
(整型): Normal 音效的音效组附加音效组
(整型): Whistle、Finish、Clap 音效的音效组音效组编号
(整型): 用于区分不同音效组的编号。如果是 0
,则表示这个打击物件的音效组,沿用控制该物件时间点的音效组设定。音量
(整型): 音效组的音量。如果是 0
,则表示这个打击物件的音量,沿用控制该物件时间点的音量设定。文件名
(字符串): 自定义附加音效的文件名或相对路径。普通音效组
和附加音效组
可以设为以下的这些值:
0
:未设置自定义音效组
1
:Normal 组2
:Soft 组3
:Drum 组以上所有设置(不包括音量设置)共同决定了击打物件时应当播放何种音效。这个音效文件名格式为:<音效组名称>-hit<音效名称><音效组编号>.wav
,其中:
音效组名称
可设为 normal
、soft
、drum
,这确定了普通打击音效
或附加打击音效
的音效组音效名称
可设为 normal
、whistle
、finish
、clap
音效组编号
与上述段落的音效组编号相同。如果值为 0
或 1
,则可忽略不写当加载谱面时,游戏会自动按从上到下的优先级加载对应名称的音效。
音效组编号
不设为 0
时,加载谱面内的音效音效组编号
对应的文件时,加载玩家皮肤内的音效音效组编号
对应的文件时,加载 osu! 默认的音效当填写了文件名
,此时游戏会将这个文件替换掉物件默认的附加打击音效。
圆圈物件没有物件参数
。
滑条语法: x,y,开始时间,物件类型,打击音效,曲线类型|曲线点,滑动次数,长度,头尾音效,头尾音效组,打击音效组
曲线类型
(字符): 构建滑条的曲线类型(B
= 贝塞尔,C
=向心 catmull-rom,L
=直线,P
= 完美圆)曲线点
(竖线分隔的字符串数组): 构建滑条的锚点。每个点的格式为x:y
。滑动次数
(整型): 玩家在滑条完成前需要在滑条上滑动的次数。也可以看成折返次数 +1。长度
(精准小数): 滑条的视觉长度。单位是 osu! 像素。头尾音效
(竖线分隔的整型数组): 当按下滑条和滑条完成(包括折返)时播放的音效。第一个音效是滑条头的音效,最后的音效则是滑条尾的音效。构建滑条时,开头的 x
和 y
确定了滑条头的位置,而曲线点
保存了剩下的控制锚点位置。
osu! 里有四种滑条曲线类型:
如果滑条的长度
比已确定的曲线路径要长,则滑条会从曲线末尾继续延伸,直到达到目标长度。
注意:滑条的长度
描述了完成滑条所需的时间。长度 / (基础滑条速度 * 100 * SV) * 拍长
即完成滑条所需的时间(毫秒)(这里的 SV
是滑条速度倍率,受继承时间点(绿线)控制。如果没有绿线控制,则默认为 1
)。
与头尾音效不同,当玩家在拖动滑条球时,滑条也会播放音效。这个音效会循环播放,直至滑条结束。
这个音效的命名方式与打击音效
和打击音效组
类似,但只支持使用 Normal 和 Whistle 音效。文件名格式为:<滑条音效组>-slider<滑条音效><音效组编号>.wav
。当滑条音效
填写为 slide
时,对应了 Normal 音效,而填写为 whistle
,则对应了 Whistle 音效。
转盘语法: x,y,开始时间,物件类型,转盘音效,结束时间,转盘音效组
结束时间
(整型): 转盘的结束时间,以谱面音频开始为原点,单位是毫秒。x
和 y
不影响转盘的位置。它们的默认值为 256,192
,即游戏区域的正中心。长键语法: x,y,开始时间,物件类型,长键音效,结束时间,长键音效组
结束时间
(整型): 长键的结束时间,以谱面音频开始为原点,单位是毫秒。x
与长键所在的键位有关。算法为:floor(x * 键位总数 / 512)
,并限制在 0
和 键位总数 - 1
之间。y
不影响长键。默认值为 192
,即游戏区域的水平中轴。256,192,11000,21,2
256,192,11200,8,12,12000,3:0:0:80:
100,100,12600,6,1,B|200:200|250:200|250:200|300:150,2,310.123,2|1|2,0:0|0:0|0:2,0:0:0:0:
第一个物件为圆圈:
第二个物件为转盘:
第三个物件为滑条:
osu!taiko 的物件只使用时间
决定物件在游戏区域出现的位置,忽略了物件所处的 x
和 y
值。同样地,滑条的决定参数只有滑条长度
;曲线类型
和曲线点
只会影响谱面在编辑器内的显示模样。Combo 颜色、新 Combo 设置也会被忽略。同时,osu!taiko 有一套模式专属的音效规则。
osu!catch 的游玩区域仅和 x 轴有关,而物件的 y
值则不重要。但是可以通过改变滑条的斜率来影响玩家游玩时盘子的水平加速度。
与 osu!catch 类似,osu!mania 不使用物件的 y
值。而 x
则用于区分物件所处的键位。参见:长键部分。