Nodes/ComfyTV/Score Performer
ComfyUI Node

Score Performer

Making Robot Music Sound Played by a Person

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Score Performer
  • score
  • performance
  • midi_url
force_run_token0
project_id
parent_output_id0
swing_ratio50
swing_uniteighth
humanize0.00
easingnormal
profilekeyboard
seed7

A score is a recipe, not a meal. Played back literally, the notes come out quantized and lifeless - the MIDI-perfect piano sound that makes synth music obviously synthetic. Score Performer (ComfyTV.ScoreToMidiStage) is the node that fixes that by deciding how the notes get played: it takes a score and returns a performance - the same notes, humanized, swung, and phrased - plus a downloadable MIDI file.

Under ComfyTV/Music, it's the second stop in the composition → performance → synthesis chain (Score → Score Performer → Score Synth). Feed it the score output from Score or Score Editor and it gives back two outputs: performance (COMFYTV_TEXT - the performance data the synth stage consumes) and midi_url (COMFYTV_TEXT - a link to the rendered Standard MIDI File you can download and drop into a real DAW).

The knobs that make it sound human

These are the parameters worth understanding, because "humanize" is usually a marketing word and here it's a set of real levers:

  • swing_ratio (50–75, default 50) - how much swing, with swing_unit choosing whether it applies to eighth or sixteenth notes. 50 is straight; 65+ is where it starts to groove.
  • humanize (0–1, default 0) - timing/velocity variation. This is the "played by a person" knob; even 0.05-0.1 of slop removes the machine-gun feel.
  • easing - normal, ease_in, ease_out, ease_in_out, exponential. Note-level phrasing, i.e. how each note attacks and decays toward its neighbors.
  • profile - keyboard, strings, winds, voice, percussion. Instrument-appropriate behavior; a strings profile should not phrase like a percussion one.
  • seed - reproducible variation. Same seed, same performance, which is huge when you're iterating on a score and don't want the humanization to jump around every Run.

The internal force_run_token/project_id/parent_output_id fields are ComfyTV project plumbing - ignore them.

The honest caveat

The heavy "make it sound real" lifting happens downstream in Score Synth (a real SoundFont with actual instrument samples). Performer gives you humanized note timing and phrasing; it won't rescue a bad arrangement. Start conservative - humanize 0.1, no swing - then push the sliders until it stops sounding like a player piano.

Install

Ships with ComfyTV:

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Restart ComfyUI; look under ComfyTV → Music. ComfyUI Manager: search "ComfyTV". Desktop/macOS users should clone into the running instance's absolute custom_nodes path (from the startup log), watch for a nested ComfyTV/ComfyTV/ folder, and fully restart the backend. No models, no extra dependencies.

Troubleshooting

  • "Score Performer needs a score - wire the Score stage." You ran it with no score wired. Connect Score or Score Editor first.
  • MIDI download is empty or missing. The midi_url output only appears once the performance renders; if you changed seed and got the same file, you haven't Run since - re-run the stage.
CategoryComfyTV/Music

Inputs (10)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
swing_ratioFLOAT5050–75
swing_unitCOMBOeighth2 options: eighth, sixteenth
humanizeFLOAT0.000–1
easingCOMBOnormal5 options: normal, ease_in, ease_out, ease_in_out, exponential
profileCOMBOkeyboard5 options: keyboard, strings, winds, voice, percussion
seedINT70–99999
scoreoptCOMFYTV_TEXT

Outputs (2)

NameTypeDescription
performanceCOMFYTV_TEXT
midi_urlCOMFYTV_TEXT