Nodes/ComfyTV/Chord Accompaniment
ComfyUI Node

Chord Accompaniment

Type a chord chart, get a played-out backing part

By jtydhr88·Created 3 months ago·Updated about 17 hours ago· 725
Chord Accompaniment
  • progression_text
  • performance
  • midi_url
force_run_token0
project_id
parent_output_id0
progressionAm7 | Dm7 | G7 | Cmaj7
bpm100.0
beats_per_bar4
patternblock
voicingclose
octave_shift0
velocity88
repeats1

Writing a comping part note-by-note is the kind of drudgery that makes people abandon music in node graphs. Chord Accompaniment exists so you don't have to. You type a chord progression - Am7 | Dm7 | G7 | Cmaj7 - and it realizes each chord into real notes, applies a voicing, and lays it out with a rhythmic pattern. You get a played-out backing part plus a MIDI file, without touching a piano roll. This is the "composition → performance → synthesis → mixing on one canvas" story the ComfyTV README sells, and this is one of its more practical nodes.

The two outputs tell you how it fits into the music lane: a performance payload feeds Score Synth to actually hear it, and a midi_url gives you the exported Standard MIDI File for anything that wants one.

How it works

It's a real backend stage - hit ▶ Run and the pack's chord_accompaniment runner realizes the progression, voices it, applies the pattern, then write_smf exports a .mid. Chord symbols are space-separated; | marks bar lines. You can type the progression in the progression field, or wire a progression_text input (COMFYTV_TEXT) from upstream - and if it's wired, it takes priority over the field. Run with no progression at all and it fails with a "needs a progression" message, which is a better error than most music nodes give you.

The inputs that matter

  • progression - the chord chart, default Am7 | Dm7 | G7 | Cmaj7. | defines bars.
  • bpm (20–300, default 100) and beats_per_bar (1–12, default 4) - tempo and meter.
  • pattern - the rhythmic feel, default block (all chord tones together); arpeggiated styles are in the pattern set.
  • voicing - how the chord tones are spaced, default close; wider spread voicings are available.
  • octave_shift (−2 to +2), velocity (20–127, default 88), repeats (1–16, default 1) - shift range, loudness, and how many times the whole progression loops.

Outputs: performance (COMFYTV_TEXT, the JSON Score Synth consumes) and midi_url (COMFYTV_TEXT).

Installing it

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

Restart the ComfyUI backend (a real restart, not a tab refresh); nodes appear under the ComfyTV category. ComfyUI Manager finds the pack by searching "ComfyTV". The README's two recurring gotchas: on Desktop/macOS/multi-install setups the relative cd can clone into the wrong instance - read the startup log for the base path it loaded and clone into that absolute path, quoted - and the first level of custom_nodes/ComfyTV/ must contain __init__.py (fix a nested ComfyTV/ComfyTV/… by moving the inner folder up). No Python dependencies to install; MIDI and the SoundFont synth ride on the pack's own runners.

Troubleshooting and tips

  • "needs a progression" error. Both the field and the wired input are empty. Provide one.
  • Hearing nothing. The performance output is data, not audio - you have to feed it to Score Synth (or bridge the MIDI out) to hear it.
  • Changes the feel without retyping: flip pattern between block and arpeggiated, or switch voicing from close to spread. repeats turns a short progression into a longer bed for practice or scoring.
  • Bridge note: both outputs are COMFYTV_TEXT; to get the MIDI path into a native node, you'll use a text bridge.
CategoryComfyTV/Music

Inputs (12)

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.
progressionSTRINGAm7 | Dm7 | G7 | Cmaj7
bpmFLOAT100.020–300
beats_per_barINT41–12
patternCOMBOblock5 options: block, pad, broken, alberti, strum
voicingCOMBOclose5 options: close, drop_2, three_note, four_note, root_only
octave_shiftINT0-2–2
velocityINT8820–127
repeatsINT11–16
progression_textoptCOMFYTV_TEXT

Outputs (2)

NameTypeDescription
performanceCOMFYTV_TEXT
midi_urlCOMFYTV_TEXT