> ## Documentation Index
> Fetch the complete documentation index at: https://comfytv.org/llms.txt
> Use this file to discover all available pages before exploring further.

# MIDI Editor

> 一个秒域的 MIDI 钢琴卷帘。在多个通道上绘制与编辑音符，带按通道的乐器、静音/独奏与力度，然后导出标准 MIDI 文件。

<Frame caption="MIDI Editor（ComfyTV）">
  <img src="https://mintcdn.com/comfytv/dMkMxJDZdIo4YzAU/images/nodes/midi-editor.png?fit=max&auto=format&n=dMkMxJDZdIo4YzAU&q=85&s=d989ee8a809ebbdfca08d763fd794ff4" alt="MIDI Editor" width="1200" height="640" data-path="images/nodes/midi-editor.png" />
</Frame>

## 这个节点做什么

**MIDI Editor（MIDI 编辑器）** 是一个浏览器内钢琴卷帘，工作在 **时间域（秒）** 而非拍 ——
横向网格是真实时间，因此它是为编辑实际 MIDI 演奏而生的。你在网格上绘制音符，把它们组织成
MIDI **通道**（每个带一个 General MIDI 乐器，另有一个专用鼓通道），工作时可静音/独奏通道，
并塑造力度。

按 **▶ Run** 在后端写出一个标准 MIDI 文件；`midi` 输出是一个指向导出 `.mid` 的
`COMFYTV_AUDIO` 负载。卷帘为空时运行会以 “the piano roll is empty” 失败。

你可以把接入的 MIDI 文件（`midi` 输入，`COMFYTV_AUDIO`）导入卷帘 —— 它的通道、程序与
tempo map 会被载入，随即可编辑。

## 编辑器

卡片由工具栏加钢琴卷帘组成，以时间域布局。

**工具行。**

* **Draw / Select（绘制 / 选择）** —— 两种编辑模式。
  * *绘制*：在网格上按住拖动创建音符；拖动决定其时长，放置时会发声。
  * *选择*：拖出选框框选（Shift 追加）；点击音符即抓取。
* **Play（▶ / ■）** —— 用内置振荡器/鼓合成器以前瞻调度播放卷帘；一条绿色播放头实时扫过，
  被静音的通道保持无声。
* **Snap（吸附）** —— 时间吸附：**free、10ms、50ms、100ms、250ms** 或 **1s**。
* **Undo（↩）撤销**、**Clear channel（清空通道）**，以及（接入 MIDI 文件时）**Import
  MIDI（导入 MIDI）**。导入错误显示在这里。

**通道行。** 每个 MIDI **通道** 是一个 chip，显示一块颜色样与其编号（`Ch1`…），或用 🥁
表示鼓通道（通道 10 / 索引 9）。每个 chip：

* 点击 chip 把该通道设为 **激活**，
* **S** 独奏该通道（静音其它所有），
* **音量图标** 静音/取消静音，
* 悬停某 chip 会在卷帘里只高亮该通道（其它变暗）。
  **＋** 添加通道，**＋🥁** 添加鼓通道（仅当尚无鼓通道时），**−** 移除激活通道。对非鼓通道，
  一个 **Instrument** 下拉框设置 General MIDI 程序。

**钢琴卷帘。** 一个可滚动网格，左侧是钢琴键盘（点击某键试听；C 音有标注；鼓通道显示 GM 鼓
名）。顶部一条时间标尺以秒标记（刻度间距随缩放自适应）。音符按通道/乐器着色，可以：

* 拖动本体 **移动**，
* 从左/右边缘手柄 **调整长度**，
* 双击 **删除**，
* 多选后一起编辑。
  非激活通道的音符以其通道色显示为暗淡的 “幽灵” 方块。底部有一条 **力度带**，为光标下的音符
  涂刷 0–127 的力度。

**缩放与导航。** Ctrl/Cmd + 鼠标滚轮缩放时间轴；滚动条平移。快捷键：**Delete/Backspace**
删除选中音符，**Ctrl/Cmd+Z** 撤销，**Ctrl/Cmd+A** 全选。

## 工作流 / 分步

1.（可选）接入 MIDI 文件并按 **Import MIDI** 载入其通道、程序与 tempo map。
2\. 选一个 **Snap** 值；选择一个 **通道** 并设置其 **Instrument**（或加 🥁 用于鼓）。
3\. **绘制** 或编辑音符；拖动边缘手柄修整时长。
4\. 用通道上的 **S/静音** 在工作时隔离声部；在 **力度带** 里塑造强弱。
5\. 按 **Play** 试听；用幽灵音符跨通道对齐。
6\. 按 **▶ Run** 导出 **midi** 文件，再喂给 **Score Synth**（渲染音频）或下载它。

## 输入与输出

| 槽位       | 方向    | 类型              | 含义                    |
| -------- | ----- | --------------- | --------------------- |
| **midi** | 入（可选） | `COMFYTV_AUDIO` | 要导入卷帘的一个 MIDI 文件      |
| **midi** | 出     | `COMFYTV_AUDIO` | 导出的标准 MIDI 文件（`.mid`） |

卷帘（事件、通道程序与 tempo map）以一个隐藏的 `events_json` 字段存储在节点上，会随工作流
保存。静音/独奏状态是实时的播放辅助，不属于导出内容。

## 提示

* 这是 **秒域** 编辑器 —— 位置是真实时间，不是拍。若要做拍/小节作曲并生成 MusicXML，请改用
  **Score Editor**。
* **独奏（S）** 是快速试听单个通道的办法；它静音其它一切，直到你再次关闭。静音/独奏只影响
  编辑器内的预览，不影响导出文件。
* 导入 MIDI 文件会带入其 tempo map 与按通道的程序 —— 清理工作的好起点。
* 导出的 `.mid` 是 `COMFYTV_AUDIO`；喂给 **Score Synth** 即可用 SoundFont 听到它。

## 相关节点

* **Score Editor** —— 输出 MusicXML 的拍域钢琴卷帘。
* **Score Performer** —— 由写好的乐谱输出 MIDI 文件。
* **Score Synth** —— 通过 SoundFont 把导出的 MIDI 渲染成音频。
* **Bridge** —— 把 `COMFYTV_AUDIO` 与原生 ComfyUI 互转。见
  [https://github.com/jtydhr88/ComfyTV/blob/main/docs/bridges.md](https://github.com/jtydhr88/ComfyTV/blob/main/docs/bridges.md)
