English | 简体中文
From a score (or a prompt asking an LLM to write one) to a finished, reverb-polished audio track — all on one canvas, no external software. This page walks through the four stages — composition → performance → synthesis → mixing — explaining the musical concepts and every parameter on the way.
The chain at a glance (ComfyTV / Music + ComfyTV / Audio):
Score ──▶ Score Performer ──▶ Score Synth ──▶ Muse Reverb ──▶ finished audio
Three words, each owning one part of the chain:
| Stage | What it means in music | Handled by |
|---|---|---|
| Composition | The notes themselves: melody, harmony, rhythm | the MusicXML score + Score |
| Arrangement / performance | How they're played: instruments, articulation, dynamics, swing | Score Performer, instrument choice |
| Mixing | How it sounds: balance, space, frequency shaping | Muse Reverb and the other Audio nodes |
MusicXML is the universal interchange format for sheet music — MuseScore, Finale, and Sibelius all export it. It describes "which notes in which measure, what duration, what articulation" as text. A minimal usable score:
<?xml version="1.0"?>
<score-partwise version="4.0">
<part-list>
<score-part id="P1"><part-name>Piano</part-name></score-part>
</part-list>
<part id="P1">
<measure number="1">
<attributes>
<divisions>2</divisions>
<time><beats>4</beats><beat-type>4</beat-type></time>
</attributes>
<direction><sound tempo="100"/></direction>
<note><pitch><step>C</step><octave>4</octave></pitch>
<duration>2</duration><type>quarter</type></note>
<note><pitch><step>E</step><octave>4</octave></pitch>
<duration>2</duration><type>quarter</type></note>
<note><pitch><step>G</step><octave>4</octave></pitch>
<duration>2</duration><type>quarter</type></note>
<note><pitch><step>C</step><octave>5</octave></pitch>
<duration>2</duration><type>quarter</type></note>
</measure>
</part>
</score-partwise>Three fields are enough to read it:
divisions— how many ticks one quarter note is split into; everydurationis counted in those ticks (above,divisions=2, soduration=2is a quarter note);step+octave(+ optionalalter) — note name + octave + accidental (alter=1sharp,-1flat);measure— a bar; multiple staves (left/right hand) are multiple<part>elements.
The Score node is forgiving: paste the LLM's entire answer as-is — it extracts the <score-partwise>…</score-partwise> block out of the surrounding prose automatically. Prompt template:
Write an 8-bar C-major piano solo in MusicXML (score-partwise 4.0), 4/4 time, tempo 100, right-hand melody plus left-hand block chords, two parts. Only correctness of the notes matters; no layout information needed.
Two voices, a specific chord progression, dynamics (<dynamics>), hairpins (<wedge>), staccato (<articulations>) — just ask for them in the prompt. The parser reads those markings, and the performance stage actually plays them.
The Score Editor node is a piano roll on the canvas — no XML required:
- Three input styles: draw (press and drag out a note), select (marquee, move, resize both edges), and step input (MuseScore-style: A–G enters pitches, 7–2 picks durations,
.dots, 0/space rests, the cursor advances automatically — typing a melody is an order of magnitude faster than clicking) - Up to 4 parts, each with its own instrument (a GM program written into the score — Score Synth picks it up automatically) or flagged as a drum part (the sidebar switches to GM drum names; paint Kick/Snare/HH directly)
- Velocity lane: paint per-note loudness under the grid, DAW-style — it carries through to the final performance
- Playback: ▶ auditions the draft right in the editor (per-part waveforms, synthesized drums); the real timbres come from the proper chain once you Run
- Outputs standard MusicXML — wire to Score for engraving or Score Performer → Score Synth for the finished audio; an upstream score (LLM-written or downloaded) can also be imported into the roll for editing
| Site | Content | Notes |
|---|---|---|
| MuseScore.com | Community-uploaded scores | Best quality; some need a login |
| abcnotation.com | Folk/classical, machine-converted from ABC | Direct downloads, no login; converted files can be sloppy — the parser follows MuseScore/OSMD semantics and tolerates them |
| IMSLP | Public-domain classical library | Mostly PDF, some XML |
| Mutopia | Public-domain classical | LilyPond sources, some XML |
Note: download the uncompressed .musicxml / .xml variant; .mxl is a zip archive — extract the XML from it first.
Paste MusicXML into the node (or wire an upstream LLM text node into text). It does three things:
- Validates and cleans — parse failures raise a clear error instead of letting a broken score flow downstream;
- Engraves the score — the node card renders the full multi-stave score (percussion staff included), zoomable, with an editable XML panel that re-engraves live;
- Outputs the cleaned score text for the rest of the chain.
There are no performance parameters — the score is the "facts"; everything after this changes how it's played, never what's written.
A score says which notes; MIDI events say when and how loudly they're struck. Playing the score back mechanically is what people call "robotic MIDI"; a human performance differs in articulation (actual note lengths), dynamic curves (how crescendos travel), and tiny timing deviations. This node ports MuseScore's performance rules and applies every staccato / tenuto / accent / dynamic / hairpin / trill / grace-note marking in the score.
| Parameter | Range (default) | What it is musically | What turning it does |
|---|---|---|---|
swing_ratio |
50–75 (50) | Swing: how far off-beats are pushed late | 50 = straight (classical/pop); 62–66 ≈ jazz triplet feel; 75 = extreme bounce. Only affects off-beats — a score of nothing but quarter notes won't change at all |
swing_unit |
eighth / sixteenth | Which subdivision swings | Standard jazz swing = eighth; funk / hip-hop sixteenth swing = sixteenth |
humanize |
0–1 (0) | Humanization: micro jitter in timing and velocity | 0.2–0.35 sounds natural; above 0.6 sounds drunk. Deterministic — same seed, same take |
easing |
5 curves (normal) | The shape of hairpin dynamics | normal linear; ease_in saves the push for the end; ease_out surges immediately; ease_in_out gentle both ends; exponential most dramatic. Formulas match MuseScore |
profile |
5 profiles (keyboard) | Instrument performance model | keyboard / strings / winds / voice / percussion. The same staccato mark produces different actual lengths and accent envelopes on piano vs. violin — constants extracted from MuseScore's performance profiles. Percussion parts force the percussion profile automatically |
seed |
0–99999 (7) | Random seed for humanize | Change it for a different take, keep the one that feels best |
Two outputs: performance (performance JSON — tempo map + event stream, wire to Score Synth) and midi_url (a standard .mid file you can download straight into any DAW).
💡 Changing Performer parameters does not change the engraved score downstream — the engraving shows the score, not the performance. To hear the difference, re-Run the Score Synth.
Performance events need a sound. That's a SoundFont (.sf2 / .sf3) — a sampled instrument library organized by the General MIDI standard's 128 programs. The free FluidR3_GM covers all of GM; import the file via the sidebar under Resources → soundfont.
| Parameter | Range (default) | What it does |
|---|---|---|
soundfont |
library file name (empty) | Which sound library. Empty = built-in basic synthesizer — the chain always makes sound, but plainly; install a SoundFont for real output |
program |
37 common GM names (piano) | Main instrument for every channel not overridden below |
channel_programs |
row editor | Per-track instruments: each row picks a channel + an instrument. Each MusicXML <part> maps to channel 0, 1, 2… in order (drums follow the GM channel-10 convention). E.g. ch 0 = piano, ch 1 = acoustic_bass |
gain |
0.1–2 (1) | Master volume |
The card engraves the full score and, during playback, the cursor follows the music note by note — including repeats and first/second endings. The output is standard audio: chain any Audio node after it, or feed it into a Video Stage's audio input to drive audio-to-video generation.
Dry synthesized audio sits "right in your face"; reverb puts it in a room. Physically there are three layers: direct sound (dry) → early reflections (the first bounces off the walls — your instinct for "how big is this room") → late reverb (the dense tail — "how wet"). This node is the same FDN (feedback delay network) algorithm as MuseScore's reverb.
| Parameter | Range (default) | What it does | Practical guide |
|---|---|---|---|
reverb_time_ms |
100–10000 (2200) | RT60: time for the sound to decay 60 dB | Small room 400–800; concert hall 1500–2500; cathedral 4000+ |
room_scale |
0.5–4 (0.8) | Room size (scales internal delay lines) | Bigger = farther, emptier |
predelay_ms |
0–500 (10) | Gap between dry sound and first reflection | 30–80 keeps the soloist "up front" while preserving space |
dry_db |
-60–6 (0) | Direct level | Usually 0; pull down only for full-wet effects |
er_db |
-60–6 (-14) | Early-reflection level | Raise for a more defined room |
late_db |
-60–6 (-14) | Late-reverb level | The main wetness knob — up = wetter |
time_low |
50–200% (100) | Low-frequency decay multiplier | >100 longer low tail (warmer, but can get muddy); <100 tighter lows |
time_high |
50–200% (60) | High-frequency decay multiplier | Usually <100 — highs die first in real rooms |
xover_low_mid |
50–500 (400) | Low/mid crossover (Hz) | Works with the two above |
xover_mid_high |
1000–10000 (4000) | Mid/high crossover (Hz) | Same |
feedback_top |
500–20000 (8000) | High-frequency damping cutoff inside the feedback loop | Lower = darker, more vintage |
mod_freq / mod_amp |
0–10 / 0–1 (1 / 0.2) | Delay-line modulation | A touch (amp ≈ 0.2) removes metallic ringing; more gives chorus-like shimmer |
stereo_spread |
0–150 (100) | Stereo width | 0 = mono reverb |
quality |
8 / 16 (16) | Number of FDN delay lines | 16 denser and smoother; 8 cheaper |
Three starting points:
| Scene | reverb_time_ms | room_scale | predelay_ms | late_db |
|---|---|---|---|---|
| Room (pop backing) | 700 | 0.7 | 10 | -18 |
| Concert hall (solo piano) | 2200 | 1.2 | 20 | -14 |
| Cathedral (choir/ambient) | 4500 | 2.5 | 40 | -10 |
The synth output is a standard audio track; the whole ComfyTV / Audio toolbox chains after it:
| Node | One-line purpose |
|---|---|
| Audio EQ | Frequency balance |
| Audio Dynamics | Compression/limiting — smooth out level swings |
| Audio Loudness | Loudness normalization (streaming standard -14 LUFS) |
| Audio Time / Pitch | Time-stretch / pitch-shift (pitch_hq uses the high-quality phase vocoder) |
| Audio Echo | Echo/delay |
| Audio Modulation | Chorus, flanger, phaser, tremolo |
| Audio Stereo | Widening, Haas effect, panning |
| Audio Saturate | Saturation/distortion/bit-crush |
| Audio Convolve (IR) | Convolution reverb — impulse responses of real spaces |
| Muse Reverb (FDN) | Algorithmic reverb (Stop 5 above) |
| Audio Stem Split | Split a full song into vocals/drums/bass/other |
| Noise Reduction (Spectral) | Spectral-gating denoise |
| Audio Beats & Notes | Beat/note analysis, outputs beat/note labels |
| Audio Mix / Crossfade / Duck | Multi-track mixing / crossfades / ducking (background yields to voice) |
- Download a public-domain MusicXML (e.g. Für Elise on abcnotation) and paste it into Score;
- Score Performer:
profile = keyboard,humanize = 0.25, rest default; - Score Synth: pick FluidR3 as the soundfont,
program = piano, hit Run, watch the cursor follow the score during playback; - Muse Reverb: use the "concert hall" preset above. Done.
- Use the Stop-1 prompt template, asking explicitly for two parts: "D minor, swung, 8 bars; Part 1 is the right-hand melody, Part 2 is left-hand accompaniment chords (one or two per bar)". Paste into Score;
- Score Performer:
swing_ratio = 63,profile = keyboard,humanize = 0.3; - Score Synth: give the two parts different instruments in channel_programs — ch 0 = piano (melody), ch 1 = e_piano or jazz_guitar (comping);
- Muse Reverb ("room" preset) → done.