nc://hermes-band

v0.1.0Pinned
ThomSharktools/nodecode-hermes-band: Composes and renders original music locally: a score or preset in, an exact-length wav and mp3 out. - a rewrite of RegeneratusLabs/hermes-band (MIT), credited to RegeneratusLabsfc3f18a· 9 Nov1 commit
test1 filecell.lisp12.0 KBcompose.lisp16.8 KBmidi.lisp4.6 KBrender.lisp17.0 KBscore.lisp13.8 KBtheory.lisp7.4 KB

nodecode-hermes-band

Hermes Band: compose and render original music on your own machine — an arrangement is data (tempo, key, chords, parts) rendered to an exact-length wav and mp3. A Nodecode rewrite of RegeneratusLabs/hermes-band by RegeneratusLabs.

Four tools, the plugin's own names and arguments: band_render, band_validate_score, band_list_presets, band_doctor. No music API, no model, no key, and no per-track cost: a score becomes MIDI, MIDI becomes stems through the fluidsynth you already have, the stems are mixed with per-part pan and level, a synthesised room is added, and ffmpeg masters the result to −14 LUFS and an mp3. The same score always renders the same audio.

Get it

Tell the agent "add the hermes-band cell", or run:

nodecode add nc://hermes-band

Set it up

You need three things on the machine, and band_doctor tells you which is missing:

apt install fluidsynth fluid-soundfont-gm ffmpeg     # Debian/Ubuntu
brew install fluid-synth ffmpeg                       # macOS, plus a GM .sf2

A General MIDI soundfont (.sf2) is what makes the instruments sound like instruments. band_doctor looks in the usual system locations; if yours lives elsewhere, set soundfont.

The section, as ~/.nodecode/config.jsonc carries it:

Setting Default What it does
output_dir hermes-band-out/ where renders go, one subfolder per track
soundfont (found) a General MIDI .sf2; empty searches the system locations
fluidsynth fluidsynth the binary, as it is on PATH
ffmpeg ffmpeg the binary, as it is on PATH
sample_rate 44100 the render's sample rate
lufs -14 the loudness target a render without its own uses

Use it

Ask for music, or write the arrangement yourself:

{"name": "bed", "bpm": 90, "key": "D", "mode": "major", "bars": 12,
 "progression": ["I", "V", "vi", "IV"],
 "parts": [{"inst": "steel", "role": "fingerpick", "pattern": "folk",
            "register": [55, 79], "voices": 4},
           {"inst": "fingerbass", "role": "bass_root5", "start_bar": 2,
            "register": [40, 52], "gain": 0.9},
           {"inst": "drums", "role": "drums", "start_bar": 4, "pattern": "folk_soft"}]}

That is a twelve-bar folk bed: 32.0 seconds at 90 BPM, exact, one stem per part, mastered to −14 LUFS.

Tool What it answers
band_doctor whether this host can render: fluidsynth, the soundfont, ffmpeg, the output folder
band_list_presets the four bundled arrangements and the five rooms
band_validate_score a one-line summary of a score, or every reason it cannot render
band_render the wav and mp3 paths, the duration, the peak, and the stems

Or pass a preset name instead of a score: bed (warm fingerpicked folk, room), band (melody, walking bass, kit, hall), pulse (minor electronic bed, close), funk (E dorian, close). /hermes-band lists them with their numbers, and (help :hermes-band) carries the whole vocabulary: roles, fingering patterns, drum patterns, rooms and roman-numeral chords.

What a render leaves on disk:

hermes-band-out/bed/
  bed.wav                 the mastered track
  bed.mp3                 192 kbps
  bed-00-steel.mid        the part, and the stem fluidsynth played
  bed-00-steel.wav
  ...

Nothing leaves the machine and nothing is billed: the score goes to fluidsynth and ffmpeg on this host, and the files stay in the output folder. Long renders run in the foreground of the tool call and take seconds to tens of seconds.

Tests

.github/test-cell.sh tools/nodecode-hermes-band

No program runs: the runner seam writes the wav a real fluidsynth would and an empty file where ffmpeg's output goes, and *FIND-PROGRAM* answers a path that exists. The suite proves the four tools answer, that a bad part is refused by name, that a render writes a wav, an mp3 and one MIDI file per part with the length it really has, and that a host without a soundfont is told which setting to fill.

Credits

A rewrite of RegeneratusLabs's Hermes Agent plugin, MIT, at commit c9dec797d9bf29fd5e09be538952c7db9bace8c8: see NOTICE for what was rewritten and what was left out, and LICENSE for the original licence.

Add nc://hermes-band

  1. 1

    Install Nodecode

    Once per machine.

    $ curl -fsSL https://nodecode.ai/install.sh | sh
  2. 2

    Add the cell

    Pinned at fc3f18a.

    $ nodecode add nc://hermes-band

    Or tell the agent add the hermes band cell.