Orpheus (Audio β Shots) πΆ
Orpheus cuts your music video to the actual music
- audio
- timing
- durations
- trims
- cues
- shot_count
- seconds
- report
- scope
- gen_extra_info
- lyrics
A music video edited to its own music is the difference between "a video that has a song under it" and something that feels cut by a human editor. Orpheus is the node that decides where the cuts fall: you feed it the finished track, it reads the tempo, the downbeat and the structural seams, and it hands you the durations string that Phantas and Morpheus already take - plus the per-shot trims that put every cut back exactly on the beat. It's the audio-to-shots brain of the Kinburg video stack.
How it finds the cuts
Everything is measured from the audio: tempo by autocorrelation, onsets from spectral flux, the downbeat from the phase carrying the most onset energy, and the structural seams (the drop, the moment the drums enter) from how unlike the next few seconds are to the last few. Every estimate comes back with a confidence, and the report prints it. That honesty matters - a ballad with no rhythm section has no beat grid to find, and saying so is the only honest answer.
cut_on (default 2 bars) is the musical unit a cut may land on - bar, beat, 2 bars, or phrase (4 bars). It's not just taste: it decides how much video gets generated and thrown away, because a shot is 3β7 bars at normal tempo and phrase may leave the planner only two possible shot lengths. pace (default 7) is a bias, not a length - it decides how many shots the track becomes, then the cut goes to the best available cue, which is never exactly that number. On a 7.5 s phrase grid, 7 and 9 give the same plan, so move it in whole seconds and watch shot_count, not the decimals. sensitivity is how far above its own neighborhood a moment must stand to be a candidate: low leaves the planner spoilt for choice (cuts land near pace), high stretches shots toward the few big moments.
bpm of 0 means "measure it" - which you should do only for a song you didn't generate. For your own Siren output, type the tempo you know; the downbeat is still measured either way, because knowing the tempo doesn't tell you where bar 1 starts.
The input that changes everything
The optional plan input - Siren Cast's or Siren Score's label | voice | length table. Wired, the section boundaries come from the table rather than the signal: exact, named, impossible to miss, and detection only fills in the accents inside each section. For a song you wrote, this is the right way round, and no detector beats it. start_sec/end_sec cut a window out of the track for a teaser or to skip a long intro - but the whole track is still analyzed, because tempo and downbeat are measured far more reliably over three minutes than over twenty seconds.
Outputs and the half-second check
durations and trims go straight into Morpheus (or Phantas's board). trims exists because H3's shot lengths move in a 0.708 s quantum and bar lines don't: to land a cut on a downbeat you generate the first legal length longer than the music needs and drop the overshoot here. cues is deliberately not beats - don't wire it into Morpheus Storyboard as a director's note; read it through a Show Text and merge the lines that earn it yourself.
The scope output is the check that costs half a second instead of a render: the spectrogram with the plan drawn on it, amber where a cut landed on a real moment, dim red where the planner had nothing to cut on. If the amber lines don't sit on the transients, nothing downstream is worth rendering. A row of red ones is a sensitivity or cut_on problem, invisible otherwise until the video looks wrong.
Installing it
It's part of Kinburg/Kinburg-Nodes - ComfyUI Manager search "Kinburg-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/Kinburg/Kinburg-Nodes then restart. No extra dependencies for this node; it analyzes AUDIO in place, no model download. The models you need are upstream (ACE-Step for the song) or downstream (H3 for the video), not here.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| audio | AUDIO | The finished track β straight out of Siren, or a LoadAudio for something off disk. It is analysed whole even when 'start_sec'/'end_sec' narrow the part you are cutting, because tempo and downbeat are measured far more reliably over the whole song than over a 20-second window. | |
| cut_on | COMBO | 2 bars | The musical unit a cut may land on. Same vocabulary as Siren Section's 'snap'. This is not only taste β it decides how much video gets generated and thrown away, and by how much depends on the tempo. A shot is 3-7 bars at a normal tempo, so 'bar' gives the planner more lines than it can use while 'phrase (4 bars)' may give it only two possible shot lengths. The report prints the full cost table for YOUR tempo; read it once per song. |
| pace | FLOAT | 7.005.166666666666667β15.08333333333333 | The shot length to aim for, in seconds β a BIAS, not a length. It decides how many shots the rest of the track should become; the cut itself then goes to the best cue available, which is never exactly this number. So on a 7.5 s phrase grid, 7 and 9 give the SAME plan β there is nothing between the candidates to choose. Move it in whole seconds and watch the shot count, not the decimals. |
| sensitivity | FLOAT | 0.500β1 | How far above its own neighbourhood a moment must stand to become a candidate cut. Low = every drum hit is a candidate (the planner has plenty of choice and cuts nearer 'pace'); high = only the big moments, so shots stretch to reach one. Ignored for section boundaries when a 'plan' is wired β those are read, not detected. |
| bpm | FLOAT | 0.000β300 | 0 = measure it from the audio. Anything else is used verbatim. Type it for a song you generated: you know the tempo exactly, and a measured one carries a confidence that can be low on a ballad or anything without drums. The downbeat is measured either way β knowing the tempo does not tell you where bar 1 starts. |
| beats_per_bar | INT | 41β16 | The time signature's top number. Only used to turn beats into bars, which is what 'cut_on' measures in. |
| planopt | STRING | Siren Cast's or Siren Score's plan β 'label | voice | length' rows. Wired, the section boundaries come from the TABLE rather than from the signal: exact, named, and impossible to miss. Detection then only adds the accents inside each section. This is the right way round for a song you wrote, and no detector can beat it. | |
| start_secopt | FLOAT | 0.00β3600 | Begin the video here instead of at the top of the track β to skip a long intro, or to cut a teaser out of the middle. The whole track is still analysed. |
| end_secopt | FLOAT | 0.00β3600 | Stop here. 0 = run to the end of the track. |
| cue_pullopt | FLOAT | 2.00β10 | How many seconds of deviation from the ideal length a cue's importance is worth. Between two candidates it is their strength DIFFERENCE that pays, so at the default 2.0 a section boundary outranks a weak onset up to ~1.8 s further away and loses beyond that. Raise it to follow the music harder at the cost of uneven shots; drop it to 0 to ignore importance entirely and simply cut on the nearest line. |
| scopeopt | BOOLEAN | true | Render the spectrogram with the cuts drawn on it. Amber = the cut landed on a cue, dim red = the planner had nothing to cut on there. This is how you check a plan in half a second instead of a render. |
| scope_widthopt | INT | 1280256β4096 | Width of that picture in pixels. The whole track always spans it, so a longer song simply gets less detail per second. |
| verboseopt | BOOLEAN | true | Print the report to the console. The same text is always on the 'report' output. |
| timingopt | KINBURG_ECHO_TIMING | Echo's 'timing' β where each word was ACTUALLY sung. Wired, the section boundaries come from the performance instead of from the table. That matters more than it sounds: a plan says where a section was ASKED to be, and on a real take those two have been measured up to 18 s apart. Cutting on the plan then puts the picture change in the middle of a verse. It also fills the 'lyrics' output β what is sung over each shot, by number, for a storyboard planner to read. When both this and 'plan' are wired, this one wins and the plan is used only for the labels it carries. |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| durations | STRING | β |
| trims | STRING | β |
| cues | STRING | β |
| shot_count | INT | β |
| seconds | FLOAT | β |
| report | STRING | β |
| scope | IMAGE | β |
| gen_extra_info | GEN_INFO | β |
| lyrics | STRING | β |