Nodes/SunoComfyUI/Suno Get Midi (Ace Data Cloud)
ComfyUI Node

Suno Get Midi (Ace Data Cloud)

Turning a generated song back into something you can edit

By AceDataCloud·Created 3 days ago·Updated 2 days ago· 0
Suno Get Midi (Ace Data Cloud)
    • status
    • task_id
    • media_urls_json
    • first_media_url
    • result_json
    • trace_id
    ◄parameters_json{}►
    ◄audio_id►
    ◄callback_url►

    Generated music has a dirty secret: it's audio, and audio is where editability goes to die. You can't tempo-map a stereo bounce, you can't change a chord, you can't hand a melody to a synth. MIDI is the escape hatch. Suno Get Midi (Ace Data Cloud) asks the service for a MIDI rendition of a track you already generated, which you can then open in a DAW, re-orchestrate, or drive into a video pipeline where you need note-level control.

    It's one of the pack's five conversion nodes - Get Mp3, Get Wav, Get Midi, Get Mp4, Get Timing - and they're all the same idea: take an existing track, produce a different representation of it. Get Midi is the one musicians actually care about.

    Inputs

    Three named fields plus parameters_json:

    • audio_id - required by the contract. The ID of an existing track, not a URL and not a task ID. You get these out of the result_json output of a generation call.
    • callback_url - optional webhook. Skip it; the pack's retrieve node is the polling story, and a callback you're not listening on is just a silent failure mode waiting to happen.
    • parameters_json - default {}. The endpoint also accepts an async flag, and the client sets it to true on its own for this call, which is why you get a job back instead of a file. If you'd rather not, the JSON is where that lives - but you almost certainly do want async here, since transcoding takes time.

    Standard pack behaviour on top: non-empty named fields win over the JSON, empty ones are dropped, and the payload is validated against the published API contract before it's sent. Because the contract is strict about extra properties, filling a field this call doesn't accept gets you a local validation error rather than an API complaint.

    Outputs

    The six tool-node strings: status, task_id, media_urls_json, first_media_url, result_json, trace_id.

    The MIDI file is a download, so the path is: task_id into a retrieve node, then take the resulting media URL and fetch it. Don't try to wire first_media_url straight into Suno Load Audio - that loader accepts only Ace CDN links and decodes them as audio, and a .mid file is neither going to pass a host check you didn't earn nor decode into a waveform. Download it or point a file-saving node at it.

    If the response comes back with a job rather than a link, result_json holds the task detail and the retrieve node is your next step.

    Why bother

    The interesting use case isn't remixing - it's composition control. A generated song gives you a melody and a chord progression you didn't write, and MIDI is how you keep it while replacing everything else: a different instrument, a different tempo, a bass line that actually resolves. For video work, note timing is also the honest way to sync cuts to a track without hand-marking every beat, which is what Get Timing is for in its own right.

    Keep expectations calibrated, though. Converting rendered audio to MIDI is a transcription guess, not a recovery of the original arrangement - dense mixes with a lot of reverb transcribe worse than a clean arpeggio. Take it as a sketch you'll fix by hand.

    Install

    Ships in SunoComfyUI. Manager → Custom Nodes → search Suno → publisher acedatacloud, package Suno by Ace Data Cloud (Registry ID ace-suno) → install → restart. Source route:

    cd /path/to/ComfyUI/custom_nodes
    git clone https://github.com/AceDataCloud/SunoComfyUI.git
    cd SunoComfyUI
    python -m pip install -r requirements.txt
    

    requests and jsonschema; nothing else, no GPU work. The path is /suno/midi, worth allowlisting if your Ace application restricts endpoints. Key in the ComfyUI process environment - Desktop runs its own process and won't inherit your shell:

    export ACEDATACLOUD_API_KEY='paste-your-key-here'
    python main.py
    

    When it goes wrong

    Invalid audio_id: does not meet the API's ... constraint. Usually an empty field, sometimes a task ID where an audio ID belongs. They look similar and are not the same thing; the audio ID lives in the generation response.

    Still pending, minutes later. Transcoding jobs queue. Re-query, don't resubmit: read-only queries are free and retried, submissions are neither.

    Set confirm to true... won't appear here - that's the destructive-persona node. Listed only because people hunt for it after seeing the error elsewhere.

    HTTP 401/403 or 429. Access or rate limit. Both are console problems. 429 in particular means wait - and if a job was already accepted, keep the same task ID rather than starting a second one.

    CategoryAce Data Cloud/Suno

    Inputs (3)

    NameTypeDefaultDescription
    parameters_jsonSTRING{}—
    audio_idSTRING—
    callback_urlSTRING—

    Outputs (6)

    NameTypeDescription
    statusSTRING—
    task_idSTRING—
    media_urls_jsonSTRING—
    first_media_urlSTRING—
    result_jsonSTRING—
    trace_idSTRING—