示例脚本
这里提供了多个完整的示例脚本,展示 RCT API 的各种用法。
目录
示例 1:Note统计
统计并显示各类型Note数量。
# Description: 统计并显示各类型Note数量
from rct_api import get_current_chart, Note
def main():
chart = get_current_chart()
if not chart:
print("错误:无法获取谱面")
return
counts = chart.get_note_count_by_type()
type_names = {
Note.TAP: "Tap",
Note.FLICK: "Flick",
Note.SLIDE: "Slide",
Note.ROTATE: "Rotate",
Note.CATCH: "Catch",
Note.BOMB: "Bomb",
Note.TRAIL: "Trail"
}
print("=== Note统计 ===")
total = 0
for note_type, count in counts.items():
name = type_names.get(note_type, f"Unknown({note_type})")
print(f"{name}: {count}")
total += count
print(f"总计: {total}")
if __name__ == "__main__":
main()
功能:
- 获取当前谱面
- 统计各类型Note数量
- 显示详细统计信息
示例 2:Note时间平移
将所有Note时间平移指定毫秒数。
# Description: 将所有Note时间平移指定毫秒数
# Args: 偏移量(ms) - 正数延后,负数提前
import sys
from rct_api import get_current_chart, save_current_chart
def main():
if len(sys.argv) < 2:
print("错误:请提供偏移量参数")
return
try:
offset = float(sys.argv[1])
except ValueError:
print("错误:偏移量必须是数字")
return
chart = get_current_chart()
if not chart:
print("错误:无法获取谱面")
return
# 平移时间
chart.shift_time(offset)
# 保存
save_current_chart(chart)
print(f"成功:所有Note时间平移了 {offset}ms")
if __name__ == "__main__":
main()
功能:
- 接收偏移量参数
- 平移所有Note、BPM、Speed 的时间
- 保存修改后的谱面
示例 3:删除特定类型Note
使用自定义 UI 删除指定类型的Note。
# Description: 删除指定类型的Note
# UI: {"fields":[{"name":"note_types","field_type":"select","label":"要删除的Note类型:","default_value":"bomb","options":["tap","flick","slide","rotate","catch","bomb","trail"]}]}
import sys
import json
from rct_api import get_current_chart, save_current_chart, Note
def main():
if len(sys.argv) < 2:
print("错误:未提供参数")
return
try:
params = json.loads(sys.argv[1])
note_type_str = params.get('note_types', 'bomb')
# 映射类型
type_map = {
'tap': Note.TAP,
'flick': Note.FLICK,
'slide': Note.SLIDE,
'rotate': Note.ROTATE,
'catch': Note.CATCH,
'bomb': Note.BOMB,
'trail': Note.TRAIL
}
if note_type_str not in type_map:
print(f"错误:未知的Note类型 '{note_type_str}'")
return
target_type = type_map[note_type_str]
# 获取谱面
chart = get_current_chart()
if not chart:
print("错误:无法获取谱面")
return
# 删除指定类型
original_count = len(chart.notes)
chart.notes = [note for note in chart.notes if note.type != target_type]
deleted_count = original_count - len(chart.notes)
# 保存
save_current_chart(chart)
print(f"成功:删除了 {deleted_count} 个 {note_type_str} Note")
except json.JSONDecodeError as e:
print(f"错误:无法解析参数 - {e}")
except Exception as e:
print(f"错误:{e}")
if __name__ == "__main__":
main()
功能:
- 提供图形化界面选择Note类型
- 删除选定类型的所有Note
- 显示删除数量
示例 4:基于拍数生成Note
按照节拍生成 Tap Note。
# Description: 按照节拍生成 Tap Note
# Args: 起始拍数 结束拍数 每拍Note数
import sys
from rct_api import get_current_chart, save_current_chart, Beat, Note
def main():
if len(sys.argv) < 4:
print("错误:用法: 起始拍数 结束拍数 每拍Note数")
return
try:
start_beat = float(sys.argv[1])
end_beat = float(sys.argv[2])
notes_per_beat = int(sys.argv[3])
except ValueError:
print("错误:参数必须是数字")
return
chart = get_current_chart()
if not chart:
print("错误:无法获取谱面")
return
if not chart.bpm:
print("错误:谱面没有 BPM 信息")
return
# 创建 Beat 转换器
beat = Beat.from_bpm_objects(chart.bpm)
# 计算每个Note的拍数间隔
beat_interval = 1.0 / notes_per_beat
# 生成Note
current_beat = start_beat
added_count = 0
while current_beat <= end_beat:
time = beat.get_time(current_beat)
degree = (current_beat * 45) % 360 # 角度随拍数变化
chart.add_note(Note.TAP, time, degree)
added_count += 1
current_beat += beat_interval
# 排序并保存
chart.sort()
save_current_chart(chart)
print(f"成功:生成了 {added_count} 个 Tap Note")
print(f"时间范围: {beat.get_time(start_beat):.0f}ms - {beat.get_time(end_beat):.0f}ms")
if __name__ == "__main__":
main()
功能:
- 基于音乐节拍生成Note
- 支持自定义拍数范围
- 支持自定义每拍Note密度
示例 5:分析Note拍数信息
分析谱面中Note的拍数分布。
# Description: 分析谱面中Note的拍数分布
from rct_api import get_current_chart, Beat, Note
def main():
chart = get_current_chart()
if not chart:
print("错误:无法获取谱面")
return
if not chart.bpm:
print("错误:谱面没有 BPM 信息")
return
if not chart.notes:
print("错误:谱面没有Note")
return
# 创建 Beat 转换器
beat = Beat.from_bpm_objects(chart.bpm)
print("=== Note拍数分析 ===")
print(f"总Note数: {len(chart.notes)}")
print()
# 分析前10个Note
print("前10个Note的拍数信息:")
for i, note in enumerate(chart.notes[:10]):
note_beat = beat.get_beat(note.time)
type_names = {
Note.TAP: "Tap",
Note.FLICK: "Flick",
Note.SLIDE: "Slide",
Note.ROTATE: "Rotate",
Note.CATCH: "Catch",
Note.BOMB: "Bomb",
Note.TRAIL: "Trail"
}
type_name = type_names.get(note.type, f"Unknown({note.type})")
print(f" {i+1}. {type_name} - 时间: {note.time:.0f}ms, 拍数: {note_beat:.3f}")
# 统计整拍Note(误差 ±0.05 拍)
on_beat_count = 0
tolerance = 0.05
for note in chart.notes:
note_beat = beat.get_beat(note.time)
if abs(note_beat - round(note_beat)) < tolerance:
on_beat_count += 1
percentage = (on_beat_count / len(chart.notes)) * 100
print()
print(f"整拍Note: {on_beat_count}/{len(chart.notes)} ({percentage:.1f}%)")
if __name__ == "__main__":
main()
功能:
- 分析Note的拍数信息
- 显示前 10 个Note的详细信息
- 统计整拍Note的比例
更多示例
按时间范围过滤Note
# Description: 保留指定时间范围的Note
# Args: 起始时间(ms) 结束时间(ms)
import sys
from rct_api import get_current_chart, save_current_chart
def main():
if len(sys.argv) < 3:
print("错误:用法: 起始时间 结束时间")
return
start = float(sys.argv[1])
end = float(sys.argv[2])
chart = get_current_chart()
if not chart:
return
original = len(chart.notes)
chart.filter_notes_by_time(start, end)
save_current_chart(chart)
print(f"保留了 {len(chart.notes)}/{original} 个Note")
if __name__ == "__main__":
main()
只保留特定类型Note
# Description: 只保留 Tap 和 Flick Note
from rct_api import get_current_chart, save_current_chart, Note
def main():
chart = get_current_chart()
if not chart:
return
original = len(chart.notes)
chart.filter_notes_by_type([Note.TAP, Note.FLICK])
save_current_chart(chart)
print(f"保留了 {len(chart.notes)}/{original} 个Note")
if __name__ == "__main__":
main()