RCT 帮助文档
首页
  • 入门指南
  • 脚本元数据
  • 自定义UI
  • 核心API
  • Chart类
  • 数据类
  • 示例脚本
  • 最佳实践
脚本商店
  • 简体中文
  • English
首页
  • 入门指南
  • 脚本元数据
  • 自定义UI
  • 核心API
  • Chart类
  • 数据类
  • 示例脚本
  • 最佳实践
脚本商店
  • 简体中文
  • English
  • API参考

    • 首页
    • 入门指南
    • 脚本元数据
    • 自定义UI对话框
    • 核心API
    • Chart 类
    • 数据类
    • 示例脚本
    • 最佳实践

示例脚本

这里提供了多个完整的示例脚本,展示 RCT API 的各种用法。

目录

  • 示例脚本
    • 目录
    • 示例 1:Note统计
    • 示例 2:Note时间平移
    • 示例 3:删除特定类型Note
    • 示例 4:基于拍数生成Note
    • 示例 5:分析Note拍数信息
    • 更多示例
      • 按时间范围过滤Note
      • 只保留特定类型Note

示例 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()
最后更新: 2026/1/12 01:03
Prev
数据类
Next
最佳实践