FF_KEY是一个基于.NET 8和WPF的MIDI自动演奏系统,能够导入MIDI文件、解析音符数据,并通过模拟鼠标点击实现自动演奏功能。系统使用MVVM架构、依赖注入等现代化开发模式,支持多触发器并发演奏,模拟真实的钢琴演奏体验。
- 支持标准MIDI文件格式:导入.mid文件并解析音符数据
- 音符信息显示:按时间排序显示所有音符的详细信息(时间、音符名、力度、时长等)
- 实时MIDI播放:使用MeltySynth SoundFont合成器进行高质量音频输出
- 钢琴键盘可视化:实时显示当前播放的音符在虚拟钢琴键盘上
- 10触发器并发架构:模拟10根手指的钢琴演奏,支持复杂和弦演奏
- 严格时间同步:确保同一时刻的音符严格同时分配到不同触发器
- 智能音符分配:同时音符按序号自动分配到触发器0-9,避免冲突
- 1ms精度时序控制:精确的时序管理确保演奏的准确性
- 独立队列系统:每个触发器独立运行,互不干扰
- 高性能点击机制:使用Windows SendInput API实现高精度鼠标模拟
- 可视化配置:通过覆盖层界面直观配置每个音符的点击位置
- 拖拽式布局:支持拖拽调整点击项位置,实时预览效果
- 配置导入导出:支持保存和加载点击配置,便于复用
- 多项目管理:支持为不同MIDI文件创建独立的配置方案
- 透明覆盖显示:在目标应用程序上方显示半透明的配置界面
- 实时位置调整:可拖拽移动点击项位置,支持精确定位
- 状态指示器:不同颜色表示点击项的配置状态和播放状态
- 快捷操作:支持右键菜单、双击等快捷操作
- 详细日志记录:使用NLog记录所有操作和错误信息
- 性能指标显示:实时显示自动演奏进度和系统状态
- 调试模式:提供详细的触发器运行状态和时序信息
- .NET 8.0 - 现代化的.NET框架
- WPF (Windows Presentation Foundation) - 丰富的桌面UI框架
- MVVM架构模式 - 清晰的代码分层和数据绑定
- 依赖注入 - Microsoft.Extensions.DependencyInjection
- NAudio - 强大的音频处理库
- MeltySynth - 高质量的SoundFont合成器
- NLog - 企业级日志框架
- 文件解析: LoadMidiFileAsync()
- 音频播放: PlayMidiAsync() / PauseMidi() / StopMidi()
- 事件通知: NotePlayed事件用于钢琴键盘可视化- 音符预处理: PrepareNoteGroupsAsync() - 按时间分组并分配触发器
- 时序控制器: RunAutoPlaybackAsync() - 1ms精度的严格时序控制
- 并发触发器: 10个RunTriggerAsync()任务独立运行
- 状态管理: Start/Stop/Pause/Resume完整的生命周期管理- SendInput API: 使用Microsoft推荐的现代化输入模拟
- 绝对坐标定位: 精确的屏幕坐标转换
- 多按钮支持: 左键/右键/中键点击
- 异步执行: 非阻塞的高性能点击操作- 项目配置: 保存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
- PrepareNoteGroupsAsync(): 预处理所有音符,按时间分组
- RunAutoPlaybackAsync(): 主时序控制器,严格按时间推送
- 10 × RunTriggerAsync(): 独立触发器任务,执行具体点击
- 资源管理: 安全的启动/停止机制,避免资源泄漏
- 启动应用程序
- 导入MIDI文件: 点击"导入MIDI文件"按钮选择.mid文件
- 配置点击位置:
- 点击"显示覆盖层"打开配置界面
- 为每个音符拖拽配置对应的点击位置
- 完成后关闭覆盖层
- 开始自动演奏: 点击"开始自动演奏"按钮
- 控制播放: 支持暂停/恢复/停止操作
- 配置导出: 将当前配置导出为JSON文件
- 配置导入: 导入之前保存的配置文件
- 测试功能: 测试鼠标点击是否正常工作
- 性能监控: 查看实时的演奏进度和系统状态
- F5: 暂停/恢复自动演奏
- 空格: 播放/暂停MIDI音频
- ESC: 停止所有操作
- 演奏数据缓存清理: 修复导入新MIDI文件时未清理之前演奏数据缓存的问题
- 自动播放状态重置: 确保每次导入新MIDI文件都从全新状态开始,不会误用上一个文件的数据
- 完整状态清理: 新增
ClearPlaybackDataCache()方法,彻底清理演奏数据、音符组和索引状态
- 导入MIDI文件A → 自动演奏 → 演奏结束
- 导入MIDI文件B → 点击自动演奏
- 问题:错误地继续使用文件A的演奏数据
- 修复:现在正确使用文件B的音符数据
- 接口扩展:
IAutoPlayService新增ClearPlaybackDataCache()方法 - 自动清理:
LoadMidiFileAsync()在加载前自动清理缓存 - 安全停止: 清理时如发现正在播放会先安全停止演奏
- 完整重置: 清理
_currentPlaybackData、_noteGroups、计数器等所有相关状态
- ✅ MIDI文件切换现在完全可靠,不会产生混乱
- ✅ 每个文件都有独立的演奏状态,互不干扰
- ✅ 自动演奏按钮状态正确反映当前文件的可演奏性
- ✅ 音符对比界面准确显示当前文件的音符需求
- 智能等音识别: 系统基于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文件和演奏数据中提取所需音符信息
- 缺失音符定位: 精确显示缺失的音符,便于用户快速补全配置
- 智能演奏数据缓存: 自动生成并保存演奏触发器数据,避免重复计算
- 演奏数据复用机制: 相同MIDI文件和配置组合自动复用已生成数据,大幅提升效率
- 完整导入导出支持: 支持.playback格式文件的手动导入导出
- 纯演奏数据模式: 支持仅导入演奏数据文件即可开始自动演奏,无需原始MIDI文件
- PlaybackDataService: 新增专用服务管理演奏数据的完整生命周期
- 完善数据模型: PlaybackData、NoteGroup、PlayableNote三层数据结构
- 智能临时文件管理: 自动清理过期文件,7天生命周期机制
- SendInput API升级: 使用Microsoft推荐的现代化鼠标模拟方案
- 多触发器并发优化: 10触发器系统完美配合演奏数据缓存
- 演奏数据管理UI: 新增专门的导入导出按钮组,操作更直观
- 智能状态提示: 详细的数据摘要信息和源文件匹配验证
- 自动演奏准备遮罩: 数据处理期间优雅的加载界面,防止误操作
- 一键启动演奏: 导入演奏数据后立即支持自动演奏
- 数据预处理: 首次生成后永久缓存,后续启动秒级响应
- JSON格式存储: 人类可读,便于调试和数据分析
- 内存优化: 智能的数据结构设计,降低内存占用
- 并发安全: 完善的多线程处理和资源管理
- 完整日志记录: 详细的演奏数据处理日志,便于问题排查
- 数据验证机制: 完整性检查确保数据可靠性
- 版本兼容性: 支持未来数据格式升级的版本管理
- 错误恢复: 优雅的异常处理和故障恢复机制
- 演奏流程冲突修复: 彻底解决了MIDI文件模式和演奏数据模式的冲突问题
- 智能模式切换: 导入演奏数据时自动清空MIDI文件状态,确保使用正确的演奏源
- 优先级机制: AutoPlayService优先使用导入的演奏数据,其次才使用MIDI文件生成数据
- 状态同步: 完善了UI状态同步机制,CanStartAutoPlay正确反映当前可用的演奏模式
- 用户体验: 导入演奏数据后清晰提示状态变化,避免用户混淆两种演奏模式
- 应用关闭崩溃修复: 修复了主窗口关闭时音频渲染线程导致的程序崩溃问题
- 资源清理优化: 完善了MidiService的Dispose方法,确保音频渲染线程正确停止
- 优雅关闭机制: 添加了超时控制和异常处理,防止关闭时资源释放阻塞
- 内存泄漏预防: 确保所有服务在程序关闭时正确释放资源,避免内存泄漏
- 升级到SendInput API: 替代传统mouse_event,使用Microsoft推荐的现代化输入模拟方案
- 绝对坐标系统: 实现精确的屏幕坐标转换,提升点击准确性
- 增强错误处理: 完整的Win32错误代码检测和日志记录
- 自动演奏准备遮罩: 数据处理期间显示优雅的加载界面,防止误操作
- 实时状态反馈: 清晰的"正在准备自动演奏..."和"正在处理触发器数据..."提示
- 操作状态管理: IsOperationBlocked属性统一管理UI锁定状态
- 现代化API集成: SendInput、INPUT结构体、InputUnion等完整实现
- 多线程安全: Task.Run异步处理配合Dispatcher线程同步
- 资源管理改进: try-finally确保遮罩状态正确清理
- 10触发器并发架构: 模拟10根手指的钢琴演奏体验
- 严格时间同步: 同一时刻音符精确分配到不同触发器
- 智能音符分配: 自动分配算法避免触发器冲突
- 1ms精度时序: 优化时序控制确保演奏准确性
- 独立队列系统: 每个触发器独立运行ConcurrentQueue
- 完整资源管理: 安全的触发器启动/停止机制
- 禁用旧机制: 彻底移除旧的顺序点击机制,避免双重点击冲突
- 增强日志: 详细的调试信息和性能监控
- 实现透明覆盖层界面,支持可视化配置点击位置
- 添加拖拽式点击项布局功能
- 实现配置导入导出功能
- 优化UI界面和用户体验
- 实现MVVM架构模式和依赖注入
- 重构所有服务层接口
- 添加配置管理系统
- 统一错误处理和日志记录
- 集成MeltySynth SoundFont合成器
- 实现高质量MIDI音频播放
- 添加钢琴键盘可视化控件
- 支持实时音符显示
- 实现基础的鼠标点击模拟
- 添加MIDI音符时序控制
- 实现简单的自动演奏功能
- 实现MIDI文件导入和解析
- 添加音符列表显示
- 基础的文件管理功能
- 基础的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 runFF_KEY/