MusicXML Synthesizer

io.github.raulkivi由 GitHub 帳號 raulkivi 發布v0.2.3更新於 Oct 24, 2026

Synthesizes audio from MusicXML, with voice-part selection and tempo control

已驗證STDIO僅桌面檔案與儲存媒體與設計

概覽

AI 產生的概覽

透過 FluidSynth 將 MusicXML 樂譜渲染成 WAV 音訊,讓助理挑選聲部、調整速度並製作練習音軌。

可以做什麼
  • 檢視樂譜:列出各聲部名稱、ID 與小節數,並摘要標題、調性、拍號、速度、聲部與長度
  • 渲染音訊:將整份樂譜或指定聲部合成為 WAV 檔,可調整速度
  • 製作練習音軌:限定小節範圍、重複次數、加入預備拍與節拍器,選擇音色與各聲部音量
  • 取得起音:以文字回傳各聲部第一個音高,並附上一段簡短的鋼琴音訊
  • 檢查環境:回報後端版本、音色庫狀態與 FluidSynth 是否可用
適用情境
適合合唱團員、指揮或音樂學習者想單獨聽某個聲部,或需要放慢速度的練習音軌時使用;也適合助理在渲染前先了解 MusicXML 或壓縮 MXL 樂譜的結構。
執行需求
以 Python 套件形式在本機執行(需 Python 3.11 以上),透過 uvx 或 uv 啟動;需要 libfluidsynth 系統函式庫,並以 SYNTH_SOUNDFONT_PATH 指定 SF2 音色庫檔案路徑。選用的 SHEET_MUSIC_OUTPUT_ROOT 與 SHEET_MUSIC_INPUT_ROOTS 可限定音訊寫入與樂譜讀取的資料夾。僅支援桌面端。
安裝前請注意
synthesize 會將 WAV 檔寫入磁碟,預設位於輸出根目錄;建議設定 SHEET_MUSIC_OUTPUT_ROOT 與 SHEET_MUSIC_INPUT_ROOTS 以限制可寫入與可讀取的資料夾。樂譜可直接放在對話中,也可用路徑傳入,請謹慎選擇路徑。輸出固定為 WAV,且 music21 的 MIDI 匯出可能遺失部分奏法與力度。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 MusicXML Synthesizer,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

synth-mcp

MCP server that synthesizes audio from MusicXML. Supports voice part selection (Soprano, Alto, Tenor, Bass) and tempo control.

What it does

Takes a MusicXML score, optionally filters to one or more voice parts, and renders a WAV audio file using FluidSynth. Useful for choir singers who want to practice a specific voice part.

Tools

ToolDescription
get_partsList all voice parts in a score — returns part name, ID, and measure count
synthesizeRender the score (or selected parts) to a WAV file, with optional tempo adjustment and practice options (bars, repeats, count-in, metronome, timbre, part volumes)
starting_pitchesEach part's first note as text ("S: D5, A: A4, T: F#4, B: D3") and a short piano clip
describe_scoreSummarize a score cheaply: title, key, time, tempo, parts (ID, clef, range), measures, duration
list_capabilitiesReturn server metadata: backend version, soundfont status, FluidSynth availability
health_checkCheck that the soundfont, FluidSynth, and music21 are all available and ready

Installation

bash
cd synth-mcpuv sync

System library required:

bash
# Ubuntu / Debiansudo apt install libfluidsynth-dev
# macOSbrew install fluid-synth

A soundfont (SF2) file is also required. Free options:

SoundfontSizeNotes
TimGM6mb~6 MBShips with Ubuntu (/usr/share/sounds/sf2/TimGM6mb.sf2)
MuseScore General~200 MBBetter quality; download from musescore.org
GeneralUser GS~30 MBDownload from schristiancollins.com

Quick install

Prefer not to do the above by hand? Run ./install.sh — with uv already installed, it installs the system libfluidsynth package and a soundfont automatically. See SETUP.md for a non-technical walkthrough, and TROUBLESHOOTING.md if something goes wrong. Ready-made client configs (Claude Desktop, Cursor, Windsurf, Continue, Zed) are in examples/.

Running

bash
SYNTH_SOUNDFONT_PATH=/usr/share/sounds/sf2/TimGM6mb.sf2 uv run synth-mcp

Configuration

VariableRequiredDescription
SYNTH_SOUNDFONT_PATHYesPath to an SF2 soundfont file
SHEET_MUSIC_OUTPUT_ROOTNoFolder output_path must be inside; also readable by musicxml_path (default: working directory). Without output_path, synthesize writes audio/output-<timestamp>.wav here (earlier releases used /tmp/synth-mcp-<uid>/; use the returned audio_path)
SHEET_MUSIC_INPUT_ROOTSNoExtra folders musicxml_path may read (:-separated; ; on Windows)

Claude Desktop configuration

json
{  "mcpServers": {    "synth": {      "command": "uv",      "args": ["--directory", "/absolute/path/to/synth-mcp", "run", "synth-mcp"],      "env": {        "SYNTH_SOUNDFONT_PATH": "/absolute/path/to/soundfont.sf2"      }    }  }}

Usage examples

json
// List parts in a score{"tool": "get_parts", "arguments": {"musicxml": "<score-partwise>...</score-partwise>"}}
// The same, reading a file instead of copying the score into the conversation{"tool": "get_parts", "arguments": {"musicxml_path": "scores/chorale.mxl"}}
// Synthesize the full score{  "tool": "synthesize",  "arguments": {    "musicxml": "<score-partwise>...</score-partwise>",    "output_path": "/tmp/full.wav"  }}
// Synthesize Soprano part only at 80% tempo{  "tool": "synthesize",  "arguments": {    "musicxml": "<score-partwise>...</score-partwise>",    "output_path": "/tmp/soprano.wav",    "parts": ["Soprano"],    "tempo_factor": 0.8  }}
// Practice track: Alto loud, others soft, bars 17-24 three times, one bar of count-in{  "tool": "synthesize",  "arguments": {    "musicxml_path": "scores/chorale.mxl",    "preset": "learning",    "focus_part": "Alto",    "measures": [17, 24],    "repeat": 3,    "count_in_bars": 1  }}
// Starting notes before singing{"tool": "starting_pitches", "arguments": {"musicxml_path": "scores/chorale.mxl"}}

parts accepts part IDs from get_parts ("P1"), part names ("Soprano", any case) or voices ("S", "Alto", "Alt", "A1" for divisi); an unknown part returns the valid choices. part_ids still works as a deprecated alias for one minor release.

Every tool that takes musicxml also takes musicxml_path instead (exactly one of the two): a .musicxml, .xml or compressed .mxl file inside the output root, a folder the client shares as an MCP root, or a folder in SHEET_MUSIC_INPUT_ROOTS. Prefer it, and pass on paths other servers return. describe_score reports part IDs, ranges and duration without returning the score.

tempo_factor range: 0.25–4.0. Values below 1.0 slow down; above 1.0 speed up. Does not affect pitch.

Practice options on synthesize (all optional; leaving them out gives the plain track):

OptionValuesEffect
measures[start, end]Only these printed bars (a pickup is 0)
repeat1–20Play the selection this many times
count_in_bars0–4Wood-block clicks before the music
metronometrue / falseClicks on every beat of the music too
timbrescore, piano, choir, organSound for every part (score keeps the score's instruments)
preset + focus_partlearning (focus 1.5, others 0.5), karaoke (focus muted), equalPart volumes
part_gainspart → 0.0–2.0Per-part volume, overrides the preset

starting_pitches returns the text always; the clip (mono 16 kHz WAV, inline when ≤ 200 KB) needs the soundfont and FluidSynth. Without them the result says why in audio_unavailable.

Testing

bash
# Unit tests (no soundfont required)VIRTUAL_ENV= .venv/bin/pytest tests/ -v
# Integration tests (synthesizes real audio)VIRTUAL_ENV= SYNTH_SOUNDFONT_PATH=/usr/share/sounds/sf2/TimGM6mb.sf2 \  .venv/bin/pytest tests/ -v -m integration

Dependencies

  • music21 — score parsing and MIDI export
  • pyfluidsynth — Python bindings for FluidSynth
  • mcp — MCP protocol

Known limitations

  • music21's MIDI export may drop some articulations and dynamics
  • Audio output is always WAV; convert with ffmpeg -i out.wav out.mp3 if needed
  • Large scores (100+ measures) may take several seconds to synthesize

System requirements

  • Python 3.11+
  • libfluidsynth shared library (libfluidsynth.so.3 on Linux)
  • An SF2 soundfont file

來源:synth-mcp/README.md,提交 417deaf

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

3
  1. v0.2.3最新Oct 17, 2026
  2. v0.2.2Oct 12, 2026
  3. v0.2.1Sep 26, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分