commit 0835b488f45e1534406e69e1f9302c153ed27d18 Author: xiaoxin <2932869213@qq.com> Date: Wed Nov 12 16:36:09 2025 +0800 upload diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1bb4614 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.code-workspace \ No newline at end of file diff --git a/Charting.md b/Charting.md new file mode 100644 index 0000000..b5df474 --- /dev/null +++ b/Charting.md @@ -0,0 +1,434 @@ +这是关于游戏中使用的谱面文件的基本文档。这些文件显示了歌曲的结构,如 note 位置和节奏。 + +# 须知事项 + +* 本文档不保证 100%准确。某些 tag 定义基于假设,可能需要进一步测试。 +* 该文件格式中的大多数计数都从 0 开始。小节为 0 表示歌曲开始,单元格为 0 表示左边的第一个单元格,等等。 +* 谱面文件的位置在 ``root\app\data\AXXX\music\musicXXXX`` 中。谱面的文件格式为``.c2s``,是纯文本文件,可以用 Notepad++ 等工具打开。 +* 一个单元格是游戏画面上 note 的对应键。游戏区有 16 列,从左到右的数字为 0-15。 +* 小节是包含特定节拍的时间函数。每个小节通常包含 4 个节拍,并在整首歌曲中保持相对一致。 +* 根据我的经验,除非注释的格式非常特殊,否则 Chunithm 通常会忽略注释。在现有的谱面文件中,使用制表符而不是空格来为注释添加修饰符是有效的,而使用空格则无效。根据我的经验,这是 Notepad++ 独有的功能。 +* Chunithm 会在选择时重新加载``.c2s``文件。这意味着只需重新选择正在更改的歌曲,就可以调试自定义谱面。为了简化这一过程,请使用 "DANGER "技能,如 "今わの際"(技能 ID 102005),并在自定义音符后的几小节中放置 ≈20 TAP 音符。这样,您就会自动使 Track 失败,并能更快地重新选择 Track,而无需等待歌曲结束。 + +# Tags + +## VERSION + +通常设置为 1.08.00。(表示用于谱面设计的 ``.c2s`` 处理程序的版本?) + +## MUSIC + +通常设置为 0。在 ``Music.xml`` 文件包含该 ID 之前,它可能是音乐的 ID。 + +## SEQUENCEID + +通常设置为 0。 + +## DIFFICULT + +通常设置为 00。在 ``Music.xml`` 文件包含它之前,它可能是音乐的难度(BASIC, ADVANCED, EXPERT, MASTER, WORLD'S END)。 + +## LEVEL + +通常设置为 0.0。在 ``Music.xml`` 包含谱面文件之前,它可能是谱面文件的级别。 + +## CREATOR + +指定谱面文件的谱师。请注意,除非难度设置为 "BASIC" 或 "ADVANCED" ,否则该字符串将出现在选曲界面歌曲卡片的左下方。 + +## BPM_DEF + +指定默认 BPM。 + +### 示例: + +| 1 | 2 | 3 | 4 | +| ---- | ---- | ---- | ---- | + +1 通常包含真正的默认 BPM,或歌曲开始时的 BPM。2 通常包含备选 BPM,或歌曲除 1 中的 BPM 之外最常用的 BPM。3 和 4 似乎分别反映了 2 和 1。 + +## RESOLUTION + +表示歌曲的分辨率。始终设置为 384。 + +## CLK_DEF + +始终设置为 384。 + +## PROGJUDGE_BPM + +始终设置为 240.000。 + +## PROGJUDGE_AER + +始终设置为 0.999。 + +## TUTORIAL + +指定谱面是否为教程谱面。 + +## BPM + +指定歌曲中指定小节的 BPM。 + +### 示例: + +| Beginning Measure | Offset | BPM | +| ---- | ---- | ---- | + +## MET + +指定歌曲中指定小节的时间标记。 + +### 示例: + +| Beginning Measure | Offset | Second Value | First Value | +| ---- | ---- | ---- | ---- | + +需要注意的是,时间符号的数值是相反的。值得一提的是,这纯粹是表面现象。该值唯一会影响的是游戏画面上细长小节线的位置。 + +## SFL + +指定歌曲指定小节时的播放速度。 + +### 示例: + +| Beginning Measure | Offset | Duration | Multiplier | +| ---- | ---- | ---- | ---- | + +值得注意的是,乘数的精确度必须为 0.000001,即小数点后必须有六位数。该值将乘以玩家当前的游戏速度,因此音符会根据该值显示得更快或更慢。该值纯粹是外观上的,不会影响 .c2s 文件中音符的位置,只有播放器会看到区别。该值也可以设为负数,这将导致谱面反向移动,通常用于美观目的,如[Fracture Ray 的 MASTER 谱面的这一部分](https://youtu.be/5m7bMyIDoec?t=48)。 + +# Notes + +## 通用 Note 示例 + +| Note Type | Measure | Offset | Cell | Width | +| ---- | ---- | ---- | ---- | ---- | + +### Note 类型 + +note 类型是指您希望在此特定点上放置的 note 类型。有多种类型的 note 可以使用,其中大部分都有附加变量,这些变量将附加到典型模式的末尾。稍后会有更多信息解释这些 note 。 + +#### Note 类型: + +* TAP (tap) +* CHR (ex-note) +* HLD (hold) +* SLD (slide) +* SLC (slide control point) +* FLK (flick) +* AIR (air) +* AUR (air up-right) +* AUL (air up-left) +* AHD (air hold) +* ADW (air downwards) +* ADR (air down-right) +* ADL (air down-left) +* MNE (mine) + +### Measure + +小节是您希望音符所在的具体小节。每个小节(通常)为 4 拍。该值从 0 开始无限延续,但应始终与歌曲一起结束。 + +### Offset + +时间函数,用于显示音符或定时点与小节的偏移量。这取决于歌曲的分辨率,由 RESOLUTION(分辨率)tag 指定。全分辨率为一小节,因此分辨率为 384 时,小节的第一拍为 0,第二拍为 96,第三拍为 192,第四拍为 288。要获得所需的节拍,先将分辨率除以 4,再乘以所需的节拍,然后减去分辨率除以 4。 + +如果是几分之一拍,先用分辨率除以 4,再乘以所需的几分之一拍。然后将结果与所需节拍相加。 + +The function for this would be: + +```b(r/4)-(r/4) + f(r/4)``` + +其中,b 是四舍五入为整数的所需节拍,r 是歌曲的分辨率,f 是节拍的分数。 + +例如,如果我想在一首分辨率为 384 的四拍子歌曲的第 2 个1/2 拍出现一个 note ,我会执行以下步骤: + +``` +2(384/4)-(384/4) + 1/2(384/4) +192 - 96 + 48 +144 +``` + +### Cell + +如上所述,单元格是音符应出现在游戏栏中的数字 ID。请注意,该值应是音符从**左侧**首先出现的列。 + +### Width + +宽度(Width)值与单元格值不同,它表示音符的宽度,从单元格中列出的值向右延伸。最小值为 1,这意味着 note 只占用单元格中列出的列。例如,如果单元格值为 7 的 note 宽度为 3,则该 note 将占用第 7、8 和 9 列。 + +## Additional Note Values + +大多数备注类型需要附加信息才能正常运行。本节将举例说明附注使用的模式,然后解释未包含在通用模式中的任何值。任何带引号的值都表示与该附注一致的值。 + +### Tap + +Tap 是最基本的可以放在谱面的 note 。它们只要求玩家在规定的时间内敲击 note 所在的单元格。 + +#### 示例: + +| "TAP" | Measure | Offset | Cell | Width | +| ---- | ---- | ---- | ---- | ---- | + +Tap notes 与上述通用示例没有区别。 + +### Ex-Notes + +Ex-Notes 与 Tap 类似,但玩家只要准确敲击,就能获得更多分数。 + +#### 示例: + +| "CHR" | Measure | Offset | Cell | Width | Unknown | +| ---- | ---- | ---- | ---- | ---- | ---- | + +* Unknown: 数值似乎总是 "UP"、"CE "或 "DW"。(译者注:打击Ex-Notes后的动画移动方向?) + +### Hold + +Hold 与 Tap 类似,但要求玩家连续按住指定单元格一段时间。 + +#### 示例: + +| "CHR" | Measure | Offset | Cell | Width | Duration | +| ---- | ---- | ---- | ---- | ---- | ---- | + +* Duration:音符需要按住的时间。该值与偏移量的格式相同。 + +### Slide + +Slide 与 Hold 类似,但可以在保持的同时在单元格之间移动。Slide 有两种类型:SLD 和 SLC。以直线开始的 Slide 以 SLD 开始,而立即开始移动的 Slide 则以 SLC 开始。所有 Slide 都以 SLD note 结束。 + +#### 示例: + +| "SLD"/"SLC" | Measure | Offset | Cell | Width | Duration | End Cell | End Width | +| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | + +* Duration:note 移动到目标单元格所需的时间。该值与偏移量的格式相同。 +* End Cell:Slide 在持续时间内移动的列。与单元格值类似,该值将位于单元格左侧,范围在 0-15 之间。要使 Slide 在持续时间内保持直线,可将单元格结束值设置为与单元格值相同。 +* End Width:Slide 在持续时间结束时的宽度。与 "宽度 "值类似,该值可在 1-16 之间任意设置。如果 "结束宽度 "与 "原始宽度 "不同,Slider 的宽度将在 Slide 播放过程中逐渐缩小或扩大。 + +在您调用同一单元格中的 SLD 之前,Slide 不会结束,而此时另一个 Slide 也在同一单元格中,之后不会出现另一个 Slide 。在连续 Slide 中间调用 SLD 会在该特定点添加一个额外的蓝色 note ,这纯粹是为了美观(译者注:?)。要调整 Slide 而不添加其他音符,请使用 SLC。 + +Slide 左右快速晃动的功能并不是游戏的内置功能,而只是让 Slide 在很短的偏移时间内左右移动几个单元格。 + +### Flick + +Flick 需要玩家将手指放在flick note 所在的单元格内,然后向任意水平方向轻滑。 + +#### 示例: + +| "FLK" | Measure | Offset | Cell | Width | Unknown | +| ---- | ---- | ---- | ---- | ---- | ---- | + +* Unknown:值始终为 "L"。请注意,这不是华东的方向,Flick 可以从任何方向滑动。(译者注:不会是SEGA把定向滑动删了吧)) + +### Air + +Air 是指玩家通过物理键盘上方的红外传感器举起双手。与其他 note 不同,这些 note 是对已有 note 的修改。这种 note 也有不同的外观版本,但功能完全相同。 + +#### 示例: + +| "AIR"/"AUR"/"AUL" | Measure | Offset | Cell | Width | Target Note | +| ---- | ---- | ---- | ---- | ---- | ---- | + +* AIR/AUR/AUL:这些 note 类型在功能上完全相同,但会影响 note 上方箭头的外观。AIR 有一个向上的箭头,AUR 有一个向上向右的箭头,而 AUL 则有一个向上向左的箭头。 +* Target Note:该值指定了 Air note 所 "吸附 "的 note 。该 note 应与 Air Note 位于同一单元、小节和偏移量中。此外,建议只在 note 的末尾使用该 note ,而不是在延音的中间使用。对于高级谱面,可以放弃这一建议。 + +## Air Hold + +Air Hold 是指玩家在完成 Air Note 后,将双手举向传感器。Air Hold总是会自动以一个空中向下的 note 结束。(译者注:NEW!! 后好像可以不需要末尾有向下动手的 note) + +#### 示例: + +| "AHD" | Measure | Offset | Cell | Width | Target Note | Duration | +| ---- | ---- | ---- | ---- | ---- | ---- | ---- | + +* Target Note:该值指定了 Air note 所 "吸附 "的 note 。该 note 应与 Air note 位于同一单元、小节和偏移量中。此外,建议只在 note 的末尾使用该 note ,而不是在延音的中间使用。对于高级谱面,可以放弃这一建议。 +* Duration: note 移动到目标单元格所需的时间。该值与偏移量的格式相同。 + +要在持续的 air note 中加入 mid-air downwards notes ,可将第一个 air hold note 持续到 mid-air note 的位置,然后再加入一个 air hold note ,其起始位置与前一个 air hold note 的结束位置偏移相同。 + +### Downwards + +Downwards 是指玩家通过物理键盘上方的红外传感器将手放下。与其他 note 不同,这些note 是对已有note 的修改。note 也有不同的外观版本,但功能完全相同。 + +#### 示例: + +| "ADW"/"ADR"/"ADL" | Measure | Offset | Cell | Width | Target Note | +| ---- | ---- | ---- | ---- | ---- | ---- | + +* ADW/ADR/ADL:每种 note 类型的功能都是相同的,只是会影响 note 上方箭头的外观。ADW 箭头向下,ADR 箭头向右,ADL 箭头向左。 +* Target Note:该值指定了 downwards note "吸附 "的 note。该 note 应与 downwards note 位于同一单元、小节和偏移量中。此外,建议只在 note 的末尾使用该 note,而不是在延音的中间使用。对于高级谱面,这一建议可不予考虑。 + +### Mines + +Mine 要求玩家不要触碰放置 mine 的单元格。触碰 note 将导致玩家失分,并可能导致Track Lost(卡车丢失))。 + +| "MNE" | Measure | Offset | Cell | Width | +| ---- | ---- | ---- | ---- | ---- | + +Mine 所需的信息与 Tap 相同,只需遵循上述通用模式即可。 + +# Notes 演示 + +下面是 Cyaegha 的 MASTER 难度谱面,分辨率(RESOLUTION)为 386。 + +``` +TAP 8 0 6 4 +TAP 8 0 12 4 +SLC 8 96 4 4 7 3 4 +TAP 8 96 10 4 +SLC 8 103 3 4 10 2 4 +SLC 8 113 2 4 13 1 4 +SLC 8 126 1 4 22 0 4 +SLD 8 148 0 4 236 0 4 +TAP 8 192 8 4 +SLC 8 288 6 4 4 7 4 +SLC 8 292 7 4 12 9 4 +SLC 8 304 9 4 9 10 4 +SLC 8 313 10 4 12 11 4 +SLC 8 325 11 4 23 12 4 +SLD 8 348 12 4 36 12 4 +AHD 9 0 0 4 SLD 192 +CHR 9 0 4 8 CE +AIR 9 0 4 8 CHR +AHD 9 0 12 4 SLD 192 +TAP 9 288 3 4 +TAP 9 288 9 4 +``` + +以下是本节的游戏玩法。我们将对上述节选的每一行进行细分,以查看其相应的游戏模式。 + +![Demonstration of Cyaegha Excerpt](./_assets/cyaegha%20example.gif) + +开头的两个 Tap 显示为: +``` +TAP 8 0 6 4 +TAP 8 0 12 4 +``` + +这些行中数值的顺序如下: + +``Tap note | on the 8th measure | with an offset of 0 | starts on cell 6/cell 12 | extends 4 cells to the right`` + +可以看出,这些 note 应该是同时出现的,因为它们具有相同的小节和偏移量。请记住,这些单元格的标记是 0-15,也就是说左边的第一个单元格是 0 单元格。 + +接下来的两个 note 是同时出现的 slide 和 tap。在文件中显示为: +``` +SLC 8 96 4 4 7 3 4 +TAP 8 96 10 4 +``` + +请注意,slide 的 note 类型是 SLC,因为 slide 是在滑动中开始的。如果 slide 一开始是静止的,它的 note 类型就会是 SLD。 + +Slide note 的数值顺序如下: + +``Slide note | on the 8th measure | with an offset of 96 | starts on cell 4 | extends 4 cells to the right | has a duration of 7 resolution | ends on cell 3 | ends with a width of 4`` + +这里有几件重要的事情需要注意。首先,小节数为 8,偏移量为 96,这意味着 note 发生在第 8 小节的第二拍(记住,偏移量为 0 意味着第一拍)。它的持续时间也很短,只有 7 分辨率。这意味着 slide 的持续时间几乎只有小节的 2/100。之所以这么短,是因为它的设计看起来像一条曲线。后来有一些 SLC note 附着在第一个 slide 上,逐渐将形状变为曲线。 + +稍后的 tap 的数值顺序为 + +``Tap note | on the 8th measure | with an offset of 96 | starts on cell 10 | extends 4 cells to the right`` + +同样,由于这两个 note 出现在相同的小节和偏移量上,因此它们是同时发生的。 + +接下来的说明是 slide 的几个控制点,以及创建一个新 slide 和一个 tap 说明。它们分别是 +``` +SLC 8 103 3 4 10 2 4 +SLC 8 113 2 4 13 1 4 +SLC 8 126 1 4 22 0 4 +SLD 8 148 0 4 236 0 4 +TAP 8 192 8 4 +SLC 8 288 6 4 4 7 4 +SLC 8 292 7 4 12 9 4 +SLC 8 304 9 4 9 10 4 +SLC 8 313 10 4 12 11 4 +SLC 8 325 11 4 23 12 4 +SLD 8 348 12 4 36 12 4 +``` + +这里有几件重要的事情需要注意。首先,顶部的 SLC 相继出现的速度非常快。如上所述,这是因为要创建一个弯曲的 slide ,所以要非常精确才能看起来流畅。紧随其后的还有一个 SLD,其持续时间为 236 分辨率。这一点很重要,因为你可以看到这个 slide 应该与另一个 slide 同时结束。如果将偏移量(148)和持续时间相加,就会得到 384 的值。如果将底部第二个 SLD 的偏移量和持续时间相加,结果也是 384。由于它们都在同一量程上,这表明它们将在彼此相同的时间结束。值得一提的是,第二对 SLC 与第一对 SLC 无关。它们从另一个 slide 的独立单元格开始,因此它创建了一个新的slde ,而不是扩展之前的 slide 。 + +选段的最后部分包含几个 air note 、一个 air hold, 、一个 ex-note 和几个 tap 。这些 note 在文件中显示为: +``` +AHD 9 0 0 4 SLD 192 +CHR 9 0 4 8 CE +AIR 9 0 4 8 CHR +AHD 9 0 12 4 SLD 192 +TAP 9 288 3 4 +TAP 9 288 9 4 +``` + +您会注意到,AHD、AIR 和 CHR note 都是同时开始的,因为它们共享相同的小节和偏移量。让我们来分解每个 note 。 + +AHD 的说明如下: + +``Air hold note | on the 9th measure | with an offset of 0 | starts on the 0th cell/12th cell | extends to the right by 4 cells | leaches off of the Slider note that occupies that same cell | has a duration of 192 resolution`` + +CHR 的说明如下: + +``Ex-note | on the 9th measure | with an offset of 0 | starts on the 4th cell | extends to the right by 8 cells | CE modifier`` + +AIR note 的说明如下: + +``Air note | on the 9th measure | with an offset of 0 | starts on the 4th cell | extends to the right by 8 cells | leaches off of the ex-note that occupies the same cell`` + +节选最后以两个 TAP note 结束,其含义如下: + +``Tap note | on the 9th measure | with an offset of 288 | starts on the 3rd/9th cell | extends to the right by 4 cells`` + +对 Cyaegha 节选的分析到此结束。 + +# 结束 Tags + +**注意:** 这些值虽然是经过最少的测试得出的,但似乎不会影响 track 的功能。因此,在创建自定义 track 时,可以完全忽略这些值。 + +## T_REC_XXX + +``XXX`` 被替换为 note 类型(TAP、CHR、FLK、MNE、HLD、SLD、AIR、AHD)的简称,以及一个标有 ``T_REC_ALL``的字段。它似乎是对每个谱面中指定类型 note 数量的计数。``T_REC_ALL``等于前面的 ``T_REC_XXX ``字段的值相加。 + +## T_NOTE_XXX + +似乎与 ``T_REC_XXX`` 相同,但尽管在同一个谱面中,数值却彼此不同。 + +## T_NUM_XXX + +似乎与 ``T_REC_XXX`` 和 ``T_NOTE_XXX`` 相同,但没有 ``T_XXX_ALL`` 字段,取而代之的是一个未知的 ``T_NUM_AAC`` 字段。 + +## T_CHRTYPE_XX + +``XX`` 被替换为 CHR note 修饰符(UP、DW、CE)的缩写。该命令用于计算音轨中带有指定修饰符的 CHR note 的数量。 + +## T_LEN_XXX + +``XXX`` 被替换为 "sustain" notes(持续音符)(HLD、SLD、AHD、ALL)的简称,以及一个标有 ``T_LEN_ALL`` 的字段。该字段似乎与 ``T_REC_XXX`` 相同,但它计算的是指定类型的 "sustain" notes(持续音符) 的有效毫秒数。``T_LEN_ALL`` 等于前面的 ``T_LEN_XXX`` 字段的值相加。 + +## T_JUDGE_XXX + +U未知。 + +## T_FIRST_XXXX + +有两个tag:``T_FIRST_MSEC`` 和``T_FIRST_RES``。两者分别表示第一个 note 的时间戳(毫秒)和分辨率。 + +## T_FINAL_XXXX + +有两个tag:``T_FINAL_MSEC`` 和``T_FINAL_RES``。这两个标记分别表示最后一个 note 的时间戳(毫秒)和分辨率。这不一定等于谱面文件中列出的 note 的时间戳,因为 sustained notes(持续音符)会将时间戳移动到音符结束时。 + +## T_PROG_XX + +有 20 个tag,从 ``T_PROG_00`` 开始,以 5 个为增量递增到 ``T_PROG_95`` 作为最终标记。未知。 + +# Cosmetics + +本文档的这一部分将概述游戏中发现的 note 的各种外观信息。这不是关于 note 的通用信息,例如 note 的具体颜色,而是在创建自定义谱面时可能有用的小细节。这些信息不会对游戏产生任何影响。 + +## Flick Notes + +Flick Notes 显示为一个灰色 note ,内含一个蓝色小 note 。蓝色 note的宽度是 tap 的三分之一,位于 note 的中心。 + +## Air/Down Notes + +Air note 和 down note 的上方或下方都有一个箭头,其宽度与相关 note 相同。这些 note 的角度总是指向原 note左侧或右侧的单元格。 \ No newline at end of file diff --git a/Customs.md b/Customs.md new file mode 100644 index 0000000..5a07f59 --- /dev/null +++ b/Customs.md @@ -0,0 +1,60 @@ +让 Chunithm 识别并将自制谱添加到选曲界面是一个不直观的过程,因此这里将解释如何正确添加自制内容的基础知识。 + +# 设置文件格式 + +由于游戏的性质,Chunithm对它所期望的文件种类和这些文件的规格要求非常明确。如果这些规格不正确,Chunithm 就会直接拒绝在选曲界面上显示歌曲,而不会说明明确的原因。你可以在 [[基本信息](General.md)](General.md#文件类型) 页面上找到 Chunithm 希望看到的文件类型的快速概览。 + +## 图像 + +您可能要处理的两种图像文件是 "封面 "和 "版权"。封面文件是歌曲的 "cover art",可在选曲界面、游戏过程中、结果界面和其他地方看到。版权文件是选择相关歌曲时出现在屏幕左下方的版权信息。 有关这些文件格式的信息,请参见 [基本信息](General.md#文件类型) 页面。 + +## 音频 + +音频是最难处理的文件。它采用 CRIWARE 称为 ADX2 的专有音频格式编码,因此很难复制。幸运的是,有一些工具可以解码和编码这些文件。本节将主要介绍如何将自定义文件编码为这种格式。有关这些文件格式的信息,请参见 [基本信息](General.md#音频文件)页面。 + +### 必要程序 + +* [SonicAudioTools](https://github.com/blueskythlikesclouds/SonicAudioTools) +* [VGAudio](https://github.com/Thealexbarney/VGAudio) +* [HXD](https://mh-nexus.de/en/hxd/) +* [Audacity](https://www.audacityteam.org/) (可选项,用于调整音量、裁剪、查找预览位置以及将音频文件转换为`.wav`文件。) + +### 提取 + +为了制作自制的 ADX2 乐曲,我们首先要解压缩已有的歌曲。建议备份提取的文件,因为在此方法中你将替换这些文件,之后你需要再次替换文件以防止游戏中的歌曲被覆盖。首先,导航至 ``root\app\data\AXXX\cueFile`` 并选择任意 ``cueFileXXXXXX`` 文件夹。在另一个文件资源管理器窗口中,打开 SonicAudioTools 文件夹。将 cueFile 文件夹中的 ``.acb`` 文件拖入 ``AcbEditor.exe``。cueFile 文件夹中将创建一个新文件夹。在这个文件夹中,将有一个 ``.hca`` 文件。我们暂时不必对该 ``.hca`` 文件做任何处理,而是将其覆盖。 + +### 准备文件 + +首先,你要获取想要的音频文件,并将其放入 Audacity 或你选择的音频编辑器中。你现在要做的两件事是调整音量,使其平均电平为 -16dB。这可以在 Audacity 的 "分析" 下的 "对比度" 选项中看到。接下来,你要将歌曲裁剪到所需的长度。Chunithm 中的乐曲通常在 2 到 3 分钟之间,您需要将歌曲裁剪到这个范围左右。如果歌曲长度超过 3 分钟,您可能需要删除歌曲中间的一些部分,如第二节和副歌,从而缩短歌曲长度。确保听起来自然!然后,将文件导出为 16 位 .wav 文件。 + +### 编码 + +打开 VGAudio,找到刚才导出的 ``.wav`` 文件。使用该程序将其转换为 ``.hca``。它的标签可能只是 "HCA" 或 "CRI HCA"。将新的 ``.hca`` 文件放到提取第一个 ``.hca`` 文件的文件夹中,然后用相同的名称覆盖现有文件。拖动包含 ``.hca`` 文件的父文件夹并将其放到 ``AcbEditor.exe`` 上。如果一切操作正确,您将用自己的自定义文件覆盖``.acb``和``.awb``文件。 + +### 最后润色(Final Touches) + +用自制谱的 ID 重命名新的 ``.acb`` 和 ``.awb`` 文件。如果尚未创建自定义 Music.xml 文件,只需创建自己的唯一 ID。最后,在 HxD 中打开 ``.acb`` 文件。使用 ``CTRL + F`` 搜索 "music"。查找包含原始 ``.acb`` 文件中先前 ID 的字段,并用新 ID 将其替换。保存 ``.acb`` 文件,并将文件对放在安全的地方。这将在以后的步骤中使用。 + +# 将所有内容整合在一起 + +本节将重点介绍您需要创建和编辑的文件和目录。 + +## 新文件夹 + +### 添加 CueFile + +在 ``root\app\data\AXXX\cueFile`` 目录中,创建一个新文件夹并命名为 ``cueFile00XXXX`` ,将 ``XXXX`` 替换为自定义 ``.acb`` 和 ``.awb`` 文件的 ID。将自定义的 ``.acb`` 和 ``.awb`` 文件拖放到此文件夹中。创建一个新文件并将其命名为 ``CueFile.xml``。将另一个文件夹中 ``CueFile.xml`` 文件的内容复制并粘贴到这个新文件中。将 ````、````、````、```` 和 ```` 标记值替换为适当的值,通常是将 ID 替换为正确的 ID。 + +### 添加音乐 + +在 ``root¥app¥data¥AXXX¥music`` 目录中创建一个新文件夹并命名为 ``musicXXXX``,将 ``XXXX`` 替换为自定义 ID。在此创建一个名为``Music.xml``的新文件,然后将现有``Music.xml``文件的内容复制并粘贴到该文件中。按照 [Music](Music.md) 文档中解释的规范配置此文件。您还需要该目录中的 ``.c2s`` 文件。如果您只想让歌曲出现在选曲界面上,可以将现有的 ``.c2s`` 文件复制并粘贴到此目录中,无需进行任何编辑。 + +### 添加版权信息(可选) + +除非你想添加自己的自定义 RightsInfo 图像,否则本部分是可选的。在 ``root\app\data\AXXX\rightsInfo`` 目录中,创建一个新文件夹并命名为 ``rightsInfoXXXXXX`` ,将 ``XXXXXX`` 替换为一个唯一的 ID,该 ID 可以与自定义歌曲的 ID 分开。将自定义版权文件移入此文件夹,并命名为 ``CHU_UI_Rights_XXXX.dds``。创建一个名为 ``RightsInfo.xml`` 的文件,并将现有 ``RightsInfo.xml`` 文件的内容复制并粘贴到新文件中。将 ```` 替换为版权图像内容的概述,将 ```` 替换为与父文件夹相同的 ID(不包括前面的 0),将 ```` 替换为自定义版权图像内容,将 ```` 替换为先前添加的 ``.dds`` 文件的文件名。 + +## 编辑文件 + +### 编辑音乐分类 + +在``root\app\data\AXXX\music`` 目录中找到的 ``MusicSort.xml`` 文件列出了歌曲选择菜单中每首歌曲的顺序。该文件与歌曲所属的流派无关,但其格式仍考虑到了流派。要添加歌曲,只需创建一个新的 ```` 标记,其中的 ```` 和 ```` 标记将分别替换为歌曲的自定义 ID 和歌曲名称。 \ No newline at end of file diff --git a/DISCLAIMER b/DISCLAIMER new file mode 100644 index 0000000..62b3aa7 --- /dev/null +++ b/DISCLAIMER @@ -0,0 +1,5 @@ +本文件不纵容非法盗版、操作、修改或逆向工程CHUNITHM街机游戏,也不任何经世嘉授权的游戏,因为此类行为可能违反日本和国际法。 + +本文档中“逆向工程”一词描述的是非二进制文件及其与功能相关性的研究本文档中的所有信息均非通过对游戏提供的二进制文件和代码进行逆向工程。不本软件附带的受版权保护的图像、视频、音频或二进制文件文档图像、视频和文件摘录被重新创建,独立于其原始材料,或属于公共领域。创建和修改“图表”被视为合理使用根据互操作性条款。 + +“CHUNITHM”是世嘉公司的商标。“Arcaea”是商标Lowiro Limited。所有引用的歌曲均属于其各自所有者。 \ No newline at end of file diff --git a/General.md b/General.md new file mode 100644 index 0000000..9d61095 --- /dev/null +++ b/General.md @@ -0,0 +1,59 @@ +这是一份关于Chunithm的文件格式以及本研究文集的一般信息列表。其中包括感兴趣的文件列表、文件概览、其他文件链接(如有)以及本研究文件的元信息。 + +# Meta + +* 本指南**并不保证**与当前版本的 Chunithm Paradise 同步。本指南是根据 "Chunithm Paradise"编写的。虽然我假定本指南中的几乎所有信息都将继续适用于 Chunithm 的后续版本,但我不能保证本指南与 Paradise Lost 和 Chunithm New 等后续版本100%兼容。此外,在新版中出现的 AIR SLIDE notes和 AIR CRUSH notes还没有谱面文档。未来可能会有所改变。 +* 这**不是**在 Chunithm "clones"中创建自定义歌曲的指南。这包括像 SUSPlayer、Laverita 或 Seaurchin 等程序。这些游戏使用不同的谱面格式,并以完全不同的、通常是精简的方式实现自定义歌曲。 +* Chunithm 经常使用``.xml``文件。为方便起见,本文档假定您了解``.xml``文件的基本格式。 +* 提及 "音乐"和 "歌曲"时,指的是 ``music`` 文件夹中的文件,其中包括 ``Music.xml`` 和谱面文件。提到 ``audio`` 时,将指的是 ``cueFile`` 文件夹中的文件。 +* 如果有人制作了一种工具来简化本文档中概述的任何流程,虽然显然不需要注明本文档的出处(查看 [UNLICENSE](UNLICENSE)), 但我们仍将不胜感激。 + +# 歌曲如何结束 + +在 Chunithm 中游玩歌曲时,谱面将在最后一个 note 之后”结束"。这时,顶部的进度条动画和"FULL COMBO/ALL JUSTICE "图形就会出现。但是,歌曲会在音频文件播放完毕后"结束"。这时,歌曲结束时出现的任何技能(如支援技能)都会激活,不久后就会出现结算页面。 + +# MASTER 和 WORLD'S END 难度 + +除非满足两个条件之一,否则歌曲的 MASTER 难度将无法解锁: + +* 玩家以 S 评级或更高评级通过了歌曲的MASTER难度,或 + +* 玩家使用的票卷允许游玩MASTER难度的谱面。(在票卷的 ``Ticket.xml`` 文件中的 ```` 字段下注明已启用)。 + +在创建自制谱时,一定要注意这一点。如果谱面作者打算让其谱面具有MASTER难度,则应始终为MASTER难度提供有效的、可完成的谱面。否则,应将谱面设为其他 3 个正常难度之一。 + +除非玩家使用的票卷允许游玩 WORLD'S END 难度的乐曲,否则无法访问乐曲的 WORLD'S END 难度。(在票卷的``Ticket.xml``文件的````字段下注明已启用) 创建自制谱时,不宜创建 WORLD'S END 谱面。除非玩家连接到 AIME 或 Minime 服务器,并购买或使用 WORLD'S END 票卷作弊,否则无法访问这些谱面。 + +# 文件夹 + +Chunithm 接收更新的方法是将新信息分别存储在 "root\app\data "中的 "AXXX "文件夹中。根据更新内容的不同,这些文件夹中的 "X "代表不同的数字。本文档中提到的 "AXXX "指的是未指定的 "A "文件夹。值得注意的是,虽然歌曲的补充文件(音频、封面、版权)通常都在同一个 ``A`` 文件夹中,但它们也有可能在其他文件夹中。目前,我们假设较新的 AXXX 文件夹将覆盖较旧的 AXXX 文件夹在游戏中的数据,尽管较旧的文件将保持不变,但这一点尚未得到证实。值得注意的是,Chunithm 的更新会定期删除某些预先存在的歌曲,通常是由于版权到期。此外,值得注意的是,Chunithm的主要更新会改变名称和增加新功能(例如,Amazon到Crystal,或Crystal到Paradise),不会涉及新的AXXX文件,而是将它们全部压缩到A000文件夹中。除其他二进制文件外,``root\app\bin``中的.exe也可能被覆盖。 + +# 文件类型 + +这是一份没有专门页面的相关文件类型的列表,以及这些文件的位置和必要的其他信息链接。这**并不是**一个广泛的列表,一些不感兴趣的文件将不包括在内。 + +## 音频文件 + +音乐音频文件位于``root\app\data\AXXX\cueFile\cueFileXXXXXX``中。插入点文件的 ID 可以在与相关歌曲的谱面文件位于同一文件夹中的 ``Music.xml`` 文件的 XML ```` 标记中找到。通常情况下,这些文件的 ID 与相应的音乐 ID 相同。这些文件以专有的[CRIWARE ADX2 音频格式](https://en.wikipedia.org/wiki/ADX_(file_format))编码,以``.awb``和``.acb``文件对形式存在。这些文件可由 [vgmstream](https://vgmstream.org/) 库,特别是 [foobar2000](https://www.foobar2000.org/) 的组件播放和转换。有关如何将自己的文件编码成这种格式的信息,请参阅 [Customs](https://github.com/Suprnova123/Chunithm-Research/blob/main/Customs.md) 文档。 + +## 封面文件 + +封面文件,也就是与歌曲相关联的图片,与谱面文件放在同一文件夹中,文件格式为 ``.dds``(DirectDraw Surface),可在 [GIMP](https://www.gimp.org/) 等软件中打开。插图文件的分辨率始终为 300x300。要模仿与 Chunithm 套装相同的文件大小,虽然通常没有必要,但可以从 GIMP 的导出设置中以 BC1 / DXT1 压缩导出任何自定义的 ``.dds`` 套装文件。 + +## 版权文件 + +版权文件是出现在特定歌曲选曲界面左下方的图像。由于文字后面的图像是独立的纹理,每个版权文件都会重复使用,因此版权文件应作为包含文字本身的文件使用。版权文件的格式始终是分辨率为 512x48 的``.dds``(DirectDraw Surface)文件格式,可以在``root\app\data\AXXX\rightsInfo\rightsInfoXXXXXX`` 中找到。要模仿与 Chunithm 权利文件相同的文件大小,虽然通常没有必要,但可以从 GIMP 的导出设置中使用 BC1 / DXT1 压缩导出任何自定义的 ``.dds`` 权利文件。 + +# Dummies + +虚拟文件用于纹理,作为游戏希望纹理格式化的模板,主要是在分辨率方面。请注意,提供这些文件的 ``.png`` 版本只是为了方便,所有最终版本仍应使用 ``.dds`` 格式。 + +## Jacket Dummies + +* [.dds](./_assets/jacket_dummy.dds) +* [.png](./_assets/jacket_dummy.png) + +## Rights Dummies + +* [.dds](./_assets/rights_dummy.dds) +* [.png](./_assets/rights_dummy.png) diff --git a/Music.md b/Music.md new file mode 100644 index 0000000..5ec5ae6 --- /dev/null +++ b/Music.md @@ -0,0 +1,141 @@ +这是每个乐曲文件夹下的 ``root\app\data\AXXX\music\musicXXXX\Music.xml`` 文件的通用文档。 + +# 概述 + +``Music.xml`` 是与特定歌曲的谱面同在一个文件夹中的单一文件。该文件实质上是歌曲的元数据,为游戏提供了除谱面外几乎所有关于歌曲的信息。请注意,本文档不包括整个 XML 文件的结构,只包括其中的含义。要创建自己的 ``Music.xml`` 文件,请使用已有的文件作为模板,然后使用此处列出的规范。 + +本游戏中的 ``Music.xml`` 文件频繁使用了库存数组布局,如下所示: + +```xml + + + +``` + +任何对 "库存数组 "的引用都意味着值中存在这种数组格式,```` 和 ```` 标签已指定其值。````从不包含任何值,并始终采用这种格式。 + +# 标记 + +## dataName + +````标记将有一个以父文件夹命名的值,通常是``musicXXXX``。 + +## formatVersion + +````标记的值始终为 ``10000``。 + +## resourceVersion + +````标记始终包含一个库存数组,其````值为``0``,````值为``10000``。 + +## netOpenName + +````标记包含一个未知值的存量数组。可能的解释是,这些值表示歌曲最初添加到游戏中的更新。 + +## disableFlag + +````标签的值为``false``或``true``。启用 disableFlag 后,歌曲将不会出现在歌曲选择屏幕上。 + +## exType + +````标记的值为 0 到 2 之间的整数。如果值为 ``0``,歌曲将成为可在歌曲选择屏幕上选择的普通歌曲。如果值为``1``,歌曲将成为教程歌曲。数值为 ``2`` 时,歌曲将变为 WORLD'S END 歌曲。 + +## name + +````标记包含一个库存数组,其中````值等于父文件夹名称的后 4 位数字(去掉前面的 0),````值包含将在游戏中显示的歌曲名称。 + +## rightsInfoName + +````标记包含一个库存数组,其````值等于``root\app\data\AXXX\rightsInfo\rightsInfoXXXX``文件夹中相应的``rightsInfo``文件,去掉前面的0,以及一个````值,其中包含在``RightsInfo.xml``文件的``name``标记中显示的版权持有者名称(而非游戏中的名称)。如果歌曲不需要版权声明,则 ```` 的值为 ``-1``,```` 的值为 ``Invalid``。 + +## sortName + +````标记以可按字母顺序排序的格式包含歌曲名称。所有拉丁字符均大写,所有标点符号和空格均被删除。对于日文标题,所有平假名和汉字都会转换成对应的片假名。 + +## artistName + +````标记包含一个库存数组,其中````的值等于曲师的 ID,````的值是曲师在游戏中的名字。如果该曲师之前未在歌曲中使用过,则应赋予其与歌曲相同的 ID。如果以前使用过曲师,则应赋予与以前歌曲中使用的曲师 ID 相同的 ID。 + +## genreName + +````标记包含一个````标记,该标记包含一个````标记,该标记包含一个存量数组,其中````值等于根据``root\app\data\AXXX\music``中的``GenreSort.xml``文件找到的有关版本的 ID,````值等于在``GenreSort.xml``文件中出现的版本名称。 + +## worksName + +````标记包含一个库存数组,其中````值等于歌曲来源作品的 ID,````值等于相关作品的名称。这与 ```` 的规格相同。如果歌曲不需要版权声明,则````的值为``-1``,````的值为``Invalid``。 + +## jaketFile + +````标记包含一个````标记,其值等于包含歌曲封面的文件名,通常与 Music.xml 文件位于同一目录。 + +## firstLock + +````标记的值为``false``或``true``。如果值为 ``true``,那么歌曲将不会被列在歌曲选择列表中,除非满足特定条件才能解锁歌曲。 + +## priority + +````标记的值为``false``或``true``。如果值为 ``true``,那么歌曲将不会被列在歌曲选择列表中,除非满足特定条件才能解锁歌曲。 + +## cueFileName + +````标记包含一个库存数组,其````值等于在``root\app\data\AXXX\cueFile\cueFileXXXX``中找到的``CueFile.xml``文件中的 cueFile 的 ID。 + +## previewStartTime + +````标记包含一个整数,指定歌曲中预览开始的位置(以毫秒为单位),预览是歌曲在选曲屏幕上高亮显示时播放的部分。 + +## previewEndTime + +````标记包含一个整数,指定预览结束的歌曲位置(以毫秒为单位)。结束后,它将循环回到 ```` 。 + +## worldsEndTagName + +````标记包含一个库存数组,其中````的值与乐曲的 WORLD'S END 类型相对应,````的值用汉字表示 WORLD'S END 类型的名称。如果音轨不是 WORLD'S END 音轨,则````的值为``-1``,````的值为``Invalid``。 + +## starDifType + +````标记包含一个未知整数。这个值可能与音乐的难度有关。 + +## stageName + +```` 标记包含一个库存数组,其中的 ```` 值等于场景的 ID,即游戏过程中出现在栏位后面的背景视频,可在路径 ``root\app\data\AXXX\stage`` 中找到,而 ```` 值等于相应的 ``Stage.xml`` 文件中的 ```` 值。 + +## fumens + +```` 的意思是 "谱面",翻译过来就是 "音乐",是包含每个难度的所有信息的标记。fumens 标记将包含 5 个 ```` 标记,每个难度一个,即使对应乐曲难度少于 5 个。 + +## MusicFumenData + +````标记包含歌曲中每个难度的信息数组。下面列出的所有标记都是数组的一部分。 + +### resourceVersion + +```` 标记总是包含一个库存数组,其 ```` 值为 ``0`` 和一个空的 ```` 标记。 + +### type + +````标记是一个库存数组,其中包含有关该特定````是哪种难度的信息。它有一个 ```` 值,可以是 ``0`` 到 ``4`` 之间的任意值。```` 值可以是 ``ID_00``、``ID_01``、``ID_O2``、``ID_03`` 或 ``ID_04``,但必须以与 ```` 标签值相同的数字结尾。```` 标记包含难度名称,可以是``BASIC``、``ADVANCED``、``EXPERT``、``MASTER``或``WORLD'S END``。该值必须依次与 ```` 和 ```` 标记相对应。例如,BASIC 的 ID 为 0,ADVANCED 的 ID 为 1,以此类推。 + +### enable + +````标记的值可以是``true``或``false``。如果值为``false``,难度将不会出现。在 WORLD'S END 的 ```` 标记上,如果歌曲是 normal,则此值设为 false,而在 WORLD'S END 曲目上,除了 WORLD'S END 之外的所有难度都设为 false。 + +### file + +````标记包含一个````标记,该标记包含与特定难度相关联的 .c2s 文件的文件名。如果难度不存在且已禁用,则该标签将被空的 ```` 标签取代。 + +### level + +````标记包含一个整数,等于游戏中显示的歌曲难度级别。如果难度不存在,或难度为 WORLD'S END,则标记的值为 ``0``。 + +### levelDecimal + +```` 标记包含一个 0-99 的整数,等于轨道的十进制难度。它与 ```` 标签相结合,可创建准确的难度级别。在游戏过程中看不到这个级别,而是用于按难度对曲目进行排序。如果难度不存在,或难度为 WORLD'S END,则标记的值为 ``0``。 + +### notesDesigner + +````标记总是空的,因此被写成````。这是因为 ``.c2s`` 文件中包含了谱师的信息。 + +### defaultBpm + +````标记的值始终为``<0>``。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..9451a95 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +这是一份关于 Chunithm 文件格式和功能的资料性文件。这**并不是**关于如何为 Chunithm 创建自定义内容的完整指南。本文档中的所有信息都是通过个人研究发现的。欢迎贡献和进一步研究。本文档可用于任何目的,包括创建 Chunithm 谱面的工具。更多信息,请参阅。有关免责声明和版权归属,请参阅。更多信息,请参阅 [UNLICENSE](UNLICENSE) 。 有关免责声明和版权归属,请参阅 [DISCLAIMER](DISCLAIMER)。 + +原项目地址:[Chunithm-Research](https://github.com/Suprnova/Chunithm-Research) + +# 目录 + +* [基本信息](General.md) +* [谱面](Charting.md) +* [乐曲](Music.md) +* [如何正确添加自制内容](Customs.md) + +(更多文件将陆续提供)(在2024.1,github上显示的最后更新时间为3年前) diff --git a/UNLICENSE b/UNLICENSE new file mode 100644 index 0000000..db87573 --- /dev/null +++ b/UNLICENSE @@ -0,0 +1,24 @@ +这是一款在公共领域发布的免费软件。 + +任何人都可以自由复制、修改、发布、使用、编译、销售或 +本软件的源代码或编译后的二进制文件 +二进制文件,出于任何商业或非商业目的,以任何方式复制、修改、出版、使用、编译、销售或分发本软件。 +方式使用本软件。 + +在承认版权法的司法管辖区,本软件作者 +在承认版权法的司法管辖区,本软件的作者将本软件的所有版权利益 +在承认版权法的司法管辖区,本软件的作者将软件中的任何及所有版权利益献给公有领域。我们这样做是为了 +本软件的所有版权利益归公共领域所有。 +继承人的利益。我们打算将此奉献作为一种公开行为 +永久放弃根据版权法对本软件现在和将来的所有权利。 +本软件在版权法下的所有现在和将来的权利。 + +本软件按 "原样 "提供,不作任何明示或暗示的保证,包括但不限于 +明示或暗示的保证,包括但不限于以下保证 +适销性、特定用途的适用性和非侵权保证。 +在任何情况下,作者均不对任何索赔、损害或其他责任负责。 +任何索赔、损害赔偿或其他责任,无论是合同诉讼、侵权诉讼还是其他诉讼、 +因本软件或本软件的使用或其他交易而产生、引起或与之相关的任何索赔、损害或其他责任。 +软件的使用或其他交易而引起、产生或与之相关的任何索赔、损害赔偿或其他责任, 作者概不负责。 + +Translate by DeepL \ No newline at end of file diff --git a/_assets/cyaegha example.gif b/_assets/cyaegha example.gif new file mode 100644 index 0000000..8958aad Binary files /dev/null and b/_assets/cyaegha example.gif differ diff --git a/_assets/jacket_dummy.dds b/_assets/jacket_dummy.dds new file mode 100644 index 0000000..e519e0a Binary files /dev/null and b/_assets/jacket_dummy.dds differ diff --git a/_assets/jacket_dummy.png b/_assets/jacket_dummy.png new file mode 100644 index 0000000..7e15dba Binary files /dev/null and b/_assets/jacket_dummy.png differ diff --git a/_assets/rights_dummy.dds b/_assets/rights_dummy.dds new file mode 100644 index 0000000..3147ae2 Binary files /dev/null and b/_assets/rights_dummy.dds differ diff --git a/_assets/rights_dummy.png b/_assets/rights_dummy.png new file mode 100644 index 0000000..68f154f Binary files /dev/null and b/_assets/rights_dummy.png differ diff --git a/read.txt b/read.txt new file mode 100644 index 0000000..877337a --- /dev/null +++ b/read.txt @@ -0,0 +1 @@ +大半夜手动翻的,有啥错误或建议可以跟我说或自己改了发出来,去睡觉了 \ No newline at end of file