Show HN:一款支持 MCP 的实验性 pattern-first DAW Blokkily
Show HN: An experimental pattern-first DAW that supports MCP
Blokkily 是一款实验性 pattern-first DAW,单一事件模型驱动 tracker、piano roll 和 step grid 三个同步编辑器,CLAP 为必需的原生插件格式。
Blokkily 是一个实验性的模式优先 DAW。单一事件模型驱动三个同步编辑器——一个 tracker、一个钢琴卷帘和一个步进网格——它们又各自是多轨歌曲中的一条轨道。CLAP 是必需的本地插件格式,而不是兼容性附加组件。
工作站截图是渲染后的 bdd_session_everything 会话:一首带有速度渐变、7/8 拍小节、键控和切片采样器、CLAP、VST3 和 SoundFont 乐器、一个扭曲音频片段、内置和 CLAP/VST3 效果、一个返回/发送总线、增益和效果自动化、一个预备拍,以及两条从确定性输入接收 MIDI 的已启用轨道的歌曲。编辑器上方是 LLM 作曲助手的提示栏(如下所述)。
与框架无关的音乐模型和实时插件边界位于这一切之下。该模型涵盖音符、语义和弦、转位、扫弦、微时序、概率、棘轮、循环条件和参数锁。它还包括一个原生 CLAP 目录,可加载 CLAP 模块、初始化其入口点、查询工厂,并记录插件描述符和功能。CLAP 实例适配器实现创建、初始化、激活、采样精确的音符/参数事件、立体声处理和状态流。基于 JUCE 的 VST3 适配器扫描捆绑包和默认系统位置,并通过相同的实时边界实例化插件,在每个参数偏移处拆分每个块,因此 VST3 自动化也是采样精确的。参数锁由调度器编译为采样精确的参数事件,并由两个插件适配器应用;自动化设置参数的值,而调制对其偏移,两者互不擦除。内部 FluidSynth 适配器加载 SF2/SF3 文件,接受采样偏移音符事件,渲染立体声音频,选择预设,并持久化其项目状态。FluidSynth 仅在其 64 帧块之一开始处启动一个声部,因此适配器维护一个小型渲染器池,共享音色的采样数据,并在其块从音符自身帧开始的那个渲染器上播放每个音符:无论模式的长度以采样计为多少,每次遍历都同相发声。音色自带的合唱效果按自己的时钟运行,如同自由运行的 LFO。项目保存并重新加载整个会话:每个命名模式及其和弦、锁、棘轮、微时序和循环条件,带有通道条和片段的轨道,以及每个 CLAP、VST3 和 SoundFont 乐器与效果的不透明状态。无分配实时传输将模式滴答编译为采样事件,循环模式,驱动任一乐器适配器,并馈送低延迟非交错立体声 RtAudio 回调。
歌曲播放时进行编辑不会中断它。编辑会重新编译编排,并在下一个块边界将其交给渲染回调,而不会在音频线程上分配、重建图、重新加载乐器或移动播放头;一个步骤被擦除时正在发声的音符会被释放,而不是任其继续响。在任何编辑器中输入的音符都会通过正在运行的引擎试听,无论是在停止的传输还是播放中的传输上;一个打开时没有乐器的会话会被赋予机器的 General MIDI SoundFont——鼓轨上使用打击乐音色——因此工作站一打开就能发声。
一个 session 是一首歌,而不是单个 pattern。命名 pattern 作为片段放置在混音器轨道的时间线上,每条轨道携带自己的乐器和通道条:以分贝为单位的增益、等功率声像、静音、独奏和峰值表,通过主推子汇总。歌曲引擎一次性编译每条轨道的整个时间线,然后在不分配、不加锁、不做 I/O 的情况下渲染它;片段的每次重复都算作其 pattern 的下一个循环,因此概率和循环条件在整个编曲中持续生效。混音器操作会到达正在运行的引擎,因此歌曲播放时也可以拉动推子。同一引擎将编曲导出为 16 位、24 位或 32 位浮点 WAVE 文件,与试听时逐样本完全一致。
一个 session 还说明它使用哪种调律和哪种音阶。调律以音分保存——任意周期的等分、有理和历史调律,以及 Scala 风格的列表——因此十二平均半音只是众多调律之一。一个音符携带其乐器被告知的十二音调键,以及偏离它的重新调音,和弦的每个声部也是如此,这就是十九音或四分之一音 pattern 如何以它被写下的音高到达 CLAP、VST3 和 SoundFont 合成器,而不是以最接近的近似值。四个可演奏表面投射相同的调律和音阶:钢琴键盘、七种布局的同构网格——六边形和方形,且每种都横向或纵向贯穿窗口——九种弦调律的指板,以及按数字命名每个和声并按转位堆叠一行的和弦垫。演奏其中一个会通过所选轨道的乐器试听它,即使走带已停止,并将其写入规范 pattern 的所选步进,在那里每个编辑器都以歌曲自身的调律命名它。
tracker 并排显示该 section 的乐器轨道;Tab 和 Shift+Tab 选择下一个或上一个通道。长 pattern 垂直滚动。钢琴卷帘的箭头按钮按八度移动其音高窗口,可达 MIDI 键 0–127。编曲有水平滚动和 +/− 缩放控件;长歌曲保持可用的小节宽度。
项目面板的 MIDI IN / MIDI OUT 按钮导入和导出标准 MIDI 文件。导出从用于播放的同一歌曲调度器写入编曲的音符和控制器,包含轨道名称、速度和拍号。导入接受格式 0 和 1,将通道拆分为乐器声部,并将四小节 section 作为一次可撤销编辑追加。它保留当前歌曲的速度和乐器;附加轨道需要分配乐器。导入使用录音网格:一个十六分音符上的音符成为共享时值的和弦,音符时值上限为 section 长度。MIDI 交换省略插件状态、参数自动化、逐音符表情、音频片段和微分音重新调音。速度渐变导出为十六分音符速度步进。这是音符交换,不是项目备份。
MIDI 键盘也能演奏歌曲。它的按键到达端口自己的线程,并通过无锁队列抵达渲染回调,因此一个音符不会被繁忙的接口阻塞;无论歌曲是停止还是播放,它们都通过所选轨道的乐器发声,并且控制器的一个键就是歌曲调音和音阶的一个音级,就像屏幕钢琴的一个键一样。启用录音后,正在运行的歌曲会将演奏的内容写入播放头下的模式中:每个音符落在其最近的步进上,与网格的偏差被保留为微定时,持续时间与按键按住的时间一样长,并与该步进上已有的音符合并为和弦。写入的内容就是引擎听到的内容,位置也是它听到的位置,一次录制就是一步撤销。导出既不会听到也不会录制键盘。
编辑器上方的提示栏要求 LLM 作曲助手写入打开的图案:像“a minor pentatonic ascending”或“offbeat hats”这样的行会被发送到选定的后端(默认是本地 Ollama 模型,配置密钥后可使用 Gemini 或 MiniMax 端点),回复会像任何其他输入一样被解析和限制,结果作为提案停留在栏上,直到制作人点击 Apply——在此之前不会进入歌曲,一次生成就是一步撤销。助手仅存在于 GUI 线程;音频线程永远不会看到 LLM 调用。有关通信方言、后端以及无需网络即可端到端驱动渲染栏的 bdd_llm_assistant 门控,请参见 docs/llm-assistant.md。
构建
需要 Qt 6.5+、FluidSynth、RtAudio、RtMidi、libsndfile、libsamplerate 和 Rubber Band 4(通过 pkg-config 查找),以及用于验证门控的 SoundFont。
许可说明:片段变形(对音频片段进行时间拉伸和变调)链接了 Rubber Band Library,除非从其作者处购买商业许可,否则该库在 GPL(第 2 版或更高版本)下授权。因此,使用它构建的 Blokkily 二进制文件受 GPL 约束。JUCE 和 CLAP 头文件在 third_party/ 下随附。界面字体 IBM Plex Sans 和 JetBrains Mono 在 resources/fonts/ 下随附,采用 SIL Open Font License 1.1(许可证文本位于其旁),因此无论桌面默认字体如何,布局在每个桌面上都绘制得相同。
cmake -S . -B build -G Ninja
cmake --build build
ctest --test-dir build --output-on-failure
./build/blokkily主可执行程序是一个 Qt Quick 工作站,在同一个规范模式上同步显示步进网格、追踪器和钢琴卷帘投影,共享一个播放头,并有一个步进检查器,可展示模型的全部表达:移调、力度、微时序、概率、棘轮、循环条件,以及带自动化/调制开关的参数锁定。每个编辑器都是输入而非读出:点击一个步进即可切换它,按下钢琴卷帘的某一轨会将那个音高写入指针下的列,拖动则跨轨绘制乐句,拖动已绘制的音符可移动它,拖动其右边缘可设定其发声时长,追踪器的音符列接受点击和拖动,其力度列写入该行的响度,其行按追踪器一贯的方式输入——一个八度用 ZSXDCVGBHNJM,上面两行用于下一个八度,输入八度显示在屏幕上,用 Ctrl+Left 和 Ctrl+Right 移动,Backspace 清除一行。Ctrl+C 复制选中的步进,Ctrl+V 将其粘贴到光标处,包括锁定和长度。无论使用哪一个,编辑都落在同一个规范模式上,因此它会立即显示在所有其他编辑器、检查器以及歌曲播放的内容中;视图切换器可聚焦一个编辑器或显示全部。编辑器上方是编排区:每条轨道一个泳道,每小节一个单元格。点击空小节会放置当前打开模式的片段;点击已填充的片段会在每个编辑器中打开该模式并将歌曲定位到那里;右键单击会移除该片段;Shift+单击会将片段延长跨越多小节(一个片段带多次重复,而非第二次放置);Alt+单击会沿其泳道移动片段。那些小节上方的数字是标尺:单击可将音频引擎定位到该小节。右侧是混音器,每条轨道一个通道条,外加主通道。播放头是音频引擎自身的位置,以 bar.beat.sixteenth 读取,贯穿整首歌曲。编辑器下方是键盘:会话的调音、音阶和根音,钢琴、同构网格、指板与和弦垫之间的切换,以及一个自动音阶开关,可将按下的键吸附到音阶的音符上。同构网格带有七种布局——Wicki-Hayden、Bosanquet、六边形平铺上的谐波表与 B 系统手风琴,以及方形平铺上的 Jankó、四度与大三度。每种布局都以每步音分而非半音书写,因此相同的指法会落在歌曲所处的任何调音中。任何表面都可横跨窗口或沿窗口向下:旋转一次是四分之一转,因此向右延伸的音高会向上延伸,并且它移动键而不触碰音符或音高。无法以可演奏的键尺寸绘制的表面会滚动,而不是将键缩小到无法击中的程度。空格键播放,Return 或 Home 回到歌曲顶部,方向键移动步进光标(Shift+Up 和 Shift+Down 将步进移调一个半音,Ctrl+Up 和 Ctrl+Down 移调一个八度),Insert 将后面的行下推,Shift+Backspace 将它们上拉,Alt+方向键微调微时序和音符长度,Ctrl+D 将选中的步进复制到下一行,Ctrl+1..0(以及 Ctrl+Shift+1..6 用于小节的后半部分)切换一个步进,Ctrl+M 静音,Ctrl+L 独奏选中的轨道,Ctrl+R 预备录音,Ctrl+E 将编排导出到磁盘,Ctrl+K 聚焦助手提示栏(Escape 将按键交还给编辑器)。左侧的 MIDI IN 面板选择键盘,其指示灯会在每个到达的按键上闪烁。当文本字段拥有键盘时,那些按键会退让,因此输入搜索或名称绝不会移动歌曲。
每一次编辑都可以撤销:Ctrl+Z 撤销,Ctrl+Shift+Z(或 Ctrl+Y)重做
步骤、笔画、片段、轨道、模式、推子移动和调音,而一次拖动——
在卷帘上画出的乐句、拉动的推子——是历史记录中的一步,
而不是每个像素一步。Ctrl+S 写回会话来自的文件,
Ctrl+Shift+S 要求新建一个;当有未保存内容时,窗口标题会带一个点,
打开文件、用 Ctrl+N 开始新会话或关闭窗口时,都会在丢弃未保存工作前询问。DUP 将打开的
模式复制到一个新模式;右键点击模式可重命名、复制、清除和删除,
右键点击轨道可重命名、静音、独奏和删除,而双击两者中的任意一个可为其命名。
用 +TRK 添加的轨道会获得会话已播放的 SoundFont,因此可以立即听到。
可演奏表面上的一个键在按下时发声,并持续到松开。
速度可以通过拖动、滚动(按住 Shift 为十分之一)或在双击后输入来调整。
引擎以音频设备实际协商的速率渲染,因此锁定到 44.1 kHz 的输出端
会以歌曲自身的音高和速度播放,而不是平淡而缓慢。
其插件浏览器会扫描平台标准的 CLAP 和 VST3 位置,
并通过一个共享的插件边界列出找到的内容,为每个条目标记产生它的格式。
这种规模的安装通过输入而不是滚动来浏览:Ctrl+F 到达浏览器的输入框,
输入名称、制作者或格式的几个字母,即可将列表缩小到这些字母按顺序
匹配到的乐器——“fbs”找到“Fat Bass”——方向键和回车在它们之间移动并加载一个,
按 Escape 再次列出所有内容。./build/blokkily_cli 运行无头调度器
演示。
行为规范在 features/ 中,仓库范围的完成
规则在 AGENTS.md 中。可重复的 BDD、
集成、端到端和截图验证工作流见 docs/verification.md。
架构
要使用 GCC 测量 C++ 行覆盖率,请用 cmake -S . -B build-coverage -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBLOKKILY_COVERAGE=ON 配置一个单独的构建,
然后运行 cmake --build build-coverage、
ctest --test-dir build-coverage --output-on-failure 和
python3 scripts/coverage.py build-coverage。
报告和未覆盖的行号会写入 build-coverage/artifacts/coverage/。
内置框架、生成代码、QML 和嵌入式 GUI 验证
驱动程序不计入百分比。
播放会在事件边界处拆分密集时间线,这样当设备请求大缓冲区时,音符和释放 不会被丢弃。每条轨道支持在同一采样点最多 256 个同时调度的 事件;超过该限制的编辑会报告错误并保留最后一个可播放的编排。
blokkily_core:规范的项目/事件模型和确定性调度器Tuning/Scale/KeyboardSpec:基于音分的调音、音阶以及由它们 投射出的可演奏表面Song:命名模式、混音器轨道以及编排它们的片段SongEngine:通过一个混音器总线进行无分配的多轨播放- 离线导出和 16 位、24 位和 32 位浮点的 WAVE 写入器
PluginInstance:保留调制的格式中立实时边界- Qt Quick 原型:同步的自定义编辑器和 CLAP/VST3 插件浏览器
- FluidSynth 内部乐器:真实的 SF2/SF3 加载和离线渲染
- 实时传输和 RtAudio 硬件输出适配器
MidiInput:RtMidi 端口适配器,通过无锁队列解码、调音并将按键路由到 渲染回调,并带有用于测试的确定性模式TakeRecorder:将引擎在录制时听到的内容转换为播放头下 模式的步骤- 下一引擎层:Tracktion 播放/录制适配器
- CLAP 宿主适配器:发现、生命周期、处理和状态
- 版本化项目文件:整首歌曲加上每个乐器的插件状态
- 原生 CLAP 和 VST3 插件窗口;立体声插件端口
- 附加适配器:通过 JUCE 支持 VST3
规范模型刻意不使用 Tracktion MIDI 片段。适配器将其编译为引擎和插件事件,保留更丰富的音序器语义。
录音、效果与音频
速度轨道编辑步进和渐变;标尺编辑拍号,使片段保持在其小节编号上。模式可以有不同的长度。+AUD 将 WAV、FLAC 或 AIFF 导入为波形片段,支持修剪、淡入淡出和增益。重叠部分相加。片段的 W 控件启用速度跟随、手动拉伸比例或移调。Rubber Band 在工作线程上渲染这些更改;待处理的渲染在就绪前是静音的。
采样器和鼓采样器出现在乐器浏览器中。它们支持键位区域、循环、包络、套鼓打击垫和切片。FX 浏览器将 CLAP、VST3 或内置的 EQ、延迟、混响和压缩器插入添加到所选轨道、返回或主机架。发送为推子后和声像前;当源轨道独奏时,返回仍然可听。播放和导出都会补偿插件延迟。插入行以浏览器列出效果的名称命名,单独占一行;其下方的 E 打开其原生窗口;A 选择要在所选轨道的自动化轨道中编辑的参数。插件窗口手势是一个撤销步骤,包括对返回和主插入的手势。
每条轨道的 R 按钮预备音符和音频,其输入控件选择 MIDI 通道或设备输入和监听。没有轨道被预备时,所选轨道进行录音。屏幕键盘和跟踪器可以在歌曲播放时录音。和弦声部保持各自的力度和长度。自动化有单独的 OFF / READ / TOUCH / LATCH / WRITE 模式。一次录制中的音符、自动化和音频共享一个撤销步骤。CLICK 跟随速度和拍号,CI 最多计数四小节而不移动歌曲,除非启用 + CLICK,否则咔嗒声不包含在导出中。
所选机架中的 RESAMPLE 预备其轨道、返回或主输出以进行下一次录音。预备传输的录音按钮并按下播放。录制结束时,输出从音频线程写入新的音频轨道;目标不能反馈到自己的录音中。主分接排除引导咔嗒声。STEM 通过同一引擎将该机架弹跳为新的音频片段,可选择静音其源。两个操作都补偿到所选分接的延迟。弹跳的主输出及其源被静音时,还会绕过旧的主插入并重置其推子,以避免对完成的混音进行两次处理;撤销会恢复所有这些更改。
分轨是总线分接:轨道分轨包含其插入和立体声推子/声像,返回分轨包含其发送和返回处理,主分轨包含完整混音。轨道分轨排除其发送的返回信号;重建混音时也要弹跳返回。轨道和返回分轨的总和是主处理之前的信号。非线性主效果无法分配到独立的分轨中。静音源轨道也会停止其发送,因此如果需要保留这些返回,请单独弹跳它们。
机架中的压缩器有一个 SIDECHAIN 芯片,任何声明了侧链输入的 CLAP 或 VST3 效果器也是如此(一个不是主输入的 CLAP 输入端口,一个 VST3 辅助输入总线):选择另一条轨道,效果器就会在其侧链输入上监听那条轨道(压缩器监听的是那条轨道,而不是它所压缩的内容)。键是源轨道经过其自身插入效果之后、推子之前的状态,因此一个被静音或衰减的底鼓仍然能对贝斯进行闪避;引擎会先渲染键的源,并拒绝来自插入效果自身轨道的键或键的循环。
一个声明了额外输出的乐器(主输出之外的 CLAP 输出端口、VST3 辅助输出总线)会在其混音条上获得一个 + OUT 芯片:每个输出都可以拆分到自己的混音通道(“PAD AUX 1”),这是一条没有乐器的轨道,其信号就是该输出,在其源之后渲染。它的推子、声像、静音、独奏、插入效果、发送和自动化都像任何轨道一样工作,并且该输出仅通过该通道被听到——绝不会同时通过源轨道被听到。独奏源轨道会使其通道保持可听(它们是乐器自身的声音);单独独奏一个通道则只播放该通道。该通道是歌曲的一部分:被保存、撤销、按听到的样子导出;移除源轨道后,该通道会保留为一条普通轨道。检查器下方的 MODULATION 面板添加 LFO(正弦、三角、锯齿、方波、随机;速率以 Hz 为单位,或者开启 SYNC 后使用从 1/16 到 4 小节的音符时值,跟随速度映射)、宏(一个 0..1 的旋钮)和包络跟随器(从卡片的源选择器中选择的轨道的电平,经过其插入效果之后、推子之前)。+ TARGET 将一个调制指向所选轨道的乐器或插入效果的某个参数,深度为该参数范围的 -100% 到 +100%。调制是在参数自身值和自动化之上的一个偏移,以 CLAP 参数调制(以及 VST3 和内置效果器上的等效方式)发送,绝不写入任何轨道;多个调制作用于同一参数时会叠加。速率、形状、深度和宏可以实时变化,无需重新编译。调制器和键随歌曲一起保存、一起撤销,并按它们实际播放的样子导出:当歌曲播放时,LFO 的相位取自歌曲位置。
LAUNCH 视图是一个场景启动器:场景纵向排列,轨道横向排列,每个单元格命名歌曲中的一个 pattern(与编辑器编辑的 pattern 相同)。点击空单元格会将当前打开的 pattern 放入其中;点击已填充的单元格会按照该单元格的量化(无、十六分音符、一拍、一小节、两小节或四小节)在其轨道上启动它,而场景的 chip 会按照网格的量化启动其整行。一个单元格可以播放若干次循环,然后执行后续动作(停止、下一个、上一个、第一个、最后一个、随机或再次播放)。启动、停止、循环切换和后续动作都在其边界的精确采样点上发生,位于渲染回调内部,并且已启动的轨道会播放其单元格而不是其编排,直到传输停止。开启 REC ARRANGEMENT 后,轨道从一个单元格播放的每一段在结束时都会作为片段打印到编排中,每一步各占一次撤销;打印出的编排会逐采样播放和导出所听到的内容。在较长片段上打印的 take 会将其分割,保留该片段在 take 之后播放的内容。在即兴演奏中途添加或移除轨道或更改乐器会重建引擎而不停止演奏:已启动的单元格继续按相位播放,播放头保持在原位。引擎队列没有空间容纳的启动会被拒绝并在状态行中说明,因 take 队列已满而丢失的 take 也是如此。网格随歌曲一起保存。
MIDI 键盘将弯音轮、控制变化和压力发送到轨道的乐器,无论它们发送到哪个通道(SoundFont、VST3、CLAP 和采样器都跟随弯音轮;SoundFont 还接受复音压力),并且延音踏板会在输入端为每个乐器保持已释放的键。录音时,弯音轮、控制器、通道压力和复音压力(在歌曲调音发送给乐器的那个键上)会作为控制器运动写入 pattern:随项目保存,在其采样点上播放,在播放头跳转时追赶,并按所听到的导出。钢琴卷帘下方的控制器轨道一次显示一个控制器(BEND、MOD、EXPR、任意编号的 CC 或 PRESSURE,从其选择器中选取):拖动以绘制笔画,拖动一个点以移动它,右键单击以擦除;每个手势都是一步撤销,正在播放的歌曲会在其下一个块中播放它。
MPE 键盘:在 MIDI IN 面板上打开 MPE(或让键盘发送其 MPE 配置消息)。每个音符自己的弯音、CC 74 和压力仅移动该音符,随其一起录制,并作为 CLAP 音符表情回放,或者对于 SoundFont 和 VST3 乐器,在音符自己的通道上回放(每个听到什么,请参阅 features/continuous_midi.feature)。
解码后大小超过流式传输阈值(默认 128 MiB;BLOKKILY_STREAM_THRESHOLD_BYTES 可覆盖它)的音频片段会从磁盘流式传输,而不是解码到 RAM 中:一个后台工作线程为每个片段填充一个无锁环形缓冲区,使用与内存路径相同的转换器重采样到引擎采样率,渲染回调只读取它。流跟随歌曲(在片段开始和歌曲回绕之前预先提示,在定位时重新定位);干涸的环形缓冲区会淡出再淡入,而不是发出咔嗒声。导出会在自己的线程上阻塞读取流式片段,因此它与流式播放逐采样相等。
导入的文件保持原位。录音会存入 <project>.audio/,或在首次保存前存入临时会话文件夹。COLLECT 会把引用的片段和采样器样本复制到已保存项目的音频文件夹中,对共享文件去重,并作为一次可撤销的编辑更改它们的引用。之后保存以持久化这些引用。原始文件会保留,以便撤销后仍可播放。
从智能体(MCP)驱动 Blokkily
Blokkily 是一个 MCP 服务器,因此 AI 智能体可以驱动正在运行的窗口:读取会话、写入音符、播放和停止、调用控件使用的任何方法,以及截取屏幕截图。将桥接注册到你的智能体,例如使用 Claude Code:
claude mcp add blokkily -- blokkily --mcp
或者,对于任何接受 JSON 配置的客户端:
{ "mcpServers": { "blokkily": { "command": "blokkily", "args": ["--mcp"] } } }blokkily --mcp 在 stdin 和 stdout 上使用 MCP,并通过本地套接字($XDG_RUNTIME_DIR/blokkily-mcp.sock,在 Windows 上是命名管道)将每个工具调用转发到打开的窗口。连接和列出工具永远不会打开窗口;第一次工具调用会在 Blokkily 未运行时启动它。只有运行 Blokkily 的用户才能连接。
这些工具是 get_session、get_pattern、write_notes、transport、list_plugins、set_instrument、list_parameters、set_parameter(合成器的预设或任何旋钮,按名称)、set_soundfont_preset(General MIDI 音色库和音色)和 screenshot,外加 describe、call 和 get_property,它们可以访问窗口控件使用的每个方法和属性(混音器、效果、自动化、片段、速度、调音、保存、导出、撤销)。智能体的编辑会经过与点击相同的可撤销路径。BLOKKILY_MCP=0 关闭服务器;BLOKKILY_MCP_SOCKET 移动套接字(为窗口和桥接设置相同的值);BLOKKILY_MCP_NO_LAUNCH=1 阻止桥接启动窗口。参见 features/mcp.feature。
尚未包含的内容
- MPE 覆盖来自 MPE 芯片的下区(上区仅来自键盘的配置消息)。逐音符表情会被录制和播放,但不会在编辑器中绘制。VST3 乐器仅在两个半音通道弯音范围内听到逐音符音高;SoundFonts 没有 CC 74 音色,除非 SF2 映射了它;采样器仅接受逐音符音高。不读取 MIDI 时钟。内置采样器忽略复音压力;控制器轨道不编辑复音压力。音符和控制器的时间戳精确到回调块。
- Comping(对已录制轨道进行交替分段录制)尚未包含。
- 磁盘流式播放仅覆盖未变形的音频片段:变形的片段会被解码到内存中以进行拉伸,而采样器始终解码。单个流式片段在播放跨越歌曲的循环点时会在循环点处短暂下降(每个片段一个流)。
- 采样器面板一次加载一个文件;它没有多采样导入向导、力度层编辑器或波形编辑界面。
- 步进参数锁定针对轨道乐器。插入参数使用自动化轨道;针对插入的步进锁定不在本次发布范围内。
- CLAP 或 VST3 效果器的第一个辅助输入仅被馈送一个键,作为立体声(或单声道)信号;具有多个侧链的效果器在其他侧链上听到静音。VST3 插件的额外总线仅在立体声主总线旁使用。
- 调制每个块评估一次(最多为设备的块大小),因此同步的 LFO 在其节拍后的下一个块开启。指向自身轨道或指向渲染顺序无法将其置于其源之后的轨道的跟随器,会听到前一个块的电平。同步分割是直音符值(没有附点或三连音),其中的“小节”无论拍号如何都是四拍。
- 场景启动器没有逐场景的速度设置,导出时始终是编曲内容(已启动的轨道不包含在内)。在打印片段之后保留的片段尾部不会追踪在其修剪之前设置的控制器值。
- 输出录音每次只选择一个总线。为得到一组分轨,需额外弹跳多个机架。部分实时录制在录音停止时结束,不会自动追加效果尾部;离线分轨则包含这些尾部。
- 原生插件窗口像素需要 X11 显示。离屏验证检查嵌入生命周期,而单独的显示门禁在 X 服务器可用时检查真实的 VST3 像素。
来源:Hacker News · github.com
