Skip to content

Instantly share code, notes, and snippets.

@paulbooth
Last active July 23, 2026 16:07
Show Gist options
  • Select an option

  • Save paulbooth/bc1175fb4860984f3ba7845a618dcde7 to your computer and use it in GitHub Desktop.

Select an option

Save paulbooth/bc1175fb4860984f3ba7845a618dcde7 to your computer and use it in GitHub Desktop.
Warlords soundtrack — pick the take (for Hari)
<title>Warlords — Pick the Take (for Hari)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root{
--ink:#f7f0e2; --muted:#c8b7a0; --faint:#93856f; --line:rgba(255,244,220,.14);
--amber:#f0b24a; --amber-dim:rgba(240,178,74,.18);
--teal:#63c6da; --teal-dim:rgba(99,198,218,.18);
--serif:"Iowan Old Style",Georgia,"Palatino Linotype","Book Antiqua",serif;
--sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
--mono:ui-monospace,"SF Mono","Cascadia Code",Consolas,monospace;
--card:rgba(24,20,26,.74);
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{ margin:0; color:var(--ink); font-family:var(--sans); line-height:1.5;
background:#120e16; padding-bottom:76px; position:relative; }
#bg{position:fixed; inset:0; width:100vw; height:100vh; z-index:-3; transform:scale(1.15);
filter:blur(30px) saturate(1.6) brightness(1.02); image-rendering:auto}
#scrim{position:fixed; inset:0; z-index:-2; pointer-events:none;
background:radial-gradient(120% 90% at 50% 0%, rgba(10,8,14,.28), rgba(8,6,12,.6) 75%)}
@media(prefers-reduced-motion:reduce){ #bg{filter:blur(34px) saturate(1.3)} }
.wrap{max-width:880px; margin:0 auto; padding:44px 20px 40px; position:relative; z-index:1}
header{border-bottom:1px solid var(--line); padding-bottom:26px}
.eyebrow{font-family:var(--mono); font-size:12px; letter-spacing:.22em; text-transform:uppercase;
color:var(--amber); margin:0 0 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
h1{font-family:var(--serif); font-weight:600; font-size:clamp(32px,6.4vw,50px); line-height:1.04;
margin:0 0 14px; text-wrap:balance; letter-spacing:-.01em; text-shadow:0 2px 16px rgba(0,0,0,.65)}
h1 .wave{display:inline-block; transform-origin:70% 70%; animation:wave 2.4s ease-in-out 1s 2}
@keyframes wave{0%,60%,100%{transform:rotate(0)}70%{transform:rotate(16deg)}80%{transform:rotate(-8deg)}90%{transform:rotate(12deg)}}
@media(prefers-reduced-motion:reduce){h1 .wave{animation:none}}
.lede{color:var(--muted); font-size:16.5px; max-width:62ch; margin:0; text-shadow:0 1px 10px rgba(0,0,0,.6)}
.lede b{color:#fff; font-weight:600}
.sig{color:var(--faint); font-style:italic; font-family:var(--serif); margin:12px 0 0; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend{display:flex; gap:18px; flex-wrap:wrap; margin-top:20px; font-family:var(--mono);
font-size:12px; color:var(--muted); letter-spacing:.03em; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend span{display:inline-flex; align-items:center; gap:7px}
.dot{width:10px; height:10px; border-radius:50%}
.dot.a{background:var(--amber)} .dot.b{background:var(--teal)}
.banner{display:none; margin:20px 0 0; padding:13px 16px; border-radius:11px;
background:rgba(20,60,70,.6); border:1px solid rgba(99,198,218,.45); color:var(--ink); font-size:14.5px}
body.blocked .banner{display:block}
.banner b{color:var(--teal)}
.group-label{font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase;
color:var(--muted); margin:34px 2px 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.song{background:var(--card); backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
border:1px solid var(--line); border-radius:14px; padding:20px 22px 18px; margin:14px 0; transition:border-color .2s}
.song.done{border-color:rgba(240,178,74,.5)}
.song-head{display:flex; gap:16px; align-items:baseline}
.num{font-family:var(--mono); font-size:13px; color:var(--faint); font-variant-numeric:tabular-nums; padding-top:5px; min-width:26px}
.titles{flex:1; min-width:0}
.title{font-family:var(--serif); font-size:23px; font-weight:600; line-height:1.15; margin:0}
.for{color:var(--muted); font-size:14px; margin:3px 0 0}
.for b{color:var(--ink); font-weight:600}
.chip{display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:.04em;
color:var(--amber); border:1px solid var(--amber-dim); background:var(--amber-dim);
padding:2px 9px; border-radius:100px; margin-top:9px; text-transform:lowercase}
.chip.rev{color:var(--teal); border-color:var(--teal-dim); background:var(--teal-dim); text-transform:none; margin-left:6px}
.hook{color:var(--faint); font-style:italic; font-family:var(--serif); font-size:15px; margin:11px 0 0; padding-left:42px}
.takes{display:flex; flex-direction:column; gap:9px; margin:16px 0 0 42px}
.take{display:flex; align-items:center; gap:11px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:10px; padding:9px 13px}
.take .lab{font-family:var(--mono); font-size:11px; letter-spacing:.12em; width:26px; flex:0 0 auto}
.take.a .lab{color:var(--amber)} .take.b .lab{color:var(--teal)}
.pl{flex:1; min-width:150px; display:flex; align-items:center; gap:10px}
.pp{flex:0 0 auto; width:36px; height:36px; border-radius:50%; border:0; cursor:pointer; padding:0;
font-size:13px; line-height:1; display:grid; place-items:center; font-family:var(--sans)}
.take.a .pp{background:var(--amber); color:#241a08} .take.b .pp{background:var(--teal); color:#08222a}
.pp:active{transform:scale(.93)}
.seek{flex:1; min-width:60px; height:22px; -webkit-appearance:none; appearance:none; background:transparent; cursor:pointer; margin:0}
.seek::-webkit-slider-runnable-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-moz-range-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-webkit-slider-thumb{-webkit-appearance:none; margin-top:-5px; width:14px; height:14px; border-radius:50%; border:0}
.seek::-moz-range-thumb{width:14px; height:14px; border-radius:50%; border:0}
.take.a .seek::-webkit-slider-thumb{background:var(--amber)} .take.a .seek::-moz-range-thumb{background:var(--amber)}
.take.b .seek::-webkit-slider-thumb{background:var(--teal)} .take.b .seek::-moz-range-thumb{background:var(--teal)}
.tt{font-family:var(--mono); font-size:11px; color:var(--muted); min-width:30px; text-align:right; font-variant-numeric:tabular-nums; flex:0 0 auto}
.linkbtn{flex:1; min-width:140px; text-align:left; font-family:var(--mono); font-size:12.5px;
color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:8px; padding:8px 11px; cursor:pointer}
.pick{appearance:none; cursor:pointer; font-family:var(--sans); font-size:13px; flex:0 0 auto;
font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:8px; padding:7px 12px; transition:all .15s}
.pick:hover{color:var(--ink); border-color:var(--muted)}
.take.a .pick.on{background:var(--amber); color:#241a08; border-color:var(--amber)}
.take.b .pick.on{background:var(--teal); color:#08222a; border-color:var(--teal)}
.cmt{display:block; width:calc(100% - 42px); margin:11px 0 0 42px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:9px; color:var(--ink); font-family:var(--sans);
font-size:13.5px; line-height:1.45; padding:9px 12px; resize:vertical; min-height:40px}
.cmt::placeholder{color:var(--faint)}
.cmt:focus{border-color:var(--muted); outline:none}
@media(max-width:560px){
.takes{margin-left:0} .hook{padding-left:0} .cmt{width:100%; margin-left:0}
.wrap{padding:34px 15px 34px} .song{padding:16px 14px 14px}
.song-head{gap:11px} .num{min-width:20px}
.take{gap:8px; padding:8px 10px} .pl{min-width:0; gap:8px}
.pp{width:34px; height:34px} .seek{min-width:36px; height:26px} .pick{padding:7px 11px}
.bar-in{padding:9px 13px; gap:10px}
.prog{display:none}
.tb{width:34px; height:34px} .tb.tb-main{width:38px; height:38px} .transport{gap:6px}
.copy{padding:9px 13px}
}
.bar{position:fixed; left:0; right:0; bottom:0; background:rgba(14,10,18,.9);
backdrop-filter:blur(10px); border-top:1px solid var(--line); z-index:10}
.bar-in{max-width:880px; margin:0 auto; padding:12px 20px; display:flex; align-items:center; gap:16px}
.prog{font-family:var(--mono); font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; flex:1}
.copy{appearance:none; cursor:pointer; font-family:var(--sans); font-weight:600; font-size:14px;
color:#241a08; background:var(--amber); border:0; border-radius:9px; padding:9px 16px}
.copy.done{background:var(--teal); color:#08222a}
.transport{display:flex; align-items:center; gap:8px; flex:0 0 auto}
.tb{width:38px; height:38px; border-radius:50%; border:1px solid var(--line); background:rgba(255,255,255,.06);
color:var(--ink); font-size:14px; cursor:pointer; display:grid; place-items:center; padding:0; line-height:1}
.tb:active{transform:scale(.92)}
.tb.tb-main{background:var(--amber); color:#241a08; border-color:var(--amber); width:42px; height:42px; font-size:15px}
.tb.tb-next{border-color:var(--amber); color:var(--amber)}
.now{flex:1; min-width:0; font-family:var(--mono); font-size:12.5px; color:var(--muted);
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.now b{color:var(--ink); font-weight:600}
.note{color:var(--muted); font-size:13px; margin:26px 2px 0; text-align:center; font-family:var(--mono); text-shadow:0 1px 8px rgba(0,0,0,.6)}
:focus-visible{outline:2px solid var(--amber); outline-offset:2px}
#hari{position:fixed; left:0; bottom:52px; width:100%; height:170px; pointer-events:none; z-index:40; display:none}
.why{margin:.5rem 0 .1rem;padding:.55rem .7rem;border-left:3px solid #7bd88f;
background:rgba(123,216,143,.09);border-radius:0 6px 6px 0;font-size:.93rem;line-height:1.45;color:#d9f2df}
.chip.new{background:rgba(255,209,102,.16);border-color:rgba(255,209,102,.5);color:#ffd166}
.lyr{margin:.55rem 0 .1rem;border-top:1px solid rgba(255,255,255,.09);padding-top:.4rem}
.lyr summary{cursor:pointer;font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:#9fb4c9;
list-style:none;user-select:none;padding:.15rem 0;opacity:.85}
.lyr summary:hover{color:#d9f2df;opacity:1}
.lyr summary::-webkit-details-marker{display:none}
.lyr[open] summary{color:#d9f2df;opacity:1}
.lyrbody{margin:.4rem 0 .2rem;padding:.7rem .8rem;background:rgba(0,0,0,.28);border-radius:8px;
font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-size:.86rem;line-height:1.5;
white-space:pre-wrap;color:#e5eef6;max-height:22rem;overflow:auto}
.gen{display:inline-flex;align-items:center;gap:.4rem;font-size:.85rem;color:#ffd166;opacity:.85;font-style:italic}
.takediv{grid-column:1/-1;margin:.55rem 0 .15rem;font-size:.72rem;letter-spacing:.05em;text-transform:uppercase;
color:#8aa0b6;opacity:.75;border-top:1px dashed rgba(255,255,255,.13);padding-top:.4rem}
.take.old{opacity:.72}
.take.old .lab{color:#9fb4c9}
.v45{display:inline-block;margin-left:.3rem;padding:.02rem .32rem;border-radius:5px;font-size:.62rem;font-weight:700;
letter-spacing:.03em;vertical-align:middle;background:rgba(255,209,102,.16);color:#ffd166;border:1px solid rgba(255,209,102,.4)}
</style>
<canvas id="bg"></canvas><div id="scrim"></div>
<div class="wrap">
<header>
<p class="eyebrow">A favor for Hari · Warlords Soundtrack</p>
<h1>Round 3, Hari. <span class="wave">👋</span></h1>
<p class="lede"><b>Your notes are all in.</b> 37 of the 47 songs are settled and off this page — they're in the game. What's left is <b>only the ones you asked us to redo</b>. The big takeaway from your feedback was <b>too much metal</b>, so most of these changed genre outright rather than getting a lyric tweak; the green line under each song says exactly what changed and what to listen for. Same as before — play both takes, pick one, <b>leave a note</b> if it's still not right. <b>Everything saves as you go</b> — hit <b>Copy picks</b> at the bottom and send it back.</p>
<p class="lede" style="opacity:.8"><b>Three more are still coming:</b> Hoarfrost, The Lost Witch and The Brothers. Suno rate-limited us mid-batch — they'll be added to this page as soon as they're through, so check back.</p>
<p class="sig">Seriously, thanks Hari — this helps a ton.</p>
<div class="banner">
🔊 <b>Heads up, Hari:</b> audio won't stream inside this preview window. Open the <b>warlords_soundtrack.html</b> file Paul sent you, or use the <b>copy-link</b> buttons. You can still pick and leave notes here.
</div>
<div class="legend">
<span><span class="dot a"></span> Take A</span>
<span><span class="dot b"></span> Take B</span>
<span>tap ► to play · drag to seek</span>
</div>
</header>
<div id="list"></div>
<p class="note" id="foot">More still rendering — this page grows as they finish.</p>
</div>
<div class="bar"><div class="bar-in">
<div class="transport">
<button class="tb" id="bprev" type="button" aria-label="Previous take" title="Previous"></button>
<button class="tb tb-main" id="bplay" type="button" aria-label="Play or pause" title="Play / pause"></button>
<button class="tb tb-next" id="bnext" type="button" aria-label="Skip to next take" title="Skip"></button>
</div>
<span class="now" id="now">tap ► on any take · ⏭ to skip through</span>
<span class="prog" id="prog">0 picked</span>
<button class="copy" id="copy">Copy picks</button>
</div></div>
<canvas id="hari"></canvas>
<script>
const SONGS = [
{
"id": "frost_pack",
"kind": "enemy",
"forName": "Hoarfrost, the Rime-Jarl",
"title": "Down the Pass",
"genre": "glacial dark ambient neofolk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/680f3543-6a37-4032-93f6-7614a8c21a26.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/351096c4-cf6c-4259-b02f-161febd4aa72.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/b1d800b7-1023-49d5-be84-4673baae1cc8.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/7039b029-447b-46d2-92fc-0fecb647f826.mp3",
"model": "v4.5",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW GENRE - no death metal. Glacial dark-ambient neofolk: throat singing, creaking ice, menace through stillness.",
"lyrics": "[Verse]\nNothing moves on the pass\nNothing moves in the pine\nWhatever quiet you are hearing\nThat quiet is mine\n\nI do not shout\nI do not blow a horn\nI was standing on this mountain\nLong before you were born\n\nSnow crunch behind you\nA moment much too late\nGrey along the treeline\nLearning how to wait\n\n[Pre-Chorus]\nCount them if you like\nThree, and three again\nGrey along the left shoulder\nGrey at the other end\nNothing has begun yet\nThat is how it ends\n\n[Chorus]\nHoarfrost, Hoarfrost\nStill as the stone\nHoarfrost, Hoarfrost\nThe cold keeps its own\nNothing to answer, nothing to ask\nOnly the long white coming down the pass\nHoarfrost, Hoarfrost\nAnd the cold keeps everything (the cold keeps everything)\n\n[Verse]\nYou set your line and hold it\nYou listen for a drum\nThere is only the glacier\nWorking out its sum\n\nMy reavers do not shiver\nYou cannot chill the chilled\nThey come out of the weather\nLike the weather learned to kill\n\nI do not lift a blade to you\nI lift a little frost\nAnd the middle of your line goes hard\nAnd the middle is what's lost\n\n[Pre-Chorus]\nYou are not wounded\nYou are only still\nUpright in your armor\nOn an empty hill\nOne long breath of nothing\nThen the quiet kills\n\n[Chorus]\nHoarfrost, Hoarfrost\nStill as the stone\nHoarfrost, Hoarfrost\nThe cold keeps its own\nNothing to answer, nothing to ask\nOnly the long white coming down the pass\nHoarfrost, Hoarfrost\nAnd the cold keeps everything (the cold keeps everything)\n\n[Instrumental]\n\n[Bridge]\nAn avalanche is patient\nAnd then it is not\nThere is no in-between to it\nNo warning and no shot\n\nThe pass forgets the road\nThe road forgets the town\nTell yourself you're ready\nWhile the white comes down\n\n[Chorus]\nHoarfrost, Hoarfrost\nStill as the stone\nHoarfrost, Hoarfrost\nThe cold keeps its own\nNothing came running, nothing came loud\nYou went still where you stood and I never made a sound\nHoarfrost, Hoarfrost\nAnd the cold keeps everything (the cold keeps everything)"
},
{
"id": "ash_witch",
"kind": "enemy",
"forName": "The Lost Witch",
"title": "The Whole Book",
"genre": "dark psychedelic witch-folk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/42a307f1-e0ff-47da-b850-c6ad9fc6f3c8.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/ec49dbee-2213-4333-9783-1ed61be33189.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/6d475d44-bf05-495f-bf4c-044396dcf6a0.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/144e7424-ec75-4fce-a349-a526408d38a8.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW GENRE - no black metal, nothing scratchy. Dark psychedelic witch-folk: hurdy-gurdy, dulcimer, close female harmonies going trance.",
"lyrics": "[Intro]\nTurn it, turn it, turn the page\nTurn it, turn it, turn the page\n\n[Verse]\nThere was a girl on the heath who could read before she could rest\nAnd she found a book in the grass with a storm in its chest\nEvery hundred pages it would say: stop here, be kind\nAnd I marked where to stop, and I left that girl behind\n\nI asked it one question and it answered me twelve\nThere is no floor to a book that can read you itself\nI was warned in the margin by a careful red pen\nAnd I turned past the warning, and again, and again\n\n[Pre-Chorus]\nNow the mirror walks out\nWearing my own face\nYour steel goes right through her\nLike a hand through a flame\n\nTwo spells every breath\nFrom the very first turn\nNot because I am cruel\nBut because I can't unlearn\n\n[Chorus]\nLost Witch, Lost Witch, what did you find?\nThe whole book, the whole book, and none of my mind\nI open my hands and the weather comes down\nLost Witch, Lost Witch, no name and no town\nChain in the water, rime in the knee\nThe book does the casting, the book isn't me\nLost Witch, Lost Witch, come and look\nI have read it all, I have read the whole book\n\n[Verse]\nI send the small ones first, they are sweet and they are quick\nAnd a nip and a purr and a whisper does the trick\nTwo bites and your bravest goes quiet in the eye\nAnd he turns and comes home to me and doesn't say goodbye\n\nI don't hate you, I want you to know that I don't\nI would stop if I could find the part of me that won't\nThe thunder isn't anger, the meteor's not spite\nThere is only a page, and the page says tonight\n\n[Pre-Chorus]\nOn the third turn something falls\nAnd the thunder pins you down\nI did not choose the hour\nThe margin wrote it down\nSo run, love, if you can run\nIt comes again on the sixth\n\n[Chorus]\nLost Witch, Lost Witch, what did you find?\nThe whole book, the whole book, and none of my mind\nI open my hands and the weather comes down\nLost Witch, Lost Witch, no name and no town\nChain in the water, rime in the knee\nThe book does the casting, the book isn't me\nLost Witch, Lost Witch, come and look\nI have read it all, I have read the whole book\n\n[Bridge]\nI remember a window, I remember the rain\nI remember a woman who could say my name\nI have a word for the lightning, a word for the dead\nAnd no word at all for the girl in my head\n\nYou wanted the whole book? All right, love. Take it.\nEvery page at once, and I can't stop, and I won't\nLift the cover off the witch and look inside her\nThere's a book where the girl was. There's a book. That's all.\n\n[Chorus]\nLost Witch, Lost Witch, what did you find?\nThe whole book, the whole book, and none of my mind\nI open my hands and the weather comes down\nLost Witch, Lost Witch, no name and no town\nMirror and familiar, thunder and stone\nThe book does the casting, I just carry it home\nLost Witch, Lost Witch, come and look\nThere is nothing left of me, there is only the book\n\n[Outro]\nTurn it, turn it, turn the page\nTurn it, turn it, turn the page\nEvery page said stop, love\nAnd I turned it anyway"
},
{
"id": "the_brothers",
"kind": "enemy",
"forName": "The Brothers",
"title": "Back to Back",
"genre": "rowdy Celtic folk-punk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/5b787d25-3592-4c1b-8a9b-20c385846472.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/58a33b2c-0b4f-4090-a960-c8ec26a84cd9.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/346fcda2-eda4-4423-b5f3-81aa0122cc04.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/03a0d877-f36b-4a8d-8960-f27ec768fde0.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW GENRE - off metal. Celtic folk-punk with two clashing voices who contradict each other all song and only agree on the chorus.",
"lyrics": "[Intro - spoken over an accordion drone and boot stomps]\n[Hew] Whose round is it?\n[Haft] Yours. Has been yours since the Ember Wastes.\n[Hew] I bled at the Ember Wastes. [Haft] You bled after I paid.\n\n[Verse 1 - Haft gravelly and low, Hew high and reedy]\n[Haft] I carry the hilt half of father's old sword,\n[Haft] He got the point, and I got the word\n[Haft] That I snapped it on the cellar door, drunk as a lord —\n[Hew] That's a LIE, and the cellar was never yours!\n[Haft] I hold the line. I plant and I stay.\n[Haft] Brutes in a row and they don't give way,\n[Haft] Legionnaires braced till the shieldwall's a hill —\n[Hew] You've held that same hill since we were seven and you're holding it still!\n\n[Verse 2 - Hew leads, Haft cutting in]\n[Hew] I don't hold nothing. Holding is for stone.\n[Hew] I drop in behind you where the ground looks alone,\n[Hew] Cutthroats past the shieldwall — they don't see a wall —\n[Hew] Straight for the commander, and that's the end of it all.\n[Haft] Your Skulkers have five health!\n[Hew] Your Brutes have got no legs!\n[Haft] Two coin I paid for that Brute —\n[Hew] And my knives drop free, Haft. Free. Right where I like.\n\n[Pre-Chorus - trading, tightening]\n[Haft] Never agreed on a road.\n[Hew] Never agreed on a price.\n[Haft] Never agreed which of us was born first —\n[Hew] (It was me.) [Haft] (It was NOT.)\n[Both] But we agreed on one thing. We only ever agreed on one thing —\n\n[Chorus - both voices in unison, whole tavern shouting]\nBACK TO BACK! and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK! HAFT AND HEW!\nHe has never once been right in his life,\nand I'd die for him tonight! Back to back!\n\n[Verse 3 - the Blackreed argument]\n[Hew] At the Blackreed bog I hauled him from the muck,\n[Hew] Twelve men on him, half his shield-arm stuck —\n[Haft] That is NOT how it went and it never was!\n[Haft] I hauled HIM. He was face down in the moss!\n[Hew] Ask anyone who saw it. [Haft] Everyone who saw it died.\n[Haft] Every round of this war goes the very same way —\n[Haft] One squad of mine to hold the lane,\n[Hew] one squad of mine in your soft parts, deep.\n[Haft] I build the door. [Hew] I'm already in the keep!\n\n[Chorus - both voices in unison, whole tavern shouting]\nBACK TO BACK! and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK! HAFT AND HEW!\nHe has never once been right in his life,\nand I'd die for him tonight! Back to back!\n\n[Bridge - everything drops to a lone fiddle, then the stomp returns]\n[Haft] HEW! [Hew] Aye, brother. Back to back.\n[Hew] Cut down the wall and the knives run free —\n[Haft] cut down the knives and the wall runs deep —\n[Both] whichever of us you leave standing there\n[Both] fights with his brother's fury and his brother's share!\n\n[Verse 4 - fast trade, then low and serious]\n[Haft] You never thanked me for the pass at Ash —\n[Hew] You never needed thanking. You'd have done it for the dog.\n[Haft] I would have done it for the dog. [Hew] You like it better than me.\n[Haft] The dog agrees with me. [Hew] ...Aye. Fair.\n[Hew] There's no wrong brother to put down first, friend.\n[Haft] There's only the one you'd rather not meet at the end.\n[Hew] So swing at the point, [Haft] or swing at the haft —\n[Both] father's sword came apart in two, and both halves know the craft.\n\n[Chorus - final, full tavern, everyone off their stools]\nBACK TO BACK! and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK! HAFT AND HEW!\nHe has never once been right in his life,\nand I'd die for him tonight! Back to back!\n\n[Outro - slowing to one stomp and a tin whistle]\n[Both] Never agreed on nothin' — never had to.\n[Haft] I'm the elder.\n[Hew] You're not.\n[Haft] I am. [Hew] You're NOT.\n[Both] Back to back."
},
{
"id": "troll_chief",
"kind": "enemy",
"forName": "Simple Ton",
"title": "End It With the Log",
"genre": "dumb heavy caveman sludge metal",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/8d6f161d-2790-46e0-bde3-2fd6a7fc1b7e.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/d7e78832-dccc-40cc-af8d-2ee820a673eb.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/17fc24de-d594-44a7-ba2b-e3f345eaa461.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/2cde2977-4736-4f28-9649-7d21b7b80f3a.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Round 3: Ton now only says 6 fixed lines, rotated by delivery (your Tequila idea). The crowd chant carries the rest.",
"lyrics": "[Instrumental Intro - long, one detuned riff builds slow]\n\n[Verse: Ton - slow dragging drawl]\nTON NOT TALK MUCH.\nTON TALK WITH LOG.\nTON WAIT.\nTON WAIT.\nTON WAIT.\nTON TALK WITH LOG.\n\n[Riff - let it pound]\n\n[Chorus: crowd chant]\nTON! TON! TON!\nTON! TON! TON!\nHe does not talk. He talks with the log.\nTON! TON! TON!\n\n[Drum Break]\n\n[Verse: Ton - half-whispered mutter]\nTON NOT TALK MUCH.\nTON WAIT.\nTON WAIT.\nTON TALK WITH LOG.\nTON WAIT.\nFRIEND COME.\n\n[Riff - let it pound]\n\n[Chorus: crowd chant]\nTON! TON! TON!\nTON! TON! TON!\nHe does not talk. He talks with the log.\nTON! TON! TON!\n\n[Instrumental - riff drags, drums drop out, then crash back]\n\n[Breakdown]\n\n[Verse: Ton - roared gang chant]\nTON SWING.\nTON SWING.\nFRIEND COME.\nFRIEND COME.\nTON SWING.\nLOG END IT.\n\n[Call and response: Ton, then crowd]\nTON SWING. (TON!)\nTON SWING. (TON!)\nFRIEND COME. (TON!)\nLOG END IT. (TON! TON! TON!)\n\n[Riff - let it pound]\n\n[Chorus: crowd chant, huge]\nTON! TON! TON!\nTON! TON! TON!\nHe does not talk. He talks with the log.\nTON! TON! TON!\n\n[Drum Break]\n\n[Verse: Ton - roared, faster now]\nTON SWING.\nFRIEND COME.\nTON SWING.\nFRIEND COME.\nTON SWING.\nLOG END IT.\n\n[Instrumental Outro - riff pounds down to nothing]\n\n[Ton - slow drawl, alone]\nTON NOT TALK MUCH.\nLOG END IT."
},
{
"id": "pyromancy",
"kind": "pack",
"forName": "Pyromancy",
"title": "Everything Burns",
"genre": "fire-and-brimstone Southern gospel revival stomp",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/42d621f9-0964-4bbc-9e80-81308644495e.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/fe1440e7-a579-416c-919f-c3194548fa48.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/34542876-577b-4431-875a-bd2af895bd8c.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/dd577967-f5df-4161-9dec-4e9d368f0fe5.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Round 3: same gospel sound, but the lyrics are now one coherent testimony with a real point (a hoarder freed by fire), not a word-salad of cards.",
"lyrics": "[Verse]\nI was a cold man, brother, I confess\nHeld my whole life in a locked-up chest\nCounted every candle, feared the dark\nGuarded every ember, hoarded every spark\n\nThen the fire came through and it took the lot\nEverything I clutched and everything I'd got\nAnd I stood in the ash and I finally saw —\nNothing left to lose is nothing left to gnaw\n\n[Pre-Chorus]\nImmolate — I give my whole hand away\nEmpty-palmed, and I still can pray\nA man who holds nothing has nothing to dread\nAsh don't fear the morning, and the morning's dead ahead\n\n[Chorus]\nEverything burns! (Everything burns!)\nAsh to ash is all we earn\nStomp the boards and feel the heat\nFire sitting in the mercy seat\nEverything burns! (Everything burns!)\nEvery soul in its season turns\nI don't run from it, I hold it high —\nEverything burns, and so will I\n\n[Verse]\nSo come down front, don't be afraid\nLook at everything you're scared to trade\nThat coat, that name, that thing you love the most —\nChild, it's only kindling, and you're holding it close\n\nFireball takes the dearest for its fuel\nThe more that you loved it, the hotter it grew\nYou don't have to reach — the Ember Hound knows,\nStand near to the truth and already you glow\n\n[Pre-Chorus]\nAnd the Pyromancer, he burns all the brighter\nThe more of the field goes up, the higher —\nThe more of you believe it, the stronger I stand\nSo lay your whole life down here in my hand\n\n[Chorus]\nEverything burns! (Everything burns!)\nAsh to ash is all we earn\nStomp the boards and feel the heat\nFire sitting in the mercy seat\nEverything burns! (Everything burns!)\nEvery soul in its season turns\nI don't run from it, I hold it high —\nEverything burns, and so will I\n\n[Bridge]\nNow some of you cry that it ain't fair —\nThat the fire don't pick, that it just don't care\nBut that's the mercy, can't you see the grace?\nWildfire takes us all in the very same place\nSame flame for the rich man, same for the poor\nSame for the preacher right here at the door\nAnd when the burning fall, they don't fall for nothing —\nBackdraft says the fire rolls on to something\nIt's never all the way out — just low, just slow,\nAn ember in the floorboards for the wind to blow\nSo I don't fear my ending, I have made it kin —\nIt ain't on fire, it IS the fire, and I'm walking in\n\n[Chorus]\nEverything burns! (Everything burns!)\nAsh to ash is all we earn\nLay it down where the flame can reach —\nGrace comes hot in the mercy seat\nEverything burns! (Everything burns!)\nEvery soul in its season turns\nThrow up your hands, don't ask me why —\nEverything burns, and so will I\nEverything burns, hallelujah —\nEverything burns, and so will I"
},
{
"id": "infernal_legion",
"kind": "pack",
"forName": "Infernal Legion",
"title": "Blood Summon",
"genre": "hypnotic hill-country blues drone",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/574681b1-cabc-4cc9-9ebc-2b2a82413d23.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/a42baea2-c71c-4b1b-b54a-cc2ee355b18d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/069ec8fd-7724-442c-8d9a-9c25c9e35175.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/51254aca-27b2-4cfa-bc88-2cb5866a6e22.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Round 3: leans into a distorted blues DRONE + hums to do the summoning; each demon gets a slow half-time drop so its name lands; the 'Blood Sum-MON!' yell is gone.",
"lyrics": "[Intro — a lone distorted slide riff looping low, a hum underneath, boards keeping the stomp]\n(hummed, low) Mmm-mmm... low down... mmm...\n(spoken, quiet) One chord. I don't let it end.\n\n[Verse 1]\nDelta gone dark and the field lay still\nOne low note hummin' off the cotton hill\nI hold the one chord, I don't let it go\nSomethin' down in the dirt start to move real slow\nRoll the slide down, let the fuzz ring long\nGround don't answer a word — it answer the song\nI ain't playin' loud, I'm playin' it low\nAnd the low is a door, and the door start to grow\n\n[Chorus]\nPlay it low, play it low, let the one note ring\nGround come open when the dirt hear it sing\nI don't call 'em up — the sound just does\nBlood summon, risin' where the music was\nPlay it low, play it long, feel the hum climb\nSomethin' answerin' up from an older time\nHand on the steel and I can't let go —\nBlood summon, and they rise when I play it low\n\n[Half-time — the hum drops back, leave space, name the little one]\nFirst one up...\na little spiteful thing...\nImp in the ash — better spent than kept...\nOn strike he burn, on death he give it all away...\nFour of 'em claw up in the smoke where I play...\n\n[Verse 2]\nBoards go stomp and the harp cry thin\nLouder I hum, the more come crawlin' in\nI ain't the preacher, I ain't the prayer —\nI'm just the man let the low note hang in the air\n\n[Half-time — drop to a crawl, name the one in the back]\nWay in the back...\nwhere the fuzz hang low...\nFiend with a bow — heal on the blood from a safe row...\nEvery card I burn, he stand a little taller...\nThe distortion feed him, and he answer the caller...\n\n[Chorus — short, half-voiced]\nPlay it low, play it low, let the one note ring\nGround come open when the dirt hear it sing\nI don't call 'em up — the sound just does\nBlood summon, risin' where the music was\n\n[Half-time — the riff pulls hard, name the runners]\nThree come ridin'...\npast the whole front line...\nHell Couriers — don't want yours, they want mine...\nStraight for whoever sang it out loud...\nDon't stop for the crowd, don't slow for the field...\n\n[Half-time — the whip crack, name him slow]\nMiddle of the pit...\ncome the one with the whip...\nPit Lord cleavin' every card that I flip...\nBurn one more, he bring an imp to his side...\nLifesteal drinkin' on the risin' tide...\n\n[Bridge — the stomp doubles, the hum won't quit]\nMan in the pinstripe at the back of the room\nImp Manager countin' every soul in the gloom\nEvery one that fall, he mark it down in red\nSoul harvest tickin', good money in the dead\nI fed Cindermaw the whole night's set\nTwo more imps for every card I ain't played yet\nBlood Candles gutter and they burn when I bleed\nUnholy switch — I take back what I need\nAnd the more I spend, the wider it grow\nSo I hold the one chord and I play it low\n\n[Half-time — everything hush, name the last one]\nAnd the last one up...\ndon't hurry, don't run...\nThe Archdevil wait 'til the encore's done...\nFine print in the fire, two imps every turn...\nHe read what I signed in the way the strings burn...\n\n[Final Chorus — a low gospel-blues choir hums in behind]\nPlay it low, play it low, let the one note ring\nGround come open when the dirt hear it sing\nI don't call 'em up — the sound just does\nBlood summon, risin' where the music was\nAin't a card in my hand, ain't a soul to spend\nEvery seat took by somethin' that don't intend\nLegion for a band and I can't let go —\nBlood summon, and they rise when I play it low\n\n[Outro — the riff loops on, the hum sinks into the ground]\nPlay it low... (play it low...)\nThey never come for the words...\nthey come for the sound...\nBlood summon...\nand I can't put it down...\n(one chord, never resolves, fade into the hum)"
},
{
"id": "rime_harrows",
"kind": "enemy",
"forName": "Sledge Hammarsson",
"title": "No Brakes",
"genre": "nordic viking folk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/da2f57ac-26c7-4e65-b38d-c53fd1867ebd.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/6942568c-dbfd-4168-9f24-ace4de903da4.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/e65957a9-87d6-4d9a-b11b-28bab8ec6e59.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/1adb3363-9e4c-47a4-af02-dd70d3b3727f.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Round 3: same Nordic sound, coherent lyrics now - a warrior who never learned 'the word for turning home'. The nonsense line is gone.",
"lyrics": "[Intro: lone male voice over deep resonant drums and icy drones]\nThey set me on the sled-run as a boy\nPointed me downhill and taught me how to go\nNamed me for the hammer, raised me in the storm\nBut no one ever taught me the word for turning home\n\n[Verse: tagelharpa and jaw harp enter, low harmonies]\nThe harrows run before me down the one straight track\nBladed sledges, downhill, and they never turn back\nRunners hiss and blades sing where the iron bites the snow\nBreak one if your arm is good, but mind where you let it go\nFor a shattered sledge leaves rime on the ground where it lands\nAnd the frost bites up cold through the boots where you stand\n\n[Verse: hardanger fiddle rises, first handclaps]\nThe frost wisps hang back cold and they never need to close\nJust a little cold that follows you home through your rows\nThey slow the boots beneath you, thin the swarm you brought to fight\nWhile I keep my one heading and they hold your ranks tight\n\n[Pre-Chorus: percussion intensifies, harmonies stack]\nDrum, drum on the frozen road\nHorn on the high pass and the sky hung low\nClap, clap, let the runners run\nNo brakes on the sled once the going's begun\n\n[Chorus: raw choir chant, rhythmic handclaps, full drums]\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nThe runners are singing and they will not slow\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nDown the one white road to the town below\nNo brakes, no turning, no calling me back\nRime where you stopped me and the storm on my track\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nHo! (Ho!) Ho! (Ho!)\n\n[Verse: tagelharpa and fiddle drive together]\nRound two, and I lift the great maul over my head\nSkyfall goes arcing where the shield-wall is spread\nIt leaps from man to man where you crowded in tight\nThen Hammerfall lands and it staggers the fight\nSo spread against the lightning, don't bunch in the cold\nCut the wisps that slow you or the tale's never told\nBreak my sledges early, break them wide of your feet\nOr you'll fight in your own winter when the two lines meet\n\n[Pre-Chorus: handclaps double, choir swells]\nDrum, drum on the frozen road\nThunder in the maul and the sky hung low\nClap, clap, let the runners run\nNo brakes on the sled once the going's begun\n\n[Chorus: raw choir chant, rhythmic handclaps, full drums]\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nThe runners are singing and they will not slow\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nDown the one white road to the town below\nNo brakes, no turning, no calling me back\nRime where you stopped me and the storm on my track\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nHo! (Ho!) Ho! (Ho!)\n\n[Bridge: drums fall away, minimalist flute and distant calls]\nNow the drums let go, now the flute comes thin\nThere's a hearth up the mountain where my life could have been\nI still remember smoke, and a door, and a name\nBut the sled only runs the one way down, all the same\nSome men learn the turning, learn the climbing back\nLearn the word that calls a wanderer home from the track\nI was only ever taught to face downhill and go\nI have asked the road to stop, and the road don't know\nHalf of me is thunder and half of me is snow\nAnd the part that still remembers has nowhere left to go\n\n[Reprise: all elements fuse - tagelharpa, hardanger fiddle, jaw harp, full choir, handclaps, drums, wide synths]\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nThe runners are singing and they will not slow\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nDown the one white road to the town below\nSkyfall in the cloud and the rime underfoot\nHammerfall staggering, the whole line shook\nSledge Hammarsson! (hey!) Sledge Hammarsson! (hey!)\nHo! (Ho!) Ho! (Ho!)\n\n[Outro: choir and drone fade, lone male voice returns]\nWhere the sledges broke, the ground will stay white\nOne voice on the mountain, one drum in the night\nI go like the storm, and I don't come back\nJust the print of the runners, left cold on the track"
},
{
"id": "frost_yeti",
"kind": "enemy",
"forName": "The Frost Yeti",
"title": "Slow as the Cold",
"genre": "glacial post-rock",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/631054b1-1264-46ca-a23c-f4528b4d0fd8.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/ef4cec50-2979-4158-b8c0-f102f164944d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/b9a0c957-2c86-4ae1-a365-8683d5f18809.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/d3d887e2-ebc4-41a6-81c6-daa6455c08de.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW GENRE - keeps the mass, drops the growls. Glacial post-rock, clean deep baritone in an ice-cave, groaning ice as percussion.",
"lyrics": "[Intro: lone bone flute over deep sub-drone and groaning ice]\nNothing on this mountain is in a hurry\nNot the snow, not the stone\nNot the white shape on the shelf above you\nThat has stood there on its own\n\n[Verse: clean deep baritone, vast ice-cave reverb, slow swells beneath]\nI am not the storm that finds you\nI am the weight it leaves behind\nThe shelf that hangs above the valley\nThat the valley never minds\n\nTake one step onto my ground\nIt takes the step back out of you\nAnd a breath after you have crossed it\nYou are still crossing through\n\n[Pre-Chorus: low horn enters, slow calving-ice drums begin]\nYou are moving, you are moving\nJust a little less than before\nThen a little less than that was\nThen a little less once more\n\nI do not want your courage\nI have no use for your name\nI only ever take the speed\nAnd the ending is the same\n\n[Chorus: full mass, huge slow swell, wordless choir, colossal drums]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nNo shout in the whiteout, no charge and no horn\nOnly the long weight leaning till your line is worn\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Verse: swells drop back, bone flute answers the voice]\nThe frostlings go out ahead of me\nSmall white things that learned to stand\nYou cannot lay the cold on cold\nIt will not turn on its own hand\n\nThen the wolves, my only quickness\nCutting wide to where your bows are set\nThey take the archers in the open\nAnd the rest of you has not moved yet\n\nAnd the golem holds the middle\nA slab of me with armour on\nChip at him and he comes away sharper\nAnd he is still standing at dawn\n\n[Pre-Chorus: horn doubles, drums heavier]\nSo bring your fire, bring your hurry\nBring the fastest man you own\nThere is rime in every lane he takes\nAnd he gets here on his own\n\n[Chorus: half-weight, choir low]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\n\n[Bridge: everything falls away, bone flute alone in the cave, then the drums return twice as heavy]\nEvery other turn I open up my hands\nAnd the sky sits down to stay\nFrost, and then the blizzard after it\nAnd the whole white field goes grey\n\nYou will chip me. That is fair.\nThat is what an army's for.\nBut you get tired and I do not\nAnd I have done this before\n\n[Final Chorus: everything at full mass, choir wide open]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nYour banners hang wet and your drum's out of time\nThe field has gone white and the white is mine\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Outro: choir and drums fade to sub-drone, voice bare and low]\nNothing on this mountain was in a hurry\nNot the snow, not the stone\nAnd the white shape on the shelf above you\nIs coming down alone"
},
{
"id": "ashen_raiders",
"kind": "enemy",
"forName": "Ashen Raiders",
"title": "Nothing Left to Lose",
"genre": "hypnotic Saharan desert blues",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/68a657e9-8741-4e6d-873f-7278dc015583.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/622af261-fa96-40cd-9c38-0c308c1ed2a5.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/f73ebdc3-af8f-47e0-a051-8a738155e4ab.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/a03993ef-efa0-43dd-b00a-1443ba2af7da.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW GENRE - no more Broodmother overlap. Saharan desert blues: looping clean guitar, djembe, chanted call-and-response.",
"lyrics": "[Intro: Lone Clean Electric Guitar Loop]\n[Djembe, Calabash and Handclaps Enter]\n\n[Verse: Warlord Ash]\nWe did not ride here from a country\nWe rode out of a burn\nThere was green behind us one time\nThere is nothing to return\nThey said ash like it meant nothing\nWe took ash up for a name\n\n[Refrain: Call and Response]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nYou will say the dust came with us\nNo — the dust was always here\nWe put it down across your lowlands\nIn a dry month of a dead year\nEvery lane you choose to stand in\nYou will stand it in the grey\n\n[Verse: The Slingers]\nTake a fistful of the ground up\nGrit and grave-dust, that's the load\nDo not throw it at his shield arm\nThrow it where he reads the road\nLet him cut at what he's hearing\nLet him guard the empty air\n\n[Percussion Break: Calabash, Handclaps and the Guitar Loop Only]\n\n[Call and Response]\n(Where is the green?) Ahead\n(Where is the green?) Ahead\n(What is behind us?) Grey\n(What did we leave them?) Grey\n(What have we got?) Nothing\n(What can they take?) Nothing\n\n[Verse: Warlord Ash]\nPut my rider in the dirt then\nCall it clean and call it won\nThe horse is finished — he is not\nHe stands up and he keeps on coming on\nThere is no witch behind this army\nNo book, no bargain and no god\n\n[Bridge: Spoken low over the loop]\nYou have things. That is the whole of your disadvantage.\nYou have a line to hold, a lord to keep breathing, a wagon of green behind you.\nWe have a direction.\n\n[Verse: The Screamer]\nNow we set one down behind you\nNot for plunder, not for grain\nHe goes past your spears like a stranger\nHe is hunting for the name\nAnd the sound he makes on landing\nIs the sound your whole line makes when it falls\n\n[Refrain: Call and Response — Full Group]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nWhen it's over we won't hold it\nWe don't want the walls you made\nWe want one hour in the green grass\nThen the green goes to the grey\nMen who have got nothing left to lose\nRiding at whatever's left of yours\n\n[Outro: Guitar Loop Alone, Percussion Falling Away]\nAsh (ash)\nAsh (ash)\nNothing left to lose (nothing left to lose)\nNothing left to lose (nothing left to lose)\n[Fade on the Guitar Loop]"
},
{
"id": "steel_legion",
"kind": "pack",
"forName": "Steel Legion",
"title": "Hold the Line",
"genre": "epic cinematic military march",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/7f5b4d87-afea-4bd7-98d3-781bc481e375.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/670d18a4-9591-4b0a-9885-1ec0be5da58f.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/71340385-bd7e-49c3-89a3-c932292cfe89.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/63fb60b1-bc93-4509-b0fa-060048196606.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Round 3: your 3 lyric fixes are in (no 'line in a game', honest about losses, no 'did the math'). Same take you picked, cleaned up.",
"lyrics": "[Verse]\nI have buried more of us than I can say\nEach one a choice, and I carry it today\nWe did not march here drunk on a song\nWe came because we counted, and the count was long\n\nThe young ones want a banner, want a cause\nI want the ground behind me and a reason to pause\nThe wall is not a slogan, the wall is a debt\nThe oldest thing we carry, the last we forget\n\n[Pre-Chorus]\nAegis on the left, halberd on the right\nTestudo overhead when the arrows bite\nNot one of us is fearless, we just chose to stay\nAnd a chosen fear is a weapon we can weigh\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe shieldwall is a promise, not a grind\nFormation is a trust that we relearn each day\nSteel Legion holds the door so the frightened get away\n\n[Verse]\nGive me veterans who flinch and still hold fast\nNot the loud ones, no, the loud ones never last\nI know the name of every soldier at my side\nAnd a man who is known is a man who will not slide\n\nBulwark when they charge us, brace and take the weight\nWe do not break the enemy, we make the enemy wait\nTill the wait becomes a doubt, till the doubt becomes a rout\nAnd the line that never moved is what it was about\n\n[Pre-Chorus]\nLower the visor, steady up the spear\nWe are loudest in the moments we are silent and clear\nDiscipline's a language that we speak low and slow\nNot a mantra we repeat, but a debt we chose to owe\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe shieldwall is a promise, not a grind\nFormation is a trust that we relearn each day\nSteel Legion holds the door so the frightened get away\n\n[Bridge]\nThey will write us down as heroes, but that is not what we are\nWe are the ones who held the ground and did not run too far\nLeaders are not the ones who shout the marching creed\nThey are the ones still standing when the others need\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe aegis and the halberd are a promise, not a grind\nFormation is a family, the shield is how we lead\nSteel Legion holds the doorway, and the doorway holds\nLong after the banners and the anthems have gone cold\nWe are the quiet wall, the last line that gets told\nHold the line, hold the line, for the ones behind"
},
{
"id": "rainforest",
"kind": "extra",
"forName": "Primordial Growth",
"title": "Only So Much Sky",
"genre": "organic tropical psych-folk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/68b2124b-5a4f-4666-95ed-bac6500f411a.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/880ebd10-2f56-4d5d-a0dd-c0c4716239a8.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/82e843bd-2b1d-4a25-9cf4-eaeef6f39ed0.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/25ff0275-884f-48c4-a232-895feaf0853c.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "NEW extra track. You asked for rainforest music alongside The Slow Green - here it is, tropical psych-folk, rhythm-first and teeming.",
"lyrics": "[Intro - rain and insect hum, distant birdcall, a single kalimba figure, wordless voices]\nAy-ya, ay-ya, ay-ya-ah\n(Something in the leaf litter is counting.)\n\n[Verse 1 - nylon-string guitar, close warm vocal, hand drums low]\nI came up under your boot as a nothing,\nA green thread, a nuisance, a weed,\nYou stepped over me going somewhere important\nAnd I did the one thing I do. I feed.\nTwo seconds, a finger. Two more, a hand.\nUnderwhelming for most of an hour,\nThen the road you were walking is under the sand\nAnd the sand is under a flower.\n\n[Pre-Chorus - shakers enter, percussion doubles]\nYou have your fire, your iron, your name,\nYour very good reasons for cutting me down.\nI do not need any of that, my love,\nI need the light, and the light comes around.\n\n[Chorus - full band, layered wordless harmonies answering each line]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Verse 2 - polyrhythmic congas, marimba pattern, flute answering]\nThe eggs go down in a spearwall of spines,\nEight seconds and the shells come apart,\nNine of my daughters will stand and guard\nAnd the tenth one lays again in the dark.\nFollow the bramble that walks through the ferns,\nFollow it barefoot if you please,\nEverything down here has a use for you\nAnd the polite ones are up in the trees.\n\n[Pre-Chorus - drums tighten]\nYou brought a season. I brought all of them.\nYou brought an army. I brought the ground.\n\n[Chorus - full band, harmonies wider]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Instrumental - kalimba and wooden flute trading figures over teeming percussion, birdcall, humid and building]\n\n[Verse 3 - softer, vocal doubled an octave up, guitar and voice mostly alone]\nWhen the heart of the grove goes down, it goes down like a gift,\nEvery ring of it a season it held\nSomething alive while the season slept.\nWhatever you kill here, I bury and use.\nEvery ending you hand me is somebody's seedbed.\nI am slower than you. I am not slower to think.\n\n[Bridge - drums drop to bare hand percussion and voice, intimate]\nEight times I have died to get bigger,\nEight shells, and each one a small clean grave,\nI climbed out of every single one of them\nAnd I never once needed to be brave.\nThere is no ninth. There is no ninth.\nWhatever comes out of the last one stays,\nAnd it does not hate you, it does not know you,\nIt only knows the way the light lays.\n\n[Chorus - everything at once, whole ensemble, voices stacked]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Outro - percussion thinning back to rain and insects, one kalimba figure left]\nAy-ya, ay-ya, ay-ya-ah\nPlant me in the first hour, apologize by the sixth,\nAy-ya, ay-ya, ay-ya-ah\nThere is only so much sky.\n(Something in the leaf litter is still counting.)"
},
{
"id": "sapper_chief",
"kind": "enemy",
"forName": "Blastcap, the Powder-Reeve",
"title": "No Eyebrows Left",
"genre": "opens slow and deliberate with spoken words over a lone upright bass then explodes into manic psychobilly",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/fb16d1c0-cd75-4b13-8bb5-ba8242744d44.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/497823e5-3dfb-4473-bb4c-18511e091c2d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/b1234d7f-8cf6-4e71-bedf-94a0f5b76e53.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/64c5da77-9ffe-4df2-98e2-bc347dd4a3d3.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Revised: opens slow and spoken over a lone bass, THEN the band explodes - your 'wait, what's that?' beat before it all goes off.",
"lyrics": "[Intro - slow, spoken, almost gentle, lone upright bass, no drums]\nNow.\nBefore we start.\nI want you to look at the barrel by your feet.\nGo on. Look at it.\nSee the little wick?\n...It's shorter than it was.\n\n[FULL BAND EXPLODES IN - manic psychobilly, everything at once]\n[Verse]\nI count in fuses, I count in booms\nI fill your castle up with rooms that go KA-BOOM\nNo eyebrows left and I don't recall\nThe last time something didn't blow up at all\n\nSappers with a keg on every back\nPowder in the barrel, lit and black\nEverything I build's got a burning wick\nEverything I field goes off real quick\n\nI stack 'em up and I light 'em down\nThe loudest little goblin in the whole dang town\nYou wanna dance? Well, I brought the band\nAnd a lit cigar in my only hand\n\n[Pre-Chorus]\nTick, tick, tick\nGoes the merry fuse\nCount your steps\nIn lit-up news\n\nEvery keg\nIs a friend of mine\nStand real close\nOn the powder line\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nDemolition zone, so it hits twice as hard\nBlastcap's got a bomb in the yard\nBlastcap! No eyebrows left and I don't care!\nHere we blow! (here we blow!)\n\n[Verse]\nBombardment rainin' down on every lane\nLittle lit-up presents and they all explain\n'Tick' for a second, then they blow like me\nAin't nowhere on the field you're safe to be\n\nKill my little sappers right where they stand?\nThey pop right off in your front-line band!\nDemolition Zone makes the boom hit worse\nSo every kill you make is a lit-up curse\n\nAnd here comes the Siege Bomb, big and round\nRollin' on a wagon for your general's ground\nYou better crack it early, better crack it wide\n'Cause it's comin' for the man you keep inside\n\n[Pre-Chorus]\nTick, tick, tick\nOn the wagon wheel\nCount your commander\nIn the powder-reel\n\nOne long fuse\nAnd a downhill roll\nBlastcap's comin'\nFor the whole patrol\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nDemolition zone, so it hits twice as hard\nBlastcap's got a bomb in the yard\nBlastcap! No eyebrows left and I don't care!\nHere we blow! (here we blow!)\n\n[Bridge]\nCount your steps in fuses, friend\nCount your men in smoke\nMy whole world's one loud mistake\nAway from goin' broke\n\nBut WHAT a way to go, hey hey!\nOne big beautiful joke!\nEverything I ever loved\nWent up in a cloud of smoke!\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nStockpile's stacked and the whole thing's lit\nStand back, baby, this is it\nBlastcap! No eyebrows left and I don't care!\nKA-BOOM! (KA-BOOM!)"
},
{
"id": "pale_rider",
"kind": "enemy",
"forName": "The Pale Rider",
"title": "Takes the Biggest First",
"genre": "spaghetti-western doom with long unhurried lonesome whistling passages between the opening lines",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/abf20f8a-bbc9-4f12-8b8d-b543f53d66ae.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/cadfb0ed-cb91-4b4f-881c-aa31828b93c2.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/04d142f8-b50c-4533-90ab-596e4c3c447d.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/14740ab1-6259-4f38-bf12-71f32ca9922b.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Revised: whistling breaks between the opening lines so the story isn't rushed, per your note.",
"lyrics": "[Intro - lonesome whistling, unhurried, let it ring out]\n\n[Verse - spacious, never rushed]\nThere's dust on the wind and a bell out of tune\n\n[Whistling - take the tune for a while]\n\nA silent horseman coming under a low grey moon\n\n[Whistling - let it breathe before the next line]\n\nI don't ride to raid you, I ride to collect\nAnd I take the biggest soul that your ranks protect\n\nNo spurs and no war-cry, just the creak of the mist\nI lean in the saddle and I read down my list\nThe Reap swings the scythe and it takes half away\nThe fattest, the strongest, is the first of the pay\n\nGrave-mist comes rolling and the phantoms come through\nThey phase past your shieldwall like it's nothing to do\nThey dive for the weakest in the thinnest of lanes\nWhile the reaping takes the giants and it counts up the gains\n\n[Pre-Chorus]\nHear that whistle\nLow and long\nOne lonesome note\nOf a funeral song\n\nI don't run\nI don't chase\nI just take the biggest\nAnd I leave no trace\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Verse]\nPile them up high and you only feed me more\nThe bigger the body, the deeper that I score\nWights in the grave-mist and the specters that phase\nThey drift for your backline through the cold and the haze\n\nI don't want the small ones, they're not worth the ride\nI want the great column with its pride packed inside\nHalf it, then half it, till the mighty are gone\nAnd the mist keeps on rolling and the reaping goes on\n\n[Pre-Chorus]\nHear that whistle\nFading slow\nOne more soul\nFor the mist below\n\nNo hurry\nNo sound\nJust the pale horse walking\nOver your ground\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Bridge]\nI do not chase the little ones, I do not take the weak\nI come for the strongest shoulder the moment that I speak\nSo spread your weight out thin, my friend, go on and try to hide\nBut the Pale Rider always finds the biggest for the ride\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list\n\nPale Rider, Pale Rider\nThe scythe swings wide\nPale Rider, Pale Rider\nThere's no place to hide\nThe phantoms take the small ones and the Reap takes the rest\nPale Rider, Pale Rider\nAnd I collect the best (and I collect the best)"
},
{
"id": "mutagen",
"kind": "pack",
"forName": "Mutagenesis",
"title": "Unlock the Beast",
"genre": "acid techno industrial dubstep",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/784d1ec5-71c0-4ab9-a8c7-527f0ff78220.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/d1ec5cf0-f02d-4227-bb54-1533e3b1ab8d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/6e325979-60a7-466f-8a71-04c97969c708.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/d15479ef-f239-488c-8176-3e473bcac2aa.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Revised: a clean, clear intro instead of 30s of noise that could read as bad static on a small speaker.",
"lyrics": "[Intro - clean and restrained, a single clear synth line, no distortion, no noise]\nSomething in the dark is learning how to want.\n\n[Verse - the acid creeps in underneath]\nSerum in the needle, push it through\nThe body swells, the readings blue\nFifteen, twenty, break the seal\nSealed-off teeth begin to feel\n\nOverheal past the marker line\nEvery drop becomes design\nNo armor here, no shield, no cage —\nJust meat and math and a growing rage\n\n[Pre-Chorus]\nThe vat is humming, the dials climb\nAdrenaline overflows to size\nSplice the batch, the whole thing grows\nDecay's the tax that the ledger knows\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, break the seal\nFeed it more than it can heal\nThreshold cracks and the ability shows —\nUnlock the beast, and up it goes\n\n[Verse]\nLab Rat runs and it grows in place\nVat-Grown Brute takes a blow, gains face\nSpliced Hound bites and drinks it in\nTwenty pounds of borrowed skin\n\nFailed Experiment melts and rots\nPour the serum in the gaps and spots\nRegenerator won't waste a drop —\nEvery treatment climbs the top\n\n[Pre-Chorus]\nHypertrophy on every mend\nEureka draws when the seals all bend\nGrand Experiment, the round begins —\nFive more pounds on all my sins\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, break the seal\nFeed it more than it can heal\nThreshold cracks and the ability shows —\nUnlock the beast, and up it goes\n\n[Bridge]\nChimera stitched from a stolen three\nEats a kill and grows the key\nTwenty-five, then forty-five —\nTwo sealed monsters come alive\nMagnum Opus, the reviewer's dread\nFifty, eighty, raise the dead thing's head\nOverdose it, double the frame —\nGene Therapy signs my name to the flame\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, no ceiling now\nEvery serum shows it how\nSplice the batch and watch it climb —\nUnlock the beast, one last time\nOverclock the failing heart\nDecay's the price of a work of art\nBreak the last seal, let it roar —\nUnlock the beast forevermore"
},
{
"id": "cloak_dagger",
"kind": "pack",
"forName": "Cloak & Dagger",
"title": "Cover of Night",
"genre": "spy thriller trip-hop",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/58219e1b-214e-4968-816d-61ea3304c46f.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/9ab09f73-2d53-4fa1-a928-547e99ab2d15.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/d3d65dc6-31b7-4dc7-8454-747fb65005da.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/6626a701-2783-4748-bbae-2ccc36e1521f.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Revised: dropped 'free placement' - the jarring bit you flagged. Everything else is the take you liked.",
"lyrics": "[Verse]\nSlip behind where the shadows fall\nAnywhere we like, a knife for all\nStealth and backstab, double the cut\nSmoke goes up and the door is shut\n\n[Chorus]\nCover of night, we move unseen\nShadowstep through the in-between\nOne clean strike and we disappear\nCloak and dagger, we were never here\n\n[Verse]\nFan of knives in the candlelight\nGuildmaster whispers, the mark is right\nCoup de grace and the smoke bomb blooms\nSilence falls in the empty rooms\n\n[Chorus]\nCover of night, we move unseen\nShadowstep through the in-between\nOne clean strike and we disappear\nCloak and dagger, we were never here"
},
{
"id": "myconid_sovereign",
"kind": "enemy",
"forName": "Amanita, the Sporecrown",
"title": "Already Part of Me",
"genre": "psychedelic mushroom doom",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/7480cb9a-7f8e-4342-adc6-237e8c2103f2.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/99bbeba4-f45c-483b-afa9-6cb289f1b9d4.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/a1756ae3-6d58-453a-b21f-e9143d5344c3.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/ec7e54b1-bbe9-4e7b-9e5d-85b6f1af3051.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": false,
"new": true,
"why": "Revised: 'I grow aloft' -> 'I lift what they lost' (you couldn't tell what the old line meant). Rest unchanged.",
"lyrics": "[Verse]\nBreathe out slow\nThe air is thick\nNo need to run\nNo need, no trick\n\nDown in the leaf\nWhere the dead go soft\nI grow in the dark\nAnd I lift what they lost\n\nI do not hate\nI do not hurry\nI only compost\nYour little worry\n\n[Pre-Chorus]\nHear the hush\nIn the rotting loam\nA quiet spore\nComes floating home\n\nOne soft breath\nAnd the count begins\nA gentle green\nBeneath your skin\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\n[Verse]\nThe sporelings burst\nAnd scatter wide\nA poison field\nWhere they died\n\nThe slinger spits\nFrom the quiet back\nA drifting rot\nOn the wind, a track\n\nThe fungal hulk\nSplits open slow\nA bigger bloom\nWhere the dead things grow\n\n[Pre-Chorus]\nHear the sigh\nIn the poisoned ground\nDon't stand your line\nWhere the spores come down\n\nContagion leaps\nFrom man to man\nA green that spreads\nAs only rot can\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\n[Bridge]\nThere is no rushing rot, my friend\nThere is only when and how\nA patient thing that grows in the dark\nWas always coming, now\n\nSo push, so run\nDon't linger, don't stay\nBut the field you're standing in\nIs mine anyway\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\nAmanita, Amanita\nFall and bloom\nAmanita, Amanita\nFeed the room\nDown in the dark where the dead things flower\nEvery last breath I keep\nAmanita, Amanita\nYou are soil now, sleep (you are soil now, sleep)"
}
];
const blocked = (function(){ try { return window.self !== window.top; } catch(e){ return true; } })();
if (blocked) document.body.classList.add("blocked");
const picks = JSON.parse(localStorage.getItem("wl_picks_r3") || "{}");
const comments = JSON.parse(localStorage.getItem("wl_comments_r3") || "{}");
const esc = t => (t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
const GROUPS = {pack:"Pack Anthems", enemy:"Enemy Villain Themes"};
/* one shared <audio> for the whole page — iOS chokes and lags once ~dozens of
separate audio elements have each buffered a track; a single reused element
keeps memory flat no matter how far down the list you play. */
const GAU=new Audio(); GAU.preload="none"; let curPl=null, curUrl=null;
GAU.addEventListener("play",()=>{ if(curPl)curPl.pp.textContent="❚❚"; updateBar(); });
GAU.addEventListener("pause",()=>{ if(curPl)curPl.pp.textContent="►"; updateBar(); });
GAU.addEventListener("ended",()=>{ if(curPl){curPl.pp.textContent="►";curPl.sk.value=0;curPl.tt.textContent="0:00";} updateBar(); });
GAU.addEventListener("timeupdate",()=>{ if(curPl&&!curPl.se&&GAU.duration){curPl.sk.value=Math.round(GAU.currentTime/GAU.duration*1000);curPl.tt.textContent=fmt(GAU.currentTime);} });
function setPick(id, take){ if(picks[id]===take) delete picks[id]; else picks[id]=take;
localStorage.setItem("wl_picks_r3", JSON.stringify(picks)); render(); }
function player(url){
if(!url) return '<span class="gen">\u23f3 generating\u2026</span>';
if(blocked) return '<button class="linkbtn" data-url="'+url+'">▶ copy track link ↗</button>';
return '<span class="pl" data-url="'+url+'"><button class="pp" type="button" aria-label="Play">►</button>'+
'<input type="range" class="seek" min="0" max="1000" value="0" aria-label="Seek">'+
'<span class="tt">0:00</span></span>';
}
function fmt(s){ s=Math.max(0,Math.floor(s||0)); return Math.floor(s/60)+":"+String(s%60).padStart(2,"0"); }
function songHTML(s){
const chosen=picks[s.id];
return '<div class="song'+(chosen?" done":"")+'">'+
'<div class="song-head"><div class="num">'+String(s.n).padStart(2,"0")+'</div>'+
'<div class="titles"><p class="title">'+s.title+'</p>'+
'<p class="for">for <b>'+s.forName+'</b></p><span class="chip">'+s.genre+'</span>'+(s.rev?'<span class="chip rev">↻ revised — re-listen</span>':'')+(s.new?'<span class="chip new">★ new version</span>':'')+'</div></div>'+
(s.why?'<p class="why">'+s.why+'</p>':'')+
'<div class="takes">'+
s.takes.map(function(t){var k=t.lab.toLowerCase();
var div=(t.lab==="C")?'<div class="takediv">earlier takes \u00b7 made with v4.5+</div>':'';
return div+'<div class="take'+(t.old?' old':'')+'"><span class="lab">'+t.lab+(t.old?' <span class="v45">v4.5+</span>':'')+'</span>'+player(t.url)+
'<button class="pick '+(chosen===k?'on':'')+'" data-id="'+s.id+'" data-take="'+k+'">'+(chosen===k?'✓':'Pick')+'</button></div>';}).join('')+
'</div>'+
'<details class="lyr"><summary>\u25b8 Lyrics</summary><pre class="lyrbody">'+esc(s.lyrics)+'</pre></details>'+
'<textarea class="cmt" data-id="'+s.id+'" rows="1" placeholder="Notes for a new version (optional) — e.g. faster, less guitar, love the chorus…">'+esc(comments[s.id])+'</textarea></div>';
}
function render(){
const list=document.getElementById("list"); let html=""; let last=null;
for(const s of SONGS){ if(s.kind!==last){ html+='<p class="group-label">'+(GROUPS[s.kind]||"")+'</p>'; last=s.kind; } html+=songHTML(s); }
list.innerHTML=html;
list.querySelectorAll(".pick").forEach(b=>b.onclick=()=>setPick(b.dataset.id,b.dataset.take));
list.querySelectorAll(".linkbtn").forEach(b=>b.onclick=()=>{ const u=b.dataset.url;
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(u).then(()=>{b.textContent="✓ link copied";},()=>{});
try{ window.open(u,"_blank"); }catch(e){} });
list.querySelectorAll(".cmt").forEach(c=>{ const grow=()=>{c.style.height="auto";c.style.height=Math.max(40,c.scrollHeight)+"px";}; if(c.value)grow();
c.addEventListener("input",()=>{ if(c.value.trim())comments[c.dataset.id]=c.value; else delete comments[c.dataset.id];
localStorage.setItem("wl_comments_r3",JSON.stringify(comments)); grow(); }); });
curPl=null;
list.querySelectorAll(".pl").forEach(pl=>{
const pp=pl.querySelector(".pp"),sk=pl.querySelector(".seek"),tt=pl.querySelector(".tt"),url=pl.dataset.url;
const me={pp,sk,tt,url,se:false};
if(url===curUrl){ curPl=me; if(!GAU.paused)pp.textContent="❚❚";
if(GAU.duration){sk.value=Math.round(GAU.currentTime/GAU.duration*1000);tt.textContent=fmt(GAU.currentTime);} }
pp.addEventListener("click",()=>{
if(curPl===me){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); return; }
if(curPl){ curPl.pp.textContent="►"; curPl.sk.value=0; curPl.tt.textContent="0:00"; }
curPl=me; curUrl=url; GAU.src=url; GAU.play().catch(()=>{});
});
sk.addEventListener("input",()=>{ if(curPl!==me)return; me.se=true; if(GAU.duration)tt.textContent=fmt(sk.value/1000*GAU.duration); });
sk.addEventListener("change",()=>{ if(curPl!==me)return; if(GAU.duration)GAU.currentTime=sk.value/1000*GAU.duration; me.se=false; });
});
document.getElementById("prog").textContent=Object.keys(picks).length+" / "+SONGS.length+" picked";
}
document.getElementById("copy").onclick=()=>{
const lines=["Warlords soundtrack — Hari's picks & notes:",""];
for(const s of SONGS){ const p=picks[s.id],c=comments[s.id];
lines.push(String(s.n).padStart(2,"0")+'. '+s.forName+' — "'+s.title+'" ('+s.genre+'): '+(p?"Take "+p.toUpperCase():"— no pick"));
if(c) lines.push(' notes: '+c.replace(/\n/g," ")); }
const text=lines.join("\n"),btn=document.getElementById("copy");
const done=()=>{btn.textContent="Copied!";btn.classList.add("done");setTimeout(()=>{btn.textContent="Copy picks";btn.classList.remove("done");},1800); if(window.__hariWalkout)window.__hariWalkout();};
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done,()=>fb(text,done)); else fb(text,done);
};
function fb(t,done){const ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");}catch(e){}ta.remove();done();}
render();
/* ---- transport bar: prev / play-pause / skip through every take ---- */
function trackInfo(url){ for(const s of SONGS){ if(s.a===url) return {t:s.title,who:s.forName,take:"A"}; if(s.b===url) return {t:s.title,who:s.forName,take:"B"}; } return null; }
function updateBar(){
const bp=document.getElementById("bplay"), now=document.getElementById("now"); if(!bp) return;
bp.textContent = (curUrl && !GAU.paused) ? "❚❚" : "►";
const info = curUrl ? trackInfo(curUrl) : null;
now.innerHTML = info ? ('<b>'+esc(info.t)+'</b> · '+esc(info.who)+' — Take '+info.take) : "tap ► on any take · ⏭ to skip through";
}
function pls(){ return [...document.querySelectorAll("#list .pl")]; }
function skipBy(dir){
const a=pls(); if(!a.length) return;
let i=a.findIndex(p=>p.dataset.url===curUrl);
i = i<0 ? (dir>0?0:a.length-1) : (((i+dir)%a.length)+a.length)%a.length;
a[i].querySelector(".pp").click();
const song=a[i].closest(".song"); if(song) song.scrollIntoView({behavior:"smooth",block:"center"});
}
document.getElementById("bnext").onclick=()=>skipBy(1);
document.getElementById("bprev").onclick=()=>skipBy(-1);
document.getElementById("bplay").onclick=()=>{ if(curUrl){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); } else skipBy(1); };
updateBar();
/* ---- groovy moving tie-dye background ---- */
(function(){
const bg=document.getElementById("bg"), ctx=bg.getContext("2d");
const reduce=matchMedia("(prefers-reduced-motion:reduce)").matches;
const SC=14; let img,d,W,H,t=0;
function hsl(h,s,l){ h/=360; const q=l<.5?l*(1+s):l+s-l*s, p=2*l-q;
const f=x=>{ x=(x%1+1)%1; if(x<1/6)return p+(q-p)*6*x; if(x<.5)return q; if(x<2/3)return p+(q-p)*(2/3-x)*6; return p; };
return [f(h+1/3)*255|0, f(h)*255|0, f(h-1/3)*255|0]; }
function fit(){ W=bg.width=Math.max(2,Math.ceil(innerWidth/SC)); H=bg.height=Math.max(2,Math.ceil(innerHeight/SC));
img=ctx.createImageData(W,H); d=img.data; for(let i=3;i<d.length;i+=4)d[i]=255; }
function paint(){ const cx=W/2, cy=H*0.3;
for(let y=0;y<H;y++)for(let x=0;x<W;x++){
let v=Math.sin(x*0.18+t)+Math.sin(y*0.16+t*0.9)+Math.sin((x+y)*0.11+t*0.7)+Math.sin(Math.hypot(x-cx,y-cy)*0.17-t*1.15);
let hue=((v*48+t*26)%360+360)%360; const c=hsl(hue,0.72,0.5);
const i=(y*W+x)*4; d[i]=c[0]; d[i+1]=c[1]; d[i+2]=c[2]; }
ctx.putImageData(img,0,0); }
fit(); addEventListener("resize",fit);
if(reduce){ paint(); }
else { (function loop(){ t+=0.02; paint(); requestAnimationFrame(loop); })(); }
})();
/* ---- Ragdoll Hari: pops out every 2 min, a different dance each time ---- */
(function(){
const cv=document.getElementById("hari"), ctx=cv.getContext("2d");
if(matchMedia("(prefers-reduced-motion:reduce)").matches) return;
const A="#f7f0e2"; let raf=0, t0=0, style="flail", fromLeft=true, order=[], oi=0;
const STYLES=["flail","disco","robot","twist","jack","headbang","charleston"];
const P=Math.PI;
function fit(){ cv.width=cv.clientWidth; cv.height=170; }
function seg(x1,y1,a,l){ const x2=x1+Math.cos(a)*l,y2=y1+Math.sin(a)*l; ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke(); return [x2,y2]; }
function walkPose(ph){ const sw=Math.sin(ph*7); return {la:P*0.55+sw*0.55, ra:P*0.55-sw*0.55, lae:0, rae:0, ll:P*0.5+sw*0.5, rl:P*0.5-sw*0.5, hop:0, lean:0}; }
function dance(st,ph){ const S=Math.sin, R=x=>Math.round(x*2)/2;
if(st==="disco"){ const up=S(ph*2.4)>0; return {la:up?-2.3:1.9, ra:up?1.9:-2.3, lae:.1, rae:.1, ll:P*0.5+S(ph*4.8)*.3, rl:P*0.5-S(ph*4.8)*.3, hop:Math.abs(S(ph*2.4))*9, lean:S(ph*2.4)*.22}; }
if(st==="robot"){ return {la:-1.2+R(S(ph*2))*1.1, ra:-1.2-R(S(ph*2+1))*1.1, lae:R(S(ph*3))*.6, rae:R(S(ph*3+1))*.6, ll:P*0.5+R(S(ph*2))*.3, rl:P*0.5-R(S(ph*2))*.3, hop:0, lean:R(S(ph))*.12}; }
if(st==="twist"){ return {la:P*0.5+S(ph*3.5)*.8, ra:P*0.5-S(ph*3.5)*.8, lae:.3, rae:.3, ll:P*0.5+S(ph*3.5)*.3, rl:P*0.5-S(ph*3.5)*.3, hop:Math.abs(S(ph*7))*4, lean:S(ph*3.5)*.4}; }
if(st==="jack"){ const o=(S(ph*4.5)+1)/2; return {la:-P*0.5-o*1.3, ra:-P*0.5+o*1.3, lae:0, rae:0, ll:P*0.5+o*.55, rl:P*0.5-o*.55, hop:o*12, lean:0}; }
if(st==="headbang"){ return {la:P*0.62+S(ph*7)*.35, ra:P*0.62-S(ph*7)*.35, lae:.2, rae:.2, ll:P*0.5+.06, rl:P*0.5-.06, hop:Math.abs(S(ph*7))*5, lean:.55+S(ph*7)*.5}; }
if(st==="charleston"){ const k=S(ph*4); return {la:P*0.5+k*.9, ra:P*0.5+k*.9, lae:-.5, rae:-.5, ll:P*0.5+k*.7, rl:P*0.5-k*.7, hop:Math.abs(S(ph*4))*7, lean:-k*.18}; }
/* flail */ return {la:-2.9+S(ph*7)*1.0, ra:-0.2+S(ph*7+1.6)*1.0, lae:S(ph*10)*.9, rae:S(ph*10+1)*.9, ll:P*0.5+S(ph*5)*.55, rl:P*0.5-S(ph*5)*.55, hop:Math.abs(S(ph*5))*15, lean:S(ph*3)*.3};
}
function draw(x,ground,ph,pose){
ctx.strokeStyle=A; ctx.fillStyle=A; ctx.lineWidth=4; ctx.lineCap="round"; ctx.lineJoin="round";
const hipY=ground-30-pose.hop, torso=-P/2+pose.lean;
const [nx,ny]=seg(x,hipY,torso,26);
const hx=nx+Math.cos(torso)*9, hy=ny+Math.sin(torso)*9;
ctx.beginPath(); ctx.arc(hx,hy,8.5,0,P*2); ctx.stroke();
let [ex,ey]=seg(nx,ny,pose.la,15); seg(ex,ey,pose.la+pose.lae,12);
[ex,ey]=seg(nx,ny,pose.ra,15); seg(ex,ey,pose.ra+pose.rae,12);
let [kx,ky]=seg(x,hipY,pose.ll,17); seg(kx,ky,pose.ll+0.25,15);
[kx,ky]=seg(x,hipY,pose.rl,17); seg(kx,ky,pose.rl+0.25,15);
ctx.font="bold 12px ui-monospace, monospace"; ctx.textAlign="center";
ctx.fillText("HARI", hx, hy-16-(pose.hop>1?pose.hop*0.4:0));
}
function frame(now){
const tt=(now-t0)/1000; ctx.clearRect(0,0,cv.width,cv.height);
const W=cv.width, ground=cv.height-14, cx=W/2;
const EN=4.5, DA=9, EX=4.5;
let x, pose;
if(tt<EN){ const p=tt/EN; x=fromLeft ? -50+(cx+50)*p : (W+50)-((W+50)-cx)*p; pose=walkPose(tt); }
else if(tt<EN+DA){ x=cx; pose=dance(style, tt-EN); }
else if(tt<EN+DA+EX){ const p=(tt-EN-DA)/EX; x=fromLeft ? cx+(W+60-cx)*p : cx-(cx+60)*p; pose=walkPose(tt); }
else { cv.style.display="none"; cancelAnimationFrame(raf); raf=0; return; }
draw(x,ground,tt<EN?tt:(tt-EN),pose); raf=requestAnimationFrame(frame);
}
function nextStyle(){ if(oi>=order.length){ order=STYLES.slice().sort(()=>Math.random()-0.5); oi=0; } return order[oi++]; }
function walkout(){ if(raf) return; style=nextStyle(); fromLeft=Math.random()<0.5; cv.style.display="block"; fit(); t0=performance.now(); raf=requestAnimationFrame(frame); }
addEventListener("resize",()=>{ if(cv.style.display!=="none") fit(); });
window.__hariWalkout=walkout;
const soon=/dance|hari|test/i.test(location.hash);
if(soon) setTimeout(walkout, 2000);
setInterval(walkout, 120000);
})();
</script>
<title>Warlords — Pick the Take (for Hari)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root{
--ink:#f7f0e2; --muted:#c8b7a0; --faint:#93856f; --line:rgba(255,244,220,.14);
--amber:#f0b24a; --amber-dim:rgba(240,178,74,.18);
--teal:#63c6da; --teal-dim:rgba(99,198,218,.18);
--serif:"Iowan Old Style",Georgia,"Palatino Linotype","Book Antiqua",serif;
--sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
--mono:ui-monospace,"SF Mono","Cascadia Code",Consolas,monospace;
--card:rgba(24,20,26,.74);
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{ margin:0; color:var(--ink); font-family:var(--sans); line-height:1.5;
background:#120e16; padding-bottom:76px; position:relative; }
#bg{position:fixed; inset:0; width:100vw; height:100vh; z-index:-3; transform:scale(1.15);
filter:blur(30px) saturate(1.6) brightness(1.02); image-rendering:auto}
#scrim{position:fixed; inset:0; z-index:-2; pointer-events:none;
background:radial-gradient(120% 90% at 50% 0%, rgba(10,8,14,.28), rgba(8,6,12,.6) 75%)}
@media(prefers-reduced-motion:reduce){ #bg{filter:blur(34px) saturate(1.3)} }
.wrap{max-width:880px; margin:0 auto; padding:44px 20px 40px; position:relative; z-index:1}
header{border-bottom:1px solid var(--line); padding-bottom:26px}
.eyebrow{font-family:var(--mono); font-size:12px; letter-spacing:.22em; text-transform:uppercase;
color:var(--amber); margin:0 0 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
h1{font-family:var(--serif); font-weight:600; font-size:clamp(32px,6.4vw,50px); line-height:1.04;
margin:0 0 14px; text-wrap:balance; letter-spacing:-.01em; text-shadow:0 2px 16px rgba(0,0,0,.65)}
h1 .wave{display:inline-block; transform-origin:70% 70%; animation:wave 2.4s ease-in-out 1s 2}
@keyframes wave{0%,60%,100%{transform:rotate(0)}70%{transform:rotate(16deg)}80%{transform:rotate(-8deg)}90%{transform:rotate(12deg)}}
@media(prefers-reduced-motion:reduce){h1 .wave{animation:none}}
.lede{color:var(--muted); font-size:16.5px; max-width:62ch; margin:0; text-shadow:0 1px 10px rgba(0,0,0,.6)}
.lede b{color:#fff; font-weight:600}
.sig{color:var(--faint); font-style:italic; font-family:var(--serif); margin:12px 0 0; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend{display:flex; gap:18px; flex-wrap:wrap; margin-top:20px; font-family:var(--mono);
font-size:12px; color:var(--muted); letter-spacing:.03em; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend span{display:inline-flex; align-items:center; gap:7px}
.dot{width:10px; height:10px; border-radius:50%}
.dot.a{background:var(--amber)} .dot.b{background:var(--teal)}
.banner{display:none; margin:20px 0 0; padding:13px 16px; border-radius:11px;
background:rgba(20,60,70,.6); border:1px solid rgba(99,198,218,.45); color:var(--ink); font-size:14.5px}
body.blocked .banner{display:block}
.banner b{color:var(--teal)}
.group-label{font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase;
color:var(--muted); margin:34px 2px 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.song{background:var(--card); backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
border:1px solid var(--line); border-radius:14px; padding:20px 22px 18px; margin:14px 0; transition:border-color .2s}
.song.done{border-color:rgba(240,178,74,.5)}
.song-head{display:flex; gap:16px; align-items:baseline}
.num{font-family:var(--mono); font-size:13px; color:var(--faint); font-variant-numeric:tabular-nums; padding-top:5px; min-width:26px}
.titles{flex:1; min-width:0}
.title{font-family:var(--serif); font-size:23px; font-weight:600; line-height:1.15; margin:0}
.for{color:var(--muted); font-size:14px; margin:3px 0 0}
.for b{color:var(--ink); font-weight:600}
.chip{display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:.04em;
color:var(--amber); border:1px solid var(--amber-dim); background:var(--amber-dim);
padding:2px 9px; border-radius:100px; margin-top:9px; text-transform:lowercase}
.chip.rev{color:var(--teal); border-color:var(--teal-dim); background:var(--teal-dim); text-transform:none; margin-left:6px}
.hook{color:var(--faint); font-style:italic; font-family:var(--serif); font-size:15px; margin:11px 0 0; padding-left:42px}
.takes{display:flex; flex-direction:column; gap:9px; margin:16px 0 0 42px}
.take{display:flex; align-items:center; gap:11px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:10px; padding:9px 13px}
.take .lab{font-family:var(--mono); font-size:11px; letter-spacing:.12em; width:26px; flex:0 0 auto}
.take.a .lab{color:var(--amber)} .take.b .lab{color:var(--teal)}
.pl{flex:1; min-width:150px; display:flex; align-items:center; gap:10px}
.pp{flex:0 0 auto; width:36px; height:36px; border-radius:50%; border:0; cursor:pointer; padding:0;
font-size:13px; line-height:1; display:grid; place-items:center; font-family:var(--sans)}
.take.a .pp{background:var(--amber); color:#241a08} .take.b .pp{background:var(--teal); color:#08222a}
.pp:active{transform:scale(.93)}
.seek{flex:1; min-width:60px; height:22px; -webkit-appearance:none; appearance:none; background:transparent; cursor:pointer; margin:0}
.seek::-webkit-slider-runnable-track{height:4px; border-radius:3px; background:rgba(255,255,255,.28)}
.seek::-moz-range-track{height:4px; border-radius:3px; background:rgba(255,255,255,.28)}
.seek::-webkit-slider-thumb{-webkit-appearance:none; margin-top:-5px; width:14px; height:14px; border-radius:50%; border:0; background:var(--muted)}
.seek::-moz-range-thumb{width:14px; height:14px; border-radius:50%; border:0; background:var(--muted)}
.take.a .seek::-webkit-slider-thumb{background:var(--amber)} .take.a .seek::-moz-range-thumb{background:var(--amber)}
.take.b .seek::-webkit-slider-thumb{background:var(--teal)} .take.b .seek::-moz-range-thumb{background:var(--teal)}
.tt{font-family:var(--mono); font-size:11px; color:var(--muted); min-width:30px; text-align:right; font-variant-numeric:tabular-nums; flex:0 0 auto}
.linkbtn{flex:1; min-width:140px; text-align:left; font-family:var(--mono); font-size:12.5px;
color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:8px; padding:8px 11px; cursor:pointer}
.pick{appearance:none; cursor:pointer; font-family:var(--sans); font-size:13px; flex:0 0 auto;
font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:8px; padding:7px 12px; transition:all .15s}
.pick:hover{color:var(--ink); border-color:var(--muted)}
.take.a .pick.on{background:var(--amber); color:#241a08; border-color:var(--amber)}
.take.b .pick.on{background:var(--teal); color:#08222a; border-color:var(--teal)}
.cmt{display:block; width:calc(100% - 42px); margin:11px 0 0 42px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:9px; color:var(--ink); font-family:var(--sans);
font-size:13.5px; line-height:1.45; padding:9px 12px; resize:vertical; min-height:40px}
.cmt::placeholder{color:var(--faint)}
.cmt:focus{border-color:var(--muted); outline:none}
@media(max-width:560px){
.takes{margin-left:0} .hook{padding-left:0} .cmt{width:100%; margin-left:0}
.wrap{padding:34px 15px 34px} .song{padding:16px 14px 14px}
.song-head{gap:11px} .num{min-width:20px}
.take{gap:8px; padding:8px 10px} .pl{min-width:0; gap:8px}
.pp{width:34px; height:34px} .seek{min-width:36px; height:26px} .pick{padding:7px 11px}
.bar-in{padding:9px 13px; gap:10px}
.prog{display:none}
.tb{width:34px; height:34px} .tb.tb-main{width:38px; height:38px} .transport{gap:6px}
.copy{padding:9px 13px}
}
.bar{position:fixed; left:0; right:0; bottom:0; background:rgba(14,10,18,.9);
backdrop-filter:blur(10px); border-top:1px solid var(--line); z-index:10}
.bar-in{max-width:880px; margin:0 auto; padding:12px 20px; display:flex; align-items:center; gap:16px}
.prog{font-family:var(--mono); font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; flex:1}
.copy{appearance:none; cursor:pointer; font-family:var(--sans); font-weight:600; font-size:14px;
color:#241a08; background:var(--amber); border:0; border-radius:9px; padding:9px 16px}
.copy.done{background:var(--teal); color:#08222a}
.transport{display:flex; align-items:center; gap:8px; flex:0 0 auto}
.tb{width:38px; height:38px; border-radius:50%; border:1px solid var(--line); background:rgba(255,255,255,.06);
color:var(--ink); font-size:14px; cursor:pointer; display:grid; place-items:center; padding:0; line-height:1}
.tb:active{transform:scale(.92)}
.tb.tb-main{background:var(--amber); color:#241a08; border-color:var(--amber); width:42px; height:42px; font-size:15px}
.tb.tb-next{border-color:var(--amber); color:var(--amber)}
.now{flex:1; min-width:0; font-family:var(--mono); font-size:12.5px; color:var(--muted);
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.now b{color:var(--ink); font-weight:600}
.note{color:var(--muted); font-size:13px; margin:26px 2px 0; text-align:center; font-family:var(--mono); text-shadow:0 1px 8px rgba(0,0,0,.6)}
:focus-visible{outline:2px solid var(--amber); outline-offset:2px}
#hari{position:fixed; left:0; bottom:52px; width:100%; height:170px; pointer-events:none; z-index:40; display:none}
.why{margin:.5rem 0 .1rem;padding:.55rem .7rem;border-left:3px solid #7bd88f;
background:rgba(123,216,143,.09);border-radius:0 6px 6px 0;font-size:.93rem;line-height:1.45;color:#d9f2df}
.chip.new{background:rgba(255,209,102,.16);border-color:rgba(255,209,102,.5);color:#ffd166}
.lyr{margin:.55rem 0 .1rem;border-top:1px solid rgba(255,255,255,.09);padding-top:.4rem}
.lyr summary{cursor:pointer;font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:#9fb4c9;
list-style:none;user-select:none;padding:.15rem 0;opacity:.85}
.lyr summary:hover{color:#d9f2df;opacity:1}
.lyr summary::-webkit-details-marker{display:none}
.lyr[open] summary{color:#d9f2df;opacity:1}
.lyrbody{margin:.4rem 0 .2rem;padding:.7rem .8rem;background:rgba(0,0,0,.28);border-radius:8px;
font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-size:.86rem;line-height:1.5;
white-space:pre-wrap;color:#e5eef6;max-height:22rem;overflow:auto}
.gen{display:inline-flex;align-items:center;gap:.4rem;font-size:.85rem;color:#ffd166;opacity:.85;font-style:italic}
.takediv{grid-column:1/-1;margin:.55rem 0 .15rem;font-size:.72rem;letter-spacing:.05em;text-transform:uppercase;
color:#8aa0b6;opacity:.75;border-top:1px dashed rgba(255,255,255,.13);padding-top:.4rem}
.take.old{opacity:.72}
.take.old .lab{color:#9fb4c9}
.v45{display:inline-block;margin-left:.3rem;padding:.02rem .32rem;border-radius:5px;font-size:.62rem;font-weight:700;
letter-spacing:.03em;vertical-align:middle;background:rgba(255,209,102,.16);color:#ffd166;border:1px solid rgba(255,209,102,.4)}
</style>
<canvas id="bg"></canvas><div id="scrim"></div>
<div class="wrap">
<header>
<p class="eyebrow">A favor for Hari · Warlords Soundtrack</p>
<h1>Round 4, Hari. <span class="wave">👋</span></h1>
<p class="lede"><b>Your notes are all in.</b> 37 of the 47 songs are settled and off this page — they're in the game. What's left is <b>only the ones you asked us to redo</b>. The big takeaway from your feedback was <b>too much metal</b>, so most of these changed genre outright rather than getting a lyric tweak; the green line under each song says exactly what changed and what to listen for. Same as before — play both takes, pick one, <b>leave a note</b> if it's still not right. <b>Everything saves as you go</b> — hit <b>Copy picks</b> at the bottom and send it back.</p>
<p class="lede" style="opacity:.8"><b>Three more are still coming:</b> Hoarfrost, The Lost Witch and The Brothers. Suno rate-limited us mid-batch — they'll be added to this page as soon as they're through, so check back.</p>
<p class="sig">Seriously, thanks Hari — this helps a ton.</p>
<div class="banner">
🔊 <b>Heads up, Hari:</b> audio won't stream inside this preview window. Open the <b>warlords_soundtrack.html</b> file Paul sent you, or use the <b>copy-link</b> buttons. You can still pick and leave notes here.
</div>
<div class="legend">
<span><span class="dot a"></span> Take A</span>
<span><span class="dot b"></span> Take B</span>
<span>tap ► to play · drag to seek</span>
</div>
</header>
<div id="list"></div>
<p class="note" id="foot">More still rendering — this page grows as they finish.</p>
</div>
<div class="bar"><div class="bar-in">
<div class="transport">
<button class="tb" id="bprev" type="button" aria-label="Previous take" title="Previous"></button>
<button class="tb tb-main" id="bplay" type="button" aria-label="Play or pause" title="Play / pause"></button>
<button class="tb tb-next" id="bnext" type="button" aria-label="Skip to next take" title="Skip"></button>
</div>
<span class="now" id="now">tap ► on any take · ⏭ to skip through</span>
<span class="prog" id="prog">0 picked</span>
<button class="copy" id="copy">Copy picks</button>
</div></div>
<canvas id="hari"></canvas>
<script>
const SONGS = [
{
"id": "the_brothers",
"kind": "big",
"forName": "The Twins",
"title": "Back to Back",
"genre": "rowdy Celtic folk-punk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/9f1decfd-ce37-4321-97d1-fa31e13c6107.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/12dddb6a-a81e-43ec-8610-2c781500db9a.mp3",
"model": "v5.5",
"old": false
}
],
"rev": true,
"new": false,
"why": "You picked B but said the two voices sounded identical — one person contradicting himself. Recast as a MALE + FEMALE duet, and the pair are now THE TWINS in-game: Haft the brother, Hew the sister. Lyrics restructured so the voices never blend.",
"lyrics": "[Intro - spoken, over an accordion drone and boot stomps]\n[Female]\nWhose round is it?\n[Male]\nYours. Has been yours since the Ember Wastes.\n[Female]\nI bled at the Ember Wastes.\n[Male]\nYou bled after I paid.\n\n[Verse 1 - MALE VOICE only, deep and gravelly]\nI carry the hilt half of father's old sword,\nshe got the point, and I got the word.\nI hold the line, I plant and I stay,\nBrutes in a row and they don't give way.\nLegionnaires braced till the shieldwall's a hill —\nI've held that hill since we were seven, and I'm holding it still.\n\n[Verse 2 - FEMALE VOICE only, bright and fierce]\nYou snapped that sword on the cellar door, drunk as a lord,\nso don't you preach me one holy word.\nI don't hold nothing — holding's for stone.\nI slip in behind where the ground looks alone,\npast the shieldwall, and they don't see a wall,\nstraight for the throat of it all.\n\n[Pre-Chorus - MALE VOICE only]\nNever agreed on a road, never agreed on a price,\nnever agreed which of us was born first.\n[Pre-Chorus - FEMALE VOICE only]\n(It was me.)\n[Both]\nBut we agreed on one thing — we only ever agreed on one thing —\n\n[Chorus - BOTH voices, male and female in harmony, whole tavern shouting]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Verse 3 - MALE VOICE only, the Blackreed bog]\nAt the Blackreed bog, I hauled her out of the muck,\ntwelve men on her, half her shield-arm stuck.\nThat's how it went, whatever she says —\nshe was face down in the moss, and I bled for that debt.\n\n[Verse 4 - FEMALE VOICE only]\nThat is NOT how it went, and it never was —\nI hauled him out, and the moss has no cause.\nOne squad of yours to hold the lane,\none squad of mine in your soft parts, deep.\nAsk anyone who saw it.\n[Male]\nEveryone who saw it died.\n\n[Chorus - BOTH voices, male and female in harmony, whole tavern shouting]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Bridge - soft, everything drops to a lone fiddle]\n[Male]\nSister.\n[Female]\nAye, brother. Back to back.\n[Both]\nCut down the wall and the knives run free,\ncut down the knives and the wall runs deep,\nand whichever of us you leave standing there\nfights with the other's fury and the other's share.\n\n[Verse 5 - trading, low and serious]\n[Male]\nYou never thanked me for the pass at Ash.\n[Female]\nYou never needed thanking — you'd have done it for the dog.\n[Male]\nI'd have done it for the dog. And the dog agrees with me.\n[Female]\n...Aye. Fair.\n\n[Chorus - BOTH voices, full tavern, everyone off their stools]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nYou'll have to kill the two of us — you'll have to choose which one!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Outro - slowing to one stomp and a tin whistle]\n[Both]\nNever agreed on nothin' — never had to.\n[Male]\nI'm the elder.\n[Female]\nYou're not.\n[Male]\nI am.\n[Female]\nYou're NOT.\n[Both]\nBack to back."
},
{
"id": "infernal_legion",
"kind": "big",
"forName": "Infernal Legion",
"title": "Blood Summon",
"genre": "hypnotic hill-country blues drone",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/fe24d01a-c463-4fb5-9500-0e8c7f338fdd.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/61b3fe1b-9103-4ec8-ae45-8b849f46a80a.mp3",
"model": "v5.5",
"old": false
}
],
"rev": true,
"new": false,
"why": "You picked A but said the lyrics were too hard to follow. Rewritten to TELL THE STORY — one chord, the ground splits open, hell floods out, then you learn to lead them (real or in your head?) — instead of going card by card.",
"lyrics": "[Intro — a lone distorted slide riff looping low, boards keeping the stomp, a hum underneath]\n(hummed, low) Mmm... low down... mmm...\n(spoken, quiet) Just me and the one chord tonight.\n\n[Verse 1]\nSun went down and I sat down alone\nOne low chord on a road nobody's on\nNo band, no crowd, no name on a sign\nJust my thumb on the wire and the wire on my spine\nI don't play it loud, I play it slow\nSame note over till the whole field start to glow\n\n[Verse 2]\nThen the dirt got warm where my boot heel lay\nHummin' right back through the cotton and clay\nI held my hand still but the note played on\nPlayin' me now — and my sayin'-so was gone\n\n[Half-time — everything drops out, the riff hangs, leave it wide open]\n(spoken, plain) And then the ground came open.\nRight down the middle of the field,\nthe dirt split like a mouth.\nCindermaw, yawnin' up out the clay —\na hole with a red light livin' down in it.\nThat ain't thunder, friend.\nThat's the ground come up\nto answer the song.\n\n[Chorus — gospel-blues choir hums low behind]\nPlay it low, play it low, let the one note ring\nGround come open when the dirt hear it sing\nI never called 'em — the low note does\nBlood summon, risin' where the quiet was\nPlay it low, play it long, feel the hum climb\nSomethin' answerin' up from an older time\nHand on the steel and I won't let go —\nBlood summon, and they rise when I play it low\n\n[Verse 3 — the stomp comes back hard, crowded now]\nI wanted one. A hundred come climbin' out\nSmoke and shoulders and a red-throat shout\nFirst a shape come clawin' up out the seam\nTeeth in the dark like the tail of a dream\nI hollered 'get down!' but they don't hear 'no' —\nthey only hear the low, and I can't kill the low\n\n[Half-time — hush, just the hum and one voice]\n(spoken) Are they up out the dirt,\nor up out my head?\nCome mornin' I went lookin' — weren't no hole.\nBut the field was full.\nDon't matter which. Don't matter now.\nThey come when I play; they hush when I stop.\n\n[Verse 4 — the turn: he quits fighting, starts steering]\nSo I quit tryin' to send 'em back down\nBent the note and I turned 'em around\nPushed the chord and the whole pit leaned\nPulled it soft and the howlin' careened\nI ain't the fool who lost his grip —\nI'm the hand on the reins of this whole burnin' ship\n\n[Bridge — leading now; the stomp doubles]\nThere's a thing come up with a courier's grin,\nwants the throat of the world, won't be reined in —\nso I hold him on the low till I let it ride,\nand he cuts right where I point him, dead on time.\nAnd the big one waited in the back for a throne,\ncome up sure he'd lead — signed his name to my own.\nNow he waits on my hand like the rest of 'em wait.\nI set the tempo. He can hold the gate.\n\n[Final Chorus — full, choir swelling low, still un-shouted]\nPlay it low, play it low, let the one note ring\nWhole pit standin' when the dirt hear it sing\nI don't beg 'em up and I don't turn 'em loose —\nBlood summon, and the leash is the blues\nPlay it low, play it long, watch the legion lean\nDangerous as ever — but the danger's mine to mean\nHand on the steel and I won't let go —\nBlood summon, and they follow when I play it low\n\n[Outro — riff loops on, the hum sinks back toward the ground]\n(hushed) They never come for the words —\nthey come for the low, and the low is mine\nPlay it low... (play it low...)\nMarch 'em home on the one chord slow\nBlood summon... and I can't put it down\n(one chord, never resolves, fade into the hum)"
},
{
"id": "frost_yeti",
"kind": "big",
"forName": "The Frost Yeti",
"title": "Slow as the Cold",
"genre": "glacial post-rock",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/631054b1-1264-46ca-a23c-f4528b4d0fd8.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/ef4cec50-2979-4158-b8c0-f102f164944d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/a9e70e46-0214-4b39-9ff2-61a1bd5df7bf.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/b927d69a-9335-453a-938b-fda8a268d1c0.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked B but questioned 'so much death metal.' Redone off metal entirely: glacial post-rock, a clean deep baritone in an ice-cave, groaning ice as percussion. No growls.",
"lyrics": "[Intro: lone bone flute over deep sub-drone and groaning ice]\nNothing on this mountain is in a hurry\nNot the snow, not the stone\nNot the white shape on the shelf above you\nThat has stood there on its own\n\n[Verse: clean deep baritone, vast ice-cave reverb, slow swells beneath]\nI am not the storm that finds you\nI am the weight it leaves behind\nThe shelf that hangs above the valley\nThat the valley never minds\n\nTake one step onto my ground\nIt takes the step back out of you\nAnd a breath after you have crossed it\nYou are still crossing through\n\n[Pre-Chorus: low horn enters, slow calving-ice drums begin]\nYou are moving, you are moving\nJust a little less than before\nThen a little less than that was\nThen a little less once more\n\nI do not want your courage\nI have no use for your name\nI only ever take the speed\nAnd the ending is the same\n\n[Chorus: full mass, huge slow swell, wordless choir, colossal drums]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nNo shout in the whiteout, no charge and no horn\nOnly the long weight leaning till your line is worn\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Verse: swells drop back, bone flute answers the voice]\nThe frostlings go out ahead of me\nSmall white things that learned to stand\nYou cannot lay the cold on cold\nIt will not turn on its own hand\n\nThen the wolves, my only quickness\nCutting wide to where your bows are set\nThey take the archers in the open\nAnd the rest of you has not moved yet\n\nAnd the golem holds the middle\nA slab of me with armour on\nChip at him and he comes away sharper\nAnd he is still standing at dawn\n\n[Pre-Chorus: horn doubles, drums heavier]\nSo bring your fire, bring your hurry\nBring the fastest man you own\nThere is rime in every lane he takes\nAnd he gets here on his own\n\n[Chorus: half-weight, choir low]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\n\n[Bridge: everything falls away, bone flute alone in the cave, then the drums return twice as heavy]\nEvery other turn I open up my hands\nAnd the sky sits down to stay\nFrost, and then the blizzard after it\nAnd the whole white field goes grey\n\nYou will chip me. That is fair.\nThat is what an army's for.\nBut you get tired and I do not\nAnd I have done this before\n\n[Final Chorus: everything at full mass, choir wide open]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nYour banners hang wet and your drum's out of time\nThe field has gone white and the white is mine\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Outro: choir and drums fade to sub-drone, voice bare and low]\nNothing on this mountain was in a hurry\nNot the snow, not the stone\nAnd the white shape on the shelf above you\nIs coming down alone"
},
{
"id": "ashen_raiders",
"kind": "big",
"forName": "Ashen Raiders",
"title": "Nothing Left to Lose",
"genre": "hypnotic Saharan desert blues",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/68a657e9-8741-4e6d-873f-7278dc015583.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/622af261-fa96-40cd-9c38-0c308c1ed2a5.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/3741f801-8b79-4797-ad0c-0e2f5f7c5488.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/c2422a92-4d12-474e-a3ff-fd72239e3bc5.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A but said it was too close to Broodmother. Redone as Saharan desert blues — looping clean-tone guitar, djembe, chanted call-and-response. None of the old fuzz-rock hooks.",
"lyrics": "[Intro: Lone Clean Electric Guitar Loop]\n[Djembe, Calabash and Handclaps Enter]\n\n[Verse: Warlord Ash]\nWe did not ride here from a country\nWe rode out of a burn\nThere was green behind us one time\nThere is nothing to return\nThey said ash like it meant nothing\nWe took ash up for a name\n\n[Refrain: Call and Response]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nYou will say the dust came with us\nNo — the dust was always here\nWe put it down across your lowlands\nIn a dry month of a dead year\nEvery lane you choose to stand in\nYou will stand it in the grey\n\n[Verse: The Slingers]\nTake a fistful of the ground up\nGrit and grave-dust, that's the load\nDo not throw it at his shield arm\nThrow it where he reads the road\nLet him cut at what he's hearing\nLet him guard the empty air\n\n[Percussion Break: Calabash, Handclaps and the Guitar Loop Only]\n\n[Call and Response]\n(Where is the green?) Ahead\n(Where is the green?) Ahead\n(What is behind us?) Grey\n(What did we leave them?) Grey\n(What have we got?) Nothing\n(What can they take?) Nothing\n\n[Verse: Warlord Ash]\nPut my rider in the dirt then\nCall it clean and call it won\nThe horse is finished — he is not\nHe stands up and he keeps on coming on\nThere is no witch behind this army\nNo book, no bargain and no god\n\n[Bridge: Spoken low over the loop]\nYou have things. That is the whole of your disadvantage.\nYou have a line to hold, a lord to keep breathing, a wagon of green behind you.\nWe have a direction.\n\n[Verse: The Screamer]\nNow we set one down behind you\nNot for plunder, not for grain\nHe goes past your spears like a stranger\nHe is hunting for the name\nAnd the sound he makes on landing\nIs the sound your whole line makes when it falls\n\n[Refrain: Call and Response — Full Group]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nWhen it's over we won't hold it\nWe don't want the walls you made\nWe want one hour in the green grass\nThen the green goes to the grey\nMen who have got nothing left to lose\nRiding at whatever's left of yours\n\n[Outro: Guitar Loop Alone, Percussion Falling Away]\nAsh (ash)\nAsh (ash)\nNothing left to lose (nothing left to lose)\nNothing left to lose (nothing left to lose)\n[Fade on the Guitar Loop]"
},
{
"id": "steel_legion",
"kind": "small",
"forName": "Steel Legion",
"title": "Hold the Line",
"genre": "epic cinematic military march",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/7f5b4d87-afea-4bd7-98d3-781bc481e375.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/670d18a4-9591-4b0a-9885-1ec0be5da58f.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/5fbf40a3-1a1e-4362-9ffd-32f86279f72e.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/4dbf04cf-d5f0-4a59-ad48-a6d73feaaa5a.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A and asked for three fixes: no 'line in a game', don't claim nobody died, drop 'we did the math.' All three are in; everything else is the take you liked.",
"lyrics": "[Verse]\nI have buried more of us than I can say\nEach one a choice, and I carry it today\nWe did not march here drunk on a song\nWe came because we counted, and the count was long\n\nThe young ones want a banner, want a cause\nI want the ground behind me and a reason to pause\nThe wall is not a slogan, the wall is a debt\nThe oldest thing we carry, the last we forget\n\n[Pre-Chorus]\nAegis on the left, halberd on the right\nTestudo overhead when the arrows bite\nNot one of us is fearless, we just chose to stay\nAnd a chosen fear is a weapon we can weigh\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe shieldwall is a promise, not a grind\nFormation is a trust that we relearn each day\nSteel Legion holds the door so the frightened get away\n\n[Verse]\nGive me veterans who flinch and still hold fast\nNot the loud ones, no, the loud ones never last\nI know the name of every soldier at my side\nAnd a man who is known is a man who will not slide\n\nBulwark when they charge us, brace and take the weight\nWe do not break the enemy, we make the enemy wait\nTill the wait becomes a doubt, till the doubt becomes a rout\nAnd the line that never moved is what it was about\n\n[Pre-Chorus]\nLower the visor, steady up the spear\nWe are loudest in the moments we are silent and clear\nDiscipline's a language that we speak low and slow\nNot a mantra we repeat, but a debt we chose to owe\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe shieldwall is a promise, not a grind\nFormation is a trust that we relearn each day\nSteel Legion holds the door so the frightened get away\n\n[Bridge]\nThey will write us down as heroes, but that is not what we are\nWe are the ones who held the ground and did not run too far\nLeaders are not the ones who shout the marching creed\nThey are the ones still standing when the others need\n\n[Chorus]\nHold the line, not for glory, for the ones behind\nThe aegis and the halberd are a promise, not a grind\nFormation is a family, the shield is how we lead\nSteel Legion holds the doorway, and the doorway holds\nLong after the banners and the anthems have gone cold\nWe are the quiet wall, the last line that gets told\nHold the line, hold the line, for the ones behind"
},
{
"id": "sapper_chief",
"kind": "small",
"forName": "Blastcap, the Powder-Reeve",
"title": "No Eyebrows Left",
"genre": "opens slow and deliberate with spoken words over a lone upright bass then explodes into manic psychobilly",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/fb16d1c0-cd75-4b13-8bb5-ba8242744d44.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/497823e5-3dfb-4473-bb4c-18511e091c2d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/6fe4d687-34b6-4f17-a26f-c08684c9f216.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/3625fa4f-c4bf-4c75-8073-6841287c8ec2.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A and wanted it to open slower before all hell breaks loose. Now a quiet, almost gentle spoken intro over a lone upright bass, THEN the band explodes.",
"lyrics": "[Intro - slow, spoken, almost gentle, lone upright bass, no drums]\nNow.\nBefore we start.\nI want you to look at the barrel by your feet.\nGo on. Look at it.\nSee the little wick?\n...It's shorter than it was.\n\n[FULL BAND EXPLODES IN - manic psychobilly, everything at once]\n[Verse]\nI count in fuses, I count in booms\nI fill your castle up with rooms that go KA-BOOM\nNo eyebrows left and I don't recall\nThe last time something didn't blow up at all\n\nSappers with a keg on every back\nPowder in the barrel, lit and black\nEverything I build's got a burning wick\nEverything I field goes off real quick\n\nI stack 'em up and I light 'em down\nThe loudest little goblin in the whole dang town\nYou wanna dance? Well, I brought the band\nAnd a lit cigar in my only hand\n\n[Pre-Chorus]\nTick, tick, tick\nGoes the merry fuse\nCount your steps\nIn lit-up news\n\nEvery keg\nIs a friend of mine\nStand real close\nOn the powder line\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nDemolition zone, so it hits twice as hard\nBlastcap's got a bomb in the yard\nBlastcap! No eyebrows left and I don't care!\nHere we blow! (here we blow!)\n\n[Verse]\nBombardment rainin' down on every lane\nLittle lit-up presents and they all explain\n'Tick' for a second, then they blow like me\nAin't nowhere on the field you're safe to be\n\nKill my little sappers right where they stand?\nThey pop right off in your front-line band!\nDemolition Zone makes the boom hit worse\nSo every kill you make is a lit-up curse\n\nAnd here comes the Siege Bomb, big and round\nRollin' on a wagon for your general's ground\nYou better crack it early, better crack it wide\n'Cause it's comin' for the man you keep inside\n\n[Pre-Chorus]\nTick, tick, tick\nOn the wagon wheel\nCount your commander\nIn the powder-reel\n\nOne long fuse\nAnd a downhill roll\nBlastcap's comin'\nFor the whole patrol\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nDemolition zone, so it hits twice as hard\nBlastcap's got a bomb in the yard\nBlastcap! No eyebrows left and I don't care!\nHere we blow! (here we blow!)\n\n[Bridge]\nCount your steps in fuses, friend\nCount your men in smoke\nMy whole world's one loud mistake\nAway from goin' broke\n\nBut WHAT a way to go, hey hey!\nOne big beautiful joke!\nEverything I ever loved\nWent up in a cloud of smoke!\n\n[Chorus]\nBlastcap! No eyebrows left and I don't care!\nBlastcap! Got another keg to spare!\nLight it up and watch the whole field blow\nThe powder's cookin', here we go, go, GO!\nStockpile's stacked and the whole thing's lit\nStand back, baby, this is it\nBlastcap! No eyebrows left and I don't care!\nKA-BOOM! (KA-BOOM!)"
},
{
"id": "pale_rider",
"kind": "small",
"forName": "The Pale Rider",
"title": "Takes the Biggest First",
"genre": "spaghetti-western doom with long unhurried lonesome whistling passages between the opening lines",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/abf20f8a-bbc9-4f12-8b8d-b543f53d66ae.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/cadfb0ed-cb91-4b4f-881c-aa31828b93c2.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/012fdf6c-ce5c-4367-ae4b-a4a8ad25c13c.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/063b0524-7a60-405f-b6a2-d28000a576b2.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A and wanted more whistling so the story doesn't feel rushed. Whistling breaks added between the opening lines, with room to breathe.",
"lyrics": "[Intro - lonesome whistling, unhurried, let it ring out]\n\n[Verse - spacious, never rushed]\nThere's dust on the wind and a bell out of tune\n\n[Whistling - take the tune for a while]\n\nA silent horseman coming under a low grey moon\n\n[Whistling - let it breathe before the next line]\n\nI don't ride to raid you, I ride to collect\nAnd I take the biggest soul that your ranks protect\n\nNo spurs and no war-cry, just the creak of the mist\nI lean in the saddle and I read down my list\nThe Reap swings the scythe and it takes half away\nThe fattest, the strongest, is the first of the pay\n\nGrave-mist comes rolling and the phantoms come through\nThey phase past your shieldwall like it's nothing to do\nThey dive for the weakest in the thinnest of lanes\nWhile the reaping takes the giants and it counts up the gains\n\n[Pre-Chorus]\nHear that whistle\nLow and long\nOne lonesome note\nOf a funeral song\n\nI don't run\nI don't chase\nI just take the biggest\nAnd I leave no trace\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Verse]\nPile them up high and you only feed me more\nThe bigger the body, the deeper that I score\nWights in the grave-mist and the specters that phase\nThey drift for your backline through the cold and the haze\n\nI don't want the small ones, they're not worth the ride\nI want the great column with its pride packed inside\nHalf it, then half it, till the mighty are gone\nAnd the mist keeps on rolling and the reaping goes on\n\n[Pre-Chorus]\nHear that whistle\nFading slow\nOne more soul\nFor the mist below\n\nNo hurry\nNo sound\nJust the pale horse walking\nOver your ground\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Bridge]\nI do not chase the little ones, I do not take the weak\nI come for the strongest shoulder the moment that I speak\nSo spread your weight out thin, my friend, go on and try to hide\nBut the Pale Rider always finds the biggest for the ride\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list\n\nPale Rider, Pale Rider\nThe scythe swings wide\nPale Rider, Pale Rider\nThere's no place to hide\nThe phantoms take the small ones and the Reap takes the rest\nPale Rider, Pale Rider\nAnd I collect the best (and I collect the best)"
},
{
"id": "mutagen",
"kind": "small",
"forName": "Mutagenesis",
"title": "Unlock the Beast",
"genre": "acid techno industrial dubstep",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/784d1ec5-71c0-4ab9-a8c7-527f0ff78220.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/d1ec5cf0-f02d-4227-bb54-1533e3b1ab8d.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/e6cd8215-da1b-4bc5-8d4d-38530acbc28f.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/fcf6d4ec-3afd-4082-b125-c42b0d5f86aa.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked B, but the noisy first 30s could read as bad static on a small speaker. Now a clean, clear melodic intro before the acid creeps in.",
"lyrics": "[Intro - clean and restrained, a single clear synth line, no distortion, no noise]\nSomething in the dark is learning how to want.\n\n[Verse - the acid creeps in underneath]\nSerum in the needle, push it through\nThe body swells, the readings blue\nFifteen, twenty, break the seal\nSealed-off teeth begin to feel\n\nOverheal past the marker line\nEvery drop becomes design\nNo armor here, no shield, no cage —\nJust meat and math and a growing rage\n\n[Pre-Chorus]\nThe vat is humming, the dials climb\nAdrenaline overflows to size\nSplice the batch, the whole thing grows\nDecay's the tax that the ledger knows\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, break the seal\nFeed it more than it can heal\nThreshold cracks and the ability shows —\nUnlock the beast, and up it goes\n\n[Verse]\nLab Rat runs and it grows in place\nVat-Grown Brute takes a blow, gains face\nSpliced Hound bites and drinks it in\nTwenty pounds of borrowed skin\n\nFailed Experiment melts and rots\nPour the serum in the gaps and spots\nRegenerator won't waste a drop —\nEvery treatment climbs the top\n\n[Pre-Chorus]\nHypertrophy on every mend\nEureka draws when the seals all bend\nGrand Experiment, the round begins —\nFive more pounds on all my sins\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, break the seal\nFeed it more than it can heal\nThreshold cracks and the ability shows —\nUnlock the beast, and up it goes\n\n[Bridge]\nChimera stitched from a stolen three\nEats a kill and grows the key\nTwenty-five, then forty-five —\nTwo sealed monsters come alive\nMagnum Opus, the reviewer's dread\nFifty, eighty, raise the dead thing's head\nOverdose it, double the frame —\nGene Therapy signs my name to the flame\n\n[Chorus]\nUnlock the beast, past the line!\nBigger, stronger, redesign\nGrand experiment, the vat runs wild\nMutagenesis, monster child\nUnlock the beast, no ceiling now\nEvery serum shows it how\nSplice the batch and watch it climb —\nUnlock the beast, one last time\nOverclock the failing heart\nDecay's the price of a work of art\nBreak the last seal, let it roar —\nUnlock the beast forevermore"
},
{
"id": "cloak_dagger",
"kind": "small",
"forName": "Cloak & Dagger",
"title": "Cover of Night",
"genre": "spy thriller trip-hop",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/58219e1b-214e-4968-816d-61ea3304c46f.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/9ab09f73-2d53-4fa1-a928-547e99ab2d15.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/380d088e-47ac-4235-8687-b1fae26fa17e.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/e03cf0ff-7b72-433d-b91c-74aac253321c.mp3",
"model": "v4.5",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A but said 'free placement' was jarring and killed the vibe. That line is gone; the rest is the take you liked.",
"lyrics": "[Verse]\nSlip behind where the shadows fall\nAnywhere we like, a knife for all\nStealth and backstab, double the cut\nSmoke goes up and the door is shut\n\n[Chorus]\nCover of night, we move unseen\nShadowstep through the in-between\nOne clean strike and we disappear\nCloak and dagger, we were never here\n\n[Verse]\nFan of knives in the candlelight\nGuildmaster whispers, the mark is right\nCoup de grace and the smoke bomb blooms\nSilence falls in the empty rooms\n\n[Chorus]\nCover of night, we move unseen\nShadowstep through the in-between\nOne clean strike and we disappear\nCloak and dagger, we were never here"
},
{
"id": "myconid_sovereign",
"kind": "small",
"forName": "Amanita, the Sporecrown",
"title": "Already Part of Me",
"genre": "psychedelic mushroom doom",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/ad91fc02-6b6b-4f39-8cf9-aaa0b5c85ac0.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/96bd84f9-0ab8-41a0-8fd7-e1ff0f4bc70c.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/a1756ae3-6d58-453a-b21f-e9143d5344c3.mp3",
"model": "v4.5+",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/ec7e54b1-bbe9-4e7b-9e5d-85b6f1af3051.mp3",
"model": "v4.5+",
"old": true
}
],
"rev": true,
"new": false,
"why": "You picked A but couldn't tell what 'I grow aloft' meant. Changed to 'I lift what they lost.' Nothing else touched.",
"lyrics": "[Verse]\nBreathe out slow\nThe air is thick\nNo need to run\nNo need, no trick\n\nDown in the leaf\nWhere the dead go soft\nI grow in the dark\nAnd I lift what they lost\n\nI do not hate\nI do not hurry\nI only compost\nYour little worry\n\n[Pre-Chorus]\nHear the hush\nIn the rotting loam\nA quiet spore\nComes floating home\n\nOne soft breath\nAnd the count begins\nA gentle green\nBeneath your skin\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\n[Verse]\nThe sporelings burst\nAnd scatter wide\nA poison field\nWhere they died\n\nThe slinger spits\nFrom the quiet back\nA drifting rot\nOn the wind, a track\n\nThe fungal hulk\nSplits open slow\nA bigger bloom\nWhere the dead things grow\n\n[Pre-Chorus]\nHear the sigh\nIn the poisoned ground\nDon't stand your line\nWhere the spores come down\n\nContagion leaps\nFrom man to man\nA green that spreads\nAs only rot can\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\n[Bridge]\nThere is no rushing rot, my friend\nThere is only when and how\nA patient thing that grows in the dark\nWas always coming, now\n\nSo push, so run\nDon't linger, don't stay\nBut the field you're standing in\nIs mine anyway\n\n[Chorus]\nAmanita, Amanita\nBreathe it in\nAmanita, Amanita\nUnder the skin\nSlowly the sporecrown surrounds you\nHaze in the lung, so sweet\nAmanita, Amanita\nYou're already part of me (part of me)\n\nAmanita, Amanita\nFall and bloom\nAmanita, Amanita\nFeed the room\nDown in the dark where the dead things flower\nEvery last breath I keep\nAmanita, Amanita\nYou are soil now, sleep (you are soil now, sleep)"
},
{
"id": "rainforest",
"kind": "new",
"forName": "Primordial Growth",
"title": "Only So Much Sky",
"genre": "organic tropical psych-folk",
"hook": "",
"takes": [
{
"lab": "A",
"url": "https://cdn1.suno.ai/68b2124b-5a4f-4666-95ed-bac6500f411a.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "B",
"url": "https://cdn1.suno.ai/880ebd10-2f56-4d5d-a0dd-c0c4716239a8.mp3",
"model": "v5.5",
"old": false
},
{
"lab": "C",
"url": "https://cdn1.suno.ai/892f73f3-393f-4892-8407-252a87e6c94b.mp3",
"model": "v4.5",
"old": true
},
{
"lab": "D",
"url": "https://cdn1.suno.ai/385b76aa-93ad-431e-90b4-bb513dc00816.mp3",
"model": "v4.5",
"old": true
}
],
"rev": false,
"new": true,
"why": "Brand new — you asked for rainforest-inspired music alongside The Slow Green (which stays). Tropical psych-folk: hand percussion, kalimba, flutes, humid and teeming.",
"lyrics": "[Intro - rain and insect hum, distant birdcall, a single kalimba figure, wordless voices]\nAy-ya, ay-ya, ay-ya-ah\n(Something in the leaf litter is counting.)\n\n[Verse 1 - nylon-string guitar, close warm vocal, hand drums low]\nI came up under your boot as a nothing,\nA green thread, a nuisance, a weed,\nYou stepped over me going somewhere important\nAnd I did the one thing I do. I feed.\nTwo seconds, a finger. Two more, a hand.\nUnderwhelming for most of an hour,\nThen the road you were walking is under the sand\nAnd the sand is under a flower.\n\n[Pre-Chorus - shakers enter, percussion doubles]\nYou have your fire, your iron, your name,\nYour very good reasons for cutting me down.\nI do not need any of that, my love,\nI need the light, and the light comes around.\n\n[Chorus - full band, layered wordless harmonies answering each line]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Verse 2 - polyrhythmic congas, marimba pattern, flute answering]\nThe eggs go down in a spearwall of spines,\nEight seconds and the shells come apart,\nNine of my daughters will stand and guard\nAnd the tenth one lays again in the dark.\nFollow the bramble that walks through the ferns,\nFollow it barefoot if you please,\nEverything down here has a use for you\nAnd the polite ones are up in the trees.\n\n[Pre-Chorus - drums tighten]\nYou brought a season. I brought all of them.\nYou brought an army. I brought the ground.\n\n[Chorus - full band, harmonies wider]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Instrumental - kalimba and wooden flute trading figures over teeming percussion, birdcall, humid and building]\n\n[Verse 3 - softer, vocal doubled an octave up, guitar and voice mostly alone]\nWhen the heart of the grove goes down, it goes down like a gift,\nEvery ring of it a season it held\nSomething alive while the season slept.\nWhatever you kill here, I bury and use.\nEvery ending you hand me is somebody's seedbed.\nI am slower than you. I am not slower to think.\n\n[Bridge - drums drop to bare hand percussion and voice, intimate]\nEight times I have died to get bigger,\nEight shells, and each one a small clean grave,\nI climbed out of every single one of them\nAnd I never once needed to be brave.\nThere is no ninth. There is no ninth.\nWhatever comes out of the last one stays,\nAnd it does not hate you, it does not know you,\nIt only knows the way the light lays.\n\n[Chorus - everything at once, whole ensemble, voices stacked]\nReach, reach, everything reaches,\nEvery green hand opening wide,\nI was never angry, I was never in a hurry,\nI just never stepped aside.\nClimb me if you want to see the morning,\nClimb me, but you had best climb high,\nThere is room for the roots, there is room for the rain,\nThere is only so much sky.\n\n[Outro - percussion thinning back to rain and insects, one kalimba figure left]\nAy-ya, ay-ya, ay-ya-ah\nPlant me in the first hour, apologize by the sixth,\nAy-ya, ay-ya, ay-ya-ah\nThere is only so much sky.\n(Something in the leaf litter is still counting.)"
}
];
SONGS.forEach((s,i)=>{ if(s.n==null) s.n=i+1; });
const blocked = (function(){ try { return window.self !== window.top; } catch(e){ return true; } })();
if (blocked) document.body.classList.add("blocked");
const picks = JSON.parse(localStorage.getItem("wl_picks_r4") || "{}");
const comments = JSON.parse(localStorage.getItem("wl_comments_r4") || "{}");
const esc = t => (t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
const GROUPS = {"big": "★ Revised from your notes — please re-listen", "small": "Small tweaks from your notes — quick confirm", "new": "New track"};
/* one shared <audio> for the whole page — iOS chokes and lags once ~dozens of
separate audio elements have each buffered a track; a single reused element
keeps memory flat no matter how far down the list you play. */
const GAU=new Audio(); GAU.preload="none"; let curPl=null, curUrl=null;
GAU.addEventListener("play",()=>{ if(curPl)curPl.pp.textContent="❚❚"; updateBar(); });
GAU.addEventListener("pause",()=>{ if(curPl)curPl.pp.textContent="►"; updateBar(); });
GAU.addEventListener("ended",()=>{ if(curPl){curPl.pp.textContent="►";curPl.sk.value=0;curPl.tt.textContent="0:00";} updateBar(); });
GAU.addEventListener("timeupdate",()=>{ if(curPl&&!curPl.se&&GAU.duration){curPl.sk.value=Math.round(GAU.currentTime/GAU.duration*1000);curPl.tt.textContent=fmt(GAU.currentTime);} });
function setPick(id, take){ if(picks[id]===take) delete picks[id]; else picks[id]=take;
localStorage.setItem("wl_picks_r4", JSON.stringify(picks)); render(); }
function player(url){
if(!url) return '<span class="gen">\u23f3 generating\u2026</span>';
if(blocked) return '<button class="linkbtn" data-url="'+url+'">▶ copy track link ↗</button>';
return '<span class="pl" data-url="'+url+'"><button class="pp" type="button" aria-label="Play">►</button>'+
'<input type="range" class="seek" min="0" max="1000" value="0" aria-label="Seek">'+
'<span class="tt">0:00</span></span>';
}
function fmt(s){ s=Math.max(0,Math.floor(s||0)); return Math.floor(s/60)+":"+String(s%60).padStart(2,"0"); }
function songHTML(s){
const chosen=picks[s.id];
return '<div class="song'+(chosen?" done":"")+'">'+
'<div class="song-head"><div class="num">'+String(s.n).padStart(2,"0")+'</div>'+
'<div class="titles"><p class="title">'+s.title+'</p>'+
'<p class="for">for <b>'+s.forName+'</b></p><span class="chip">'+s.genre+'</span>'+(s.rev?'<span class="chip rev">↻ revised — re-listen</span>':'')+(s.new?'<span class="chip new">★ new version</span>':'')+'</div></div>'+
(s.why?'<p class="why">'+s.why+'</p>':'')+
'<div class="takes">'+
s.takes.map(function(t){var k=t.lab.toLowerCase();
var div=(t.lab==="C")?'<div class="takediv">earlier takes \u00b7 made with v4.5+</div>':'';
return div+'<div class="take '+k+(t.old?' old':'')+'"><span class="lab">'+t.lab+(t.old?' <span class="v45">v4.5+</span>':'')+'</span>'+player(t.url)+
'<button class="pick '+(chosen===k?'on':'')+'" data-id="'+s.id+'" data-take="'+k+'">'+(chosen===k?'✓':'Pick')+'</button></div>';}).join('')+
'</div>'+
'<details class="lyr"><summary>\u25b8 Lyrics</summary><pre class="lyrbody">'+esc(s.lyrics)+'</pre></details>'+
'<textarea class="cmt" data-id="'+s.id+'" rows="1" placeholder="Notes for a new version (optional) — e.g. faster, less guitar, love the chorus…">'+esc(comments[s.id])+'</textarea></div>';
}
function render(){
const list=document.getElementById("list"); let html=""; let last=null;
for(const s of SONGS){ if(s.kind!==last){ html+='<p class="group-label">'+(GROUPS[s.kind]||"")+'</p>'; last=s.kind; } html+=songHTML(s); }
list.innerHTML=html;
list.querySelectorAll(".pick").forEach(b=>b.onclick=()=>setPick(b.dataset.id,b.dataset.take));
list.querySelectorAll(".linkbtn").forEach(b=>b.onclick=()=>{ const u=b.dataset.url;
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(u).then(()=>{b.textContent="✓ link copied";},()=>{});
try{ window.open(u,"_blank"); }catch(e){} });
list.querySelectorAll(".cmt").forEach(c=>{ const grow=()=>{c.style.height="auto";c.style.height=Math.max(40,c.scrollHeight)+"px";}; if(c.value)grow();
c.addEventListener("input",()=>{ if(c.value.trim())comments[c.dataset.id]=c.value; else delete comments[c.dataset.id];
localStorage.setItem("wl_comments_r4",JSON.stringify(comments)); grow(); }); });
curPl=null;
list.querySelectorAll(".pl").forEach(pl=>{
const pp=pl.querySelector(".pp"),sk=pl.querySelector(".seek"),tt=pl.querySelector(".tt"),url=pl.dataset.url;
const me={pp,sk,tt,url,se:false};
if(url===curUrl){ curPl=me; if(!GAU.paused)pp.textContent="❚❚";
if(GAU.duration){sk.value=Math.round(GAU.currentTime/GAU.duration*1000);tt.textContent=fmt(GAU.currentTime);} }
pp.addEventListener("click",()=>{
if(curPl===me){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); return; }
if(curPl){ curPl.pp.textContent="►"; curPl.sk.value=0; curPl.tt.textContent="0:00"; }
curPl=me; curUrl=url; GAU.src=url; GAU.play().catch(()=>{});
});
sk.addEventListener("input",()=>{ if(curPl!==me)return; me.se=true; if(GAU.duration)tt.textContent=fmt(sk.value/1000*GAU.duration); });
sk.addEventListener("change",()=>{ if(curPl!==me)return; if(GAU.duration)GAU.currentTime=sk.value/1000*GAU.duration; me.se=false; });
});
document.getElementById("prog").textContent=Object.keys(picks).length+" / "+SONGS.length+" picked";
}
document.getElementById("copy").onclick=()=>{
const lines=["Warlords soundtrack — Hari's picks & notes:",""];
for(const s of SONGS){ const p=picks[s.id],c=comments[s.id];
lines.push(String(s.n).padStart(2,"0")+'. '+s.forName+' — "'+s.title+'" ('+s.genre+'): '+(p?"Take "+p.toUpperCase():"— no pick"));
if(c) lines.push(' notes: '+c.replace(/\n/g," ")); }
const text=lines.join("\n"),btn=document.getElementById("copy");
const done=()=>{btn.textContent="Copied!";btn.classList.add("done");setTimeout(()=>{btn.textContent="Copy picks";btn.classList.remove("done");},1800); if(window.__hariWalkout)window.__hariWalkout();};
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done,()=>fb(text,done)); else fb(text,done);
};
function fb(t,done){const ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");}catch(e){}ta.remove();done();}
render();
/* ---- transport bar: prev / play-pause / skip through every take ---- */
function trackInfo(url){ for(const s of SONGS){ if(s.a===url) return {t:s.title,who:s.forName,take:"A"}; if(s.b===url) return {t:s.title,who:s.forName,take:"B"}; } return null; }
function updateBar(){
const bp=document.getElementById("bplay"), now=document.getElementById("now"); if(!bp) return;
bp.textContent = (curUrl && !GAU.paused) ? "❚❚" : "►";
const info = curUrl ? trackInfo(curUrl) : null;
now.innerHTML = info ? ('<b>'+esc(info.t)+'</b> · '+esc(info.who)+' — Take '+info.take) : "tap ► on any take · ⏭ to skip through";
}
function pls(){ return [...document.querySelectorAll("#list .pl")]; }
function skipBy(dir){
const a=pls(); if(!a.length) return;
let i=a.findIndex(p=>p.dataset.url===curUrl);
i = i<0 ? (dir>0?0:a.length-1) : (((i+dir)%a.length)+a.length)%a.length;
a[i].querySelector(".pp").click();
const song=a[i].closest(".song"); if(song) song.scrollIntoView({behavior:"smooth",block:"center"});
}
document.getElementById("bnext").onclick=()=>skipBy(1);
document.getElementById("bprev").onclick=()=>skipBy(-1);
document.getElementById("bplay").onclick=()=>{ if(curUrl){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); } else skipBy(1); };
updateBar();
/* ---- groovy lava-lamp (metaballs) background ---- */
(function(){
const bg=document.getElementById("bg"), ctx=bg.getContext("2d");
const reduce=matchMedia("(prefers-reduced-motion:reduce)").matches;
const SC=11; let img,d,W,H,t=0;
// warm 70s ramp: deep indigo -> violet -> hot pink -> orange -> gold
const STOPS=[[20,8,46],[68,16,98],[150,26,122],[224,44,108],[255,96,58],[255,168,54],[255,232,150]];
function ramp(u){ u=u<0?0:u>1?1:u; const f=u*(STOPS.length-1), i=Math.floor(f), g=f-i;
const a=STOPS[i], b=STOPS[i+1<STOPS.length?i+1:i];
return [a[0]+(b[0]-a[0])*g|0, a[1]+(b[1]-a[1])*g|0, a[2]+(b[2]-a[2])*g|0]; }
const N=6, B=[];
for(let i=0;i<N;i++)B.push({x:Math.random(),y:Math.random(),
vx:(Math.random()*2-1)*0.00035, vy:(Math.random()*2-1)*0.00035, r:0.15+Math.random()*0.15});
function fit(){ W=bg.width=Math.max(2,Math.ceil(innerWidth/SC)); H=bg.height=Math.max(2,Math.ceil(innerHeight/SC));
img=ctx.createImageData(W,H); d=img.data; for(let i=3;i<d.length;i+=4)d[i]=255; }
function step(){ for(const b of B){ b.x+=b.vx; b.y+=b.vy;
if(b.x<0.08||b.x>0.92)b.vx*=-1; if(b.y<0.08||b.y>0.92)b.vy*=-1; } }
function paint(){ const wob=0.055*Math.sin(t*0.5);
for(let y=0;y<H;y++){ const ny=y/H;
for(let x=0;x<W;x++){ const nx=x/W; let F=0;
for(let k=0;k<N;k++){ const dx=nx-B[k].x, dy=ny-B[k].y; F+=B[k].r*B[k].r/(dx*dx+dy*dy+0.0016); }
const c=ramp(F/(F+2.2)+wob); const i=(y*W+x)*4; d[i]=c[0]; d[i+1]=c[1]; d[i+2]=c[2]; } }
ctx.putImageData(img,0,0); }
fit(); addEventListener("resize",fit);
if(reduce){ step(); paint(); }
else { (function loop(){ t+=0.016; step(); paint(); requestAnimationFrame(loop); })(); }
})();
/* ---- Ragdoll Hari: pops out every 2 min, a different dance each time ---- */
(function(){
const cv=document.getElementById("hari"), ctx=cv.getContext("2d");
if(matchMedia("(prefers-reduced-motion:reduce)").matches) return;
const A="#f7f0e2"; let raf=0, t0=0, style="flail", fromLeft=true, order=[], oi=0;
const STYLES=["flail","disco","robot","twist","jack","headbang","charleston"];
const P=Math.PI;
function fit(){ cv.width=cv.clientWidth; cv.height=170; }
function seg(x1,y1,a,l){ const x2=x1+Math.cos(a)*l,y2=y1+Math.sin(a)*l; ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke(); return [x2,y2]; }
function walkPose(ph){ const sw=Math.sin(ph*7); return {la:P*0.55+sw*0.55, ra:P*0.55-sw*0.55, lae:0, rae:0, ll:P*0.5+sw*0.5, rl:P*0.5-sw*0.5, hop:0, lean:0}; }
function dance(st,ph){ const S=Math.sin, R=x=>Math.round(x*2)/2;
if(st==="disco"){ const up=S(ph*2.4)>0; return {la:up?-2.3:1.9, ra:up?1.9:-2.3, lae:.1, rae:.1, ll:P*0.5+S(ph*4.8)*.3, rl:P*0.5-S(ph*4.8)*.3, hop:Math.abs(S(ph*2.4))*9, lean:S(ph*2.4)*.22}; }
if(st==="robot"){ return {la:-1.2+R(S(ph*2))*1.1, ra:-1.2-R(S(ph*2+1))*1.1, lae:R(S(ph*3))*.6, rae:R(S(ph*3+1))*.6, ll:P*0.5+R(S(ph*2))*.3, rl:P*0.5-R(S(ph*2))*.3, hop:0, lean:R(S(ph))*.12}; }
if(st==="twist"){ return {la:P*0.5+S(ph*3.5)*.8, ra:P*0.5-S(ph*3.5)*.8, lae:.3, rae:.3, ll:P*0.5+S(ph*3.5)*.3, rl:P*0.5-S(ph*3.5)*.3, hop:Math.abs(S(ph*7))*4, lean:S(ph*3.5)*.4}; }
if(st==="jack"){ const o=(S(ph*4.5)+1)/2; return {la:-P*0.5-o*1.3, ra:-P*0.5+o*1.3, lae:0, rae:0, ll:P*0.5+o*.55, rl:P*0.5-o*.55, hop:o*12, lean:0}; }
if(st==="headbang"){ return {la:P*0.62+S(ph*7)*.35, ra:P*0.62-S(ph*7)*.35, lae:.2, rae:.2, ll:P*0.5+.06, rl:P*0.5-.06, hop:Math.abs(S(ph*7))*5, lean:.55+S(ph*7)*.5}; }
if(st==="charleston"){ const k=S(ph*4); return {la:P*0.5+k*.9, ra:P*0.5+k*.9, lae:-.5, rae:-.5, ll:P*0.5+k*.7, rl:P*0.5-k*.7, hop:Math.abs(S(ph*4))*7, lean:-k*.18}; }
/* flail */ return {la:-2.9+S(ph*7)*1.0, ra:-0.2+S(ph*7+1.6)*1.0, lae:S(ph*10)*.9, rae:S(ph*10+1)*.9, ll:P*0.5+S(ph*5)*.55, rl:P*0.5-S(ph*5)*.55, hop:Math.abs(S(ph*5))*15, lean:S(ph*3)*.3};
}
function draw(x,ground,ph,pose){
ctx.strokeStyle=A; ctx.fillStyle=A; ctx.lineWidth=4; ctx.lineCap="round"; ctx.lineJoin="round";
const hipY=ground-30-pose.hop, torso=-P/2+pose.lean;
const [nx,ny]=seg(x,hipY,torso,26);
const hx=nx+Math.cos(torso)*9, hy=ny+Math.sin(torso)*9;
ctx.beginPath(); ctx.arc(hx,hy,8.5,0,P*2); ctx.stroke();
let [ex,ey]=seg(nx,ny,pose.la,15); seg(ex,ey,pose.la+pose.lae,12);
[ex,ey]=seg(nx,ny,pose.ra,15); seg(ex,ey,pose.ra+pose.rae,12);
let [kx,ky]=seg(x,hipY,pose.ll,17); seg(kx,ky,pose.ll+0.25,15);
[kx,ky]=seg(x,hipY,pose.rl,17); seg(kx,ky,pose.rl+0.25,15);
ctx.font="bold 12px ui-monospace, monospace"; ctx.textAlign="center";
ctx.fillText("HARI", hx, hy-16-(pose.hop>1?pose.hop*0.4:0));
}
function frame(now){
const tt=(now-t0)/1000; ctx.clearRect(0,0,cv.width,cv.height);
const W=cv.width, ground=cv.height-14, cx=W/2;
const EN=4.5, DA=9, EX=4.5;
let x, pose;
if(tt<EN){ const p=tt/EN; x=fromLeft ? -50+(cx+50)*p : (W+50)-((W+50)-cx)*p; pose=walkPose(tt); }
else if(tt<EN+DA){ x=cx; pose=dance(style, tt-EN); }
else if(tt<EN+DA+EX){ const p=(tt-EN-DA)/EX; x=fromLeft ? cx+(W+60-cx)*p : cx-(cx+60)*p; pose=walkPose(tt); }
else { cv.style.display="none"; cancelAnimationFrame(raf); raf=0; return; }
draw(x,ground,tt<EN?tt:(tt-EN),pose); raf=requestAnimationFrame(frame);
}
function nextStyle(){ if(oi>=order.length){ order=STYLES.slice().sort(()=>Math.random()-0.5); oi=0; } return order[oi++]; }
function walkout(){ if(raf) return; style=nextStyle(); fromLeft=Math.random()<0.5; cv.style.display="block"; fit(); t0=performance.now(); raf=requestAnimationFrame(frame); }
addEventListener("resize",()=>{ if(cv.style.display!=="none") fit(); });
window.__hariWalkout=walkout;
const soon=/dance|hari|test/i.test(location.hash);
if(soon) setTimeout(walkout, 2000);
setInterval(walkout, 120000);
})();
</script>
<title>Warlords — Pick the Take (for Hari)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root{
--ink:#f7f0e2; --muted:#c8b7a0; --faint:#93856f; --line:rgba(255,244,220,.14);
--amber:#f0b24a; --amber-dim:rgba(240,178,74,.18);
--teal:#63c6da; --teal-dim:rgba(99,198,218,.18);
--serif:"Iowan Old Style",Georgia,"Palatino Linotype","Book Antiqua",serif;
--sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
--mono:ui-monospace,"SF Mono","Cascadia Code",Consolas,monospace;
--card:rgba(24,20,26,.74);
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{ margin:0; color:var(--ink); font-family:var(--sans); line-height:1.5;
background:#120e16; padding-bottom:76px; position:relative; }
#bg{position:fixed; inset:0; width:100vw; height:100vh; z-index:-3; transform:scale(1.15);
filter:blur(30px) saturate(1.6) brightness(1.02); image-rendering:auto}
#scrim{position:fixed; inset:0; z-index:-2; pointer-events:none;
background:radial-gradient(120% 90% at 50% 0%, rgba(10,8,14,.28), rgba(8,6,12,.6) 75%)}
@media(prefers-reduced-motion:reduce){ #bg{filter:blur(34px) saturate(1.3)} }
.wrap{max-width:880px; margin:0 auto; padding:44px 20px 40px; position:relative; z-index:1}
header{border-bottom:1px solid var(--line); padding-bottom:26px}
.eyebrow{font-family:var(--mono); font-size:12px; letter-spacing:.22em; text-transform:uppercase;
color:var(--amber); margin:0 0 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
h1{font-family:var(--serif); font-weight:600; font-size:clamp(32px,6.4vw,50px); line-height:1.04;
margin:0 0 14px; text-wrap:balance; letter-spacing:-.01em; text-shadow:0 2px 16px rgba(0,0,0,.65)}
h1 .wave{display:inline-block; transform-origin:70% 70%; animation:wave 2.4s ease-in-out 1s 2}
@keyframes wave{0%,60%,100%{transform:rotate(0)}70%{transform:rotate(16deg)}80%{transform:rotate(-8deg)}90%{transform:rotate(12deg)}}
@media(prefers-reduced-motion:reduce){h1 .wave{animation:none}}
.lede{color:var(--muted); font-size:16.5px; max-width:62ch; margin:0; text-shadow:0 1px 10px rgba(0,0,0,.6)}
.lede b{color:#fff; font-weight:600}
.sig{color:var(--faint); font-style:italic; font-family:var(--serif); margin:12px 0 0; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend{display:flex; gap:18px; flex-wrap:wrap; margin-top:20px; font-family:var(--mono);
font-size:12px; color:var(--muted); letter-spacing:.03em; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend span{display:inline-flex; align-items:center; gap:7px}
.dot{width:10px; height:10px; border-radius:50%}
.dot.a{background:var(--amber)} .dot.b{background:var(--teal)}
.banner{display:none; margin:20px 0 0; padding:13px 16px; border-radius:11px;
background:rgba(20,60,70,.6); border:1px solid rgba(99,198,218,.45); color:var(--ink); font-size:14.5px}
body.blocked .banner{display:block}
.banner b{color:var(--teal)}
.group-label{font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase;
color:var(--muted); margin:34px 2px 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.song{background:var(--card); backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
border:1px solid var(--line); border-radius:14px; padding:20px 22px 18px; margin:14px 0; transition:border-color .2s}
.song.done{border-color:rgba(240,178,74,.5)}
.song-head{display:flex; gap:16px; align-items:baseline}
.num{font-family:var(--mono); font-size:13px; color:var(--faint); font-variant-numeric:tabular-nums; padding-top:5px; min-width:26px}
.titles{flex:1; min-width:0}
.title{font-family:var(--serif); font-size:23px; font-weight:600; line-height:1.15; margin:0}
.for{color:var(--muted); font-size:14px; margin:3px 0 0}
.for b{color:var(--ink); font-weight:600}
.chip{display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:.04em;
color:var(--amber); border:1px solid var(--amber-dim); background:var(--amber-dim);
padding:2px 9px; border-radius:100px; margin-top:9px; text-transform:lowercase}
.chip.rev{color:var(--teal); border-color:var(--teal-dim); background:var(--teal-dim); text-transform:none; margin-left:6px}
.hook{color:var(--faint); font-style:italic; font-family:var(--serif); font-size:15px; margin:11px 0 0; padding-left:42px}
.takes{display:flex; flex-direction:column; gap:9px; margin:16px 0 0 42px}
.take{display:flex; align-items:center; gap:11px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:10px; padding:9px 13px}
.take .lab{font-family:var(--mono); font-size:11px; letter-spacing:.12em; width:26px; flex:0 0 auto}
.take.a .lab{color:var(--amber)} .take.b .lab{color:var(--teal)}
.pl{flex:1; min-width:150px; display:flex; align-items:center; gap:10px}
.pp{flex:0 0 auto; width:36px; height:36px; border-radius:50%; border:0; cursor:pointer; padding:0;
font-size:13px; line-height:1; display:grid; place-items:center; font-family:var(--sans)}
.take.a .pp{background:var(--amber); color:#241a08} .take.b .pp{background:var(--teal); color:#08222a}
.pp:active{transform:scale(.93)}
.seek{flex:1; min-width:60px; height:22px; -webkit-appearance:none; appearance:none; background:transparent; cursor:pointer; margin:0}
.seek::-webkit-slider-runnable-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-moz-range-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-webkit-slider-thumb{-webkit-appearance:none; margin-top:-5px; width:14px; height:14px; border-radius:50%; border:0}
.seek::-moz-range-thumb{width:14px; height:14px; border-radius:50%; border:0}
.take.a .seek::-webkit-slider-thumb{background:var(--amber)} .take.a .seek::-moz-range-thumb{background:var(--amber)}
.take.b .seek::-webkit-slider-thumb{background:var(--teal)} .take.b .seek::-moz-range-thumb{background:var(--teal)}
.tt{font-family:var(--mono); font-size:11px; color:var(--muted); min-width:30px; text-align:right; font-variant-numeric:tabular-nums; flex:0 0 auto}
.linkbtn{flex:1; min-width:140px; text-align:left; font-family:var(--mono); font-size:12.5px;
color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:8px; padding:8px 11px; cursor:pointer}
.pick{appearance:none; cursor:pointer; font-family:var(--sans); font-size:13px; flex:0 0 auto;
font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:8px; padding:7px 12px; transition:all .15s}
.pick:hover{color:var(--ink); border-color:var(--muted)}
.take.a .pick.on{background:var(--amber); color:#241a08; border-color:var(--amber)}
.take.b .pick.on{background:var(--teal); color:#08222a; border-color:var(--teal)}
.cmt{display:block; width:calc(100% - 42px); margin:11px 0 0 42px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:9px; color:var(--ink); font-family:var(--sans);
font-size:13.5px; line-height:1.45; padding:9px 12px; resize:vertical; min-height:40px}
.cmt::placeholder{color:var(--faint)}
.cmt:focus{border-color:var(--muted); outline:none}
@media(max-width:560px){
.takes{margin-left:0} .hook{padding-left:0} .cmt{width:100%; margin-left:0}
.wrap{padding:34px 15px 34px} .song{padding:16px 14px 14px}
.song-head{gap:11px} .num{min-width:20px}
.take{gap:8px; padding:8px 10px} .pl{min-width:0; gap:8px}
.pp{width:34px; height:34px} .seek{min-width:36px; height:26px} .pick{padding:7px 11px}
.bar-in{padding:9px 13px; gap:10px}
.prog{display:none}
.tb{width:34px; height:34px} .tb.tb-main{width:38px; height:38px} .transport{gap:6px}
.copy{padding:9px 13px}
}
.bar{position:fixed; left:0; right:0; bottom:0; background:rgba(14,10,18,.9);
backdrop-filter:blur(10px); border-top:1px solid var(--line); z-index:10}
.bar-in{max-width:880px; margin:0 auto; padding:12px 20px; display:flex; align-items:center; gap:16px}
.prog{font-family:var(--mono); font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; flex:1}
.copy{appearance:none; cursor:pointer; font-family:var(--sans); font-weight:600; font-size:14px;
color:#241a08; background:var(--amber); border:0; border-radius:9px; padding:9px 16px}
.copy.done{background:var(--teal); color:#08222a}
.transport{display:flex; align-items:center; gap:8px; flex:0 0 auto}
.tb{width:38px; height:38px; border-radius:50%; border:1px solid var(--line); background:rgba(255,255,255,.06);
color:var(--ink); font-size:14px; cursor:pointer; display:grid; place-items:center; padding:0; line-height:1}
.tb:active{transform:scale(.92)}
.tb.tb-main{background:var(--amber); color:#241a08; border-color:var(--amber); width:42px; height:42px; font-size:15px}
.tb.tb-next{border-color:var(--amber); color:var(--amber)}
.now{flex:1; min-width:0; font-family:var(--mono); font-size:12.5px; color:var(--muted);
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.now b{color:var(--ink); font-weight:600}
.note{color:var(--muted); font-size:13px; margin:26px 2px 0; text-align:center; font-family:var(--mono); text-shadow:0 1px 8px rgba(0,0,0,.6)}
:focus-visible{outline:2px solid var(--amber); outline-offset:2px}
#hari{position:fixed; left:0; bottom:52px; width:100%; height:170px; pointer-events:none; z-index:40; display:none}
.why{margin:.5rem 0 .1rem;padding:.55rem .7rem;border-left:3px solid #7bd88f;
background:rgba(123,216,143,.09);border-radius:0 6px 6px 0;font-size:.93rem;line-height:1.45;color:#d9f2df}
.chip.new{background:rgba(255,209,102,.16);border-color:rgba(255,209,102,.5);color:#ffd166}
.lyr{margin:.55rem 0 .1rem;border-top:1px solid rgba(255,255,255,.09);padding-top:.4rem}
.lyr summary{cursor:pointer;font-size:.82rem;letter-spacing:.04em;text-transform:uppercase;color:#9fb4c9;
list-style:none;user-select:none;padding:.15rem 0;opacity:.85}
.lyr summary:hover{color:#d9f2df;opacity:1}
.lyr summary::-webkit-details-marker{display:none}
.lyr[open] summary{color:#d9f2df;opacity:1}
.lyrbody{margin:.4rem 0 .2rem;padding:.7rem .8rem;background:rgba(0,0,0,.28);border-radius:8px;
font-family:ui-monospace,'SF Mono',Menlo,Consolas,monospace;font-size:.86rem;line-height:1.5;
white-space:pre-wrap;color:#e5eef6;max-height:22rem;overflow:auto}
.gen{display:inline-flex;align-items:center;gap:.4rem;font-size:.85rem;color:#ffd166;opacity:.85;font-style:italic}
.takediv{grid-column:1/-1;margin:.55rem 0 .15rem;font-size:.72rem;letter-spacing:.05em;text-transform:uppercase;
color:#8aa0b6;opacity:.75;border-top:1px dashed rgba(255,255,255,.13);padding-top:.4rem}
.take.old{opacity:.72}
.take.old .lab{color:#9fb4c9}
.v45{display:inline-block;margin-left:.3rem;padding:.02rem .32rem;border-radius:5px;font-size:.62rem;font-weight:700;
letter-spacing:.03em;vertical-align:middle;background:rgba(255,209,102,.16);color:#ffd166;border:1px solid rgba(255,209,102,.4)}
</style>
<canvas id="bg"></canvas><div id="scrim"></div>
<div class="wrap">
<header>
<p class="eyebrow">A favor for Hari · Warlords Soundtrack</p>
<h1>Round 4, Hari. <span class="wave">👋</span></h1>
<p class="lede"><b>Your notes are all in.</b> 37 of the 47 songs are settled and off this page — they're in the game. What's left is <b>only the ones you asked us to redo</b>. The big takeaway from your feedback was <b>too much metal</b>, so most of these changed genre outright rather than getting a lyric tweak; the green line under each song says exactly what changed and what to listen for. Same as before — play both takes, pick one, <b>leave a note</b> if it's still not right. <b>Everything saves as you go</b> — hit <b>Copy picks</b> at the bottom and send it back.</p>
<p class="lede" style="opacity:.8"><b>Three more are still coming:</b> Hoarfrost, The Lost Witch and The Brothers. Suno rate-limited us mid-batch — they'll be added to this page as soon as they're through, so check back.</p>
<p class="sig">Seriously, thanks Hari — this helps a ton.</p>
<div class="banner">
🔊 <b>Heads up, Hari:</b> audio won't stream inside this preview window. Open the <b>warlords_soundtrack.html</b> file Paul sent you, or use the <b>copy-link</b> buttons. You can still pick and leave notes here.
</div>
<div class="legend">
<span><span class="dot a"></span> Take A</span>
<span><span class="dot b"></span> Take B</span>
<span>tap ► to play · drag to seek</span>
</div>
</header>
<div id="list"></div>
<p class="note" id="foot">More still rendering — this page grows as they finish.</p>
</div>
<div class="bar"><div class="bar-in">
<div class="transport">
<button class="tb" id="bprev" type="button" aria-label="Previous take" title="Previous"></button>
<button class="tb tb-main" id="bplay" type="button" aria-label="Play or pause" title="Play / pause"></button>
<button class="tb tb-next" id="bnext" type="button" aria-label="Skip to next take" title="Skip"></button>
</div>
<span class="now" id="now">tap ► on any take · ⏭ to skip through</span>
<span class="prog" id="prog">0 picked</span>
<button class="copy" id="copy">Copy picks</button>
</div></div>
<canvas id="hari"></canvas>
<script>
const SONGS = [{"id": "the_brothers", "kind": "big", "forName": "The Twins", "title": "Back to Back", "genre": "rowdy Celtic folk-punk", "hook": "", "takes": [{"lab": "A", "url": "https://cdn1.suno.ai/be238efe-524e-46a0-9a59-b937250bf6e6.mp3", "model": "v5.5", "old": false}, {"lab": "B", "url": "https://cdn1.suno.ai/13ceb521-be09-4d35-9b55-55a2a6d61760.mp3", "model": "v5.5", "old": false}], "rev": true, "new": false, "why": "You wanted the dialog to carry a real story and every line to make sense. Rewritten. Gone: “hold the line”, “you bled after I paid”, “the moss has no cause”, the shieldwall-hill line and “brutes in a row and they don’t give way”. The hilt/point thing is now a name pun that gets explained — Haft is the handle, Hew is the cut. Kept what you liked: the drunk-broke-the-sword story, the “(It was me.)” interjection, the pre-chorus and chorus, and “I’d die for you tonight”. The “choose which one” line is replaced with what the fight actually does: cut one of us down and the one still standing gets the other’s fury.", "lyrics": "[Intro - spoken, over an accordion drone and boot stomps]\n[Female]\nWhose round is it?\n[Male]\nYours. It has been yours since the Ember Wastes.\n[Female]\nI bled at the Ember Wastes!\n[Male]\nYou bled. I paid. Those are two different things.\n\n[Verse 1 - MALE VOICE only, deep and gravelly]\nFather's old sword broke the winter we were born,\nso he gave the grip to me and the edge to her.\nHe named me Haft: the handle and the hold,\nthe half of a sword that was never meant to turn.\nI set the brutes on your best lane and lean,\nlegionnaires behind them, shoulder into shield.\nYou can shove at that all day if you like —\nat the end of the day I am still in the field.\n\n[Verse 2 - FEMALE VOICE only, bright and fierce]\nAnd he named me Hew, and Hew means cut,\nso I never once learned how to stand still.\nYou snapped that sword on a cellar door, drunk as a lord,\nso don't you preach me one holy word.\nHe holds the front so hard they all face front —\nthat's the favour, that's the whole of what he's for.\nI put my cutthroats down behind your line\nand walk right up to whoever gives the orders.\n\n[Pre-Chorus - MALE VOICE only]\nNever agreed on a road, never agreed on a price,\nnever agreed which of us was born first.\n[Pre-Chorus - FEMALE VOICE only]\n(It was me.)\n[Both]\nBut we agreed on one thing — we only ever agreed on one thing —\n\n[Chorus - BOTH voices, male and female in harmony, whole tavern shouting]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nCut one of us down, you have done nothing right —\nthe one still standing gets the other one's fight!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Verse 3 - MALE VOICE only, the Blackreed bog]\nAt the Blackreed bog I hauled her out of the muck,\ntwelve men on her and her shield-arm stuck.\nThat is how it went, whatever she says.\nI still owe that bog a boot, and she still owes me a life.\n\n[Verse 4 - FEMALE VOICE only]\nThat is not how it went and it never was.\nHe was the one face down. I counted six, not twelve.\nI left one squad in the lane to keep them looking forward\nand I dragged him out the back while they were busy.\nAsk anyone who saw it.\n[Male]\nEveryone who saw it died.\n\n[Chorus - BOTH voices, male and female in harmony, whole tavern shouting]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nCut one of us down, you have done nothing right —\nthe one still standing gets the other one's fight!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Bridge - soft, everything drops to a lone fiddle]\n[Male]\nSister.\n[Female]\nAye, brother. Back to back.\n[Both]\nCut down the wall and the knives run free,\ncut down the knives and the wall grows deep,\nand whichever of us you leave standing there\nfights with the other's fury and the other's share.\n\n[Verse 5 - trading, low and serious]\n[Male]\nYou never thanked me for the pass at Ash.\n[Female]\nYou'd have done it for the dog.\n[Male]\nI'd have done it for the dog. And the dog agrees with me.\n[Female]\n...Aye. Fair.\n\n[Chorus - BOTH voices, full tavern, everyone off their stools]\nBACK TO BACK, and the world can come!\nBack to back till the drums are done!\nCut one of us down, you have done nothing right —\nthe one still standing gets the other one's fight!\nBACK TO BACK, THE TWO OF US!\nYou have never once been right in your life,\nand I'd die for you tonight — back to back!\n\n[Outro - slowing to one stomp and a tin whistle]\n[Both]\nNever agreed on nothin' — never had to.\n[Male]\nI'm the elder.\n[Female]\nYou're not.\n[Male]\nI am.\n[Female]\nYou're NOT.\n[Both]\nBack to back."}, {"id": "infernal_legion", "kind": "big", "forName": "Infernal Legion", "title": "Blood Summon", "genre": "hypnotic hill-country blues drone", "hook": "", "takes": [{"lab": "A", "url": "https://cdn1.suno.ai/a4a4401e-a5b2-4e87-9ac3-896c6e87921b.mp3", "model": "v5.5", "old": false}, {"lab": "B", "url": "https://cdn1.suno.ai/1a07be95-e213-4065-b5a2-cfc388030c53.mp3", "model": "v5.5", "old": false}], "rev": true, "new": false, "why": "You took B but the chorus and verse 3 still lost you. The chorus now spells out the chain — the note goes down, the ground comes up, he never called them and doesn’t know their names. Verse 3 is rewritten and turns on him choosing to keep playing. The “there’s no hole” moment is sung instead of spoken, and he explicitly walks out in the morning to look for it.", "lyrics": "[Intro — a lone distorted slide riff looping low, boards keeping the stomp, a hum underneath]\n(hummed, low) Mmm... low down... mmm...\n(spoken, quiet) Just me and the one chord tonight.\n\n[Verse 1]\nSun went down and I sat down alone\nOne low chord on a road nobody's on\nNo band, no crowd, no name on a sign\nJust my thumb on the wire and the wire on my spine\nI don't play it loud, I play it slow\nSame note over till the whole field start to glow\n\n[Verse 2]\nThen the dirt got warm where my boot heel lay\nHummin' right back through the cotton and clay\nI held my hand still but the note played on\nPlayin' me now — and my sayin'-so was gone\n\n[Half-time — everything drops out, the riff hangs, leave it wide open]\n(spoken, plain) And then the ground came open.\nRight down the middle of the field,\nthe dirt split like a mouth.\nCindermaw, yawnin' up out the clay —\na hole with a red light livin' down in it.\nThat ain't thunder, friend.\nThat's the ground come up\nto answer the song.\n\n[Chorus — gospel-blues choir hums low behind]\nPlay it low, play it low, let the one note ring\nThe note goes down and the ground come up\nI never called 'em, I don't know one name —\nthe low is the askin', and they answer every time\nPlay it low, play it long, feel the hum climb\nEvery note I bend down, somethin' climb out the clay\nHand on the steel and I won't let go —\nBlood summon: I play low, and they rise\n\n[Verse 3 — the stomp comes back hard, crowded now]\nI asked for one. A hundred come up.\nSmoke and shoulders and a red-throat shout\nI hollered 'Get down!' — but they don't take words,\nthey only take the note, and I was still playin' it\nI could've took my hand off the string right there.\nI want you to know that I thought about it.\nAnd I want you to know I kept playin'.\n\n[Half-time — hush, just the hum and one voice; SUNG plain and low, not spoken]\nCome the mornin' I walked out to find that hole.\nI know that field, I know that row, I know right where I stood.\nThere was no hole. No seam. No mark in the clay at all.\nBut the hundred was still standin' there, waitin' on me to play.\nAre they up out the dirt, or up out my head?\nDon't matter which. Don't matter now.\nThey come when I play; they hush when I stop.\n\n[Verse 4 — the turn: he quits fighting, starts steering]\nSo I quit tryin' to send 'em back down\nBent the note and I turned 'em around\nPushed the chord and the whole pit leaned\nPulled it soft and the howlin' careened\nI ain't the fool who lost his grip —\nI'm the hand on the reins of this whole burnin' ship\n\n[Bridge — leading now; the stomp doubles]\nThere's a thing come up with a courier's grin,\nwants the throat of the world, won't be reined in —\nso I hold him on the low till I let it ride,\nand he cuts right where I point him, dead on time.\nAnd the big one waited in the back for a throne,\ncome up sure he'd lead — signed his name to my own.\nNow he waits on my hand like the rest of 'em wait.\nI set the tempo. He can hold the gate.\n\n[Final Chorus — full, choir swelling low, still un-shouted]\nPlay it low, play it low, let the one note ring\nThe note goes down and the whole pit come up\nI don't beg 'em up and I don't turn 'em loose —\nthe low is the askin', and the leash is the blues\nPlay it low, play it long, watch the legion lean\nDangerous as ever — but the danger's mine to mean\nHand on the steel and I won't let go —\nBlood summon: I play low, and they follow\n\n[Outro — riff loops on, the hum sinks back toward the ground]\n(hushed) They never come for the words —\nthey come for the low, and the low is mine\nPlay it low... (play it low...)\nMarch 'em home on the one chord slow\nBlood summon... and I can't put it down\n(one chord, never resolves, fade into the hum)"}, {"id": "frost_yeti", "kind": "big", "forName": "The Frost Yeti", "title": "Slow as the Cold", "genre": "glacial post-rock", "hook": "", "takes": [{"lab": "A", "url": "https://cdn1.suno.ai/424f63b9-3e3c-453a-809b-065c43d6e902.mp3", "model": "v5.5", "old": false}, {"lab": "B", "url": "https://cdn1.suno.ai/3b34b6dc-17e3-4d80-bd49-b505e5fc7074.mp3", "model": "v5.5", "old": false}], "rev": true, "new": false, "why": "You took B on sound, so the music brief is untouched — the lyrics are entirely new. Rebuilt on your brief: you are inside its home and the home is part of it, awe and terror and total certainty, a monster with its own story that is completely at ease. No more brain-melting lines.", "lyrics": "[Intro: lone bone flute over deep sub-drone and groaning ice]\nEverything white on this mountain\nis a piece of me somewhere —\nthe pass you came up through, the snow on your coat,\nthe cold that is already in your hair\n\n[Verse: clean deep baritone, vast ice-cave reverb, slow swells beneath]\nI did not come down to meet you.\nYou climbed up into my house.\nYou put your fires on my floor\nand your ropes across my walls.\n\nI watched you from the treeline.\nI was the ridge you rested on.\nI was the still place in the weather\nwhere you told each other the worst had passed.\n\n[Pre-Chorus: low horn enters, slow calving-ice drums begin]\nI am not angry that you came.\nThere is nothing here to take.\nI do not have to reach you —\nyou are already inside the thing that kills you.\n\nYou will get slower. Then slower than that.\nNot from any wound. From being here.\nThe cold does not have to hurry.\nThe cold does not have to aim.\n\n[Chorus: full mass, huge slow swell, wordless choir, colossal drums]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nNo charge and no horn, no shout in the white —\njust the weight of the mountain leaning all night\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Verse: swells drop back, bone flute answers the voice]\nThe frostlings go out first. They are small,\nand they are made of what you are standing in.\nYou cannot freeze a thing that is already frozen,\nso they walk to your fires and they put them out.\n\nThen the wolves. The only fast thing I own.\nThey go wide, around the edge, to your archers,\nand they are finished with your archers\nbefore your front rank has taken a step.\n\nAnd the golem holds the middle.\nHe is a piece of this mountain wearing armour.\nBreak him, and the break is an edge.\nHe will still be standing when the sun comes up.\n\n[Pre-Chorus: horn doubles, drums heavier]\nSo bring your fire. Bring your hurry.\nBring the fastest man you have.\nThere is rime in every lane he runs,\nand he arrives here slow, like all of them.\n\n[Chorus: half-weight, choir low]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\n\n[Bridge: everything falls away, bone flute alone in the cave, then the drums return twice as heavy]\nEvery second turn I open up my hands\nand the sky comes down and sits.\nFrost first. Then the blizzard in behind it.\nThen the field is white, and the white is only me.\n\nYou will chip at me. That is fair.\nThat is what an army is for.\nBut you will get tired, and I will not.\nI have done this to better than you.\n\n[Final Chorus: everything at full mass, choir wide open]\nFrost Yeti, Frost Yeti\nSlow as the cold\nFrost Yeti, Frost Yeti\nHeavy and old\nYour banners hang wet and your drum's out of time,\nthe field has gone white and the white is mine\nFrost Yeti, Frost Yeti\nAnd the cold has the time (the cold has the time)\n\n[Outro: choir and drums fade to sub-drone, voice bare and low]\nNothing on this mountain was ever in a hurry.\nNot the snow. Not the stone. Not me.\nGo back down while the light holds.\n\n...You are not going back down."}, {"id": "ashen_raiders", "kind": "big", "forName": "Ashen Raiders", "title": "Nothing Left to Lose", "genre": "hypnotic Saharan desert blues", "hook": "", "takes": [{"lab": "A", "url": "https://cdn1.suno.ai/35b627d7-3a8c-4ff2-8268-246caadda3ae.mp3", "model": "v5.5", "old": false}, {"lab": "B", "url": "https://cdn1.suno.ai/8cd4fd39-9268-4b45-816e-8e979dd2ca97.mp3", "model": "v5.5", "old": false}], "rev": true, "new": false, "why": "You said A and B sounded AI-generated and the lyrics didn’t make sense. The style now bans autotune, pitch correction and vocal doubling outright, and asks for one weathered older North African voice cut live in a room — and it must open on the lone guitar loop, never a drum hit (your note on B’s opening). Lyrics rewritten: the dust contradiction is fixed by making the ash their own burnt fields, which they now lay down in your lanes.", "lyrics": "[Intro: lone clean electric guitar loop, alone, unhurried]\n[Djembe, calabash and handclaps creep in underneath it]\n\n[Verse: Warlord Ash]\nWe did not ride here from a country\nWe rode out of a burn\nThere was green behind us once\nThere is nothing to go back to\nThey said \"ash\" like it was an insult\nWe took it up for a name\n\n[Refrain: Call and Response]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nThe grey you are breathing was our fields\nWe carry what is left of them\nWe lay it down in every lane you stand in\nSo you fight our dead country before you fight us\nYou keep saying that we brought the dust\nWe did. It is all we brought.\n\n[Verse: The Slingers]\nTake a fistful of the ground up\nGrit and grave-dust, that's the load\nDo not aim it at his shield\nAim it at his eyes\nLet him cut at what he's hearing\nLet him guard the empty air\n\n[Percussion Break: Calabash, Handclaps and the Guitar Loop Only]\n\n[Call and Response]\n(Where is the green?) Ahead\n(Where is the green?) Ahead\n(What is behind us?) Grey\n(What did we leave them?) Grey\n(What have we got?) Nothing\n(What can they take?) Nothing\n\n[Verse: Warlord Ash]\nPut my rider in the dirt, then\nCall it clean and call it won\nYou killed the horse. You did not kill the man.\nHe gets up out of the ash and he walks at you\nThere is no witch behind this army\nNo book, no bargain and no god\n\n[Bridge: Spoken low over the loop]\nYou have things. That is the whole of your disadvantage.\nYou have a line to keep straight, a lord to keep breathing, a wagon of grain behind you.\nWe have a direction.\n\n[Verse: The Screamer]\nWe set one of ours down behind you\nNot for plunder, not for grain\nHe goes past your spears like he was invited\nHe is looking for the one you all look at\nAnd the sound he makes when he finds him\nIs the sound your whole line makes when it breaks\n\n[Refrain: Call and Response — Full Group]\nAsh (ash)\nAsh (ash)\nAsh goes on ahead of us (ash)\nAsh (ash)\nAsh (ash)\nWarlord Ash — and nothing left to lose\n(nothing left to lose)\n\n[Verse: Warlord Ash]\nWhen it is over we will not hold it\nWe do not want the walls you made\nWe want one hour in the green grass\nThen the green goes to the grey\nMen who have got nothing left to lose\nRide at whatever is left of yours\n\n[Outro: Guitar Loop Alone, Percussion Falling Away]\nAsh (ash)\nAsh (ash)\nNothing left to lose (nothing left to lose)\nNothing left to lose (nothing left to lose)\n[Fade on the Guitar Loop]"}, {"id": "pale_rider", "kind": "small", "forName": "The Pale Rider", "title": "Takes the Biggest First", "genre": "spaghetti-western doom with long unhurried lonesome whistling passages between the opening lines", "hook": "", "takes": [{"lab": "A", "url": "https://cdn1.suno.ai/789bc713-8536-4b06-b653-00e01621dc9e.mp3", "model": "v5.5", "old": false}, {"lab": "B", "url": "https://cdn1.suno.ai/5d925dfe-ef46-414e-9613-6e22ae60bd7e.mp3", "model": "v5.5", "old": false}], "rev": true, "new": false, "why": "You caught a real contradiction. The phantoms take the weak, the Rider only ever takes the biggest — that is literally what his kit does, and it is now stated out loud as a deliberate split rather than the song arguing with itself. Also pinned to a single male voice, so the alternating female lines are gone. You liked A’s style, so nothing else moved.", "lyrics": "[Intro - lonesome whistling, unhurried, let it ring out]\n\n[Verse - spacious, never rushed]\nThere's dust on the wind and a bell out of tune\n\n[Whistling - take the tune for a while]\n\nA silent horseman coming under a low grey moon\n\n[Whistling - let it breathe before the next line]\n\nI don't ride to raid you, I ride to collect\nAnd I take the biggest soul that your ranks protect\n\nNo spurs and no war-cry, just the creak of the mist\nI lean in the saddle and I read down my list\nThe Reap swings the scythe and it takes half away\nThe fattest, the strongest, is the first of the pay\n\nGrave-mist comes rolling and my phantoms come through\nThey phase past your shieldwall like it's nothing to do\nLet them have the stragglers in the thinnest of lanes —\nI don't ride for stragglers. I ride for the names.\n\n[Pre-Chorus]\nHear that whistle\nLow and long\nOne lonesome note\nOf a funeral song\n\nI don't run\nI don't chase\nI just take the biggest\nAnd I leave no trace\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Verse]\nPile them up high and you only feed me more\nThe bigger the body, the deeper that I score\nWights in the grave-mist and the specters that phase\nThey drift for your backline through the cold and the haze\n\nI don't want the small ones, they're not worth the ride\nI want the great column with its pride packed inside\nHalf it, then half it, till the mighty are gone\nAnd the mist keeps on rolling and the reaping goes on\n\n[Pre-Chorus]\nHear that whistle\nFading slow\nOne more soul\nFor the mist below\n\nNo hurry\nNo sound\nJust the pale horse walking\nOver your ground\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list (you're top of the list)\n\n[Bridge]\nLet the phantoms have the stragglers — that's their share and not mine.\nThey can drift the empty lanes all night, I do not work that line.\nI ride past a hundred little ones and never turn my head:\nI was sent here for the heaviest, and I take the biggest first.\n\n[Chorus]\nPale Rider, Pale Rider\nTakes the biggest first\nPale Rider, Pale Rider\nThe heavy and the cursed\nNo banner, no bugle, just the scythe and the mist\nPale Rider, Pale Rider\nYou're top of the list\n\nPale Rider, Pale Rider\nThe scythe swings wide\nPale Rider, Pale Rider\nThere's no place to hide\nMy phantoms want the small ones — I have never been impressed\nPale Rider, Pale Rider\nAnd I collect the best (and I collect the best)"}];
const blocked = (function(){ try { return window.self !== window.top; } catch(e){ return true; } })();
if (blocked) document.body.classList.add("blocked");
const picks = JSON.parse(localStorage.getItem("wl_picks_r5") || "{}");
const comments = JSON.parse(localStorage.getItem("wl_comments_r5") || "{}");
const esc = t => (t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
const GROUPS = {"big": "★ Revised from your notes — please re-listen", "small": "Small tweaks from your notes — quick confirm", "new": "New track"};
/* one shared <audio> for the whole page — iOS chokes and lags once ~dozens of
separate audio elements have each buffered a track; a single reused element
keeps memory flat no matter how far down the list you play. */
const GAU=new Audio(); GAU.preload="none"; let curPl=null, curUrl=null;
GAU.addEventListener("play",()=>{ if(curPl)curPl.pp.textContent="❚❚"; updateBar(); });
GAU.addEventListener("pause",()=>{ if(curPl)curPl.pp.textContent="►"; updateBar(); });
GAU.addEventListener("ended",()=>{ if(curPl){curPl.pp.textContent="►";curPl.sk.value=0;curPl.tt.textContent="0:00";} updateBar(); });
GAU.addEventListener("timeupdate",()=>{ if(curPl&&!curPl.se&&GAU.duration){curPl.sk.value=Math.round(GAU.currentTime/GAU.duration*1000);curPl.tt.textContent=fmt(GAU.currentTime);} });
function setPick(id, take){ if(picks[id]===take) delete picks[id]; else picks[id]=take;
localStorage.setItem("wl_picks_r5", JSON.stringify(picks)); render(); }
function player(url){
if(!url) return '<span class="gen">\u23f3 generating\u2026</span>';
if(blocked) return '<button class="linkbtn" data-url="'+url+'">▶ copy track link ↗</button>';
return '<span class="pl" data-url="'+url+'"><button class="pp" type="button" aria-label="Play">►</button>'+
'<input type="range" class="seek" min="0" max="1000" value="0" aria-label="Seek">'+
'<span class="tt">0:00</span></span>';
}
function fmt(s){ s=Math.max(0,Math.floor(s||0)); return Math.floor(s/60)+":"+String(s%60).padStart(2,"0"); }
function songHTML(s){
const chosen=picks[s.id];
return '<div class="song'+(chosen?" done":"")+'">'+
'<div class="song-head"><div class="num">'+String(s.n).padStart(2,"0")+'</div>'+
'<div class="titles"><p class="title">'+s.title+'</p>'+
'<p class="for">for <b>'+s.forName+'</b></p><span class="chip">'+s.genre+'</span>'+(s.rev?'<span class="chip rev">↻ revised — re-listen</span>':'')+(s.new?'<span class="chip new">★ new version</span>':'')+'</div></div>'+
(s.why?'<p class="why">'+s.why+'</p>':'')+
'<div class="takes">'+
s.takes.map(function(t){var k=t.lab.toLowerCase();
var div=(t.lab==="C")?'<div class="takediv">earlier takes \u00b7 made with v4.5+</div>':'';
return div+'<div class="take'+(t.old?' old':'')+'"><span class="lab">'+t.lab+(t.old?' <span class="v45">v4.5+</span>':'')+'</span>'+player(t.url)+
'<button class="pick '+(chosen===k?'on':'')+'" data-id="'+s.id+'" data-take="'+k+'">'+(chosen===k?'✓':'Pick')+'</button></div>';}).join('')+
'</div>'+
'<details class="lyr"><summary>\u25b8 Lyrics</summary><pre class="lyrbody">'+esc(s.lyrics)+'</pre></details>'+
'<textarea class="cmt" data-id="'+s.id+'" rows="1" placeholder="Notes for a new version (optional) — e.g. faster, less guitar, love the chorus…">'+esc(comments[s.id])+'</textarea></div>';
}
function render(){
const list=document.getElementById("list"); let html=""; let last=null;
for(const s of SONGS){ if(s.kind!==last){ html+='<p class="group-label">'+(GROUPS[s.kind]||"")+'</p>'; last=s.kind; } html+=songHTML(s); }
list.innerHTML=html;
list.querySelectorAll(".pick").forEach(b=>b.onclick=()=>setPick(b.dataset.id,b.dataset.take));
list.querySelectorAll(".linkbtn").forEach(b=>b.onclick=()=>{ const u=b.dataset.url;
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(u).then(()=>{b.textContent="✓ link copied";},()=>{});
try{ window.open(u,"_blank"); }catch(e){} });
list.querySelectorAll(".cmt").forEach(c=>{ const grow=()=>{c.style.height="auto";c.style.height=Math.max(40,c.scrollHeight)+"px";}; if(c.value)grow();
c.addEventListener("input",()=>{ if(c.value.trim())comments[c.dataset.id]=c.value; else delete comments[c.dataset.id];
localStorage.setItem("wl_comments_r5",JSON.stringify(comments)); grow(); }); });
curPl=null;
list.querySelectorAll(".pl").forEach(pl=>{
const pp=pl.querySelector(".pp"),sk=pl.querySelector(".seek"),tt=pl.querySelector(".tt"),url=pl.dataset.url;
const me={pp,sk,tt,url,se:false};
if(url===curUrl){ curPl=me; if(!GAU.paused)pp.textContent="❚❚";
if(GAU.duration){sk.value=Math.round(GAU.currentTime/GAU.duration*1000);tt.textContent=fmt(GAU.currentTime);} }
pp.addEventListener("click",()=>{
if(curPl===me){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); return; }
if(curPl){ curPl.pp.textContent="►"; curPl.sk.value=0; curPl.tt.textContent="0:00"; }
curPl=me; curUrl=url; GAU.src=url; GAU.play().catch(()=>{});
});
sk.addEventListener("input",()=>{ if(curPl!==me)return; me.se=true; if(GAU.duration)tt.textContent=fmt(sk.value/1000*GAU.duration); });
sk.addEventListener("change",()=>{ if(curPl!==me)return; if(GAU.duration)GAU.currentTime=sk.value/1000*GAU.duration; me.se=false; });
});
document.getElementById("prog").textContent=Object.keys(picks).length+" / "+SONGS.length+" picked";
}
document.getElementById("copy").onclick=()=>{
const lines=["Warlords soundtrack — Hari's picks & notes:",""];
for(const s of SONGS){ const p=picks[s.id],c=comments[s.id];
lines.push(String(s.n).padStart(2,"0")+'. '+s.forName+' — "'+s.title+'" ('+s.genre+'): '+(p?"Take "+p.toUpperCase():"— no pick"));
if(c) lines.push(' notes: '+c.replace(/\n/g," ")); }
const text=lines.join("\n"),btn=document.getElementById("copy");
const done=()=>{btn.textContent="Copied!";btn.classList.add("done");setTimeout(()=>{btn.textContent="Copy picks";btn.classList.remove("done");},1800); if(window.__hariWalkout)window.__hariWalkout();};
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done,()=>fb(text,done)); else fb(text,done);
};
function fb(t,done){const ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");}catch(e){}ta.remove();done();}
render();
/* ---- transport bar: prev / play-pause / skip through every take ---- */
function trackInfo(url){ for(const s of SONGS){ if(s.a===url) return {t:s.title,who:s.forName,take:"A"}; if(s.b===url) return {t:s.title,who:s.forName,take:"B"}; } return null; }
function updateBar(){
const bp=document.getElementById("bplay"), now=document.getElementById("now"); if(!bp) return;
bp.textContent = (curUrl && !GAU.paused) ? "❚❚" : "►";
const info = curUrl ? trackInfo(curUrl) : null;
now.innerHTML = info ? ('<b>'+esc(info.t)+'</b> · '+esc(info.who)+' — Take '+info.take) : "tap ► on any take · ⏭ to skip through";
}
function pls(){ return [...document.querySelectorAll("#list .pl")]; }
function skipBy(dir){
const a=pls(); if(!a.length) return;
let i=a.findIndex(p=>p.dataset.url===curUrl);
i = i<0 ? (dir>0?0:a.length-1) : (((i+dir)%a.length)+a.length)%a.length;
a[i].querySelector(".pp").click();
const song=a[i].closest(".song"); if(song) song.scrollIntoView({behavior:"smooth",block:"center"});
}
document.getElementById("bnext").onclick=()=>skipBy(1);
document.getElementById("bprev").onclick=()=>skipBy(-1);
document.getElementById("bplay").onclick=()=>{ if(curUrl){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); } else skipBy(1); };
updateBar();
/* ---- groovy lava-lamp (metaballs) background ---- */
(function(){
const bg=document.getElementById("bg"), ctx=bg.getContext("2d");
const reduce=matchMedia("(prefers-reduced-motion:reduce)").matches;
const SC=11; let img,d,W,H,t=0;
// warm 70s ramp: deep indigo -> violet -> hot pink -> orange -> gold
const STOPS=[[20,8,46],[68,16,98],[150,26,122],[224,44,108],[255,96,58],[255,168,54],[255,232,150]];
function ramp(u){ u=u<0?0:u>1?1:u; const f=u*(STOPS.length-1), i=Math.floor(f), g=f-i;
const a=STOPS[i], b=STOPS[i+1<STOPS.length?i+1:i];
return [a[0]+(b[0]-a[0])*g|0, a[1]+(b[1]-a[1])*g|0, a[2]+(b[2]-a[2])*g|0]; }
const N=6, B=[];
for(let i=0;i<N;i++)B.push({x:Math.random(),y:Math.random(),
vx:(Math.random()*2-1)*0.00035, vy:(Math.random()*2-1)*0.00035, r:0.15+Math.random()*0.15});
function fit(){ W=bg.width=Math.max(2,Math.ceil(innerWidth/SC)); H=bg.height=Math.max(2,Math.ceil(innerHeight/SC));
img=ctx.createImageData(W,H); d=img.data; for(let i=3;i<d.length;i+=4)d[i]=255; }
function step(){ for(const b of B){ b.x+=b.vx; b.y+=b.vy;
if(b.x<0.08||b.x>0.92)b.vx*=-1; if(b.y<0.08||b.y>0.92)b.vy*=-1; } }
function paint(){ const wob=0.055*Math.sin(t*0.5);
for(let y=0;y<H;y++){ const ny=y/H;
for(let x=0;x<W;x++){ const nx=x/W; let F=0;
for(let k=0;k<N;k++){ const dx=nx-B[k].x, dy=ny-B[k].y; F+=B[k].r*B[k].r/(dx*dx+dy*dy+0.0016); }
const c=ramp(F/(F+2.2)+wob); const i=(y*W+x)*4; d[i]=c[0]; d[i+1]=c[1]; d[i+2]=c[2]; } }
ctx.putImageData(img,0,0); }
fit(); addEventListener("resize",fit);
if(reduce){ step(); paint(); }
else { (function loop(){ t+=0.016; step(); paint(); requestAnimationFrame(loop); })(); }
})();
/* ---- Ragdoll Hari: pops out every 2 min, a different dance each time ---- */
(function(){
const cv=document.getElementById("hari"), ctx=cv.getContext("2d");
if(matchMedia("(prefers-reduced-motion:reduce)").matches) return;
const A="#f7f0e2"; let raf=0, t0=0, style="flail", fromLeft=true, order=[], oi=0;
const STYLES=["flail","disco","robot","twist","jack","headbang","charleston"];
const P=Math.PI;
function fit(){ cv.width=cv.clientWidth; cv.height=170; }
function seg(x1,y1,a,l){ const x2=x1+Math.cos(a)*l,y2=y1+Math.sin(a)*l; ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke(); return [x2,y2]; }
function walkPose(ph){ const sw=Math.sin(ph*7); return {la:P*0.55+sw*0.55, ra:P*0.55-sw*0.55, lae:0, rae:0, ll:P*0.5+sw*0.5, rl:P*0.5-sw*0.5, hop:0, lean:0}; }
function dance(st,ph){ const S=Math.sin, R=x=>Math.round(x*2)/2;
if(st==="disco"){ const up=S(ph*2.4)>0; return {la:up?-2.3:1.9, ra:up?1.9:-2.3, lae:.1, rae:.1, ll:P*0.5+S(ph*4.8)*.3, rl:P*0.5-S(ph*4.8)*.3, hop:Math.abs(S(ph*2.4))*9, lean:S(ph*2.4)*.22}; }
if(st==="robot"){ return {la:-1.2+R(S(ph*2))*1.1, ra:-1.2-R(S(ph*2+1))*1.1, lae:R(S(ph*3))*.6, rae:R(S(ph*3+1))*.6, ll:P*0.5+R(S(ph*2))*.3, rl:P*0.5-R(S(ph*2))*.3, hop:0, lean:R(S(ph))*.12}; }
if(st==="twist"){ return {la:P*0.5+S(ph*3.5)*.8, ra:P*0.5-S(ph*3.5)*.8, lae:.3, rae:.3, ll:P*0.5+S(ph*3.5)*.3, rl:P*0.5-S(ph*3.5)*.3, hop:Math.abs(S(ph*7))*4, lean:S(ph*3.5)*.4}; }
if(st==="jack"){ const o=(S(ph*4.5)+1)/2; return {la:-P*0.5-o*1.3, ra:-P*0.5+o*1.3, lae:0, rae:0, ll:P*0.5+o*.55, rl:P*0.5-o*.55, hop:o*12, lean:0}; }
if(st==="headbang"){ return {la:P*0.62+S(ph*7)*.35, ra:P*0.62-S(ph*7)*.35, lae:.2, rae:.2, ll:P*0.5+.06, rl:P*0.5-.06, hop:Math.abs(S(ph*7))*5, lean:.55+S(ph*7)*.5}; }
if(st==="charleston"){ const k=S(ph*4); return {la:P*0.5+k*.9, ra:P*0.5+k*.9, lae:-.5, rae:-.5, ll:P*0.5+k*.7, rl:P*0.5-k*.7, hop:Math.abs(S(ph*4))*7, lean:-k*.18}; }
/* flail */ return {la:-2.9+S(ph*7)*1.0, ra:-0.2+S(ph*7+1.6)*1.0, lae:S(ph*10)*.9, rae:S(ph*10+1)*.9, ll:P*0.5+S(ph*5)*.55, rl:P*0.5-S(ph*5)*.55, hop:Math.abs(S(ph*5))*15, lean:S(ph*3)*.3};
}
function draw(x,ground,ph,pose){
ctx.strokeStyle=A; ctx.fillStyle=A; ctx.lineWidth=4; ctx.lineCap="round"; ctx.lineJoin="round";
const hipY=ground-30-pose.hop, torso=-P/2+pose.lean;
const [nx,ny]=seg(x,hipY,torso,26);
const hx=nx+Math.cos(torso)*9, hy=ny+Math.sin(torso)*9;
ctx.beginPath(); ctx.arc(hx,hy,8.5,0,P*2); ctx.stroke();
let [ex,ey]=seg(nx,ny,pose.la,15); seg(ex,ey,pose.la+pose.lae,12);
[ex,ey]=seg(nx,ny,pose.ra,15); seg(ex,ey,pose.ra+pose.rae,12);
let [kx,ky]=seg(x,hipY,pose.ll,17); seg(kx,ky,pose.ll+0.25,15);
[kx,ky]=seg(x,hipY,pose.rl,17); seg(kx,ky,pose.rl+0.25,15);
ctx.font="bold 12px ui-monospace, monospace"; ctx.textAlign="center";
ctx.fillText("HARI", hx, hy-16-(pose.hop>1?pose.hop*0.4:0));
}
function frame(now){
const tt=(now-t0)/1000; ctx.clearRect(0,0,cv.width,cv.height);
const W=cv.width, ground=cv.height-14, cx=W/2;
const EN=4.5, DA=9, EX=4.5;
let x, pose;
if(tt<EN){ const p=tt/EN; x=fromLeft ? -50+(cx+50)*p : (W+50)-((W+50)-cx)*p; pose=walkPose(tt); }
else if(tt<EN+DA){ x=cx; pose=dance(style, tt-EN); }
else if(tt<EN+DA+EX){ const p=(tt-EN-DA)/EX; x=fromLeft ? cx+(W+60-cx)*p : cx-(cx+60)*p; pose=walkPose(tt); }
else { cv.style.display="none"; cancelAnimationFrame(raf); raf=0; return; }
draw(x,ground,tt<EN?tt:(tt-EN),pose); raf=requestAnimationFrame(frame);
}
function nextStyle(){ if(oi>=order.length){ order=STYLES.slice().sort(()=>Math.random()-0.5); oi=0; } return order[oi++]; }
function walkout(){ if(raf) return; style=nextStyle(); fromLeft=Math.random()<0.5; cv.style.display="block"; fit(); t0=performance.now(); raf=requestAnimationFrame(frame); }
addEventListener("resize",()=>{ if(cv.style.display!=="none") fit(); });
window.__hariWalkout=walkout;
const soon=/dance|hari|test/i.test(location.hash);
if(soon) setTimeout(walkout, 2000);
setInterval(walkout, 120000);
})();
</script>
<title>Warlords — Pick the Take (for Hari)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root{
--ink:#f7f0e2; --muted:#c8b7a0; --faint:#93856f; --line:rgba(255,244,220,.14);
--amber:#f0b24a; --amber-dim:rgba(240,178,74,.18);
--teal:#63c6da; --teal-dim:rgba(99,198,218,.18);
--serif:"Iowan Old Style",Georgia,"Palatino Linotype","Book Antiqua",serif;
--sans:system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
--mono:ui-monospace,"SF Mono","Cascadia Code",Consolas,monospace;
--card:rgba(24,20,26,.74);
}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{ margin:0; color:var(--ink); font-family:var(--sans); line-height:1.5;
background:#120e16; padding-bottom:76px; position:relative; }
#bg{position:fixed; inset:0; width:100vw; height:100vh; z-index:-3; transform:scale(1.15);
filter:blur(30px) saturate(1.6) brightness(1.02); image-rendering:auto}
#scrim{position:fixed; inset:0; z-index:-2; pointer-events:none;
background:radial-gradient(120% 90% at 50% 0%, rgba(10,8,14,.28), rgba(8,6,12,.6) 75%)}
@media(prefers-reduced-motion:reduce){ #bg{filter:blur(34px) saturate(1.3)} }
.wrap{max-width:880px; margin:0 auto; padding:44px 20px 40px; position:relative; z-index:1}
header{border-bottom:1px solid var(--line); padding-bottom:26px}
.eyebrow{font-family:var(--mono); font-size:12px; letter-spacing:.22em; text-transform:uppercase;
color:var(--amber); margin:0 0 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
h1{font-family:var(--serif); font-weight:600; font-size:clamp(32px,6.4vw,50px); line-height:1.04;
margin:0 0 14px; text-wrap:balance; letter-spacing:-.01em; text-shadow:0 2px 16px rgba(0,0,0,.65)}
h1 .wave{display:inline-block; transform-origin:70% 70%; animation:wave 2.4s ease-in-out 1s 2}
@keyframes wave{0%,60%,100%{transform:rotate(0)}70%{transform:rotate(16deg)}80%{transform:rotate(-8deg)}90%{transform:rotate(12deg)}}
@media(prefers-reduced-motion:reduce){h1 .wave{animation:none}}
.lede{color:var(--muted); font-size:16.5px; max-width:62ch; margin:0; text-shadow:0 1px 10px rgba(0,0,0,.6)}
.lede b{color:#fff; font-weight:600}
.sig{color:var(--faint); font-style:italic; font-family:var(--serif); margin:12px 0 0; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend{display:flex; gap:18px; flex-wrap:wrap; margin-top:20px; font-family:var(--mono);
font-size:12px; color:var(--muted); letter-spacing:.03em; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.legend span{display:inline-flex; align-items:center; gap:7px}
.dot{width:10px; height:10px; border-radius:50%}
.dot.a{background:var(--amber)} .dot.b{background:var(--teal)}
.banner{display:none; margin:20px 0 0; padding:13px 16px; border-radius:11px;
background:rgba(20,60,70,.6); border:1px solid rgba(99,198,218,.45); color:var(--ink); font-size:14.5px}
body.blocked .banner{display:block}
.banner b{color:var(--teal)}
.group-label{font-family:var(--mono); font-size:12px; letter-spacing:.2em; text-transform:uppercase;
color:var(--muted); margin:34px 2px 14px; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.song{background:var(--card); backdrop-filter:blur(7px); -webkit-backdrop-filter:blur(7px);
border:1px solid var(--line); border-radius:14px; padding:20px 22px 18px; margin:14px 0; transition:border-color .2s}
.song.done{border-color:rgba(240,178,74,.5)}
.song-head{display:flex; gap:16px; align-items:baseline}
.num{font-family:var(--mono); font-size:13px; color:var(--faint); font-variant-numeric:tabular-nums; padding-top:5px; min-width:26px}
.titles{flex:1; min-width:0}
.title{font-family:var(--serif); font-size:23px; font-weight:600; line-height:1.15; margin:0}
.for{color:var(--muted); font-size:14px; margin:3px 0 0}
.for b{color:var(--ink); font-weight:600}
.chip{display:inline-block; font-family:var(--mono); font-size:11px; letter-spacing:.04em;
color:var(--amber); border:1px solid var(--amber-dim); background:var(--amber-dim);
padding:2px 9px; border-radius:100px; margin-top:9px; text-transform:lowercase}
.chip.rev{color:var(--teal); border-color:var(--teal-dim); background:var(--teal-dim); text-transform:none; margin-left:6px}
.hook{color:var(--faint); font-style:italic; font-family:var(--serif); font-size:15px; margin:11px 0 0; padding-left:42px}
.takes{display:flex; flex-direction:column; gap:9px; margin:16px 0 0 42px}
.take{display:flex; align-items:center; gap:11px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:10px; padding:9px 13px}
.take .lab{font-family:var(--mono); font-size:11px; letter-spacing:.12em; width:26px; flex:0 0 auto}
.take.a .lab{color:var(--amber)} .take.b .lab{color:var(--teal)}
.pl{flex:1; min-width:150px; display:flex; align-items:center; gap:10px}
.pp{flex:0 0 auto; width:36px; height:36px; border-radius:50%; border:0; cursor:pointer; padding:0;
font-size:13px; line-height:1; display:grid; place-items:center; font-family:var(--sans)}
.take.a .pp{background:var(--amber); color:#241a08} .take.b .pp{background:var(--teal); color:#08222a}
.pp:active{transform:scale(.93)}
.seek{flex:1; min-width:60px; height:22px; -webkit-appearance:none; appearance:none; background:transparent; cursor:pointer; margin:0}
.seek::-webkit-slider-runnable-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-moz-range-track{height:4px; border-radius:3px; background:rgba(255,255,255,.18)}
.seek::-webkit-slider-thumb{-webkit-appearance:none; margin-top:-5px; width:14px; height:14px; border-radius:50%; border:0}
.seek::-moz-range-thumb{width:14px; height:14px; border-radius:50%; border:0}
.take.a .seek::-webkit-slider-thumb{background:var(--amber)} .take.a .seek::-moz-range-thumb{background:var(--amber)}
.take.b .seek::-webkit-slider-thumb{background:var(--teal)} .take.b .seek::-moz-range-thumb{background:var(--teal)}
.tt{font-family:var(--mono); font-size:11px; color:var(--muted); min-width:30px; text-align:right; font-variant-numeric:tabular-nums; flex:0 0 auto}
.linkbtn{flex:1; min-width:140px; text-align:left; font-family:var(--mono); font-size:12.5px;
color:var(--muted); background:transparent; border:1px dashed var(--line); border-radius:8px; padding:8px 11px; cursor:pointer}
.pick{appearance:none; cursor:pointer; font-family:var(--sans); font-size:13px; flex:0 0 auto;
font-weight:600; color:var(--muted); background:transparent; border:1px solid var(--line); border-radius:8px; padding:7px 12px; transition:all .15s}
.pick:hover{color:var(--ink); border-color:var(--muted)}
.take.a .pick.on{background:var(--amber); color:#241a08; border-color:var(--amber)}
.take.b .pick.on{background:var(--teal); color:#08222a; border-color:var(--teal)}
.cmt{display:block; width:calc(100% - 42px); margin:11px 0 0 42px; background:rgba(0,0,0,.28);
border:1px solid var(--line); border-radius:9px; color:var(--ink); font-family:var(--sans);
font-size:13.5px; line-height:1.45; padding:9px 12px; resize:vertical; min-height:40px}
.cmt::placeholder{color:var(--faint)}
.cmt:focus{border-color:var(--muted); outline:none}
@media(max-width:560px){
.takes{margin-left:0} .hook{padding-left:0} .cmt{width:100%; margin-left:0}
.wrap{padding:34px 15px 34px} .song{padding:16px 14px 14px}
.song-head{gap:11px} .num{min-width:20px}
.take{gap:8px; padding:8px 10px} .pl{min-width:0; gap:8px}
.pp{width:34px; height:34px} .seek{min-width:36px; height:26px} .pick{padding:7px 11px}
.bar-in{padding:9px 13px; gap:10px}
.prog{display:none}
.tb{width:34px; height:34px} .tb.tb-main{width:38px; height:38px} .transport{gap:6px}
.copy{padding:9px 13px}
}
.bar{position:fixed; left:0; right:0; bottom:0; background:rgba(14,10,18,.9);
backdrop-filter:blur(10px); border-top:1px solid var(--line); z-index:10}
.bar-in{max-width:880px; margin:0 auto; padding:12px 20px; display:flex; align-items:center; gap:16px}
.prog{font-family:var(--mono); font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; flex:1}
.copy{appearance:none; cursor:pointer; font-family:var(--sans); font-weight:600; font-size:14px;
color:#241a08; background:var(--amber); border:0; border-radius:9px; padding:9px 16px}
.copy.done{background:var(--teal); color:#08222a}
.transport{display:flex; align-items:center; gap:8px; flex:0 0 auto}
.tb{width:38px; height:38px; border-radius:50%; border:1px solid var(--line); background:rgba(255,255,255,.06);
color:var(--ink); font-size:14px; cursor:pointer; display:grid; place-items:center; padding:0; line-height:1}
.tb:active{transform:scale(.92)}
.tb.tb-main{background:var(--amber); color:#241a08; border-color:var(--amber); width:42px; height:42px; font-size:15px}
.tb.tb-next{border-color:var(--amber); color:var(--amber)}
.now{flex:1; min-width:0; font-family:var(--mono); font-size:12.5px; color:var(--muted);
white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-shadow:0 1px 8px rgba(0,0,0,.6)}
.now b{color:var(--ink); font-weight:600}
.note{color:var(--muted); font-size:13px; margin:26px 2px 0; text-align:center; font-family:var(--mono); text-shadow:0 1px 8px rgba(0,0,0,.6)}
:focus-visible{outline:2px solid var(--amber); outline-offset:2px}
#hari{position:fixed; left:0; bottom:52px; width:100%; height:170px; pointer-events:none; z-index:40; display:none}
.why{margin:.5rem 0 .1rem;padding:.55rem .7rem;border-left:3px solid #7bd88f;
background:rgba(123,216,143,.09);border-radius:0 6px 6px 0;font-size:.93rem;line-height:1.45;color:#d9f2df}
.chip.new{background:rgba(255,209,102,.16);border-color:rgba(255,209,102,.5);color:#ffd166}
</style>
<canvas id="bg"></canvas><div id="scrim"></div>
<div class="wrap">
<header>
<p class="eyebrow">A favor for Hari · Warlords Soundtrack</p>
<h1>Round 2, Hari. <span class="wave">👋</span></h1>
<p class="lede"><b>Your notes are all in.</b> 37 of the 47 songs are settled and off this page — they're in the game. What's left is <b>only the ones you asked us to redo</b>. The big takeaway from your feedback was <b>too much metal</b>, so most of these changed genre outright rather than getting a lyric tweak; the green line under each song says exactly what changed and what to listen for. Same as before — play both takes, pick one, <b>leave a note</b> if it's still not right. <b>Everything saves as you go</b> — hit <b>Copy picks</b> at the bottom and send it back.</p>
<p class="lede" style="opacity:.8"><b>Three more are still coming:</b> Hoarfrost, The Lost Witch and The Brothers. Suno rate-limited us mid-batch — they'll be added to this page as soon as they're through, so check back.</p>
<p class="sig">Seriously, thanks Hari — this helps a ton.</p>
<div class="banner">
🔊 <b>Heads up, Hari:</b> audio won't stream inside this preview window. Open the <b>warlords_soundtrack.html</b> file Paul sent you, or use the <b>copy-link</b> buttons. You can still pick and leave notes here.
</div>
<div class="legend">
<span><span class="dot a"></span> Take A</span>
<span><span class="dot b"></span> Take B</span>
<span>tap ► to play · drag to seek</span>
</div>
</header>
<div id="list"></div>
<p class="note" id="foot">More still rendering — this page grows as they finish.</p>
</div>
<div class="bar"><div class="bar-in">
<div class="transport">
<button class="tb" id="bprev" type="button" aria-label="Previous take" title="Previous"></button>
<button class="tb tb-main" id="bplay" type="button" aria-label="Play or pause" title="Play / pause"></button>
<button class="tb tb-next" id="bnext" type="button" aria-label="Skip to next take" title="Skip"></button>
</div>
<span class="now" id="now">tap ► on any take · ⏭ to skip through</span>
<span class="prog" id="prog">0 picked</span>
<button class="copy" id="copy">Copy picks</button>
</div></div>
<canvas id="hari"></canvas>
<script>
const SONGS = [
{
"n": 1,
"id": "steel_legion",
"kind": "pack",
"forName": "Steel Legion",
"title": "Hold the Line",
"genre": "epic cinematic military march",
"hook": "Shields to the front, we do not break / Every step forward, the earth will shake",
"a": "https://cdn1.suno.ai/9590b6ec-98b5-4e85-a6ac-110c9e318667.mp3",
"b": "https://cdn1.suno.ai/988dd8dc-4871-4dc9-ba88-990ee4b5061b.mp3",
"rev": true,
"new": false,
"why": "Revised: deeper, lower solo voice; longer; lyrics rewritten so they're leaders with depth, not mantra-followers. (Your old take A now plays as the home-city theme in game.)"
},
{
"n": 2,
"id": "slime_swarm",
"kind": "pack",
"forName": "Slime Swarm",
"title": "Split and Multiply",
"genre": "bubblegum chiptune pop",
"hook": "One little slime goes squish and plop / Cut it in two and it will not stop",
"a": "https://cdn1.suno.ai/3e4e51cf-ae8a-49dc-8d63-fc3301b1d6a7.mp3",
"b": "https://cdn1.suno.ai/cfb50c6e-225a-4ccd-acb9-9f1be903b925.mp3",
"rev": true,
"new": false,
"why": "Revised: same whimsical music and voice you liked, but the cliche lyrics are gone."
},
{
"n": 3,
"id": "wild_pack",
"kind": "pack",
"forName": "Wild Pack",
"title": "Blood Moon Runs",
"genre": "tribal war chant",
"hook": "Low in the grass we move as one / Pack tactics till the hunt is done",
"a": "https://cdn1.suno.ai/0a774a09-72a0-40cf-8700-33b5929051a2.mp3",
"b": "https://cdn1.suno.ai/d18dcbb1-3ed3-4cba-82c5-c8adb9bf9fe5.mp3",
"rev": true,
"new": false,
"why": "Revised: much less yelling, especially around the 1-minute mark where you said the balance was off."
},
{
"n": 4,
"id": "arcane_tempo",
"kind": "pack",
"forName": "Draw and Order",
"title": "The Beat Cop's Blues",
"genre": "smoky noir detective jazz",
"hook": "Rain on the badge and a card in hand / Draw another, work the plan",
"a": "https://cdn1.suno.ai/b9b04c54-1249-4c2d-bf3a-c443139068d5.mp3",
"b": "https://cdn1.suno.ai/6c5889f9-00a7-4d75-9166-87f297024ddc.mp3",
"rev": true,
"new": false,
"why": "Revised: lyrics no longer just name and describe cards - they reference them but actually go somewhere."
},
{
"n": 5,
"id": "pyromancy",
"kind": "pack",
"forName": "Pyromancy",
"title": "Everything Burns",
"genre": "fire-and-brimstone Southern gospel revival stomp",
"hook": "Come on down to the burning ground / Hang your coat where the ash comes down",
"a": "https://cdn1.suno.ai/e83fe58e-840b-4fcf-b563-11047bd0e6dd.mp3",
"b": "https://cdn1.suno.ai/da742687-09ea-44fb-8cca-2ee189fb2cfb.mp3",
"rev": false,
"new": true,
"why": "NEW GENRE - thrash is gone. Now a fire-and-brimstone gospel revival stomp: handclaps, choir, organ. No headache."
},
{
"n": 6,
"id": "infernal_legion",
"kind": "pack",
"forName": "Infernal Legion",
"title": "Blood Summon",
"genre": "1930s Mississippi Delta blues juke-joint stomp",
"hook": "Saturday dark on the Delta road / Boards go stomp where the whiskey's sold",
"a": "https://cdn1.suno.ai/11ce1dfe-fb5c-476b-977b-f38ed8657b07.mp3",
"b": "https://cdn1.suno.ai/9506e285-2e5c-4790-adc7-bb908b4b53fe.mp3",
"rev": false,
"new": true,
"why": "NEW GENRE - no more death metal. Delta blues juke-joint with a gospel choir, straight off your Sinners note: the music itself is what summons them."
},
{
"n": 7,
"id": "troll_chief",
"kind": "enemy",
"forName": "Simple Ton",
"title": "End It With the Log",
"genre": "dumb heavy caveman sludge metal",
"hook": "We have studied all the warlords and their intricate designs / The hexes and the horologes, the cavalry, the mines",
"a": "https://cdn1.suno.ai/3c6ada17-dba5-4446-8b9d-37633b86d479.mp3",
"b": "https://cdn1.suno.ai/206249b5-06e2-4b8a-849f-c5281d879819.mp3",
"rev": false,
"new": true,
"why": "Rewritten lyrics: Ton now only grunts 1-4 syllable words, and a survivors' choir does all the articulate talking about him. Fixes the contradiction you caught."
},
{
"n": 8,
"id": "cinder_scavengers",
"kind": "enemy",
"forName": "Rusty",
"title": "Bolt It Down",
"genre": "gearhead outlaw country",
"hook": "My daddy threw a good thing out because it wouldn't start / Took me a week and a coffee can of bolts to find its heart",
"a": "https://cdn1.suno.ai/da70b407-0f10-49bb-99b2-63f58253df9f.mp3",
"b": "https://cdn1.suno.ai/5ec19c7f-e9a6-4071-b845-d1ddaa37892e.mp3",
"rev": false,
"new": true,
"why": "NEW GENRE - your country idea. Gearhead outlaw country: slide guitar, pedal steel, a wry drawl, junkyard percussion in the groove."
},
{
"n": 9,
"id": "warsmith",
"kind": "enemy",
"forName": "The Warsmith",
"title": "Raw Material",
"genre": "slow-burn progressive rock in the vein of Pink Floyd's The Dogs of War",
"hook": "I don't hate you. I never learned the way. / Hate wants a fire that a man has got to feed.",
"a": "https://cdn1.suno.ai/850850f4-0608-4669-8eee-d0b8096b87df.mp3",
"b": "https://cdn1.suno.ai/056b96f8-4206-49d8-a71a-0e4b8733f717.mp3",
"rev": false,
"new": true,
"why": "NEW GENRE - no industrial metal. Slow-burn prog rock with a wailing sax, your Dogs of War note. Also fixes the truncation - the old one was cut off at 77s."
},
{
"n": 10,
"id": "rime_harrows",
"kind": "enemy",
"forName": "Sledge Hammarsson",
"title": "No Brakes",
"genre": "nordic viking folk",
"hook": "Far out on the white road, hear the runners come / One voice on the mountain and a deep slow drum",
"a": "https://cdn1.suno.ai/24b67c2a-4048-4851-9c9a-8a8a2d7f0569.mp3",
"b": "https://cdn1.suno.ai/edab948a-2dca-4d6d-9b93-14e8caa442a3.mp3",
"rev": false,
"new": true,
"why": "NEW GENRE - speed metal gone. Built directly from the Nordic prompt you wrote: tagelharpa, hardanger fiddle, jaw harp, chant chorus, flute bridge."
}
];
const blocked = (function(){ try { return window.self !== window.top; } catch(e){ return true; } })();
if (blocked) document.body.classList.add("blocked");
const picks = JSON.parse(localStorage.getItem("wl_picks_r3") || "{}");
const comments = JSON.parse(localStorage.getItem("wl_comments_r3") || "{}");
const esc = t => (t||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
const GROUPS = {pack:"Pack Anthems", enemy:"Enemy Villain Themes"};
/* one shared <audio> for the whole page — iOS chokes and lags once ~dozens of
separate audio elements have each buffered a track; a single reused element
keeps memory flat no matter how far down the list you play. */
const GAU=new Audio(); GAU.preload="none"; let curPl=null, curUrl=null;
GAU.addEventListener("play",()=>{ if(curPl)curPl.pp.textContent="❚❚"; updateBar(); });
GAU.addEventListener("pause",()=>{ if(curPl)curPl.pp.textContent="►"; updateBar(); });
GAU.addEventListener("ended",()=>{ if(curPl){curPl.pp.textContent="►";curPl.sk.value=0;curPl.tt.textContent="0:00";} updateBar(); });
GAU.addEventListener("timeupdate",()=>{ if(curPl&&!curPl.se&&GAU.duration){curPl.sk.value=Math.round(GAU.currentTime/GAU.duration*1000);curPl.tt.textContent=fmt(GAU.currentTime);} });
function setPick(id, take){ if(picks[id]===take) delete picks[id]; else picks[id]=take;
localStorage.setItem("wl_picks_r3", JSON.stringify(picks)); render(); }
function player(url){
if(blocked) return '<button class="linkbtn" data-url="'+url+'">▶ copy track link ↗</button>';
return '<span class="pl" data-url="'+url+'"><button class="pp" type="button" aria-label="Play">►</button>'+
'<input type="range" class="seek" min="0" max="1000" value="0" aria-label="Seek">'+
'<span class="tt">0:00</span></span>';
}
function fmt(s){ s=Math.max(0,Math.floor(s||0)); return Math.floor(s/60)+":"+String(s%60).padStart(2,"0"); }
function songHTML(s){
const chosen=picks[s.id];
return '<div class="song'+(chosen?" done":"")+'">'+
'<div class="song-head"><div class="num">'+String(s.n).padStart(2,"0")+'</div>'+
'<div class="titles"><p class="title">'+s.title+'</p>'+
'<p class="for">for <b>'+s.forName+'</b></p><span class="chip">'+s.genre+'</span>'+(s.rev?'<span class="chip rev">↻ revised — re-listen</span>':'')+(s.new?'<span class="chip new">★ new version</span>':'')+'</div></div>'+
(s.why?'<p class="why">'+s.why+'</p>':'')+
'<p class="hook">'+s.hook+'</p>'+
'<div class="takes">'+
'<div class="take a"><span class="lab">A</span>'+player(s.a)+
'<button class="pick '+(chosen==='a'?'on':'')+'" data-id="'+s.id+'" data-take="a">'+(chosen==='a'?'✓':'Pick')+'</button></div>'+
'<div class="take b"><span class="lab">B</span>'+player(s.b)+
'<button class="pick '+(chosen==='b'?'on':'')+'" data-id="'+s.id+'" data-take="b">'+(chosen==='b'?'✓':'Pick')+'</button></div>'+
'</div>'+
'<textarea class="cmt" data-id="'+s.id+'" rows="1" placeholder="Notes for a new version (optional) — e.g. faster, less guitar, love the chorus…">'+esc(comments[s.id])+'</textarea></div>';
}
function render(){
const list=document.getElementById("list"); let html=""; let last=null;
for(const s of SONGS){ if(s.kind!==last){ html+='<p class="group-label">'+(GROUPS[s.kind]||"")+'</p>'; last=s.kind; } html+=songHTML(s); }
list.innerHTML=html;
list.querySelectorAll(".pick").forEach(b=>b.onclick=()=>setPick(b.dataset.id,b.dataset.take));
list.querySelectorAll(".linkbtn").forEach(b=>b.onclick=()=>{ const u=b.dataset.url;
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(u).then(()=>{b.textContent="✓ link copied";},()=>{});
try{ window.open(u,"_blank"); }catch(e){} });
list.querySelectorAll(".cmt").forEach(c=>{ const grow=()=>{c.style.height="auto";c.style.height=Math.max(40,c.scrollHeight)+"px";}; if(c.value)grow();
c.addEventListener("input",()=>{ if(c.value.trim())comments[c.dataset.id]=c.value; else delete comments[c.dataset.id];
localStorage.setItem("wl_comments_r3",JSON.stringify(comments)); grow(); }); });
curPl=null;
list.querySelectorAll(".pl").forEach(pl=>{
const pp=pl.querySelector(".pp"),sk=pl.querySelector(".seek"),tt=pl.querySelector(".tt"),url=pl.dataset.url;
const me={pp,sk,tt,url,se:false};
if(url===curUrl){ curPl=me; if(!GAU.paused)pp.textContent="❚❚";
if(GAU.duration){sk.value=Math.round(GAU.currentTime/GAU.duration*1000);tt.textContent=fmt(GAU.currentTime);} }
pp.addEventListener("click",()=>{
if(curPl===me){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); return; }
if(curPl){ curPl.pp.textContent="►"; curPl.sk.value=0; curPl.tt.textContent="0:00"; }
curPl=me; curUrl=url; GAU.src=url; GAU.play().catch(()=>{});
});
sk.addEventListener("input",()=>{ if(curPl!==me)return; me.se=true; if(GAU.duration)tt.textContent=fmt(sk.value/1000*GAU.duration); });
sk.addEventListener("change",()=>{ if(curPl!==me)return; if(GAU.duration)GAU.currentTime=sk.value/1000*GAU.duration; me.se=false; });
});
document.getElementById("prog").textContent=Object.keys(picks).length+" / "+SONGS.length+" picked";
}
document.getElementById("copy").onclick=()=>{
const lines=["Warlords soundtrack — Hari's picks & notes:",""];
for(const s of SONGS){ const p=picks[s.id],c=comments[s.id];
lines.push(String(s.n).padStart(2,"0")+'. '+s.forName+' — "'+s.title+'" ('+s.genre+'): '+(p?"Take "+p.toUpperCase():"— no pick"));
if(c) lines.push(' notes: '+c.replace(/\n/g," ")); }
const text=lines.join("\n"),btn=document.getElementById("copy");
const done=()=>{btn.textContent="Copied!";btn.classList.add("done");setTimeout(()=>{btn.textContent="Copy picks";btn.classList.remove("done");},1800); if(window.__hariWalkout)window.__hariWalkout();};
if(navigator.clipboard&&navigator.clipboard.writeText) navigator.clipboard.writeText(text).then(done,()=>fb(text,done)); else fb(text,done);
};
function fb(t,done){const ta=document.createElement("textarea");ta.value=t;document.body.appendChild(ta);ta.select();try{document.execCommand("copy");}catch(e){}ta.remove();done();}
render();
/* ---- transport bar: prev / play-pause / skip through every take ---- */
function trackInfo(url){ for(const s of SONGS){ if(s.a===url) return {t:s.title,who:s.forName,take:"A"}; if(s.b===url) return {t:s.title,who:s.forName,take:"B"}; } return null; }
function updateBar(){
const bp=document.getElementById("bplay"), now=document.getElementById("now"); if(!bp) return;
bp.textContent = (curUrl && !GAU.paused) ? "❚❚" : "►";
const info = curUrl ? trackInfo(curUrl) : null;
now.innerHTML = info ? ('<b>'+esc(info.t)+'</b> · '+esc(info.who)+' — Take '+info.take) : "tap ► on any take · ⏭ to skip through";
}
function pls(){ return [...document.querySelectorAll("#list .pl")]; }
function skipBy(dir){
const a=pls(); if(!a.length) return;
let i=a.findIndex(p=>p.dataset.url===curUrl);
i = i<0 ? (dir>0?0:a.length-1) : (((i+dir)%a.length)+a.length)%a.length;
a[i].querySelector(".pp").click();
const song=a[i].closest(".song"); if(song) song.scrollIntoView({behavior:"smooth",block:"center"});
}
document.getElementById("bnext").onclick=()=>skipBy(1);
document.getElementById("bprev").onclick=()=>skipBy(-1);
document.getElementById("bplay").onclick=()=>{ if(curUrl){ if(GAU.paused)GAU.play().catch(()=>{}); else GAU.pause(); } else skipBy(1); };
updateBar();
/* ---- groovy moving tie-dye background ---- */
(function(){
const bg=document.getElementById("bg"), ctx=bg.getContext("2d");
const reduce=matchMedia("(prefers-reduced-motion:reduce)").matches;
const SC=14; let img,d,W,H,t=0;
function hsl(h,s,l){ h/=360; const q=l<.5?l*(1+s):l+s-l*s, p=2*l-q;
const f=x=>{ x=(x%1+1)%1; if(x<1/6)return p+(q-p)*6*x; if(x<.5)return q; if(x<2/3)return p+(q-p)*(2/3-x)*6; return p; };
return [f(h+1/3)*255|0, f(h)*255|0, f(h-1/3)*255|0]; }
function fit(){ W=bg.width=Math.max(2,Math.ceil(innerWidth/SC)); H=bg.height=Math.max(2,Math.ceil(innerHeight/SC));
img=ctx.createImageData(W,H); d=img.data; for(let i=3;i<d.length;i+=4)d[i]=255; }
function paint(){ const cx=W/2, cy=H*0.3;
for(let y=0;y<H;y++)for(let x=0;x<W;x++){
let v=Math.sin(x*0.18+t)+Math.sin(y*0.16+t*0.9)+Math.sin((x+y)*0.11+t*0.7)+Math.sin(Math.hypot(x-cx,y-cy)*0.17-t*1.15);
let hue=((v*48+t*26)%360+360)%360; const c=hsl(hue,0.72,0.5);
const i=(y*W+x)*4; d[i]=c[0]; d[i+1]=c[1]; d[i+2]=c[2]; }
ctx.putImageData(img,0,0); }
fit(); addEventListener("resize",fit);
if(reduce){ paint(); }
else { (function loop(){ t+=0.02; paint(); requestAnimationFrame(loop); })(); }
})();
/* ---- Ragdoll Hari: pops out every 2 min, a different dance each time ---- */
(function(){
const cv=document.getElementById("hari"), ctx=cv.getContext("2d");
if(matchMedia("(prefers-reduced-motion:reduce)").matches) return;
const A="#f7f0e2"; let raf=0, t0=0, style="flail", fromLeft=true, order=[], oi=0;
const STYLES=["flail","disco","robot","twist","jack","headbang","charleston"];
const P=Math.PI;
function fit(){ cv.width=cv.clientWidth; cv.height=170; }
function seg(x1,y1,a,l){ const x2=x1+Math.cos(a)*l,y2=y1+Math.sin(a)*l; ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.stroke(); return [x2,y2]; }
function walkPose(ph){ const sw=Math.sin(ph*7); return {la:P*0.55+sw*0.55, ra:P*0.55-sw*0.55, lae:0, rae:0, ll:P*0.5+sw*0.5, rl:P*0.5-sw*0.5, hop:0, lean:0}; }
function dance(st,ph){ const S=Math.sin, R=x=>Math.round(x*2)/2;
if(st==="disco"){ const up=S(ph*2.4)>0; return {la:up?-2.3:1.9, ra:up?1.9:-2.3, lae:.1, rae:.1, ll:P*0.5+S(ph*4.8)*.3, rl:P*0.5-S(ph*4.8)*.3, hop:Math.abs(S(ph*2.4))*9, lean:S(ph*2.4)*.22}; }
if(st==="robot"){ return {la:-1.2+R(S(ph*2))*1.1, ra:-1.2-R(S(ph*2+1))*1.1, lae:R(S(ph*3))*.6, rae:R(S(ph*3+1))*.6, ll:P*0.5+R(S(ph*2))*.3, rl:P*0.5-R(S(ph*2))*.3, hop:0, lean:R(S(ph))*.12}; }
if(st==="twist"){ return {la:P*0.5+S(ph*3.5)*.8, ra:P*0.5-S(ph*3.5)*.8, lae:.3, rae:.3, ll:P*0.5+S(ph*3.5)*.3, rl:P*0.5-S(ph*3.5)*.3, hop:Math.abs(S(ph*7))*4, lean:S(ph*3.5)*.4}; }
if(st==="jack"){ const o=(S(ph*4.5)+1)/2; return {la:-P*0.5-o*1.3, ra:-P*0.5+o*1.3, lae:0, rae:0, ll:P*0.5+o*.55, rl:P*0.5-o*.55, hop:o*12, lean:0}; }
if(st==="headbang"){ return {la:P*0.62+S(ph*7)*.35, ra:P*0.62-S(ph*7)*.35, lae:.2, rae:.2, ll:P*0.5+.06, rl:P*0.5-.06, hop:Math.abs(S(ph*7))*5, lean:.55+S(ph*7)*.5}; }
if(st==="charleston"){ const k=S(ph*4); return {la:P*0.5+k*.9, ra:P*0.5+k*.9, lae:-.5, rae:-.5, ll:P*0.5+k*.7, rl:P*0.5-k*.7, hop:Math.abs(S(ph*4))*7, lean:-k*.18}; }
/* flail */ return {la:-2.9+S(ph*7)*1.0, ra:-0.2+S(ph*7+1.6)*1.0, lae:S(ph*10)*.9, rae:S(ph*10+1)*.9, ll:P*0.5+S(ph*5)*.55, rl:P*0.5-S(ph*5)*.55, hop:Math.abs(S(ph*5))*15, lean:S(ph*3)*.3};
}
function draw(x,ground,ph,pose){
ctx.strokeStyle=A; ctx.fillStyle=A; ctx.lineWidth=4; ctx.lineCap="round"; ctx.lineJoin="round";
const hipY=ground-30-pose.hop, torso=-P/2+pose.lean;
const [nx,ny]=seg(x,hipY,torso,26);
const hx=nx+Math.cos(torso)*9, hy=ny+Math.sin(torso)*9;
ctx.beginPath(); ctx.arc(hx,hy,8.5,0,P*2); ctx.stroke();
let [ex,ey]=seg(nx,ny,pose.la,15); seg(ex,ey,pose.la+pose.lae,12);
[ex,ey]=seg(nx,ny,pose.ra,15); seg(ex,ey,pose.ra+pose.rae,12);
let [kx,ky]=seg(x,hipY,pose.ll,17); seg(kx,ky,pose.ll+0.25,15);
[kx,ky]=seg(x,hipY,pose.rl,17); seg(kx,ky,pose.rl+0.25,15);
ctx.font="bold 12px ui-monospace, monospace"; ctx.textAlign="center";
ctx.fillText("HARI", hx, hy-16-(pose.hop>1?pose.hop*0.4:0));
}
function frame(now){
const tt=(now-t0)/1000; ctx.clearRect(0,0,cv.width,cv.height);
const W=cv.width, ground=cv.height-14, cx=W/2;
const EN=4.5, DA=9, EX=4.5;
let x, pose;
if(tt<EN){ const p=tt/EN; x=fromLeft ? -50+(cx+50)*p : (W+50)-((W+50)-cx)*p; pose=walkPose(tt); }
else if(tt<EN+DA){ x=cx; pose=dance(style, tt-EN); }
else if(tt<EN+DA+EX){ const p=(tt-EN-DA)/EX; x=fromLeft ? cx+(W+60-cx)*p : cx-(cx+60)*p; pose=walkPose(tt); }
else { cv.style.display="none"; cancelAnimationFrame(raf); raf=0; return; }
draw(x,ground,tt<EN?tt:(tt-EN),pose); raf=requestAnimationFrame(frame);
}
function nextStyle(){ if(oi>=order.length){ order=STYLES.slice().sort(()=>Math.random()-0.5); oi=0; } return order[oi++]; }
function walkout(){ if(raf) return; style=nextStyle(); fromLeft=Math.random()<0.5; cv.style.display="block"; fit(); t0=performance.now(); raf=requestAnimationFrame(frame); }
addEventListener("resize",()=>{ if(cv.style.display!=="none") fit(); });
window.__hariWalkout=walkout;
const soon=/dance|hari|test/i.test(location.hash);
if(soon) setTimeout(walkout, 2000);
setInterval(walkout, 120000);
})();
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment