Nodes/Music Production Toolkit/Save Production JSON
ComfyUI Node

Save Production JSON

One JSON file per song that could rebuild the whole thing

By jplenio·Created 26 days ago·Updated 6 days ago· 66
Save Production JSON
    • saved_path
    • configuration_json
    ◄configuration_prefix—►
    ◄audio_tags_json—►
    ◄title—►
    ◄original_audio_save_json—►
    ◄release_flac_save_json—►
    ◄release_mp3_save_json—►
    ◄artwork_path—►
    ◄collision_modeauto_increment►
    ◄filename_modealbum - title►
    ◄create_directoriestrue►
    ◄metadata_json—►
    ◄llm_system_prompt—►
    ◄llm_user_prompt—►
    ◄llm_output—►
    ◄llm_status—►
    ◄llm_thinking—►
    ◄structured_summary_json—►
    ◄caption—►
    ◄lyrics—►
    ◄image_prompt—►
    ◄source_name—►
    ◄source_path—►
    ◄prompt_origin—►
    ◄prompt_provenance_json—►
    ◄generation_seed—►
    ◄run_index—►
    ◄variant_count—►
    ◄max_duration—►
    ◄text_seed—►
    ◄text_cfg_scale—►
    ◄text_top_k—►
    ◄ksampler_seed—►
    ◄ksampler_steps—►
    ◄ksampler_cfg—►
    ◄denoise—►
    ◄flashsr_settings_json—►
    ◄pre_preset—►
    ◄pre_settings_json—►
    ◄post_preset—►
    ◄post_settings_json—►
    ◄hybrid_crossover_json—►
    ◄hf_repair_json—►
    ◄declip_json—►
    ◄release_prep_json—►
    ◄workflow_nameMusic Production Toolkit 3.1.3►
    ◄minimax_prompt_md—►
    ◄eq_report_json—►
    ◄auto_eq_analysis_json—►
    ◄mastering_json—►
    ◄resource_profile_json—►
    ◄llm_runtime_json—►
    ◄model_identity_json—►
    ◄template_version—►
    ◄artifact_reduction_json—►
    ◄cover_score_json—►
    ◄cover_lyrics_json—►

    Generating a song you like is one thing. Being able to recreate it six weeks later - same prompt, same seeds, same settings - is the thing that actually separates a demo from a production habit. MiniMaxSaveProductionJSON is the pack's answer: it writes one canonical, atomic JSON per song that records the entire generation, enough that the pack's metadata loader can rebuild the track (with modified settings) from that file alone.

    It's the last node in the chain for a reason, and it's an output node - everything funnels into it. After the original FLAC, the release FLAC, the release MP3 and the album cover have all been saved, this node gathers the evidence and writes the record. Note the deliberate ordering: it refuses to run until those upstream saves have happened, because a configuration file that claims artifacts exist when they don't is worse than no record at all.

    What goes in the JSON

    The whole story, in one place:

    • the LLM stage - system prompt, user prompt, raw output, status, even the thinking;
    • the structured-prompt summary and the parsed Caption / Lyrics / Title / Image_Prompt with provenance;
    • seeds and generation settings - MiniMax text seed/CFG/top-k, sampler seed/steps/CFG/denoise, duration;
    • every audio-enhancement report: declip, PRE/POST low-pass, FlashSR settings, hybrid crossover, HF repair, release prep;
    • standard audio tags, and the actual saved file paths for the original, both release formats, and the cover.

    That's the reproducibility story: together with the outputs section it's a complete generation record, not a sidecar of loose metadata.

    The inputs you'll actually touch

    The required list looks intimidating but most of it is pre-wired in the example workflow:

    • original_audio_save_json, release_flac_save_json, release_mp3_save_json - connect these to the save_info_json outputs of the three audio savers. These connections are what make the node wait for the files to exist.
    • artwork_path - the saved JPG path, same idea for the cover.
    • configuration_prefix - the destination base, fed from the MiniMax Output Paths node; its directory is controlled by that node's configuration_subdir (default json).
    • audio_tags_json and title - used for the consistent Album - Title filename and copied into the record.
    • collision_mode - auto_increment (recommended for batches), overwrite, or error_if_exists.
    • filename_mode - album - title is recommended so the JSON matches your release audio naming; it doesn't touch embedded title metadata.
    • create_directories - just leave it on.

    Everything else - the llm_*, caption/lyrics/image_prompt, the seed fields, and the long list of *_json enhancement reports - is optional and fed by the corresponding nodes in the chain. Wire what you have; the payload only includes what you connect.

    Outputs

    • saved_path - where the JSON landed.
    • configuration_json - the rendered JSON itself, if you want to pipe it somewhere.

    Where people get confused

    First: no JSON beside your FLAC files is not a bug. Since v1.0.4 the pack deliberately writes one centralized file per song into the json/ subdirectory instead of duplicate sidecars - look in MiniMax Output Paths → configuration_subdir. Second, if the JSON never appears, the odds are an upstream save failed; check the ComfyUI log for the first failed saver, because this node won't paper over it. And the file is written atomically (temp file, then rename), so an interrupted write leaves you with the old state rather than a half-written record.

    Installing

    cd ComfyUI/custom_nodes
    git clone https://github.com/jplenio/ComfyUI-MiniMax-Music-Production-Toolkit.git
    cd ComfyUI-MiniMax-Music-Production-Toolkit
    python -m pip install -r requirements.txt
    

    Restart ComfyUI and hard-refresh the browser. If you're ever tempted to skip this node for a quick test, that's fine - it's pure bookkeeping, and everything before it still works. But for anything you might want to revisit, the five minutes of wiring is worth it. Future-you, six weeks out, will thank present-you for the record.

    CategoryMusic Production Toolkit/save

    Inputs (56)

    NameTypeDefaultDescription
    configuration_prefixSTRINGDestination prefix from MiniMax Output Paths. Its directory is controlled by configuration_subdir (default log/); the node creates the final .json filename from Album/Title by default.
    audio_tags_jsonSTRINGStandard tags containing Title/Artist/Album/etc. They are copied into the canonical JSON and are also used for consistent Album - Title JSON naming.
    titleSTRINGGenerated song title. Used as a filename fallback and retained in the canonical configuration JSON; it does not alter audio metadata here.
    original_audio_save_jsonSTRINGSave-info JSON emitted by the original-audio saver. Connecting it makes this node wait until the original audio file has been written and records path, format, sample rate, peak and applied save gain.
    release_flac_save_jsonSTRINGSave-info JSON emitted by the release FLAC saver. Connecting it makes this node wait until the FLAC exists and records its output details.
    release_mp3_save_jsonSTRINGSave-info JSON emitted by the release MP3 saver. Connecting it makes this node wait until the MP3 exists and records its output details.
    artwork_pathSTRINGSaved JPG path. This dependency makes the configuration JSON run after artwork saving and records the cover path in the outputs section.
    collision_modeCOMBOauto_incrementHow to handle an existing JSON with the same Album - Title filename. auto_increment is recommended for batches; overwrite replaces it; error_if_exists stops the run.
    filename_modeCOMBOalbum - titleFilesystem naming for the JSON only. 'album - title' is recommended so the configuration file matches the release audio naming. Embedded audio TITLE metadata is unaffected.
    create_directoriesBOOLEANtrueCreate the configured JSON directory automatically when it does not yet exist. Recommended: ON.
    metadata_jsonoptSTRINGLEGACY base payload from the pre-2.0.0 song-metadata node. The direct inputs below overlay it; leave unconnected in the current example workflow.
    llm_system_promptoptSTRINGThe system prompt that was sent to the LLM; recorded in the canonical JSON so the exact prompt is reproducible.
    llm_user_promptoptSTRINGThe assembled user prompt that was sent to the LLM (structured brief + description).
    llm_outputoptSTRINGRaw assistant text the LLM returned, before parsing, recorded in the JSON.
    llm_statusoptSTRINGStatus line from the LLM chat node (model, session, character count) for diagnostics.
    llm_thinkingoptSTRINGReasoning the model produced next to its answer. Stored in the JSON only; it never reaches the music model.
    structured_summary_jsonoptSTRINGSummary of the structured prompt resolution (origin, resolved fields, overrides).
    captionoptSTRINGGenerated Caption that was sent to the music model, recorded in the production JSON.
    lyricsoptSTRINGGenerated Lyrics / structural section map sent to MiniMax Music 3.
    image_promptoptSTRINGArtwork prompt used by the FLUX.2 cover branch, recorded in the production JSON.
    source_nameoptSTRINGStable source name derived from the prompt selection or title.
    source_pathoptSTRINGWhere the prompt came from (prompt file path, <manual> or the LLM marker).
    prompt_originoptSTRINGOrigin marker: folder / manual / external_comfyui_llm / manual_override.
    prompt_provenance_jsonoptSTRINGParser provenance record (source mode, user prompt, budget/trim info, manual-field usage).
    generation_seedoptINTSeed of this song's generation, recorded in the production JSON.
    run_indexoptINT1-based variant index of this song within the batch, recorded in the JSON.
    variant_countoptINTTotal number of variants generated for this prompt, recorded in the JSON.
    max_durationoptFLOATMiniMax Music 3 maximum duration in seconds (300 = 5 minutes).
    text_seedoptINTSeed the text encoder ran with, recorded in the production JSON.
    text_cfg_scaleoptFLOATCFG scale of the text encoder, recorded in the production JSON.
    text_top_koptINTTop-k of the text encoder, recorded in the production JSON.
    ksampler_seedoptINTSeed the music sampler ran with, recorded so the take can be reproduced.
    ksampler_stepsoptINTSampler step count this song ran with, recorded in the production JSON.
    ksampler_cfgoptFLOATSampler CFG this song ran with, recorded in the production JSON.
    denoiseoptFLOATSampler denoise strength, recorded in the production JSON.
    flashsr_settings_jsonoptSTRINGFlashSR settings report (inference rate, chunk/overlap sizes, low-pass flag, output rate, device).
    pre_presetoptSTRINGName of the PRE low-pass preset that was used, recorded in the JSON.
    pre_settings_jsonoptSTRINGEffective PRE low-pass settings report, recorded in the production JSON.
    post_presetoptSTRINGName of the POST low-pass preset that was used, recorded in the JSON.
    post_settings_jsonoptSTRINGEffective POST low-pass settings report, recorded in the production JSON.
    hybrid_crossover_jsonoptSTRINGFlashSR Hybrid Crossover report (sample rates, crossover, HF mix, mode).
    hf_repair_jsonoptSTRINGHigh-frequency cymbal/shimmer repair report, recorded in the production JSON.
    declip_jsonoptSTRINGDe-clipping / overload repair report, recorded under the restoration section.
    release_prep_jsonoptSTRINGRelease Prep report (sample rate, measured/effective loudness, true peak, gain).
    workflow_nameoptSTRINGMusic Production Toolkit 3.1.3Name of the workflow that produced this run, recorded in the canonical JSON.
    minimax_prompt_mdoptSTRINGMarkdown prompt report, written next to the JSON so the exact prompt survives with the song.
    eq_report_jsonoptSTRINGPer-band EQ report from automatic and manual EQ, recorded in the EQ section of the production JSON.
    auto_eq_analysis_jsonoptSTRINGAuto-EQ analysis: detected tonal difference against the target and the proposed gain per band.
    mastering_jsonoptSTRINGMastering report: measured LUFS and true peak plus the applied gain reduction.
    resource_profile_jsonoptSTRINGDetected hardware profile and the model recommendation derived from it, recorded for reproducibility.
    llm_runtime_jsonoptSTRINGLLM runtime details (backend, model file, context size, GPU placement) as reported by the chat node.
    model_identity_jsonoptSTRINGIdentifiers of the loaded song and artwork models, so the JSON records which weights produced the audio.
    template_versionoptSTRINGVersion or fingerprint of the prompt template that produced the text, so a later prompt change can be told apart.
    artifact_reduction_jsonoptSTRINGArtifact-reduction report: what was detected and how much was removed.
    cover_score_jsonoptSTRINGCover-only: the score adaptation record (lyrics mode, lead instrument, whether and how the vocal line was rewritten, and the vocal note counts and phrase grids). Omitted for normal songs.
    cover_lyrics_jsonoptSTRINGCover-only: the Whisper transcription and timestamp record for new/original-lyrics covers (checkpoint, device, precision, detected language and confidence, segment count, transcript). Omitted when the mode does not use Whisper.

    Outputs (2)

    NameTypeDescription
    saved_pathSTRING—
    configuration_jsonSTRING—