Skip to content

Nautiloideas/AUTO_BARD

Repository files navigation

FF_KEY - MIDI自动演奏系统

项目简介

FF_KEY是一个基于.NET 8和WPF的MIDI自动演奏系统,能够导入MIDI文件、解析音符数据,并通过模拟鼠标点击实现自动演奏功能。系统使用MVVM架构、依赖注入等现代化开发模式,支持多触发器并发演奏,模拟真实的钢琴演奏体验。

主要功能

1. MIDI文件处理

  • 支持标准MIDI文件格式:导入.mid文件并解析音符数据
  • 音符信息显示:按时间排序显示所有音符的详细信息(时间、音符名、力度、时长等)
  • 实时MIDI播放:使用MeltySynth SoundFont合成器进行高质量音频输出
  • 钢琴键盘可视化:实时显示当前播放的音符在虚拟钢琴键盘上

2. 多触发器并发自动演奏系统 ⭐ 核心功能

  • 10触发器并发架构:模拟10根手指的钢琴演奏,支持复杂和弦演奏
  • 严格时间同步:确保同一时刻的音符严格同时分配到不同触发器
  • 智能音符分配:同时音符按序号自动分配到触发器0-9,避免冲突
  • 1ms精度时序控制:精确的时序管理确保演奏的准确性
  • 独立队列系统:每个触发器独立运行,互不干扰
  • 高性能点击机制:使用Windows SendInput API实现高精度鼠标模拟

3. 点击项配置系统

  • 可视化配置:通过覆盖层界面直观配置每个音符的点击位置
  • 拖拽式布局:支持拖拽调整点击项位置,实时预览效果
  • 配置导入导出:支持保存和加载点击配置,便于复用
  • 多项目管理:支持为不同MIDI文件创建独立的配置方案

4. 覆盖层界面

  • 透明覆盖显示:在目标应用程序上方显示半透明的配置界面
  • 实时位置调整:可拖拽移动点击项位置,支持精确定位
  • 状态指示器:不同颜色表示点击项的配置状态和播放状态
  • 快捷操作:支持右键菜单、双击等快捷操作

5. 性能监控与调试

  • 详细日志记录:使用NLog记录所有操作和错误信息
  • 性能指标显示:实时显示自动演奏进度和系统状态
  • 调试模式:提供详细的触发器运行状态和时序信息

技术架构

核心技术栈

  • .NET 8.0 - 现代化的.NET框架
  • WPF (Windows Presentation Foundation) - 丰富的桌面UI框架
  • MVVM架构模式 - 清晰的代码分层和数据绑定
  • 依赖注入 - Microsoft.Extensions.DependencyInjection
  • NAudio - 强大的音频处理库
  • MeltySynth - 高质量的SoundFont合成器
  • NLog - 企业级日志框架

关键组件

1. MIDI处理 (MidiService)

- 文件解析: LoadMidiFileAsync()
- 音频播放: PlayMidiAsync() / PauseMidi() / StopMidi()
- 事件通知: NotePlayed事件用于钢琴键盘可视化

2. 多触发器自动演奏 (AutoPlayService)

- 音符预处理: PrepareNoteGroupsAsync() - 按时间分组并分配触发器
- 时序控制器: RunAutoPlaybackAsync() - 1ms精度的严格时序控制
- 并发触发器: 10个RunTriggerAsync()任务独立运行
- 状态管理: Start/Stop/Pause/Resume完整的生命周期管理

3. 高性能鼠标模拟 (MouseService)

- SendInput API: 使用Microsoft推荐的现代化输入模拟
- 绝对坐标定位: 精确的屏幕坐标转换
- 多按钮支持: 左键/右键/中键点击
- 异步执行: 非阻塞的高性能点击操作

4. 配置管理 (ConfigurationService)

- 项目配置: 保存MIDI文件和点击配置的关联关系
- 导入导出: JSON格式的配置文件管理
- 自动保存: 实时保存用户的配置更改

多触发器并发系统详解

音符分配算法

示例: A0(0ms) B0(0ms) C0(0ms) E0(3ms) F0(3ms) A1(4ms) B1(5ms)

时间分组:
- 0ms: [A0, B0, C0] → 触发器0, 1, 2
- 3ms: [E0, F0] → 触发器0, 1  
- 4ms: [A1] → 触发器0
- 5ms: [B1] → 触发器0

并发执行流程

  1. PrepareNoteGroupsAsync(): 预处理所有音符,按时间分组
  2. RunAutoPlaybackAsync(): 主时序控制器,严格按时间推送
  3. 10 × RunTriggerAsync(): 独立触发器任务,执行具体点击
  4. 资源管理: 安全的启动/停止机制,避免资源泄漏

使用指南

基本使用流程

  1. 启动应用程序
  2. 导入MIDI文件: 点击"导入MIDI文件"按钮选择.mid文件
  3. 配置点击位置:
    • 点击"显示覆盖层"打开配置界面
    • 为每个音符拖拽配置对应的点击位置
    • 完成后关闭覆盖层
  4. 开始自动演奏: 点击"开始自动演奏"按钮
  5. 控制播放: 支持暂停/恢复/停止操作

高级功能

  • 配置导出: 将当前配置导出为JSON文件
  • 配置导入: 导入之前保存的配置文件
  • 测试功能: 测试鼠标点击是否正常工作
  • 性能监控: 查看实时的演奏进度和系统状态

快捷键支持

  • F5: 暂停/恢复自动演奏
  • 空格: 播放/暂停MIDI音频
  • ESC: 停止所有操作

版本历史

v1.9.1 (2025-01-26) - MIDI文件切换演奏数据冲突修复 🔧

🚨 重要修复

  • 演奏数据缓存清理: 修复导入新MIDI文件时未清理之前演奏数据缓存的问题
  • 自动播放状态重置: 确保每次导入新MIDI文件都从全新状态开始,不会误用上一个文件的数据
  • 完整状态清理: 新增ClearPlaybackDataCache()方法,彻底清理演奏数据、音符组和索引状态

🎯 修复的问题场景

  1. 导入MIDI文件A → 自动演奏 → 演奏结束
  2. 导入MIDI文件B → 点击自动演奏
  3. 问题:错误地继续使用文件A的演奏数据
  4. 修复:现在正确使用文件B的音符数据

🔧 技术实现

  • 接口扩展: IAutoPlayService新增ClearPlaybackDataCache()方法
  • 自动清理: LoadMidiFileAsync()在加载前自动清理缓存
  • 安全停止: 清理时如发现正在播放会先安全停止演奏
  • 完整重置: 清理_currentPlaybackData_noteGroups、计数器等所有相关状态

🎵 用户体验改进

  • ✅ MIDI文件切换现在完全可靠,不会产生混乱
  • ✅ 每个文件都有独立的演奏状态,互不干扰
  • ✅ 自动演奏按钮状态正确反映当前文件的可演奏性
  • ✅ 音符对比界面准确显示当前文件的音符需求

v1.9.0 (2025-01-26) - 智能音符匹配与等音识别系统 🎵

🎼 音符匹配革命性升级

  • 智能等音识别: 系统基于MIDI号(0-127)精确匹配,完美解决A#=Bb等等音问题
  • 全新音符对比UI: 四个专门选项卡展示:演奏所需音符、已配置音符、缺失音符、原始音符列表
  • 等音显示增强: 音符名称显示格式升级为"A#4 (Bb4)",直观展示所有等音可能性
  • 实时对比更新: 任何MIDI文件、演奏数据或配置变更都会立即更新音符对比状态
  • 智能匹配提示: 摘要信息明确说明系统基于MIDI号匹配,消除用户对等音的疑虑

🔧 技术实现突破

  • MIDI号核心匹配: 所有匹配逻辑基于MidiNoteNumber,确保等音100%正确识别
  • 等音映射表: 完整的升降记法转换(C#=Db, D#=Eb, F#=Gb, G#=Ab, A#=Bb)
  • 实时状态同步: UpdateNoteComparison()在所有关键位置自动调用,确保UI实时更新
  • 内存优化: 智能去重和排序算法,高效处理大量音符数据

🎨 用户体验革命

  • 直观音符管理: 专门的"音符分析与配置对比"界面,一目了然看清配置状态
  • 色彩状态指示: 绿色✅完美匹配,橙色⚠️缺失提醒,清晰的视觉反馈
  • 详细摘要信息: "✅ 完美匹配!需要X个音符,已配置Y个,🎵注意:等音会自动识别"
  • 空状态优化: 精美的空状态提示,引导用户正确操作

🧠 智能化特性

  • 自动等音转换: A#4和Bb4在系统中完全等价,用户无需担心记号法差异
  • 配置完整性检查: 实时显示哪些音符已配置,哪些还需要配置
  • 多源数据支持: 同时支持从MIDI文件和演奏数据中提取所需音符信息
  • 缺失音符定位: 精确显示缺失的音符,便于用户快速补全配置

v1.8.0 (2025-01-26) - 演奏数据管理系统 🎯

🚀 核心功能突破

  • 智能演奏数据缓存: 自动生成并保存演奏触发器数据,避免重复计算
  • 演奏数据复用机制: 相同MIDI文件和配置组合自动复用已生成数据,大幅提升效率
  • 完整导入导出支持: 支持.playback格式文件的手动导入导出
  • 纯演奏数据模式: 支持仅导入演奏数据文件即可开始自动演奏,无需原始MIDI文件

🔧 技术架构全面升级

  • PlaybackDataService: 新增专用服务管理演奏数据的完整生命周期
  • 完善数据模型: PlaybackData、NoteGroup、PlayableNote三层数据结构
  • 智能临时文件管理: 自动清理过期文件,7天生命周期机制
  • SendInput API升级: 使用Microsoft推荐的现代化鼠标模拟方案
  • 多触发器并发优化: 10触发器系统完美配合演奏数据缓存

🎨 用户体验全面提升

  • 演奏数据管理UI: 新增专门的导入导出按钮组,操作更直观
  • 智能状态提示: 详细的数据摘要信息和源文件匹配验证
  • 自动演奏准备遮罩: 数据处理期间优雅的加载界面,防止误操作
  • 一键启动演奏: 导入演奏数据后立即支持自动演奏

📊 性能与效率优化

  • 数据预处理: 首次生成后永久缓存,后续启动秒级响应
  • JSON格式存储: 人类可读,便于调试和数据分析
  • 内存优化: 智能的数据结构设计,降低内存占用
  • 并发安全: 完善的多线程处理和资源管理

🛠️ 开发者友好特性

  • 完整日志记录: 详细的演奏数据处理日志,便于问题排查
  • 数据验证机制: 完整性检查确保数据可靠性
  • 版本兼容性: 支持未来数据格式升级的版本管理
  • 错误恢复: 优雅的异常处理和故障恢复机制

🔄 演奏流程优化 (2025-01-26)

  • 演奏流程冲突修复: 彻底解决了MIDI文件模式和演奏数据模式的冲突问题
  • 智能模式切换: 导入演奏数据时自动清空MIDI文件状态,确保使用正确的演奏源
  • 优先级机制: AutoPlayService优先使用导入的演奏数据,其次才使用MIDI文件生成数据
  • 状态同步: 完善了UI状态同步机制,CanStartAutoPlay正确反映当前可用的演奏模式
  • 用户体验: 导入演奏数据后清晰提示状态变化,避免用户混淆两种演奏模式

�� 重要修复 (2025-01-26)

  • 应用关闭崩溃修复: 修复了主窗口关闭时音频渲染线程导致的程序崩溃问题
  • 资源清理优化: 完善了MidiService的Dispose方法,确保音频渲染线程正确停止
  • 优雅关闭机制: 添加了超时控制和异常处理,防止关闭时资源释放阻塞
  • 内存泄漏预防: 确保所有服务在程序关闭时正确释放资源,避免内存泄漏

v1.7.0 (2025-01-26) - SendInput升级与用户体验优化

🔧 核心改进

  • 升级到SendInput API: 替代传统mouse_event,使用Microsoft推荐的现代化输入模拟方案
  • 绝对坐标系统: 实现精确的屏幕坐标转换,提升点击准确性
  • 增强错误处理: 完整的Win32错误代码检测和日志记录

🎨 用户体验升级

  • 自动演奏准备遮罩: 数据处理期间显示优雅的加载界面,防止误操作
  • 实时状态反馈: 清晰的"正在准备自动演奏..."和"正在处理触发器数据..."提示
  • 操作状态管理: IsOperationBlocked属性统一管理UI锁定状态

🚀 技术架构优化

  • 现代化API集成: SendInput、INPUT结构体、InputUnion等完整实现
  • 多线程安全: Task.Run异步处理配合Dispatcher线程同步
  • 资源管理改进: try-finally确保遮罩状态正确清理

v1.6.0 (2025-01-26) - 多触发器并发系统

🎹 核心功能

  • 10触发器并发架构: 模拟10根手指的钢琴演奏体验
  • 严格时间同步: 同一时刻音符精确分配到不同触发器
  • 智能音符分配: 自动分配算法避免触发器冲突
  • 1ms精度时序: 优化时序控制确保演奏准确性

🔧 系统优化

  • 独立队列系统: 每个触发器独立运行ConcurrentQueue
  • 完整资源管理: 安全的触发器启动/停止机制
  • 禁用旧机制: 彻底移除旧的顺序点击机制,避免双重点击冲突
  • 增强日志: 详细的调试信息和性能监控

v1.5.0 (2025-01-25) - 覆盖层系统

  • 实现透明覆盖层界面,支持可视化配置点击位置
  • 添加拖拽式点击项布局功能
  • 实现配置导入导出功能
  • 优化UI界面和用户体验

v1.4.0 (2025-01-24) - 架构重构

  • 实现MVVM架构模式和依赖注入
  • 重构所有服务层接口
  • 添加配置管理系统
  • 统一错误处理和日志记录

v1.3.0 (2025-01-23) - MIDI播放功能

  • 集成MeltySynth SoundFont合成器
  • 实现高质量MIDI音频播放
  • 添加钢琴键盘可视化控件
  • 支持实时音符显示

v1.2.0 (2025-01-22) - 基础自动演奏

  • 实现基础的鼠标点击模拟
  • 添加MIDI音符时序控制
  • 实现简单的自动演奏功能

v1.1.0 (2025-01-21) - 文件管理

  • 实现MIDI文件导入和解析
  • 添加音符列表显示
  • 基础的文件管理功能

v1.0.0 (2025-01-20) - 初始版本

  • 基础的WPF项目框架
  • 简单的UI界面设计

开发环境

系统要求

  • 操作系统: Windows 10/11 (x64)
  • .NET版本: .NET 8.0 或更高版本
  • 开发工具: Visual Studio 2022 或 VS Code + C# Dev Kit

依赖包

<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="NAudio" Version="2.2.1" />
<PackageReference Include="MeltySynth" Version="2.1.0" />
<PackageReference Include="NLog" Version="5.2.8" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

构建和运行

# 克隆项目
git clone [repository-url]
cd FF_KEY

# 还原依赖
dotnet restore

# 构建项目
dotnet build

# 运行应用
dotnet run

项目结构

FF_KEY/

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages