Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
8e915c7
Add Toneshuttle brand modules with stable legacy identifiers
lsy-404 Oct 18, 2026
1d7b718
Make SynthV an optional integration and give the agent a product iden…
lsy-404 Oct 18, 2026
af262a1
Rename the release identity and user documents to Toneshuttle
lsy-404 Oct 18, 2026
be7bced
Save live SV2 data before switching account slots
lsy-404 Oct 18, 2026
d793f86
Keep the Windows executable name across the Toneshuttle rename
lsy-404 Oct 18, 2026
2dfe9a9
Rebrand the renderer as Toneshuttle and add integration and MCP clien…
lsy-404 Oct 18, 2026
b820fb5
Give the built-in agent read-only toolbox tools independent of SynthV
lsy-404 Oct 18, 2026
4d81562
Merge release identity rename to Toneshuttle
lsy-404 Oct 18, 2026
c99d45a
Hide the SynthV import option when the integration is off
lsy-404 Oct 18, 2026
ab03e1a
Serialize SV2 slot operations and protect writes into the active slot
lsy-404 Oct 18, 2026
6f960b2
Refuse SynthV host operations while the integration is off
lsy-404 Oct 18, 2026
db43b63
Merge SV2 slot data-loss fix
lsy-404 Oct 18, 2026
36ac64e
Expose enabled external MCP servers from desktop state
lsy-404 Oct 18, 2026
dae0a72
Secure the local HTTP MCP server and make it work with current MCP cl…
lsy-404 Oct 18, 2026
2c26741
Merge MCP compatibility and bearer-token hardening
lsy-404 Oct 18, 2026
7088ffc
Mark toolbox_agent as AI-mode only on the Connections page
lsy-404 Oct 18, 2026
98d99f4
Report a Stop during a model request as cancelled, not as an error
lsy-404 Oct 18, 2026
d93acf2
Give the built-in agent the user's external stdio MCP servers
lsy-404 Oct 18, 2026
163c539
Add a real-Electron end-to-end test for the Toneshuttle rename
lsy-404 Oct 18, 2026
d10775e
Record agent, integration and MCP fixes in the changelog
lsy-404 Oct 18, 2026
90053c1
Bring four renderer and shell tests in line with the rename
lsy-404 Oct 18, 2026
48a9f89
Reap launcher orphans and keep external MCP names and schemas usable
lsy-404 Oct 18, 2026
6234c6f
Merge external MCP servers for the built-in agent
lsy-404 Oct 18, 2026
0fd19d2
Note external MCP servers for the agent in the changelog
lsy-404 Oct 18, 2026
64c4623
Make the cover-score data-root containment test portable
lsy-404 Oct 18, 2026
3e27d76
Close gaps found in review of the integration and agent changes
lsy-404 Oct 18, 2026
363cd18
Drop the Bridge from the toolbox-mode home description
lsy-404 Oct 18, 2026
ccb714b
Rename the Windows executable, install folder and data folder to Tone…
lsy-404 Oct 19, 2026
fb36807
Make the contract tests pass on CI's Windows and macOS runners
lsy-404 Oct 19, 2026
35dec70
Address review: SynthV gate, chat history on rebuild, probe orphans, …
lsy-404 Oct 19, 2026
2d5c6eb
Address review: bridge IPC folder, MCP server env, token rotation
lsy-404 Oct 19, 2026
7371a1c
Address review: live SynthV gate, MCP tool changes, probe limits, Age…
lsy-404 Oct 19, 2026
4aefd8b
Give Windows orphan reaping time for a cold WMI start
lsy-404 Oct 19, 2026
0e9adcf
Address review: shared launch plan, tool-less servers, hints, AI mode…
lsy-404 Oct 19, 2026
97322b7
Address review: history after long replies, lyric-only check, live locks
lsy-404 Oct 19, 2026
f84e045
Address review: creative Bridge gate, tool refresh, limits, results
lsy-404 Oct 19, 2026
c08ef6b
Address review: MCP message limits and envelopes, busy migration, rec…
lsy-404 Oct 20, 2026
881e2e8
Address review: tool-list totals, Cover taskId, MCP retirement, busy …
lsy-404 Oct 20, 2026
51f1678
Address review: reap stale MCP clients first, keep audio batch withou…
lsy-404 Oct 20, 2026
dfbed81
Resolve the SynthV "auto" preference from what is detected
lsy-404 Oct 20, 2026
764801a
Address review: Bridge refresh, MCP after AI off, History gate, token…
lsy-404 Oct 20, 2026
58608bb
Address review: MCP message limit in bytes, selective sync between slots
lsy-404 Oct 20, 2026
824dbe4
Address review: null project paths, SynthV-off probes, tools/list race
lsy-404 Oct 20, 2026
3636eef
Address review: SynthV-off polling, definition bytes, active slot fol…
lsy-404 Oct 20, 2026
727bf3a
Address review: retry failed MCP servers per conversation, bound sche…
lsy-404 Oct 20, 2026
80794b0
Address review: unsaved settings, Bridge load with SynthV Off, Test r…
lsy-404 Oct 20, 2026
45928d6
Address review: bind MCP tool calls to their config, Bridge load refr…
lsy-404 Oct 20, 2026
04acdad
Address review: verify MCP tools after a restart, pause backups with …
lsy-404 Oct 20, 2026
7515401
Address review: re-list stale tool caches before a call, defer migrat…
lsy-404 Oct 20, 2026
e64e534
Address review: refuse MCP calls while a server's tool list stays stale
lsy-404 Oct 20, 2026
e555454
Address review: full probe state, cancel toolbox processes, disabled …
lsy-404 Oct 20, 2026
928fcc2
Address review: stop FFprobe with the run, put a set-aside folder bac…
lsy-404 Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/scripts/macos-signing-shared.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { createHash } from 'node:crypto';
import { createReadStream } from 'node:fs';
import { writeFile } from 'node:fs/promises';

// The signing center project and the bundle id predate the Toneshuttle name: the center is provisioned for them and
// Squirrel.Mac only installs updates whose bundle id matches the installed app, so they keep their original values.
export const PROJECT_ID = 'synthv-toolbox-arm64';
export const BUNDLE_ID = 'com.synthvcopilot.toolbox';
export const APP = 'Synthesizer V Toolbox.app';
export const APP = 'Toneshuttle.app';
export const ARCH = 'arm64';
export const TEAM_ID = '76DMUAK6J5';
export const STABLE_TAG = /^v(\d+\.\d+\.\d+)$/;
Expand Down
4 changes: 2 additions & 2 deletions .github/scripts/publish-macos.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ function defaultExec(file, args) {
}

export const assetNames = (version) => ({
dmg: `Synthesizer-V-Toolbox-${version}.dmg`,
zip: `Synthesizer-V-Toolbox-${version}-${ARCH}-mac.zip`,
dmg: `Toneshuttle-${version}.dmg`,
zip: `Toneshuttle-${version}-${ARCH}-mac.zip`,
metadata: 'latest-mac.yml',
});

Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/release-draft.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { assetNames } from './publish-macos.mjs';
export function requiredAssets(version) {
const macos = assetNames(version);
return [
'latest.yml', `Synthesizer-V-Toolbox-${version}-setup.exe`,
'latest.yml', `Toneshuttle-${version}-setup.exe`,
macos.metadata, macos.dmg, macos.zip,
];
}
Expand Down
2 changes: 1 addition & 1 deletion .github/scripts/set-dev-version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,4 @@ updateJson(lockFile, (value) => {
if (process.env.GITHUB_OUTPUT) {
fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${version}\n`);
}
process.stdout.write(`SynthV Toolbox development build version: ${version}\n`);
process.stdout.write(`Toneshuttle development build version: ${version}\n`);
2 changes: 1 addition & 1 deletion .github/scripts/set-version.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ updateJson(path.join(desktop, "package-lock.json"), (value) => {
if (process.env.GITHUB_OUTPUT) {
fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${version}\n`);
}
process.stdout.write(`SynthV Toolbox build version: ${version}\n`);
process.stdout.write(`Toneshuttle build version: ${version}\n`);
2 changes: 1 addition & 1 deletion .github/scripts/submit-macos.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ async function assertDmgMatchesApp(app, mounted, executable) {
}

async function buildBundle({ env, exec, runId, version, sourceSha, app, dir, executable }) {
const dmg = path.join(workspace(env), 'release', `Synthesizer-V-Toolbox-${version}.dmg`);
const dmg = path.join(workspace(env), 'release', `Toneshuttle-${version}.dmg`);
const dmgInfo = await lstat(dmg).catch(() => null);
if (!dmgInfo?.isFile()) throw new ToolError('DMG_APP_MISMATCH');
const workDir = await mkdtemp(path.join(runnerTemp(env), `toolbox-sign-${runId}-`));
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ffmpeg-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
run: npm exec --prefix src/PiDesktop.Tauri -- electron-builder --config electron-builder.yml ${{ matrix.target }} --publish never
- uses: actions/upload-artifact@v4
with:
name: synthv-toolbox-${{ matrix.name }}
name: toneshuttle-${{ matrix.name }}
path: ${{ matrix.artifact }}
if-no-files-found: error

Expand Down Expand Up @@ -121,6 +121,6 @@ jobs:
run: |
$assets = @(gh release view "v$env:NIGHTLY_VERSION" --json assets --jq '.assets[].name')
if ($LASTEXITCODE -ne 0) { throw "Nightly release was not created." }
$packageAsset = "Synthesizer-V-Toolbox-$env:NIGHTLY_VERSION$env:ASSET_SUFFIX"
$packageAsset = "Toneshuttle-$env:NIGHTLY_VERSION$env:ASSET_SUFFIX"
if ($assets -notcontains $packageAsset) { throw "Nightly package was not published: $packageAsset" }
if ($assets -notcontains $env:UPDATE_METADATA) { throw "Nightly update metadata was not published: $env:UPDATE_METADATA" }
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,23 @@

## 未发布

- 产品更名为 Toneshuttle(声梭),定位为通用的人声与音频创作工具箱。应用标识、Windows 安装注册和更新源保持不变,现有安装可直接升级。
- Windows 可执行文件改名为 `Toneshuttle.exe`,按用户安装的目录从 `synthv-toolbox` 改为 `Toneshuttle`,数据目录也从 `synthv-toolbox` 改为 `Toneshuttle`(Windows 为 `%APPDATA%`,macOS 为 `~/Library/Application Support`)。首次启动新版本时数据目录整体迁移,设置、AI 凭据、SV2 账号槽位、MCP 令牌、插件、组件和历史都会保留,记录中的旧路径同步更新。如果旧版本仍在运行,新版本会提示先从托盘退出旧版本,退出后再启动即可完成迁移;如果旧目录中的文件被其他程序占用,本次启动继续使用旧目录,下次启动时重试,「设置 > 数据与平台」会说明原因。
- 升级时桌面和开始菜单快捷方式会按新名称重建,开机自启动项会迁移到新的可执行文件并保留原来的启用状态。手动升级时如果旧版本正在运行,安装器会先询问再关闭它。固定到任务栏的图标无法迁移,需要重新固定。用 `/S` 静默安装且不自动启动时,需要手动启动一次新版本,开机自启动才会迁移。降级到旧版本时,旧版本看不到迁移后的数据。
- 修复 Windows 上开启「开机启动」后总是提示系统未应用设置、并显示为关闭的问题。
- 修复设置页在较窄窗口中被插件特权说明撑宽、右侧内容被裁切的问题。
- 安装包和更新文件改名为 `Toneshuttle-<版本>-setup.exe`、`Toneshuttle-<版本>.dmg` 和 `Toneshuttle-<版本>-arm64-mac.zip`。
- Synthesizer V 支持改为可选集成,包括 Bridge、SV2 账号槽位和 .svp 工具,可在「设置 > 集成」中关闭。默认的「自动」在检测到 Synthesizer V 安装(含在 Bridge 页设置过的脚本目录)、SV2 账号槽位或已连接的 Bridge 时启用,否则关闭;窗口获得焦点时、以及未启用期间每隔几秒都会重新检测,安装或启动 SynthV 后无需重启。
- 本地 MCP 端点需要 Bearer 令牌;「连接」页显示令牌,并可为 Claude Code、Codex 和 Cursor / VS Code 生成客户端配置。
- 修正与外部 MCP 客户端的协议兼容性问题。
- 修复激活 SV2 账号槽位时可能丢失数据的问题。
- 内置 Agent 以声梭身份工作,并新增只读的音频与歌词工具(媒体信息、响度、音频特征、押韵、歌词发音检查、工作流历史),关闭 Synthesizer V 集成时也能使用;集成关闭后 Agent 不再获得 sv_* 工具与一键 Cover。
- 关闭 Synthesizer V 集成后,MCP 客户端与插件也无法再调用 SynthV 相关操作,应用不再探测 SynthV。
- 在审批等待期间停止 Agent 运行时,结果正确显示为“已取消”,不再误报为模型错误。
- 修复 Windows 上 MCP Agent 任务保存偶发失败、已完成任务被标为失败的问题。
- Bridge 组件加载失败时应用仍可启动,并在「设置 > 集成」中显示原因。
- 「连接」页配置的外部 stdio MCP 服务器现在真正接入内置 Agent(此前只保存不连接、测试按钮恒显示成功):测试按钮会实际启动服务器并列出工具;只读工具在任何模式可用,可能修改数据的工具仅在 Solo 模式执行。
- 使用条款按新名称更新,Synthesizer V 相关条款归入独立章节;Windows 安装器不显示条款确认页,安装或使用即表示接受条款。
- macOS 正式版安装包改由签名中心签名并公证,下载后可直接通过 Gatekeeper。
- macOS 应用内更新使用由已签名应用生成的 zip 和 `latest-mac.yml`。
- Windows 安装包不再要求代码签名环境。
Expand Down
43 changes: 27 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,46 @@
# Synthesizer V Toolbox
# Toneshuttle 声梭

Synthesizer V Toolbox 是面向 Synthesizer V 创作流程的桌面工具箱,支持 Windows 和 macOS。它把常用的音频、MIDI、工程文件和 Bridge 工具集中在一个应用中;需要时也可启用 AI 辅助功能。
Toneshuttle(声梭)是面向人声与音频创作的通用桌面工具箱,支持 Windows 和 macOS。它把音频准备、分析、音频转 MIDI、歌词处理和 AI Agent 集中在一个应用中,并通过本地 MCP 服务器和插件系统与其他工具协作。Synthesizer V 支持作为可选集成提供。

本项目原名 Synthesizer V Toolbox。升级到 Toneshuttle 时,可执行文件、安装目录和数据目录会一并改为 Toneshuttle,设置、账号、插件和开机自启动自动迁移,应用内更新继续可用。

## 主要功能

- 将演唱音频转换为 MIDI 或 SynthV 可用素材
- 分析音频的节奏、调性和整体特征
- 导入、检查和整理 MIDI、MusicXML 与 SynthV 工程文件
- 导出歌词与工程副本,方便校对和备份
- 连接 SynthV Bridge,在当前工程中继续处理结果
- 通过统一 Agent 接口连接官方 SV1、Flat 或官方 SV2,隐藏底层 Bridge/MCP 差异
- 通过 Copilot 与用户配置的工具协助完成创作流程
- 音频准备:导入和整理素材,分离人声与伴奏
- 音频分析:节奏、调性和整体特征
- 音频转 MIDI:从演唱音频生成 MIDI,并保留歌词和标记信息
- 歌词工作区:写词、识别、校对和导出歌词
- 导入、检查和整理 MIDI 与 MusicXML 文件,导出结果写入独立位置
- AI Agent:启用并配置模型账号后协助完成创作流程,需要确认的操作由用户批准
- 本地 MCP 服务器:让 Claude Code、Codex、Cursor 等外部客户端调用工具箱能力
- 插件系统:通过插件扩展工具和界面

## Synthesizer V 集成(可选)

面向 Synthesizer V 用户的可选集成,可在「设置 > 集成」中关闭;关闭后上述通用功能不受影响。

- Bridge:连接 SynthV Bridge,在当前工程中继续处理结果;通过统一 Agent 接口连接官方 SV1、Flat 或官方 SV2,隐藏底层 Bridge/MCP 差异
- SV2 账号槽位:Windows 和 macOS 都提供可选的 SV2 本地数据槽位,可在 SV2 完全退出后顺序切换并启动。Windows 还提供工程智能启动和可选的并发隔离辅助功能。同账号可在普通或隔离环境启动多个进程,共用该账号槽位的数据;声库按账号独立保存,默认跨账号仅同步设置和脚本等内容。账号页可按窗口标题和 PID 查看实例及账号关联
- .svp 工具:导入、检查和整理 SynthV 工程文件,导出歌词与工程副本,方便校对和备份

## 平台支持
所有账号相关功能均不会修改 Synthesizer V 程序,并始终由用户主动启用和确认。

音频、MIDI、工程文件、Bridge 与 Copilot 工作流支持 Windows 和 macOS。
## 连接 MCP 客户端

Windows 和 macOS 都提供可选的 SV2 本地数据槽位,可在 SV2 完全退出后顺序切换并启动。Windows 还提供工程智能启动和可选的并发隔离辅助功能。 同账号可在普通或隔离环境启动多个进程,共用该账号槽位的数据;声库按账号独立保存,默认跨账号仅同步设置和脚本等内容。账号页可按窗口标题和 PID 查看实例及账号关联。所有账号相关功能均不会修改 Synthesizer V 程序,并始终由用户主动启用和确认。
在「连接」页开启 MCP 工具接口后,Toneshuttle 在本机提供 `http://127.0.0.1:17831/mcp`(默认端口)。每个请求都需要携带 Bearer 令牌,令牌显示在「连接」页;该页还可为 Claude Code、Codex 和 Cursor / VS Code 生成可直接粘贴的客户端配置。

## 使用原则

- 基础工具可独立使用;AI 功能仅在用户启用后运行。
- 外部工具和账号相关功能均需由用户主动配置或确认。
- 外部工具、插件和账号相关功能均需由用户主动配置或确认。
- 工程处理会保留原文件,导出结果写入独立位置。
- 使用任何第三方服务时,请遵守其适用的服务条款与账号政策。

## Trademark and affiliation

*This project is not affiliated with or endorsed by Dreamtonics.*
*Toneshuttle is not affiliated with or endorsed by Dreamtonics.*

“Synthesizer V” is used solely as nominative fair use to identify compatible software.
“Synthesizer V” is a trademark of Dreamtonics and is used only to identify compatible software.

## 开发与发布

Expand All @@ -43,4 +54,4 @@ Windows 和 macOS 都提供可选的 SV2 本地数据槽位,可在 SV2 完全

[Apache-2.0](LICENSE)

使用工具箱前,请阅读[使用条款](src/PiDesktop.Tauri/electron/assets/TERMS-OF-USE.txt)。该条款独立于 Apache-2.0 许可证。
使用 Toneshuttle 前,请阅读[使用条款](src/PiDesktop.Tauri/electron/assets/TERMS-OF-USE.txt)。该条款独立于 Apache-2.0 许可证。
4 changes: 2 additions & 2 deletions docs/ab-clip-capture.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

## 目标

片段 A/B 检查用于替代调声迭代中的重复完整渲染。用户选择短时间范围后,Toolbox 自动定位、播放、停止并恢复 SynthV 播放头,同时捕获该次播放的音频。基线 A 可以保留不动;每次修改后只捕获候选 B,再做快速对齐比较。
片段 A/B 检查用于替代调声迭代中的重复完整渲染。用户选择短时间范围后,Toneshuttle(声梭)自动定位、播放、停止并恢复 SynthV 播放头,同时捕获该次播放的音频。基线 A 可以保留不动;每次修改后只捕获候选 B,再做快速对齐比较。

这条路径不会启动 `pi-audio`、PANNs 或模型推理。它只执行短时本机捕获、单声道 WAV 裁切和确定性指标计算,因此适合作为连续片段优化与 Copilot 复检的默认方式。

## 实现边界

- 当前捕获后端为 Windows WASAPI Application Loopback,目标是所选 SynthV standalone PID 及其子进程;不录制系统混音,也不捕获 DAW 中的 SynthV 插件。
- 需要 Windows 10 build 20348 或更高版本。其他平台会返回明确的 capability 不可用状态;A/B WAV 比较逻辑本身仍是跨平台的。
- Bridge 的公共 MCP 表面仍保持六工具不变。片段捕获通过 Toolbox 的统一 SynthV 宿主层控制播放,不把任何宿主原始工具暴露给内置 Agent。
- Bridge 的公共 MCP 表面仍保持六工具不变。片段捕获通过 Toneshuttle 的统一 SynthV 宿主层控制播放,不把任何宿主原始工具暴露给内置 Agent。
- 单次目标片段最长 30 秒,前后保护区各最多 2 秒。捕获开始前 SynthV 必须处于 stopped 状态,避免中断用户正在进行的试听。
- 输出写入 `~/.SynthVcopilot/output/ab-captures/`。最终片段是 48 kHz 单声道 PCM16 WAV,并带有 JSON 元数据、SHA-256、边界不确定度与快速电平指标。

Expand Down
2 changes: 1 addition & 1 deletion docs/bridge-and-lyrics.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
3. 在 SynthV 钢琴卷帘中选中音符,然后回到作词页点击「读取选中音符」。在草稿中选中需要填入的中文文字,点击「用草稿选区填入」;它按非空白字符逐字对应音符,数量必须相等。也可以直接编辑每个音符的词槽。
4. 点击「预览写入」,核对轨道、组和每个音符的新旧歌词,再点击「确认写回」。修改词槽后需要重新预览。切换会话、改变音符或选区、预览过期时,重新读取后再操作。
5. 写回只改选中音符的歌词,保留音高和时值,并沿用 SynthV 的撤销记录。共享音符组由 Bridge 拒绝修改;工程仍需在 SynthV 中保存。
6. 点击「导出 TXT」生成独立 UTF-8 文本,成功提示会显示文件路径。文件保存在 Toolbox 数据目录的 `creative/lyrics/exports` 下,每次导出生成新文件。
6. 点击「导出 TXT」生成独立 UTF-8 文本,成功提示会显示文件路径。文件保存在 Toneshuttle(声梭)数据目录的 `creative/lyrics/exports` 下,每次导出生成新文件。

候选记录最多保留 20 组;单个项目最多占用 16 MiB,所有歌词项目合计最多占用 64 MiB。项目旧稿最多保留 30 个版本;保存后单项目超限时只移除当前项目最旧的历史版本,正文或候选内容本身超限以及项目库总量超限时会拒绝保存,不会删除其他项目内容。草稿编辑的本机临时保存与「保存项目」是两个不同操作,项目版本在点击保存时创建。
Loading
Loading