From efad9e5522f49cfa5eb0adcbd3b219adbe7d7ca0 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Sun, 4 Oct 2026 11:10:11 -0700 Subject: [PATCH] =?UTF-8?q?sailor-song=20v73:=20the=20critics'=20pass=20an?= =?UTF-8?q?d=20a=20day=20of=20jeffrey's=20ear=20=E2=80=94=20the=20glitch?= =?UTF-8?q?=20is=20the=20drop,=20her=20voice=20and=20guitar=20in=20front,?= =?UTF-8?q?=20wax=20master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes from the four-critic review of v26 (phantom 5th beats, dead gates, the orchestra voiced on top of her, the drop that was only louder, the demo ending) and everything after: steady four-on-the-floor from a pickup two beats before "kiss"; her k- false start kept and made the drop with a gong; voice loudest, guitar seated with her and un-hollowed; chorus beds swell in; her vowel choir, quantized octave rises, the dissolving "out"; tuned/humanized/eager kit with real toms, reverses, wub kicks, the gallop; sine pads struck on her strum motif; melody bus; pitched air; HRTF seats, turns, lap, wobble; vinyl substrate master with no clipper after the wax; a NaN probe. Salamander grand sampler in, part off. --- pop/sailor-song/bin/orchestra.mjs | 220 ++-- pop/sailor-song/bin/regularize.mjs | 14 +- pop/sailor-song/bin/splice.mjs | 2 +- pop/sailor-song/c/cut.sh | 28 +- pop/sailor-song/c/sailor-chart.h | 574 ++++---- pop/sailor-song/c/sailorremix.c | 713 ++++++++-- pop/sailor-song/measures.cut.json | 1955 ++++++++++++++-------------- pop/sailor-song/measures.reg.json | 1946 +++++++++++++-------------- 8 files changed, 2988 insertions(+), 2464 deletions(-) diff --git a/pop/sailor-song/bin/orchestra.mjs b/pop/sailor-song/bin/orchestra.mjs index 2d4b497495..c8d27a3e43 100644 --- a/pop/sailor-song/bin/orchestra.mjs +++ b/pop/sailor-song/bin/orchestra.mjs @@ -27,6 +27,8 @@ const TUNE = Number(/#define CHART_TUNE ([\d.]+)/.exec(H)[1]); // semitones ov const bars = [...H.matchAll(/\{ (\d+), ([\d.]+), ([\d.]+), (\d), (\d), \{ ([^}]+) \} \}/g)] .map((m) => ({ n: +m[1], t: +m[2], dur: +m[3], chord: +m[4], nb: +m[5], beats: m[6].split(",").map(Number) })); const notes = [...H.matchAll(/\{ ([\d.]+), ([\d.]+), (\d+) \}/g)].map((m) => ({ t: +m[1], dur: +m[2], midi: +m[3] })); +// v52: THE HESITATION (see c/sailorremix.c) — her voice from 60.08 to 64.29 plays 0.58 s earlier; her notes follow +const VOX_CUT = { a: 60.08, until: 64.29, d: 0 }; for (const v of notes) if (v.t >= VOX_CUT.a && v.t < VOX_CUT.until) v.t -= VOX_CUT.d; // v53: off — the chart itself moved if (bars.length < 80 || notes.length < 100) { console.error(`✗ chart parse: ${bars.length} bars, ${notes.length} notes`); process.exit(1); } // the form (c/sailorremix.c SEC_FROM) and the harmony: Emaj7 bars sound G#m over her open G# @@ -84,144 +86,162 @@ const P = { }; const barN = (n) => bars.find((b) => b.n === n); +// ── what she sings, bar by bar (the parts stay out of her way) ── +const sungIn = new Map(); // bar n → the pitch classes she sings in it +for (const v of notes) { const b = bars.find((x) => v.t >= x.t && v.t < x.t + x.dur); if (!b) continue; if (!sungIn.has(b.n)) sungIn.set(b.n, new Set()); sungIn.get(b.n).add(v.midi % 12); } +const sings = (n) => sungIn.has(n); +const herE = (n) => !!sungIn.get(n)?.has(4); // E: the 4th over B, the b6 over G#m — her one non-triad note, 39 times +// v27: THE SUSPENSION — where she sings E, a part's D# (pc 3) holds E for the first half and resolves to D#: the 4–3 she is singing +const susNote = (part, t, m, dur, vel, n) => { if (herE(n) && m % 12 === 3) { part.note(t, m + 1, dur * 0.55, vel); part.note(t + dur * 0.55, m, dur * 0.47, vel * 0.9); } else part.note(t, m, dur, vel); }; +const chordRun = (n) => { const i = bars.findIndex((b) => b.n === n); let a = i; while (a > 0 && bars[a - 1].chord === bars[i].chord) a--; let z = i; while (z + 1 < bars.length && bars[z + 1].chord === bars[i].chord) z++; return { from: a, to: z, pos: i - a }; }; +// v27: HER KISS FIGURE — the first seven sung notes of bar 28 ("kiss me on the mouth and love me like a sailor"), as fractions of the bar +const b28 = barN(28), KISS = notes.filter((v) => v.t >= b28.t - 0.7 && v.t < b28.t + 2 * b28.dur).slice(0, 7).map((v) => ({ off: (v.t - b28.t) / b28.dur, dur: v.dur / b28.dur, midi: v.midi })); +const kissAt = (part, bar, lift, vel) => { for (const k of KISS) part.note(bar.t + k.off * bar.dur, k.midi + lift, Math.max(0.15, k.dur * bar.dur), vel); }; + // ── the parts, bar by bar ── for (const b of bars) { - const s = section(b.n), c = b.chord, root = ROOT[c], bt = b.beats, nb = b.nb, beat = b.dur / nb; + const s = section(b.n), c = b.chord, root = ROOT[c], bt = b.beats, nb = b.nb, beat = b.dur / nb, n = b.n; const mid = (j) => bt[j] + (bt[j + 1] - bt[j]) / 2; - const chorus = s === "chorus1" || s === "chorus2", big = s === "chorus2" || s === "bridge"; - const last = b.n === 27 || b.n === 51 || b.n === 72; // the bar before a lift - - // STRINGS — creep in under verse 1 (bar 22 → 27), full chords in the choruses, high and thin - // in verse 2, swelling through the break and the bridge, long in the outro - if (s === "verse1" && b.n >= 22) { - const g = grow(b.n, 22, 28); - for (const m of voicing(c, 51, 63, 3)) P.strings.note(b.t, m, b.dur * 1.02, 30 + 40 * g); - } else if (chorus) { // v26: variation — chorus 1 legato; chorus 2 legato for two phrases, re-bowed on every beat for the next two - const v = voicing(c, 51, 75, 6), swell = 1 + 0.15 * Math.sin(Math.PI * (PHRASE(b.n) + 0.5) / 4), phN = Math.floor((b.n - SEC_FROM[s]) / 4); - if (big && phN % 4 >= 2) { for (let j = 0; j < nb; j++) for (const m of v) P.strings.note(bt[j], m, beat * 1.05, 92 * swell); } - else for (const m of v) P.strings.note(b.t, m, b.dur * 1.02, (big ? 96 : 84) * swell); - if (big && phN >= 2) for (const m of voicing(c, 75, 83, 2)) P.strings.note(b.t, m, b.dur * 1.02, 72); - } else if (s === "verse2") { - for (const m of voicing(c, 68, 80, 2)) P.strings.note(b.t, m, b.dur * 1.02, 48); - } else if (s === "break") { - const g = grow(b.n, 68, 73); - for (const m of voicing(c, 56, 75, 4)) P.strings.note(b.t, m, b.dur * 1.02, 56 + 36 * g); - } else if (s === "bridge") { - // the climb: re-bowed every beat, louder bar by bar, an octave added from 77 - const g = grow(b.n, 73, 81); - for (let j = 0; j < nb; j++) for (const m of voicing(c, 51, 75, 5)) P.strings.note(bt[j], m, beat * 1.05, 70 + 40 * g); - if (b.n >= 77) for (const m of voicing(c, 75, 87, 3)) P.strings.note(b.t, m, b.dur * 1.02, 84); - } else if (s === "outro") { // v24: the finale — "if anything we should still be ramping up" - for (let j = 0; j < nb; j++) for (const m of voicing(c, 51, 75, 5)) P.strings.note(bt[j], m, beat * 1.05, 110); - for (const m of voicing(c, 75, 87, 3)) P.strings.note(b.t, m, b.dur * 1.02, 96); - } - - // CELLO — long root and fifth from bar 18, under everything but the break - if ((s === "verse1" && b.n >= 18) || s === "verse2" || chorus || s === "bridge" || s === "outro") { - const g = s === "verse1" ? 0.5 + 0.5 * grow(b.n, 18, 27) : 1; - P.cello.note(b.t, root, b.dur * 1.04, (chorus || s === "bridge" ? 92 : 72) * g); - P.cello.note(b.t, root + 7, b.dur * 1.04, (chorus || s === "bridge" ? 76 : 56) * g); - } - - // PIZZICATO — her own strum motif X..XX..X (1, &2, 3, &4) on root / fifth, in the verses only - if ((s === "verse1" && b.n >= 14) || s === "verse2") { - const g = s === "verse1" ? 0.55 + 0.45 * grow(b.n, 14, 24) : 1; + const chorus = s === "chorus1" || s === "chorus2", big = s === "chorus2"; + const ph = PHRASE(n), phN = Math.floor((n - SEC_FROM[s]) / 4); + const early = s === "bridge" && n < 77; // v27: bars 73–76 — her quietest line, the band thins + const finale = s === "outro" && n <= 81, release = s === "outro" && n >= 82; // v41: the orchestra lets go from 82 — the last word dissolves // v27: 81–82 full, 83–84 the band leaves her ring-out + const lift = n === 27 || n === 51 || n === 72; // the bar before a lift + // v27 register rule: while she sings, nothing sustained in 56–70 — a low pair under her and a high trio over her + const lowPair = voicing(c, 44, 55, 2), hiTrio = voicing(c, 71, 83, 3), top = voicing(c, 83, 91, 2); + // v67: the chorus's sustained parts swell in over its first four bars (the pickup stab and the timpani still mark the downbeat) + const swellIn = s === "chorus1" ? 0.3 + 0.7 * grow(n, 28, 32) : s === "chorus2" ? 0.3 + 0.7 * grow(n, 52, 56) : 1; + const sus = (part, t, ms, dur, vel) => ms.forEach((m, i) => (i === ms.length - 1 ? susNote(part, t, m, dur, vel, n) : part.note(t, m, dur, vel))); + + // STRINGS + if (s === "verse1" && n >= 22) { const g = grow(n, 22, 28); sus(P.strings, b.t, lowPair, b.dur * 1.02, 30 + 36 * g); } + else if (s === "chorus1") { sus(P.strings, b.t, hiTrio, b.dur * 1.02, 80 * swellIn); if (n >= 32) for (const m of lowPair) P.strings.note(b.t, m, b.dur * 1.02, 70); } // the low pair enters at phrase 2 + else if (s === "chorus2") { + if (phN >= 2) { for (let j = 0; j < nb; j++) { sus(P.strings, bt[j], hiTrio, beat * 1.05, 92); for (const m of lowPair) P.strings.note(bt[j], m, beat * 1.05, 84); } } + else { sus(P.strings, b.t, hiTrio, b.dur * 1.02, 94 * swellIn); for (const m of lowPair) P.strings.note(b.t, m, b.dur * 1.02, 84 * swellIn); } + if (n >= 60) for (const m of top) P.strings.note(b.t, m, b.dur * 1.02, 70); + } else if (s === "break") { const g = grow(n, 68, 73), v = sings(n) ? [...lowPair, ...hiTrio] : voicing(c, 56, 75, 4); sus(P.strings, b.t, v, b.dur * 1.02, 52 + 36 * g); } + else if (early) { for (const m of lowPair) P.strings.note(b.t, m, b.dur * 1.02, 56); } + else if (s === "bridge") { const g = grow(n, 77, 81); for (let j = 0; j < nb; j++) { sus(P.strings, bt[j], hiTrio, beat * 1.05, 84 + 26 * g); for (const m of lowPair) P.strings.note(bt[j], m, beat * 1.05, 78 + 20 * g); } for (const m of top) P.strings.note(b.t, m, b.dur * 1.02, 84); } + else if (finale) { for (let j = 0; j < nb; j++) for (const m of voicing(c, 51, 75, 5)) P.strings.note(bt[j], m, beat * 1.05, 110); for (const m of top) P.strings.note(b.t, m, b.dur * 1.02, 96); } + else if (release) { for (const m of voicing(c, 51, 75, 4)) P.strings.note(b.t, m, b.dur * 1.04, n === 83 ? 72 : 52); } + + // CELLO — root and fifth through verse 1 and chorus 1; from chorus 2 a LAMENT BASS down each chord run + // (G#m: G# F# E D# — her Emaj7 shape and the m7; B: D# C# B), one step per half bar, holding the last + if ((s === "verse1" && n >= 18) || s === "chorus1" || s === "verse2") { + const g = s === "verse1" ? 0.5 + 0.5 * grow(n, 18, 27) : 1; + P.cello.note(b.t, root, b.dur * 1.04, (s === "chorus1" ? 88 : 68) * g); if (s !== "verse2") P.cello.note(b.t, root + 7, b.dur * 1.04, (s === "chorus1" ? 72 : 52) * g); + } else if (s === "chorus2" || (s === "bridge" && !early) || finale) { + const r = chordRun(n), seq = c === 2 ? [39, 37, 35] : [44, 42, 40, 39]; + for (let h = 0; h < 2; h++) { const m = seq[Math.min(seq.length - 1, r.pos * 2 + h)]; P.cello.note(b.t + h * b.dur / 2, m, b.dur / 2 * 1.04, finale ? 100 : 86); } + } else if (early || s === "break" || release) { P.cello.note(b.t, root, b.dur * 1.04, release ? 60 : 72); } + + // PIZZICATO — her strum motif X..XX..X (1, &2, 3, &4) on root / fifth, in the verses + if ((s === "verse1" && n >= 14) || s === "verse2") { + const g = s === "verse1" ? 0.55 + 0.45 * grow(n, 14, 24) : 1; const hits = [[bt[0], root + 12, 84], [mid(1), root + 19, 62], [bt[2], root + 12, 78], [mid(3), root + 19, 62]]; for (const [t, m, v] of hits) if (t) P.pizz.note(t, m, beat * 0.6, v * g); } - // HORNS — sustained chord tones in the choruses and the bridge, swelling across each phrase; - // a stab on every phrase downbeat - if (chorus || s === "bridge" || s === "outro") { - const ph = PHRASE(b.n), v = voicing(c, 56, 68, 3), swell = 64 + 24 * ph / 3 + (big ? 16 : 0) + (s === "outro" ? 24 : 0), phN = Math.floor((b.n - SEC_FROM[s]) / 4); - if (phN % 2 === 0) { for (const m of v) P.horns.note(b.t, m, b.dur * 1.02, swell); if (ph === 0) for (const m of v) P.horns.note(b.t, m - 12, beat * 0.9, 100); } // v26: odd phrases sustain… - else if (ph === 1 || ph === 3) { for (const m of v) { P.horns.note(bt[0], m, beat * 0.5, 96); if (nb > 2) P.horns.note(mid(1), m, beat * 0.4, 84); } } // …even phrases stab (bars 2 and 4) + // HORNS — tenor voicing (44–56), under her: sustains on odd phrases, stabs on even; the bridge climb; the finale + if (((chorus || (s === "bridge" && !early)) && true) || finale) { + const v = voicing(c, 44, 56, 3), swell = 64 + 24 * ph / 3 + (big ? 16 : 0) + (finale ? 24 : 0); + if (finale || phN % 2 === 0) { sus(P.horns, b.t, v, b.dur * 1.02, swell * swellIn); if (ph === 0) for (const m of v) P.horns.note(b.t, m, beat * 0.9, 100); } + else if (ph === 1 || ph === 3) { for (const m of v) { P.horns.note(bt[0], m, beat * 0.5, 96); if (nb > 2) P.horns.note(mid(1), m, beat * 0.4, 84); } } } - // TIMPANI — the chorus and bridge downbeats on her root; a roll into every lift - if (chorus || s === "bridge" || s === "outro") { - if (PHRASE(b.n) % 2 === 0 || s === "outro") P.timpani.note(bt[0], root, beat * 1.5, big || s === "outro" ? 112 : 92); - if (PHRASE(b.n) === 3 && nb > 3) P.timpani.note(bt[3], root, beat * 0.8, 70); + // TIMPANI — chorus and bridge-climb downbeats on her root; a roll into every lift and into the button + if (chorus || (s === "bridge" && !early) || finale) { + if (ph % 2 === 0 || finale) P.timpani.note(bt[0], root, beat * 1.5, big || finale ? 112 : 92); + if (ph === 3 && nb > 3 && !lift) P.timpani.note(bt[3], root, beat * 0.8, 70); } - if (last && nb >= 3) { // a crescendo roll over the last two beats - const t0 = bt[nb - 2], t1 = bt[nb] ?? b.t + b.dur, k = 16; - for (let q = 0; q < k; q++) P.timpani.note(t0 + (t1 - t0) * q / k, root, (t1 - t0) / k * 1.2, 40 + 72 * q / (k - 1)); + if ((n === 27 || n === 51 || n === 72 || n === 80 || n === 83) && nb >= 3) { const pk = n === 27 || n === 51; const t0 = pk ? bt[nb - 3] : bt[nb - 2], t1 = pk ? bt[nb - 2] : (bt[nb] ?? b.t + b.dur), k = pk ? 8 : 16; // v51: the roll lands on the pickup beat + for (let q = 0; q < k; q++) P.timpani.note(t0 + (t1 - t0) * q / k, root, (t1 - t0) / k * 1.2, 40 + 72 * q / (k - 1)); } + + // HARP — arpeggios above her (68+): verse 2's second half, the break, the bridge, the finale (16ths), a slow release + if ((s === "verse2" && n >= 48) || s === "break" || s === "bridge" || s === "outro") { + const seq = tones(c, 68, 95), up = seq.slice(0, 6), run = [...up, ...up.slice(1, -1).reverse()]; + const dens = finale ? 4 : release ? 1 : 2; let i = 0; + for (let j = 0; j < nb; j++) for (let q = 0; q < dens; q++) { const t = bt[j] + (bt[j + 1] - bt[j]) * q / dens; + P.harp.note(t, run[i++ % run.length], beat / dens * 2.5, (q === 0 ? 76 : 60) * (early ? 0.6 : release ? 0.7 : 1)); } } - // HARP — 8th-note arpeggios across the chord: verse 2, the break, the bridge and the outro - if ((s === "verse2" && b.n >= 48) || s === "break" || s === "bridge" || s === "outro") { // v26: the harp waits for verse 2's second half - const seq = tones(c, 56, 83); const up = seq.slice(0, 6), run = [...up, ...up.slice(1, -1).reverse()]; - const dens = s === "bridge" ? 4 : 2; let i = 0; - for (let j = 0; j < nb; j++) for (let q = 0; q < dens; q++) { - const t = bt[j] + (bt[j + 1] - bt[j]) * q / dens; - P.harp.note(t, run[i++ % run.length], beat / dens * 2.5, (q === 0 ? 76 : 60) * (s === "outro" ? 0.8 : 1)); - } - } - - // QUARTET (v24) — not a pad: lines. Chorus 1: violin I runs the chord in 8ths, violin II answers on - // the offbeats a third under, viola double-stops re-bowed on 1 and 3, cello root/fifth in 8ths. - // Verse 2: the violins hold high thirds. The break: the quartet alone swells. The bridge: 16th - // tremolo climbing. The outro is the finale: everything, an octave up. + // QUARTET — lines, above and below her. Chorus 1: violin I runs the chord in 8ths (71+), violin II answers a + // third under on the offbeats, viola double-stops 51–62 on 1 and 3, cello 8ths. Verse 2: the violins hold + // high thirds. The break: a swell. Bars 73–76: violins tremolo alone, soft. 77–80 and the finale: full tremolo. if (chorus || s === "bridge" || s === "outro" || s === "verse2" || s === "break") { - const hi = tones(c, 71, 88), lo = tones(c, 64, 80), fin = s === "outro"; - const vel = s === "chorus1" ? 78 : s === "chorus2" ? 90 : s === "bridge" ? 84 + 24 * grow(b.n, 73, 81) : fin ? 104 : 60; - if (chorus || fin) { + const hi = tones(c, 71, 88), lo = tones(c, 64, 80); + const vel = s === "chorus1" ? 78 * swellIn : s === "chorus2" ? 90 * swellIn : early ? 62 + 10 * grow(n, 73, 77) : s === "bridge" ? 84 + 24 * grow(n, 77, 81) : finale ? 104 : release ? 56 : 60; + if (chorus || finale) { const run = [...hi.slice(0, 4), ...hi.slice(1, 3).reverse()]; for (let j = 0; j < nb; j++) for (let q = 0; q < 2; q++) { const i = (j * 2 + q) % run.length, t = bt[j] + (bt[j + 1] - bt[j]) * q / 2; - P.vln1.note(t, run[i] + (fin ? 12 : 0), beat / 2 * 1.1, vel * (q ? 0.8 : 1)); + P.vln1.note(t, run[i] + (finale ? 12 : 0), beat / 2 * 1.1, vel * (q ? 0.8 : 1)); if (q) P.vln2.note(t, lo[Math.min(lo.length - 1, i + 1)], beat / 2 * 1.1, vel * 0.75); } - for (const j of [0, 2]) if (bt[j]) for (const m of voicing(c, 60, 72, 2)) P.viola.note(bt[j], m, beat * 2 * 0.98, vel * 0.85); - for (let j = 0; j < nb; j++) for (let q = 0; q < 2; q++) P.qcello.note(bt[j] + (bt[j + 1] - bt[j]) * q / 2, root + (q ? 7 : 0), beat / 2 * 0.9, vel * (q ? 0.7 : 0.9)); + for (const j of [0, 2]) if (bt[j]) sus(P.viola, bt[j], voicing(c, 51, 62, 2), beat * 2 * 0.98, vel * 0.85); + if (!finale) for (let j = 0; j < nb; j++) for (let q = 0; q < 2; q++) P.qcello.note(bt[j] + (bt[j + 1] - bt[j]) * q / 2, root + (q ? 7 : 0), beat / 2 * 0.9, vel * (q ? 0.7 : 0.9)); } else if (s === "verse2") { for (const [part, m] of [[P.vln1, hi[2]], [P.vln2, hi[0]]]) part.note(b.t, m, b.dur * 1.03, 56); } else if (s === "break") { - const g = 0.6 + 0.4 * grow(b.n, 68, 73); + const g = 0.6 + 0.4 * grow(n, 68, 73); P.vln1.note(b.t, hi[3], b.dur * 1.03, 70 * g); P.vln2.note(b.t, hi[1], b.dur * 1.03, 64 * g); - for (const m of voicing(c, 60, 72, 2)) P.viola.note(b.t, m, b.dur * 1.03, 62 * g); P.qcello.note(b.t, root, b.dur * 1.03, 72 * g); + sus(P.viola, b.t, voicing(c, 51, 62, 2), b.dur * 1.03, 62 * g); P.qcello.note(b.t, root, b.dur * 1.03, 72 * g); + } else if (release) { + P.vln1.note(b.t, hi[2], b.dur * 1.04, vel); P.vln2.note(b.t, hi[0], b.dur * 1.04, vel * 0.9); } else { // bridge: tremolo 16ths, up the chord bar by bar - const k = Math.min(hi.length - 1, (b.n - 73) % 4 + 1); + const k = Math.min(hi.length - 1, (n - 73) % 4 + 1); for (let j = 0; j < nb; j++) for (let q = 0; q < 4; q++) { const t = bt[j] + (bt[j + 1] - bt[j]) * q / 4; P.vln1.note(t, hi[k], beat / 4 * 1.2, vel * (q ? 0.7 : 0.95)); P.vln2.note(t, hi[Math.max(0, k - 2)], beat / 4 * 1.2, vel * 0.65); } - for (const m of voicing(c, 60, 72, 2)) P.viola.note(b.t, m, b.dur * 1.03, vel * 0.8); P.qcello.note(b.t, root, b.dur * 1.03, vel * 0.9); + if (!early) { sus(P.viola, b.t, voicing(c, 51, 62, 2), b.dur * 1.03, vel * 0.8); P.qcello.note(b.t, root, b.dur * 1.03, vel * 0.9); } } } - // TAIKO (v24) — big drums: 1 and 3 in chorus 2, rising through the break, every beat and a - // 16th fill into each phrase in the bridge and the finale - if (s === "chorus2" || s === "break" || s === "bridge" || s === "outro") { - const g = s === "break" ? 0.4 + 0.6 * grow(b.n, 68, 73) : s === "chorus2" ? 0.85 : 1; + // TAIKO — on her roots (44/47, not the sample's G/A/C): 1 and 3 in chorus 2, from bar 70 in the break, every beat + // with a fill into each phrase in the bridge climb and the finale + if (s === "chorus2" || (s === "break" && n >= 70) || (s === "bridge" && !early) || finale) { + const g = s === "break" ? 0.5 + 0.5 * grow(n, 70, 73) : s === "chorus2" ? 0.85 : 1; const hits = s === "chorus2" || s === "break" ? [0, 2] : [0, 1, 2, 3]; - for (const j of hits) if (bt[j] != null) P.taiko.note(bt[j], j % 2 ? 48 : 43, beat * 0.8, (j % 2 ? 84 : 112) * g); - if (s !== "chorus2" && PHRASE(b.n) === 3 && nb > 3) for (let q = 0; q < 4; q++) P.taiko.note(bt[3] + beat * q / 4, 45, beat / 4, (70 + 12 * q) * g); - if ((s === "bridge" || s === "outro") && nb > 3) P.taiko.note(mid(3), 48, beat * 0.4, 72 * g); + for (const j of hits) if (bt[j] != null) P.taiko.note(bt[j], j % 2 ? root + 3 : root, beat * 0.8, (j % 2 ? 84 : 112) * g); + if (s !== "chorus2" && ph === 3 && nb > 3 && !lift) for (let q = 0; q < 4; q++) P.taiko.note(bt[3] + beat * q / 4, root + 1, beat / 4, (70 + 12 * q) * g); } - // AAHS — a block choir on the chord: the second half of chorus 1, all of chorus 2, the bridge, the outro - if ((s === "chorus1" && b.n >= 36) || s === "chorus2" || s === "bridge" || s === "outro") { - const v = voicing(c, 56, 71, 4), g = s === "chorus1" ? grow(b.n, 36, 40) : 1; - for (const m of v) P.aahs.note(b.t, m, b.dur * 1.05, (big ? 92 : 76) * g); + // AAHS — a block choir ABOVE her (68–83): the second half of chorus 1, chorus 2, the bridge climb, the finale, a soft release + if ((s === "chorus1" && n >= 36) || s === "chorus2" || (s === "bridge" && !early) || s === "outro") { + const v = voicing(c, 68, 83, 4), g = s === "chorus1" ? grow(n, 36, 40) : s === "chorus2" ? 0.2 + 0.8 * grow(n, 52, 58) : release ? 0.55 : 1; // v67: the aahs come in late + sus(P.aahs, b.t, v, b.dur * 1.05, (big || finale ? 92 : 76) * g); } + + // THE PICKUP (v35) — the chorus begins on "Oh, won't you": from beat 3 of bars 27 and 51 the strings, horns and timpani + // are already in, at the chorus's own voicing and weight + if (n === 27 || n === 51) { const jP = nb > 2 ? nb - 2 : 0, tP = bt[jP], dP = b.t + b.dur - tP, cv = n === 51; const nc = c; // v51: two beats before "kiss" (27.4 / 51.3) + sus(P.strings, tP, voicing(nc, 71, 83, 3), dP * 1.02, cv ? 94 : 84); for (const m of voicing(nc, 44, 55, 2)) P.strings.note(tP, m, dP * 1.02, cv ? 84 : 70); + for (const m of voicing(nc, 44, 56, 3)) { P.horns.note(tP, m, dP * 1.02, 88); P.horns.note(tP, m, beat * 0.9, 104); } + P.timpani.note(tP, root, beat * 1.5, cv ? 112 : 100); if (cv) P.taiko.note(tP, root, beat * 0.8, 112); + for (let j = jP; j < nb; j++) for (let q = 0; q < 2; q++) { const t = bt[j] + (bt[j + 1] - bt[j]) * q / 2; P.vln1.note(t, tones(nc, 71, 88)[(j * 2 + q) % 4], beat / 2 * 1.1, cv ? 90 : 78); } } + // THE ANSWER (v27) — her kiss figure comes back in her own silences: pizz + harp after chorus 1 (bar 42), glock + + // violin I an octave up after chorus 2 (bar 66), and the horns open the finale with it (bar 81 — the one new thing there) + if (n === 42) { kissAt(P.pizz, b, 0, 92); kissAt(P.harp, b, 12, 84); } + if (n === 66) { kissAt(P.glock, b, 12, 80); kissAt(P.vln1, b, 12, 92); } + if (n === 81) { kissAt(P.horns, b, -12, 112); kissAt(P.strings, b, 0, 100); } } -// THE BUTTON (v25) — the end of bar 84 is the record's last downbeat: a timpani roll into it, then the -// whole orchestra holds the chord for five seconds under her ring-out, taiko and timpani on the hit -{ const b84 = barN(84); if (b84) { const tE = b84.t + b84.dur, c = b84.chord, root = ROOT[c], beat = b84.dur / b84.nb; - for (let q = 0; q < 12; q++) P.timpani.note(b84.beats[2] + (tE - b84.beats[2]) * q / 12, root, beat / 6 * 1.2, 50 + 70 * q / 11); - P.timpani.note(tE, root, 2.5, 120); P.taiko.note(tE, 43, 1.2, 120); P.taiko.note(tE + 0.02, 48, 1.0, 100); - for (const m of voicing(c, 51, 87, 8)) P.strings.note(tE, m, 5.0, 110); - for (const m of voicing(c, 56, 68, 3)) { P.horns.note(tE, m, 4.5, 104); P.horns.note(tE, m - 12, 4.5, 96); } - for (const [part, m] of [[P.vln1, tones(c, 79, 91)[1]], [P.vln2, tones(c, 71, 83)[1]], [P.viola, tones(c, 60, 72)[0]], [P.qcello, root]]) part.note(tE, m, 5.0, 108); - P.cello.note(tE, root, 5.0, 100); P.cello.note(tE, root - 12, 5.0, 90); - for (const m of voicing(c, 56, 71, 4)) P.aahs.note(tE, m, 5.0, 100); - for (const m of tones(c, 56, 95)) P.harp.note(tE + 0.02 * (m - 56) / 4, m, 3.0, 80); // one upward harp sweep +// THE BUTTON (v27) — on her LAST STRUM, bar 84's downbeat: the roll came in bar 83; the hit, then the chord +// let go in three steps over three seconds so her guitar is the last thing heard +{ const b84 = barN(84); if (b84) { const tB = b84.t, c = b84.chord, root = ROOT[c]; + P.timpani.note(tB - 0.008, root, 2.5, 120); P.taiko.note(tB, root, 1.2, 120); + for (const [dt, vel] of [[0, 104], [1.0, 74], [2.0, 46]]) { + for (const m of voicing(c, 51, 87, 8)) P.strings.note(tB + dt, m, 1.15, vel); + for (const m of voicing(c, 44, 56, 3)) P.horns.note(tB + dt, m, 1.15, vel); + for (const m of voicing(c, 68, 83, 4)) P.aahs.note(tB + dt, m, 1.15, vel * 0.9); + P.cello.note(tB + dt, root, 1.15, vel); P.vln1.note(tB + dt, tones(c, 79, 91)[1], 1.15, vel); P.vln2.note(tB + dt, tones(c, 71, 83)[1], 1.15, vel * 0.9); } + for (const m of tones(c, 56, 95)) P.harp.note(tB + 0.02 * (m - 56) / 4, m, 2.5, 80); // one upward sweep } } -// GLOCKENSPIEL — her melody an octave up, chorus 2, the bridge and the outro +// GLOCKENSPIEL — her melody an octave up: chorus 2's second half and the bridge climb (where she sings) for (const v of notes) { if (v.dur < 0.18) continue; const b = bars.find((x) => v.t >= x.t && v.t < x.t + x.dur); if (!b) continue; const s = section(b.n); - if ((s === "chorus2" && b.n >= 60) || s === "bridge" || s === "outro") P.glock.note(v.t, v.midi + 12, Math.max(0.25, v.dur), s === "outro" ? 56 : 68); // v26: glock from chorus 2's second half + if ((s === "chorus2" && b.n >= 60) || (s === "bridge" && b.n >= 77)) P.glock.note(v.t, v.midi + 12, Math.max(0.25, v.dur), 68); } // ── render ── diff --git a/pop/sailor-song/bin/regularize.mjs b/pop/sailor-song/bin/regularize.mjs index 587a0e3c08..5ed810033c 100644 --- a/pop/sailor-song/bin/regularize.mjs +++ b/pop/sailor-song/bin/regularize.mjs @@ -49,7 +49,19 @@ const sorted = [...bpm].sort((a, b) => a - b), median = sorted[sorted.length >> const smooth = bpm.map((_, i) => { const a = Math.max(0, i - WIN), z = Math.min(bpm.length, i + WIN + 1); return bpm.slice(a, z).reduce((s, v) => s + v, 0) / (z - a); }); // how much of her sway to keep per beat: all of it before the floor, KEEP after, eased over 4 bars before FLOOR_BAR const keepAt = (i) => { const n = barOfBeat[i]; if (n >= FLOOR_BAR) return KEEP; if (n < FLOOR_BAR - 4) return 1; const x = (n - (FLOOR_BAR - 4)) / 4; return 1 + (KEEP - 1) * (0.5 - 0.5 * Math.cos(Math.PI * x)); }; -const target = bpm.map((v, i) => { const k = keepAt(i); return (k >= 1 ? v : median + k * (smooth[i] - median)) * (barOfBeat[i] >= LIFT_BAR ? LIFT : 1); }); +// v32: the lift EASES in over the four bars before LIFT_BAR (it was a 5.6 % step on the downbeat of 28 — "kiss me on +// the mouth" was squeezed 11 %), and no beat is ever squeezed more than SQUEEZE (6 %) against how she played it +const SQUEEZE = Number(flags.squeeze ?? 1.06); +const liftAt = (i) => { const n = barOfBeat[i]; if (n >= LIFT_BAR) return LIFT; if (n < LIFT_BAR - 4) return 1; const x = (n - (LIFT_BAR - 4)) / 4; return 1 + (LIFT - 1) * (0.5 - 0.5 * Math.cos(Math.PI * x)); }; +let target = bpm.map((v, i) => { const k = keepAt(i); const t = (k >= 1 ? v : median + k * (smooth[i] - median)) * liftAt(i); return Math.min(t, v * SQUEEZE); }); +// v53: FIT — a bar she stretched to five beats (27: "to me? … oh won't you") is compressed to four, so the chorus downbeat lands +// on "kiss" and the band's "1" is hers. Each of the bar's intervals is scaled by the same factor; the squeeze cap does not apply. +const FIT = String(flags["fit-bars"] ?? "").split(",").filter(Boolean).map(Number); // v54: off by default — "there was never a problem with the 'oh won't you' timing" +for (const fb of FIT) { const idx = ibi.map((_, i) => i).filter((i) => barOfBeat[i] === fb); if (idx.length <= 4) continue; + const raw = idx.reduce((a, i) => a + ibi[i], 0), nb = idx.length; + const near = ibi.map((_, i) => i).filter((i) => (barOfBeat[i] === fb - 1 || barOfBeat[i] === fb + 1)); const beatT = near.reduce((a, i) => a + 60 / target[i], 0) / near.length; + const want = 4 * beatT; for (const i of idx) target[i] = bpm[i] * (raw / want); + console.log(` fit bar ${fb}: ${nb} beats ${raw.toFixed(2)} s → 4 beats ${want.toFixed(2)} s (×${(want / raw).toFixed(3)})`); } const dst = [src[0]]; for (let i = 0; i < target.length; i++) dst.push(dst[i] + 60 / target[i]); const ratio = ibi.map((d, i) => (60 / target[i]) / d); diff --git a/pop/sailor-song/bin/splice.mjs b/pop/sailor-song/bin/splice.mjs index fa734d2ede..8efe77408e 100644 --- a/pop/sailor-song/bin/splice.mjs +++ b/pop/sailor-song/bin/splice.mjs @@ -189,7 +189,7 @@ for (const s of segs) { const beats = inside.map((t) => +(t - s.from + s.offset).toFixed(3)); if (beats.length && beats[0] > +(Math.max(t0, s.from) - s.from + s.offset).toFixed(3) + 1e-6) beats.unshift(+(Math.max(t0, s.from) - s.from + s.offset).toFixed(3)); const endT = +(Math.min(t1, s.to) - s.from + s.offset).toFixed(3); - if (!beats.length || beats.at(-1) < endT - 1e-6) beats.push(endT); + if (!beats.length || beats.at(-1) < endT - 0.005) beats.push(endT); // v27: a 1 ms sliver past the next downbeat is not a beat (bars 38/49/70/75/81 were firing twice) if (beats.length < 2) continue; // v19d: a one-beat pickup is a bar too (its kick keeps the pulse) const cutL = t0 < s.from, cutR = t1 > s.to; bars.push({ ...b, n: s.asBar ?? b.n, t: beats[0], dur: +(endT - beats[0]).toFixed(3), beats, strum: cutL ? b.strum.slice(-(beats.length - 1) * 2) : cutR ? b.strum.slice(0, (beats.length - 1) * 2) : b.strum }); diff --git a/pop/sailor-song/c/cut.sh b/pop/sailor-song/c/cut.sh index 64ae7eff5b..7d1b11b131 100755 --- a/pop/sailor-song/c/cut.sh +++ b/pop/sailor-song/c/cut.sh @@ -20,25 +20,35 @@ COVER="$LANE/cover/sailor-song-cover.jpg" # v6.2: clean, no title text trap 'rm -f "$PRE"' EXIT echo "→ translation premaster" -ffmpeg -y -v error -i "$FULL" -af \ - "highpass=f=32,bass=g=-2.5:f=90:w=0.7,equalizer=f=220:t=q:w=0.9:g=0.6,\ -equalizer=f=900:t=q:w=0.85:g=1.6,treble=g=1.2:f=7500:w=0.6" -ar 48000 -c:a pcm_f32le "$PRE" +# v60: SUBSTRATE=vinyl — the wax-record master (pop/lib/substrate.mjs): its EQ tilt, wow + flutter and tube glue replace the +# translation EQ; the density/loudness stage below still sets the ceiling +if [ "${SUBSTRATE:-vinyl}" = "vinyl" ]; then + CHAIN="volume=-4dB,$(node -e 'import("'"$LANE"'/../lib/substrate.mjs").then(m=>process.stdout.write(m.masterChain("vinyl")))')" # v60b: −4 dB in, so the glue stops pinning + echo " substrate: vinyl" +else + CHAIN="highpass=f=32,bass=g=-2.5:f=90:w=0.7,equalizer=f=220:t=q:w=0.9:g=0.6,equalizer=f=900:t=q:w=0.85:g=1.6,treble=g=1.2:f=7500:w=0.6" +fi +ffmpeg -y -v error -i "$FULL" -af "$CHAIN" -ar 48000 -c:a pcm_f32le "$PRE" density() { # $1 = static gain dB - echo "acompressor=threshold=0.20:ratio=1.5:attack=30:release=180:knee=4:link=maximum:detection=rms:mix=0.50,\ -volume=4.0dB,asoftclip=type=tanh:threshold=0.62:output=0.92,volume=${1}dB,\ -aresample=192000,alimiter=limit=${LIMIT:-0.730}:attack=4:release=120:asc=true:asc_level=0.35:level=false,aresample=48000" + if [ "${SUBSTRATE:-vinyl}" = "vinyl" ]; then # v60c: the wax already glued and limited itself — only the loudness gain and the ceiling here (the clipper was eating the master) + echo "volume=${1}dB,aresample=192000,alimiter=limit=${LIMIT:-0.725}:attack=4:release=120:asc=true:asc_level=0.35:level=false,aresample=48000" + else + echo "acompressor=threshold=0.28:ratio=1.5:attack=30:release=180:knee=4:link=maximum:detection=rms:mix=0.30,\ +volume=2.5dB,asoftclip=type=tanh:threshold=0.82:output=0.92,volume=${1}dB,\ +aresample=192000,alimiter=limit=${LIMIT:-0.725}:attack=4:release=120:asc=true:asc_level=0.35:level=false,aresample=48000" + fi } measure() { ffmpeg -hide_banner -nostats -i "$1" -af "$2${2:+,}ebur128=peak=true:framelog=quiet" -f null - 2>&1 \ | awk '/Summary/{s=1} s&&/ I:/{print $2; exit}'; } echo "→ density + loudness taken at the ceiling (measured, not guessed)" -GAIN2="${GAIN2:-6.0}" +GAIN2="${GAIN2:-0.0}" for pass in 1 2 3; do I=$(measure "$PRE" "$(density "$GAIN2")") echo " pass $pass: GAIN2=${GAIN2} dB → ${I} LUFS" - awk -v i="$I" 'BEGIN{exit !(i > -10.3 && i < -9.7)}' && break - GAIN2=$(awk -v g="$GAIN2" -v i="$I" 'BEGIN{printf "%.2f", g + (-10 - i)}') + awk -v i="$I" 'BEGIN{exit !(i > -12.3 && i < -11.7)}' && break # v39: −12 LUFS — "the mix feels a little maxed out" + GAIN2=$(awk -v g="$GAIN2" -v i="$I" 'BEGIN{printf "%.2f", g + (-12 - i)}') done ffmpeg -y -v error -i "$PRE" -af "$(density "$GAIN2")" -ar 48000 -c:a pcm_s24le "$MASTER" diff --git a/pop/sailor-song/c/sailor-chart.h b/pop/sailor-song/c/sailor-chart.h index 9a8cb488bf..c19ecbc6d7 100644 --- a/pop/sailor-song/c/sailor-chart.h +++ b/pop/sailor-song/c/sailor-chart.h @@ -40,66 +40,66 @@ static const ChartBar CHART_BARS[CHART_NBARS] = { { 22, 47.9470, 2.0780, 2, 4, { 47.9470, 48.4680, 48.9880, 49.5070, 50.0250 } }, { 23, 50.0250, 2.0470, 2, 4, { 50.0250, 50.5370, 51.0480, 51.5600, 52.0720 } }, { 24, 52.0720, 2.0350, 2, 4, { 52.0720, 52.5810, 53.0900, 53.5990, 54.1080 } }, - { 25, 54.1080, 2.0350, 2, 4, { 54.1080, 54.6170, 55.1260, 55.6350, 56.1430 } }, - { 26, 56.1430, 2.0290, 2, 4, { 56.1430, 56.6500, 57.1570, 57.6640, 58.1720 } }, - { 27, 58.1720, 2.5280, 2, 5, { 58.1720, 58.6790, 59.1850, 59.6910, 60.1960, 60.7000 } }, - { 28, 60.7000, 1.9150, 1, 4, { 60.7000, 61.1790, 61.6580, 62.1370, 62.6150 } }, - { 29, 62.6150, 1.9100, 1, 4, { 62.6150, 63.0930, 63.5710, 64.0480, 64.5260 } }, - { 30, 64.5260, 1.9070, 0, 4, { 64.5260, 65.0030, 65.4800, 65.9570, 66.4330 } }, - { 31, 66.4330, 1.9030, 0, 4, { 66.4330, 66.9090, 67.3850, 67.8600, 68.3360 } }, - { 32, 68.3360, 1.9050, 2, 4, { 68.3360, 68.8130, 69.2890, 69.7650, 70.2410 } }, - { 33, 70.2410, 1.9040, 2, 4, { 70.2410, 70.7170, 71.1930, 71.6690, 72.1450 } }, - { 34, 72.1450, 1.9020, 2, 4, { 72.1450, 72.6200, 73.0960, 73.5710, 74.0470 } }, - { 35, 74.0470, 1.9030, 0, 4, { 74.0470, 74.5230, 74.9990, 75.4750, 75.9500 } }, - { 36, 75.9500, 1.9030, 0, 4, { 75.9500, 76.4260, 76.9020, 77.3780, 77.8530 } }, - { 37, 77.8530, 1.9030, 0, 4, { 77.8530, 78.3290, 78.8050, 79.2810, 79.7570 } }, - { 38, 79.7570, 1.9040, 2, 5, { 79.7570, 80.2320, 80.7080, 81.1840, 81.6600, 81.6610 } }, - { 39, 81.6600, 1.9040, 2, 4, { 81.6600, 82.1360, 82.6120, 83.0880, 83.5640 } }, - { 40, 83.5640, 1.9040, 2, 4, { 83.5640, 84.0400, 84.5160, 84.9920, 85.4680 } }, - { 41, 85.4680, 1.9020, 1, 4, { 85.4680, 85.9440, 86.4200, 86.8950, 87.3700 } }, - { 42, 87.3700, 1.9070, 2, 4, { 87.3700, 87.8460, 88.3220, 88.8000, 89.2770 } }, - { 43, 89.2770, 1.9130, 0, 4, { 89.2770, 89.7550, 90.2330, 90.7110, 91.1900 } }, - { 44, 91.1900, 1.9180, 0, 4, { 91.1900, 91.6690, 92.1480, 92.6280, 93.1080 } }, - { 45, 93.1080, 1.9270, 0, 4, { 93.1080, 93.5890, 94.0710, 94.5530, 95.0350 } }, - { 46, 95.0350, 1.9280, 2, 4, { 95.0350, 95.5180, 96.0000, 96.4820, 96.9640 } }, - { 47, 96.9640, 1.9290, 2, 4, { 96.9640, 97.4460, 97.9280, 98.4100, 98.8930 } }, - { 48, 98.8930, 1.9280, 0, 4, { 98.8930, 99.3750, 99.8570, 100.3390, 100.8210 } }, - { 49, 100.8210, 1.9240, 1, 5, { 100.8210, 101.3020, 101.7830, 102.2640, 102.7440, 102.7450 } }, - { 50, 102.7440, 1.9210, 0, 4, { 102.7440, 103.2250, 103.7060, 104.1860, 104.6650 } }, - { 51, 104.6650, 1.9110, 0, 4, { 104.6650, 105.1440, 105.6220, 106.0990, 106.5770 } }, - { 52, 106.5770, 1.9020, 2, 4, { 106.5770, 107.0530, 107.5280, 108.0040, 108.4790 } }, - { 53, 108.4790, 1.8980, 2, 4, { 108.4790, 108.9530, 109.4280, 109.9030, 110.3770 } }, - { 54, 110.3770, 1.8910, 2, 4, { 110.3770, 110.8510, 111.3230, 111.7950, 112.2680 } }, - { 55, 112.2680, 1.8920, 0, 4, { 112.2680, 112.7410, 113.2150, 113.6870, 114.1600 } }, - { 56, 114.1600, 1.8900, 0, 4, { 114.1600, 114.6330, 115.1050, 115.5780, 116.0500 } }, - { 57, 116.0500, 1.8880, 0, 4, { 116.0500, 116.5220, 116.9940, 117.4660, 117.9380 } }, - { 58, 117.9380, 1.8860, 2, 4, { 117.9380, 118.4090, 118.8800, 119.3520, 119.8240 } }, - { 59, 119.8240, 1.8820, 2, 4, { 119.8240, 120.2940, 120.7650, 121.2350, 121.7060 } }, - { 60, 121.7060, 1.8840, 2, 4, { 121.7060, 122.1770, 122.6480, 123.1190, 123.5900 } }, - { 61, 123.5900, 1.8870, 2, 4, { 123.5900, 124.0610, 124.5330, 125.0050, 125.4770 } }, - { 62, 125.4770, 1.8910, 0, 4, { 125.4770, 125.9490, 126.4220, 126.8950, 127.3680 } }, - { 63, 127.3680, 1.8930, 0, 4, { 127.3680, 127.8400, 128.3130, 128.7870, 129.2610 } }, - { 64, 129.2610, 1.8970, 2, 4, { 129.2610, 129.7350, 130.2090, 130.6830, 131.1580 } }, - { 65, 131.1580, 1.8990, 2, 4, { 131.1580, 131.6330, 132.1080, 132.5830, 133.0570 } }, - { 66, 133.0570, 1.8950, 2, 4, { 133.0570, 133.5310, 134.0040, 134.4780, 134.9520 } }, - { 67, 134.9520, 1.8970, 0, 4, { 134.9520, 135.4260, 135.9000, 136.3750, 136.8490 } }, - { 68, 136.8490, 1.8940, 0, 4, { 136.8490, 137.3230, 137.7970, 138.2700, 138.7430 } }, - { 69, 138.7430, 1.8900, 0, 4, { 138.7430, 139.2150, 139.6880, 140.1600, 140.6330 } }, - { 70, 140.6330, 1.8900, 0, 5, { 140.6330, 141.1050, 141.5770, 142.0500, 142.5220, 142.5230 } }, - { 71, 142.5220, 1.8890, 2, 4, { 142.5220, 142.9950, 143.4670, 143.9400, 144.4110 } }, - { 72, 144.4110, 1.8880, 2, 4, { 144.4110, 144.8830, 145.3550, 145.8270, 146.2990 } }, - { 73, 146.2990, 1.8900, 1, 4, { 146.2990, 146.7720, 147.2440, 147.7170, 148.1890 } }, - { 74, 148.1890, 1.8900, 2, 4, { 148.1890, 148.6620, 149.1340, 149.6070, 150.0800 } }, - { 75, 150.0800, 1.8890, 0, 5, { 150.0800, 150.5520, 151.0240, 151.4960, 151.9680, 151.9690 } }, - { 76, 151.9680, 1.8910, 0, 4, { 151.9680, 152.4410, 152.9140, 153.3870, 153.8590 } }, - { 77, 153.8590, 1.8890, 2, 4, { 153.8590, 154.3320, 154.8040, 155.2760, 155.7490 } }, - { 78, 155.7490, 1.8890, 2, 4, { 155.7490, 156.2210, 156.6940, 157.1660, 157.6380 } }, - { 79, 157.6380, 1.8850, 2, 4, { 157.6380, 158.1100, 158.5820, 159.0530, 159.5230 } }, - { 80, 159.5230, 1.8750, 1, 4, { 159.5230, 159.9930, 160.4620, 160.9310, 161.3990 } }, - { 81, 161.3990, 1.8700, 0, 5, { 161.3990, 161.8670, 162.3340, 162.8010, 163.2680, 163.2690 } }, - { 82, 163.2680, 1.8650, 0, 4, { 163.2680, 163.7350, 164.2010, 164.6670, 165.1330 } }, - { 83, 165.1330, 1.8640, 0, 4, { 165.1330, 165.6000, 166.0660, 166.5320, 166.9980 } }, - { 84, 166.9980, 1.8700, 2, 4, { 166.9980, 167.4650, 167.9320, 168.4000, 168.8680 } }, + { 25, 54.1080, 2.0700, 2, 4, { 54.1080, 54.6280, 55.1480, 55.6630, 56.1780 } }, + { 26, 56.1780, 2.0050, 2, 4, { 56.1780, 56.6760, 57.1750, 57.6790, 58.1820 } }, + { 27, 58.1820, 2.4670, 2, 5, { 58.1820, 58.6750, 59.1680, 59.6820, 60.1670, 60.6500 } }, + { 28, 60.6500, 1.9900, 1, 4, { 60.6500, 61.1590, 61.6690, 62.1540, 62.6390 } }, + { 29, 62.6390, 1.9180, 1, 4, { 62.6390, 63.1250, 63.6030, 64.0800, 64.5580 } }, + { 30, 64.5580, 1.9080, 0, 4, { 64.5580, 65.0350, 65.5130, 65.9890, 66.4650 } }, + { 31, 66.4650, 1.9220, 0, 4, { 66.4650, 66.9420, 67.4180, 67.9120, 68.3880 } }, + { 32, 68.3880, 1.9050, 2, 4, { 68.3880, 68.8640, 69.3400, 69.8160, 70.2920 } }, + { 33, 70.2920, 1.9050, 2, 4, { 70.2920, 70.7690, 71.2450, 71.7210, 72.1980 } }, + { 34, 72.1980, 1.9050, 2, 4, { 72.1980, 72.6730, 73.1480, 73.6250, 74.1020 } }, + { 35, 74.1020, 1.9110, 0, 4, { 74.1020, 74.5790, 75.0550, 75.5310, 76.0130 } }, + { 36, 76.0130, 1.9160, 0, 4, { 76.0130, 76.4890, 76.9650, 77.4470, 77.9290 } }, + { 37, 77.9290, 1.9160, 0, 4, { 77.9290, 78.4040, 78.8800, 79.3620, 79.8440 } }, + { 38, 79.8440, 1.9040, 2, 4, { 79.8440, 80.3200, 80.7960, 81.2720, 81.7480 } }, + { 39, 81.7480, 1.9380, 2, 4, { 81.7480, 82.2410, 82.7340, 83.2100, 83.6860 } }, + { 40, 83.6860, 1.9050, 2, 4, { 83.6860, 84.1620, 84.6380, 85.1150, 85.5910 } }, + { 41, 85.5910, 1.9160, 1, 4, { 85.5910, 86.0670, 86.5420, 87.0250, 87.5070 } }, + { 42, 87.5070, 1.9070, 2, 4, { 87.5070, 87.9830, 88.4590, 88.9360, 89.4140 } }, + { 43, 89.4140, 1.9160, 0, 4, { 89.4140, 89.8910, 90.3690, 90.8480, 91.3300 } }, + { 44, 91.3300, 2.0050, 0, 4, { 91.3300, 91.8390, 92.3490, 92.8410, 93.3350 } }, + { 45, 93.3350, 1.9820, 0, 4, { 93.3350, 93.8270, 94.3210, 94.8190, 95.3170 } }, + { 46, 95.3170, 1.9720, 2, 4, { 95.3170, 95.8040, 96.2920, 96.7900, 97.2880 } }, + { 47, 97.2880, 1.9830, 2, 4, { 97.2880, 97.7980, 98.3070, 98.7900, 99.2720 } }, + { 48, 99.2720, 1.9610, 0, 4, { 99.2720, 99.7600, 100.2470, 100.7400, 101.2330 } }, + { 49, 101.2330, 2.0040, 1, 4, { 101.2330, 101.7370, 102.2410, 102.7330, 103.2370 } }, + { 50, 103.2370, 1.9390, 0, 4, { 103.2370, 103.7250, 104.2120, 104.6940, 105.1760 } }, + { 51, 105.1760, 1.9280, 0, 4, { 105.1760, 105.6580, 106.1400, 106.6220, 107.1040 } }, + { 52, 107.1040, 1.9350, 2, 4, { 107.1040, 107.5960, 108.0890, 108.5640, 109.0390 } }, + { 53, 109.0390, 1.8980, 2, 4, { 109.0390, 109.5140, 109.9890, 110.4630, 110.9380 } }, + { 54, 110.9380, 1.8910, 2, 4, { 110.9380, 111.4110, 111.8840, 112.3560, 112.8290 } }, + { 55, 112.8290, 1.8990, 0, 4, { 112.8290, 113.3050, 113.7810, 114.2540, 114.7270 } }, + { 56, 114.7270, 1.8900, 0, 4, { 114.7270, 115.2000, 115.6720, 116.1440, 116.6170 } }, + { 57, 116.6170, 1.8880, 0, 4, { 116.6170, 117.0890, 117.5610, 118.0330, 118.5050 } }, + { 58, 118.5050, 1.8860, 2, 4, { 118.5050, 118.9760, 119.4470, 119.9190, 120.3900 } }, + { 59, 120.3900, 1.8830, 2, 4, { 120.3900, 120.8610, 121.3320, 121.8030, 122.2740 } }, + { 60, 122.2740, 1.8840, 2, 4, { 122.2740, 122.7440, 123.2160, 123.6870, 124.1580 } }, + { 61, 124.1580, 1.9080, 2, 4, { 124.1580, 124.6290, 125.1010, 125.5730, 126.0660 } }, + { 62, 126.0660, 1.8910, 0, 4, { 126.0660, 126.5380, 127.0110, 127.4840, 127.9570 } }, + { 63, 127.9570, 1.9170, 0, 4, { 127.9570, 128.4330, 128.9090, 129.3910, 129.8740 } }, + { 64, 129.8740, 1.8970, 2, 4, { 129.8740, 130.3470, 130.8220, 131.2960, 131.7710 } }, + { 65, 131.7710, 1.8990, 2, 4, { 131.7710, 132.2460, 132.7210, 133.1950, 133.6700 } }, + { 66, 133.6700, 1.9520, 2, 4, { 133.6700, 134.1680, 134.6660, 135.1400, 135.6220 } }, + { 67, 135.6220, 1.8970, 0, 4, { 135.6220, 136.0960, 136.5700, 137.0440, 137.5190 } }, + { 68, 137.5190, 1.8940, 0, 4, { 137.5190, 137.9930, 138.4670, 138.9400, 139.4130 } }, + { 69, 139.4130, 1.8900, 0, 4, { 139.4130, 139.8850, 140.3570, 140.8300, 141.3020 } }, + { 70, 141.3020, 1.8900, 0, 4, { 141.3020, 141.7750, 142.2470, 142.7190, 143.1920 } }, + { 71, 143.1920, 1.8890, 2, 4, { 143.1920, 143.6650, 144.1370, 144.6090, 145.0810 } }, + { 72, 145.0810, 1.9080, 2, 4, { 145.0810, 145.5530, 146.0250, 146.4970, 146.9890 } }, + { 73, 146.9890, 1.8900, 1, 4, { 146.9890, 147.4620, 147.9340, 148.4060, 148.8790 } }, + { 74, 148.8790, 1.8900, 2, 4, { 148.8790, 149.3510, 149.8240, 150.2960, 150.7690 } }, + { 75, 150.7690, 1.8890, 0, 4, { 150.7690, 151.2410, 151.7130, 152.1850, 152.6580 } }, + { 76, 152.6580, 1.8910, 0, 4, { 152.6580, 153.1310, 153.6040, 154.0770, 154.5490 } }, + { 77, 154.5490, 1.8890, 2, 4, { 154.5490, 155.0210, 155.4940, 155.9660, 156.4390 } }, + { 78, 156.4390, 1.9090, 2, 4, { 156.4390, 156.9310, 157.4030, 157.8760, 158.3480 } }, + { 79, 158.3480, 1.8970, 2, 4, { 158.3480, 158.8190, 159.2910, 159.7630, 160.2450 } }, + { 80, 160.2450, 1.8750, 1, 4, { 160.2450, 160.7150, 161.1840, 161.6520, 162.1200 } }, + { 81, 162.1200, 1.8700, 0, 4, { 162.1200, 162.5880, 163.0550, 163.5230, 163.9890 } }, + { 82, 163.9890, 1.8650, 0, 4, { 163.9890, 164.4560, 164.9220, 165.3880, 165.8550 } }, + { 83, 165.8550, 1.8640, 0, 4, { 165.8550, 166.3210, 166.7870, 167.2530, 167.7190 } }, + { 84, 167.7190, 1.8700, 2, 4, { 167.7190, 168.1860, 168.6530, 169.1210, 169.5890 } }, }; #define CHART_NNOTES 280 @@ -157,231 +157,231 @@ static const ChartNote CHART_NOTES[CHART_NNOTES] = { { 51.3693, 0.7716, 66 }, { 52.1409, 0.9620, 56 }, { 53.1029, 0.7982, 59 }, - { 53.9011, 0.2437, 61 }, - { 54.1448, 0.5909, 59 }, - { 54.8740, 0.7718, 63 }, - { 55.6457, 0.3117, 68 }, - { 55.9575, 0.5559, 66 }, - { 56.5134, 0.1824, 68 }, - { 56.6958, 1.0492, 63 }, - { 57.9160, 0.2759, 68 }, - { 58.1919, 0.3547, 66 }, - { 58.5466, 0.2087, 68 }, - { 58.7553, 0.7002, 63 }, - { 59.4555, 0.1903, 61 }, - { 59.6457, 0.3084, 59 }, - { 59.9541, 0.2461, 61 }, - { 60.7149, 0.4795, 66 }, - { 61.1944, 0.5869, 64 }, - { 61.7813, 0.3678, 63 }, - { 62.1491, 0.1253, 59 }, - { 62.3162, 0.1207, 63 }, - { 62.4369, 0.6265, 66 }, - { 63.0634, 0.5601, 64 }, - { 63.6235, 0.2054, 61 }, - { 63.8289, 0.2985, 59 }, - { 64.2745, 0.2785, 59 }, - { 64.5530, 0.1230, 64 }, - { 64.6760, 0.3264, 66 }, - { 65.0024, 0.2645, 64 }, - { 65.3141, 0.1653, 56 }, - { 65.4795, 0.5471, 63 }, - { 66.0266, 0.3112, 59 }, - { 66.3377, 0.5702, 66 }, - { 66.9079, 0.4615, 64 }, - { 67.3695, 0.2825, 63 }, - { 67.6520, 0.2904, 59 }, - { 68.1141, 0.2099, 59 }, - { 68.3672, 1.1696, 63 }, - { 69.5368, 0.1240, 58 }, - { 69.6609, 0.3769, 59 }, - { 70.0378, 0.2290, 61 }, - { 70.2668, 0.2476, 64 }, - { 70.5144, 0.2095, 66 }, - { 70.7239, 0.4437, 64 }, - { 71.2433, 0.1979, 63 }, - { 71.4412, 0.2356, 59 }, - { 71.6768, 0.2166, 52 }, - { 71.8934, 0.7070, 59 }, - { 72.6385, 0.4667, 64 }, - { 73.1617, 0.7718, 63 }, - { 73.9335, 0.5368, 66 }, - { 74.4703, 0.1130, 63 }, - { 74.5833, 0.2261, 64 }, - { 74.8706, 0.3812, 63 }, - { 75.2518, 0.2852, 59 }, - { 75.5742, 0.3968, 59 }, - { 75.9710, 0.1219, 64 }, - { 76.0929, 0.3169, 66 }, - { 76.4098, 0.7121, 63 }, - { 77.1219, 0.5397, 59 }, - { 77.6616, 0.3257, 61 }, - { 77.9873, 0.2074, 66 }, - { 78.1947, 1.3615, 63 }, - { 79.5563, 0.2527, 59 }, - { 79.8090, 0.2193, 64 }, - { 80.0282, 0.2193, 66 }, - { 80.2475, 0.2145, 63 }, - { 80.4621, 0.2772, 64 }, - { 80.7393, 0.4342, 63 }, - { 81.1734, 0.4594, 59 }, - { 81.6328, 0.5205, 66 }, - { 82.1533, 0.1140, 63 }, - { 82.2810, 0.3758, 64 }, - { 82.6568, 0.2672, 63 }, - { 82.9240, 0.3003, 59 }, - { 83.3434, 0.4170, 61 }, - { 83.7604, 0.2848, 66 }, - { 84.0452, 0.3764, 64 }, - { 84.4216, 0.1436, 68 }, - { 84.5652, 0.7068, 63 }, - { 85.2720, 0.1555, 64 }, - { 85.4275, 0.5042, 66 }, - { 85.9317, 0.1429, 64 }, - { 86.0746, 0.1572, 63 }, - { 86.2319, 0.2323, 64 }, - { 86.5665, 4.6554, 63 }, - { 91.2485, 0.6697, 56 }, - { 91.9182, 0.2537, 58 }, - { 92.1719, 0.7030, 59 }, - { 92.8749, 0.2987, 61 }, - { 93.1735, 0.1244, 58 }, - { 93.2979, 0.5436, 59 }, - { 93.8415, 0.2349, 61 }, - { 94.0764, 0.1918, 64 }, - { 94.2681, 0.5070, 63 }, - { 94.7751, 0.2977, 61 }, - { 95.0728, 1.0514, 59 }, - { 96.1243, 0.6754, 63 }, - { 96.7996, 0.1552, 61 }, - { 96.9548, 0.7055, 59 }, - { 97.6871, 0.2143, 68 }, - { 97.9329, 0.3586, 66 }, - { 98.2915, 0.3638, 64 }, - { 98.9571, 0.6715, 56 }, - { 99.6285, 0.2331, 58 }, - { 99.8847, 0.5170, 59 }, - { 100.4017, 0.2119, 58 }, - { 100.6135, 0.2298, 61 }, - { 100.8433, 0.7211, 59 }, - { 101.5644, 0.2253, 61 }, - { 101.7898, 0.7036, 63 }, - { 102.4934, 0.1845, 68 }, - { 102.6779, 0.4209, 66 }, - { 103.0988, 0.1814, 68 }, - { 103.2801, 0.9548, 63 }, - { 104.4178, 0.2438, 68 }, - { 104.6616, 0.3419, 66 }, - { 105.0035, 0.1779, 68 }, - { 105.1814, 0.1123, 64 }, - { 105.2936, 0.5797, 63 }, - { 105.8733, 0.2616, 61 }, - { 106.1349, 0.1821, 59 }, - { 106.3170, 0.2381, 61 }, - { 106.5737, 0.1095, 68 }, - { 106.6833, 0.4014, 66 }, - { 107.0846, 0.5678, 64 }, - { 107.6525, 0.2674, 63 }, - { 107.9199, 0.2677, 59 }, - { 108.2229, 0.1263, 63 }, - { 108.3492, 0.6465, 66 }, - { 108.9958, 0.2162, 63 }, - { 109.2120, 0.2018, 64 }, - { 109.4139, 0.2617, 61 }, - { 109.6756, 0.2805, 59 }, - { 110.0606, 0.1425, 56 }, - { 110.2032, 0.1568, 59 }, - { 110.3600, 0.1566, 64 }, - { 110.5166, 0.4517, 66 }, - { 110.9682, 0.2255, 64 }, - { 111.1938, 0.1467, 61 }, - { 111.3404, 0.5124, 63 }, - { 111.8529, 0.3158, 59 }, - { 112.2548, 0.1408, 66 }, - { 112.4144, 0.2951, 66 }, - { 112.7095, 0.5391, 64 }, - { 113.2486, 0.2037, 63 }, - { 113.4524, 0.2660, 59 }, - { 113.9752, 0.3499, 58 }, - { 114.3251, 0.1608, 66 }, - { 114.4860, 0.1307, 64 }, - { 114.6166, 0.8520, 63 }, - { 115.4687, 0.3739, 59 }, - { 115.8426, 0.3325, 61 }, - { 116.1751, 0.4351, 66 }, - { 116.6102, 0.4225, 64 }, - { 117.0328, 0.3916, 63 }, - { 117.4243, 0.8084, 59 }, - { 118.2327, 0.1832, 66 }, - { 118.4159, 0.4896, 64 }, - { 118.9055, 0.4987, 63 }, - { 119.4042, 0.3043, 61 }, - { 119.7085, 0.4061, 66 }, - { 120.1146, 0.2464, 64 }, - { 120.3610, 0.1687, 66 }, - { 120.5298, 0.2121, 64 }, - { 120.7419, 0.2266, 63 }, - { 120.9685, 0.1931, 59 }, - { 121.1616, 0.1236, 61 }, - { 121.3962, 0.1495, 52 }, - { 121.5457, 0.1399, 58 }, - { 121.8501, 0.3256, 66 }, - { 122.1757, 0.7657, 63 }, - { 122.9414, 0.4633, 59 }, - { 123.4048, 0.2084, 61 }, - { 123.7234, 0.1905, 66 }, - { 123.9139, 0.3410, 64 }, - { 124.2550, 0.9521, 63 }, - { 125.2071, 0.2212, 59 }, - { 125.4969, 0.1751, 64 }, - { 125.7193, 0.2129, 66 }, - { 125.9322, 0.5672, 64 }, - { 126.4994, 0.3477, 63 }, - { 126.8471, 0.1887, 59 }, - { 127.0359, 0.1490, 68 }, - { 127.2047, 0.2106, 63 }, - { 127.4153, 0.3698, 66 }, - { 127.7851, 0.2435, 64 }, - { 128.0568, 0.2808, 64 }, - { 128.3375, 0.2918, 63 }, - { 128.6294, 0.1807, 61 }, - { 129.0001, 0.2272, 59 }, - { 129.5097, 0.2115, 66 }, - { 129.7211, 0.4947, 64 }, - { 130.2159, 0.3788, 63 }, - { 130.5946, 0.4982, 59 }, - { 131.0928, 0.2394, 66 }, - { 131.4004, 0.2288, 66 }, - { 131.6291, 0.4866, 64 }, - { 132.1157, 0.1413, 61 }, - { 132.2570, 4.0191, 63 }, - { 146.0650, 0.5050, 58 }, - { 146.5700, 0.1617, 66 }, - { 146.7317, 0.6635, 64 }, - { 147.3952, 0.3176, 63 }, - { 147.7128, 0.4366, 59 }, - { 148.1495, 0.5370, 66 }, - { 148.6864, 0.5074, 64 }, - { 149.1938, 0.3740, 63 }, - { 149.5678, 0.2748, 64 }, - { 150.1327, 0.2951, 63 }, - { 150.4278, 0.4933, 64 }, - { 150.9211, 0.3827, 63 }, - { 151.4153, 0.3486, 59 }, - { 151.7638, 0.2704, 61 }, - { 152.0343, 0.4030, 64 }, - { 152.4373, 0.2489, 63 }, - { 152.6862, 0.2881, 64 }, - { 152.9743, 0.2815, 63 }, - { 153.2558, 0.2161, 59 }, - { 153.8941, 0.2332, 64 }, - { 154.1272, 0.1885, 66 }, - { 154.3158, 0.5444, 64 }, - { 154.8602, 0.3443, 63 }, - { 155.2820, 0.2760, 58 }, - { 155.6791, 0.4753, 66 }, - { 156.2178, 0.4547, 64 }, - { 156.6725, 2.6401, 63 }, - { 159.3126, 0.2265, 61 }, - { 159.5391, 2.1692, 59 }, + { 53.9011, 0.2445, 61 }, + { 54.1456, 0.6038, 59 }, + { 54.8909, 0.7830, 63 }, + { 55.6739, 0.3160, 68 }, + { 55.9899, 0.5519, 66 }, + { 56.5418, 0.1792, 68 }, + { 56.7211, 1.0377, 63 }, + { 57.9286, 0.2736, 68 }, + { 58.2022, 0.3443, 66 }, + { 58.5465, 0.2028, 68 }, + { 58.7494, 0.6934, 63 }, + { 59.4428, 0.1934, 61 }, + { 59.6361, 0.2984, 59 }, + { 59.9345, 0.2360, 61 }, + { 60.6658, 0.5094, 66 }, + { 61.1752, 0.6179, 64 }, + { 61.7931, 0.3726, 63 }, + { 62.1658, 0.1274, 59 }, + { 62.3356, 0.1226, 63 }, + { 62.4582, 0.6368, 66 }, + { 63.0950, 0.5606, 64 }, + { 63.6556, 0.2054, 61 }, + { 63.8610, 0.2985, 59 }, + { 64.3066, 0.2785, 59 }, + { 64.5851, 0.1230, 64 }, + { 64.7081, 0.3264, 66 }, + { 65.0345, 0.2645, 64 }, + { 65.3463, 0.1653, 56 }, + { 65.5116, 0.5472, 63 }, + { 66.0587, 0.3113, 59 }, + { 66.3701, 0.5708, 66 }, + { 66.9408, 0.4623, 64 }, + { 67.4031, 0.2925, 63 }, + { 67.6955, 0.2981, 59 }, + { 68.1653, 0.2099, 59 }, + { 68.4185, 1.1696, 63 }, + { 69.5881, 0.1241, 58 }, + { 69.7122, 0.3769, 59 }, + { 70.0891, 0.2290, 61 }, + { 70.3181, 0.2476, 64 }, + { 70.5657, 0.2095, 66 }, + { 70.7752, 0.4437, 64 }, + { 71.2947, 0.1981, 63 }, + { 71.4928, 0.2358, 59 }, + { 71.7287, 0.2170, 52 }, + { 71.9456, 0.7074, 59 }, + { 72.6911, 0.4667, 64 }, + { 73.2144, 0.7736, 63 }, + { 73.9880, 0.5377, 66 }, + { 74.5257, 0.1132, 63 }, + { 74.6389, 0.2264, 64 }, + { 74.9267, 0.3814, 63 }, + { 75.3080, 0.2860, 59 }, + { 75.6318, 0.4016, 59 }, + { 76.0334, 0.1219, 64 }, + { 76.1553, 0.3169, 66 }, + { 76.4722, 0.7151, 63 }, + { 77.1872, 0.5472, 59 }, + { 77.7344, 0.3284, 61 }, + { 78.0629, 0.2074, 66 }, + { 78.2703, 1.3713, 63 }, + { 79.6416, 0.2553, 59 }, + { 79.8968, 0.2193, 64 }, + { 80.1161, 0.2193, 66 }, + { 80.3354, 0.2145, 63 }, + { 80.5499, 0.2772, 64 }, + { 80.8272, 0.4342, 63 }, + { 81.2613, 0.4594, 59 }, + { 81.7207, 0.5387, 66 }, + { 82.2594, 0.1179, 63 }, + { 82.3915, 0.3873, 64 }, + { 82.7788, 0.2672, 63 }, + { 83.0460, 0.3003, 59 }, + { 83.4654, 0.4170, 61 }, + { 83.8823, 0.2848, 66 }, + { 84.1672, 0.3764, 64 }, + { 84.5436, 0.1436, 68 }, + { 84.6872, 0.7075, 63 }, + { 85.3948, 0.1557, 64 }, + { 85.5504, 0.5042, 66 }, + { 86.0547, 0.1429, 64 }, + { 86.1976, 0.1572, 63 }, + { 86.3548, 0.2330, 64 }, + { 86.6915, 4.6724, 63 }, + { 91.3922, 0.7123, 56 }, + { 92.1045, 0.2689, 58 }, + { 92.3734, 0.7217, 59 }, + { 93.0951, 0.3066, 61 }, + { 93.4017, 0.1274, 58 }, + { 93.5290, 0.5566, 59 }, + { 94.0856, 0.2406, 61 }, + { 94.3262, 0.1981, 64 }, + { 94.5243, 0.5236, 63 }, + { 95.0479, 0.3066, 61 }, + { 95.3545, 1.0660, 59 }, + { 96.4205, 0.6981, 63 }, + { 97.1187, 0.1604, 61 }, + { 97.2790, 0.7453, 59 }, + { 98.0526, 0.2264, 68 }, + { 98.3121, 0.3586, 66 }, + { 98.6707, 0.3638, 64 }, + { 99.3370, 0.6792, 56 }, + { 100.0162, 0.2358, 58 }, + { 100.2756, 0.5283, 59 }, + { 100.8039, 0.2170, 58 }, + { 101.0209, 0.2358, 61 }, + { 101.2568, 0.7547, 59 }, + { 102.0115, 0.2358, 61 }, + { 102.2473, 0.7264, 63 }, + { 102.9738, 0.1934, 68 }, + { 103.1671, 0.4293, 66 }, + { 103.5964, 0.1840, 68 }, + { 103.7804, 0.9623, 63 }, + { 104.9266, 0.2453, 68 }, + { 105.1719, 0.3443, 66 }, + { 105.5162, 0.1792, 68 }, + { 105.6954, 0.1132, 64 }, + { 105.8087, 0.5849, 63 }, + { 106.3936, 0.2642, 61 }, + { 106.6577, 0.1840, 59 }, + { 106.8417, 0.2406, 61 }, + { 107.1011, 0.1132, 68 }, + { 107.2143, 0.4151, 66 }, + { 107.6294, 0.5835, 64 }, + { 108.2130, 0.2674, 63 }, + { 108.4804, 0.2677, 59 }, + { 108.7834, 0.1263, 63 }, + { 108.9097, 0.6465, 66 }, + { 109.5562, 0.2163, 63 }, + { 109.7725, 0.2018, 64 }, + { 109.9743, 0.2617, 61 }, + { 110.2360, 0.2805, 59 }, + { 110.6211, 0.1425, 56 }, + { 110.7636, 0.1568, 59 }, + { 110.9204, 0.1566, 64 }, + { 111.0770, 0.4517, 66 }, + { 111.5287, 0.2255, 64 }, + { 111.7542, 0.1467, 61 }, + { 111.9009, 0.5124, 63 }, + { 112.4133, 0.3158, 59 }, + { 112.8152, 0.1417, 66 }, + { 112.9758, 0.2972, 66 }, + { 113.2730, 0.5426, 64 }, + { 113.8156, 0.2037, 63 }, + { 114.0193, 0.2660, 59 }, + { 114.5421, 0.3499, 58 }, + { 114.8921, 0.1608, 66 }, + { 115.0529, 0.1307, 64 }, + { 115.1836, 0.8520, 63 }, + { 116.0356, 0.3739, 59 }, + { 116.4095, 0.3325, 61 }, + { 116.7421, 0.4351, 66 }, + { 117.1772, 0.4226, 64 }, + { 117.5997, 0.3916, 63 }, + { 117.9913, 0.8084, 59 }, + { 118.7997, 0.1832, 66 }, + { 118.9829, 0.4896, 64 }, + { 119.4725, 0.4987, 63 }, + { 119.9712, 0.3043, 61 }, + { 120.2755, 0.4061, 66 }, + { 120.6816, 0.2464, 64 }, + { 120.9280, 0.1687, 66 }, + { 121.0967, 0.2121, 64 }, + { 121.3089, 0.2269, 63 }, + { 121.5358, 0.1934, 59 }, + { 121.7292, 0.1238, 61 }, + { 121.9639, 0.1495, 52 }, + { 122.1134, 0.1399, 58 }, + { 122.4178, 0.3255, 66 }, + { 122.7434, 0.7657, 63 }, + { 123.5091, 0.4633, 59 }, + { 123.9724, 0.2084, 61 }, + { 124.2911, 0.1905, 66 }, + { 124.4816, 0.3410, 64 }, + { 124.8227, 0.9612, 63 }, + { 125.7839, 0.2311, 59 }, + { 126.0859, 0.1751, 64 }, + { 126.3082, 0.2129, 66 }, + { 126.5212, 0.5672, 64 }, + { 127.0884, 0.3477, 63 }, + { 127.4361, 0.1887, 59 }, + { 127.6248, 0.1490, 68 }, + { 127.7937, 0.2110, 63 }, + { 128.0047, 0.3726, 66 }, + { 128.3773, 0.2453, 64 }, + { 128.6509, 0.2830, 64 }, + { 128.9339, 0.2972, 63 }, + { 129.2311, 0.1840, 61 }, + { 129.6084, 0.2311, 59 }, + { 130.1225, 0.2115, 66 }, + { 130.3340, 0.4947, 64 }, + { 130.8287, 0.3788, 63 }, + { 131.2075, 0.4982, 59 }, + { 131.7056, 0.2394, 66 }, + { 132.0132, 0.2288, 66 }, + { 132.2420, 0.4866, 64 }, + { 132.7286, 0.1413, 61 }, + { 132.8699, 4.0760, 63 }, + { 146.7448, 0.5149, 58 }, + { 147.2596, 0.1617, 66 }, + { 147.4214, 0.6635, 64 }, + { 148.0849, 0.3176, 63 }, + { 148.4025, 0.4366, 59 }, + { 148.8392, 0.5370, 66 }, + { 149.3761, 0.5074, 64 }, + { 149.8835, 0.3740, 63 }, + { 150.2575, 0.2748, 64 }, + { 150.8224, 0.2951, 63 }, + { 151.1175, 0.4933, 64 }, + { 151.6108, 0.3827, 63 }, + { 152.1050, 0.3485, 59 }, + { 152.4535, 0.2704, 61 }, + { 152.7239, 0.4030, 64 }, + { 153.1270, 0.2489, 63 }, + { 153.3759, 0.2881, 64 }, + { 153.6640, 0.2815, 63 }, + { 153.9455, 0.2161, 59 }, + { 154.5838, 0.2332, 64 }, + { 154.8169, 0.1885, 66 }, + { 155.0055, 0.5444, 64 }, + { 155.5498, 0.3443, 63 }, + { 155.9717, 0.2760, 58 }, + { 156.3688, 0.4924, 66 }, + { 156.9272, 0.4548, 64 }, + { 157.3821, 2.6465, 63 }, + { 160.0286, 0.2316, 61 }, + { 160.2602, 2.1692, 59 }, }; diff --git a/pop/sailor-song/c/sailorremix.c b/pop/sailor-song/c/sailorremix.c index e82daf903e..0906f70343 100644 --- a/pop/sailor-song/c/sailorremix.c +++ b/pop/sailor-song/c/sailorremix.c @@ -90,7 +90,11 @@ #include "sailor-chart.h" #define SR 48000 -#define VERSION "v26" +#define VERSION "v73" +#define EAGER 0.009 // v73: "eager" placement — percussion pushes ~9 ms ahead of the grid +#define PIANO_ON 0 // v71: "let's be rid of the piano" — the sampler stays, the part is off +#define SHIFT27 0.0 // v53: how much earlier everything after bar 27 plays, now that the regularizer fits it to four beats +#define KICK_ONLY 0 // v48: "try removing all percussion other than kick" — claps, snares, hats, toms, shaker, congas, taiko off #define END_BAR 999 // v23: "the song should end how her video ends" — the record runs to the end of her take (v9 cut at 82 + 1.5 s) #define START_BAR 11 // v6.6: (the pre-roll is now her first WORD; see main) #define FLOOR_BAR 52 // v10: the one chorus — the floor drops on its "kiss" @@ -171,33 +175,34 @@ typedef struct { } Arr; #define H(i, g, az) [i] = { g, az } static const Arr ARR[NSEC] = { - [INTRO] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // v6: bedroom — her guitar alone + [INTRO] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // v43: nothing of hers before she sings — the radio { { 0 } }, .10, .3 }, - [VERSE1] = { .9, 0, 0, 0, 0, 0, 0, 0, .25, 0, .8, .7, .3, 0, 0, 0, 0, 0, 0, // v8: end state of the evolution (gated per bar below) + [VERSE1] = { 1.1, 0, 0, 0, 0, 0, 0, 0, .25, 0, .8, .7, .3, 0, 0, 0, 0, 0, 0, // v8: end state of the evolution (gated per bar below) { H(H_DOWN3, .16, 40) }, .07, .45 }, - [CHORUS1] = { 1.0, .6, 0, 1, 0, .8, .5, 0, .5, 1, 1, 1, 1, .3, .2, 0, 0, 0, 0, // v22: her guitar back, strong + [CHORUS1] = { 1.35, .7, 0, 1, 0, .8, .5, 0, .5, 1, 1, 1, 1, .3, .2, 0, 0, 0, 0, // v22: her guitar back, strong { H(H_UP3, .34, -50), H(H_DOWN3, .30, 50), H(H_DOWN6, .2, 0) }, .18, 1.0 }, // v16: harmonies up - [VERSE2] = { .85, .35, 0, .8, 0, 0, .35, 0, .2, .4, .7, .6, .3, 0, 0, 0, 0, 0, 0, // a verse, not a chorus + [VERSE2] = { 1.15, .4, 0, .5, 0, 0, .35, 0, .1, .4, .7, .6, .3, 0, 0, 0, 0, 0, 0, // a verse, not a chorus; v27: kick .5, hat .1 { H(H_DOWN3, .30, 45), H(H_UP3, .30, -45), H(H_DOWN6, .18, 0) }, .12, .8 }, // v19: harmonies come in with the cathedral - [CHORUS2] = { 1.0, .7, .6, 1.1, 0, .9, .5, 0, .6, 1, 1, 1, 1, .3, .3, 1, 0, 0, 0, + [CHORUS2] = { 1.45, 1.0, .6, 1.1, 0, .9, .5, 0, .6, 1, 1, 1, 1, .3, .3, 0, 0, 0, 0, // v49: her guitar front and centre in chorus 2 (+3 dB, the acoustic replay full) { H(H_UP3, .36, -60), H(H_DOWN3, .34, 60), H(H_DOWN6, .25, -20), H(H_DOWN8, .24, 0) }, .18, 1.0 }, - [BREAK] = { .8, .4, 0, .8, 0, .4, .3, 0, .3, .6, .8, 1, 1, 0, 0, .6, 1, 0, 0, // v24: no dead space — the beat stays, and rises + [BREAK] = { 1.2, .5, 0, .8, 0, .4, .3, 0, .3, .6, .8, 0, 0, 0, 0, 0, 1, 0, 0, // v27: the break is a break — sub + hook, no tenor/high bed // v24: no dead space — the beat stays, and rises { { 0 } }, .20, .2 }, - [BRIDGE] = { .9, .6, .7, 1, 0, .7, .4, 0, .6, .9, 1, 1, 1, .2, .3, .7, 0, .3, .3, - { { 0 } }, .16, .9 }, // harmonies rove, see harm_at() // v22b: send down, she stays in front - [OUTRO] = { 1, .8, .8, 1.2, 0, 1, .5, 0, .7, 1, 1, 1, 1, .3, .3, 1, 0, .3, .4, // v24: the FINALE + [BRIDGE] = { 1.2, .6, .7, 1, 0, .7, .4, 0, .6, .9, 1, 1, 1, .2, .3, 0, 0, .3, .3, + { { 0 } }, .06, .9 }, // harmonies rove, see harm_at() // v32: almost dry — the cat-and-mouse verse up close + [OUTRO] = { 1.3, .8, .8, 1.2, 0, 1, .5, 0, .7, 1, 1, 1, 1, .3, .3, 0, 0, .3, .4, // v24: the FINALE { H(H_UP3, .4, -60), H(H_DOWN3, .4, 60), H(H_DOWN6, .28, -20), H(H_DOWN8, .24, 0) }, .20, 1.0 }, }; // "pitching around": in the bridge her harmony changes interval and place each bar static double evo(int bar, int from, int to); static HarmSet harm_at(int bar, int h) { int s = section_of(bar); + if (s == CHORUS1 || s == CHORUS2) { HarmSet r = ARR[s].harm[h]; r.g *= (s == CHORUS1 ? evo(bar, 28, 33) : evo(bar, 52, 57)); if (h != H_UP8) return r; } // v67: her harmonies swell in over the chorus's first bars if (s == VERSE1) { HarmSet r = ARR[s].harm[h]; r.g *= evo(bar, 18, 24); return r; } // v6: her harmony creeps in if (h == H_UP8) { // v6.2: her voice an octave up - if (bar >= 36 && bar <= 43) return (HarmSet){ .85, 0 }; // second half of chorus 1 - if (bar >= 52 && bar <= 67) return (HarmSet){ 1.0, 0 }; // all of chorus 2 - if (bar >= 77 && bar <= 80) return (HarmSet){ 1.0, 0 }; // the bridge's climb - if (bar >= 81) return (HarmSet){ 1.0, 0 }; // v24: finale + if (bar >= 36 && bar <= 43) return (HarmSet){ .4, 0 }; // second half of chorus 1 (v27: .85 → .4) + if (bar >= 60 && bar <= 67) return (HarmSet){ .5, 0 }; // v27: chorus 2's second half only (was all of it at 1.0) + if (bar >= 77 && bar <= 80) return (HarmSet){ .5, 0 }; // the bridge's climb + if (bar >= 81 && bar <= 82) return (HarmSet){ .5, 0 }; // v24: finale; v27: 81–82 only return (HarmSet){ 0, 0 }; } if (s != BRIDGE) return ARR[s].harm[h]; @@ -209,6 +214,7 @@ static HarmSet harm_at(int bar, int h) { // ── buses ──────────────────────────────────────────────────────────────── static long N; static float *dL, *dR, *tL, *tR, *b808, *sL, *sR, *hiM, *bellM, *vibM, *duck; +static float *pcM = NULL; // v60: claps / snare / toms — a mono bus the listener hears from a seat that sways (the kick stays centre) static float *pL, *pR; // hand-percussion / bubble bus static void add(float *b, long i, double v) { if (i >= 0 && i < N) b[i] += (float)v; } static long at(double t) { return lround(t * SR); } @@ -268,7 +274,7 @@ static void clap(double t, double g) { long a = at(t + OFF[k]); double lp = 0, prev = 0; for (long i = 0; i < 0.16 * SR; i++) { double u = (double)i / SR, nz = rnd(), hp = nz - prev; prev = nz; lp += (hp - lp) * 0.45; - double v = lp * exp(-u * (k < 2 ? 90 : 16)) * g * AMP[k] * 0.9; add(tL, a + i, v); add(tR, a + i, v * 0.95); } + double v = lp * exp(-u * (k < 2 ? 90 : 16)) * g * AMP[k] * 0.9; add(pcM, a + i, v); } // v60: to the percussion seat } } // 808: drops ~a 4th into the root, long tail, tanh so its harmonics speak @@ -308,6 +314,15 @@ static float *padM[3]; // v11: // ── AC voices ──────────────────────────────────────────────────────────── // FEM bells from the baked bank (bin/bells.sh). Loner rule: ≤ E5, fade tails. static Stereo BELLS[128]; +// v42: THE GONG — a FEM bell with a four-second decay: five inharmonic partials, each with its own ring-down +static void gong(double t, int midi, double g) { + static const double P[5] = { 1.0, 2.0, 2.98, 4.2, 5.43 }, D[5] = { 4.2, 3.4, 2.6, 1.9, 1.3 }, A[5] = { 1.0, 0.55, 0.4, 0.22, 0.14 }; + long a = at(t); double f = 440 * pow(2, (midi + CHART_TUNE - 69) / 12.0), ph[5] = { 0 }; + for (long i = 0; i < 5.0 * SR; i++) { double u = (double)i / SR, v = 0; + for (int k = 0; k < 5; k++) { ph[k] += 2 * PI * f * P[k] * (1 + 0.0015 * k) / SR; v += sin(ph[k]) * A[k] * exp(-u / D[k]); } + add(bellM, a + i, v * fmin(1, u / 0.006) * g * 0.35); } + ev(t, "gong", 4.0, g, midi); +} static void fem_bell(double t, int midi, double g) { while (midi > 76) midi -= 12; while (midi < 63) midi += 12; @@ -354,6 +369,12 @@ static void lead(int *voices, int nv, const int *pcs, int lo, int hi) { // nea voices[v] = m; if (nu < 3) used[nu++] = ((m % 12) + 12) % 12; } } +// v29: scale steps — the nearest scale tone at or under m, moved `steps` degrees in G# natural minor +static int scale_step(int m, int steps) { + int tones[64], n = 0; for (int x = m - 30; x <= m + 30; x++) { int pc = ((x % 12) + 12) % 12; for (int k = 0; k < 7; k++) if (SCALE[k] == pc) { tones[n++] = x; break; } } + int i = 0; for (int k = 0; k < n; k++) if (tones[k] <= m) i = k; + i += steps; if (i < 0) i = 0; if (i >= n) i = n - 1; return tones[i]; +} static int third_above(int m) { int pc = ((m % 12) + 12) % 12, oct = m / 12 - (m < 0), i = -1; for (int k = 0; k < 7; k++) if (SCALE[k] == pc) i = k; @@ -388,40 +409,48 @@ static float *automate(BarValue fn, int arg) { } #define ARRV(field) static double v_##field(const ChartBar *b, int x) { (void)x; return ARR[section_of(b->n)].field; } ARRV(send) ARRV(air) ARRV(acg) ARRV(elg) -static double v_her(const ChartBar *b, int x) { (void)x; return ARR[section_of(b->n)].her; } // v25d: "the guitar should be heard in the first bars" — hers from the first sample (v6.6 crept it in 13→17) +static double v_her(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); double g = ARR[s].her; return s == VERSE1 ? g * (0.08 + 0.92 * evo(b->n, 14, 20)) : g; } // v31c: "very quiet first few bars so it sounds like isolated vocal" // v28: "start the track with the vocal … lose some of the guitar in the beginning, just have percussion" — a sixth of it under her first line, in by 19 // v6.6: warm — the opening vocal close to the mic: proximity below 350 Hz, no air, almost no room; eases out by the floor // v7: the choir stands behind her in the choruses, the bridge and the outro; a breath of it in verse 2 -static double v_choir(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); // v22: block harmonies — up and early - return s == CHORUS1 ? 0.55 * evo(b->n, 28, 32) : s == VERSE2 ? 0.25 : s == CHORUS2 ? 0.8 : s == BREAK ? 0.5 : s == BRIDGE ? 0.75 : s == OUTRO ? 0.9 : 0; } // v26: back a step +static double v_choir(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); // v67: the choir fades in over the chorus's first six bars + return s == CHORUS1 ? 0.55 * evo(b->n, 29, 35) : s == VERSE2 ? 0.25 : s == CHORUS2 ? 0.8 * (0.2 + 0.8 * evo(b->n, 52, 58)) : s == BREAK ? 0.5 : s == BRIDGE ? 0.75 : s == OUTRO ? 0.9 : 0; } // v26: back a step // v22: SCREAM — a distorted double of her lead (clipped, growled, wide) under the big sections static double v_scream(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); - return s == CHORUS1 ? 0.2 * evo(b->n, 34, 38) : s == CHORUS2 ? 0.28 : s == BREAK ? 0.15 : s == BRIDGE ? 0.3 + 0.15 * evo(b->n, 73, 80) : s == OUTRO ? 0.45 : 0; } // v26: "too many effects on her vocal" — the scream is a shadow + return s == CHORUS2 ? 0.12 : s == BRIDGE ? 0.3 * evo(b->n, 76, 80) : 0; } // v27: the scream earns itself only in the bridge climb // v22: the ORCHESTRA (bin/orchestra.mjs → src/orch): where a part plays is decided there; how loud, here enum { O_STRINGS, O_CELLO, O_PIZZ, O_HORNS, O_TIMP, O_HARP, O_GLOCK, O_AAHS, O_VLN1, O_VLN2, O_VIOLA, O_QCELLO, O_TAIKO, NORCH }; static const char *ORCH_FILE[NORCH] = { "strings", "cello", "pizz", "horns", "timpani", "harp", "glock", "aahs", "vln1", "vln2", "viola", "qcello", "taiko" }; static const int ORCH_DRUM[NORCH] = { 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 }; // v24: drums (and pizz) are not keyed to her voice static const double ORCH[NSEC][NORCH] = { - // str cel piz hrn tmp hrp glk aah vl1 vl2 vla qvc tai + // str cel piz hrn tmp hrp glk aah vl1 vl2 vla qvc tai v44: strings at a third — the sine pad is the main pad [INTRO] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - [VERSE1] = { .6, .5, .6, 0, .8, 0, 0, 0, 0, 0, 0, 0, 0 }, - [CHORUS1] = { .8, .7, 0, .6, .8, 0, 0, .6, .7, .7, .7, .7, 0 }, - [VERSE2] = { .5, .5, .6, 0, 0, .7, 0, 0, .6, .6, 0, 0, 0 }, - [CHORUS2] = { 1, .8, 0, .8, 1, 0, .7, .9, .9, .9, .9, .9, .8 }, - [BREAK] = { .8, .6, 0, .5, .7, .7, 0, .5, .7, .7, .7, .7, .6 }, // v24: the break rises instead of emptying - [BRIDGE] = { 1, .8, 0, .9, 1, .6, .8, .9, 1, 1, 1, 1, 1 }, - [OUTRO] = { 1, 1, 0, 1, 1, .8, 1, 1, 1, 1, 1, 1, 1.1 } }; // v24: the finale -static double v_orch(const ChartBar *b, int o) { return ORCH[section_of(b->n)][o]; } + [VERSE1] = { .3, .5, .6, 0, .8, 0, 0, 0, 0, 0, 0, 0, 0 }, + [CHORUS1] = { .3, .7, 0, .6, .8, 0, 0, .6, .7, .7, .7, .7, 0 }, + [VERSE2] = { 0, .5, .6, 0, 0, .7, 0, 0, .6, .6, 0, 0, 0 }, + [CHORUS2] = { .4, .8, 0, .8, 1, 0, .7, .9, .9, .9, .9, .9, .5 }, + [BREAK] = { .4, .6, 0, .5, .7, .7, 0, .5, .7, .7, .7, .7, .6 }, // v24: the break rises instead of emptying + [BRIDGE] = { .4, .8, 0, .9, 1, .6, .8, .9, 1, 1, 1, 1, .6 }, + [OUTRO] = { .5, 1, 0, 1, 1, .8, 1, 1, 1, 1, 1, 1, .6 } }; // v24: the finale; v30: taiko supports the toms +static double v_orch(const ChartBar *b, int o) { return (KICK_ONLY && o == O_TAIKO) ? 0 : ORCH[section_of(b->n)][o]; } // v48: no taiko in kick-only +static double v_dissolve(const ChartBar *b, int x) { (void)x; return evo(b->n, 81, 85); } // v41: 0 → 1 across the finale: the band closes through a lowpass +static double v_room(const ChartBar *b, int x) { (void)x; return 1 - 0.8 * evo(b->n, 72, 84); } // v39: "towards the end we lose the reverb" — the room eases out from the bridge to the last bar +static double v_orch_side(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); return s == BREAK || s == OUTRO ? 0.5 : 1; } // v27 +static double v_orch_shelf(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); return s == BREAK || s == OUTRO ? 0.6 : 0; } // v27: +4 dB above 3 kHz // v24: the quartet's seats, each leaning a little on its own phase -static double q_vln1(double t) { return -38 + 10 * sin(2 * PI * 0.15 * t); } -static double q_vln2(double t) { return -14 + 10 * sin(2 * PI * 0.15 * t + 1.6); } -static double q_viola(double t) { return 14 + 10 * sin(2 * PI * 0.15 * t + 3.1); } -static double q_qcello(double t) { return 38 + 10 * sin(2 * PI * 0.15 * t + 4.7); } +static double q_vln1(double t) { return -38 + 4 * sin(2 * PI * 0.15 * t); } +static double q_vln2(double t) { return -14 + 4 * sin(2 * PI * 0.15 * t + 1.6); } +static double q_viola(double t) { return 14 + 4 * sin(2 * PI * 0.15 * t + 3.1); } +static double q_qcello(double t) { return 38 + 4 * sin(2 * PI * 0.15 * t + 4.7); } static double el_low(double t) { (void)t; return -12; } +static double sway_pc(double t) { return 18 * sin(2 * PI * t / 13); } // v60: the percussion's slow sway +static double hat_az(double t) { return 40 + 25 * sin(2 * PI * t / 11); } // v65: the hats, right of centre, wandering +static double seat_gtr(double t) { return 0 + 2 * sin(2 * PI * t / 17); } // v68: her guitar WITH her — centre, near, the same room static double spin_az(double t) { return 360 * t / 1.6; } // v25: the throws' spin, one lap per 1.6 s // v24: WUB — a saw on her root an octave under the sub, through a resonant lowpass the LFO sweeps 90 Hz → 1.8 kHz static const double WUB[NSEC] = { 0, 0, 0, 0, .55, .35, .75, .9 }; static const double WUB_RATE[NSEC] = { 1, 1, 1, 1, 1, 1, 2, 2 }; // sweeps per beat (chorus 2 quarters, bridge and finale 8ths) -static float *wubM = NULL; +static float *wubM = NULL, *rsL = NULL, *rsR = NULL; // v27: the riser on its own pair (the dropout gate leaves it) +static float *melM = NULL, *mirM = NULL, *radL = NULL, *radR = NULL; // v43: the radio intro // v33: the melody bus — the sister sine + chorale (centre) and the mirror (sweeping) — NOT keyed to her voice static void wub(double t0, double t1, int midi, double beatDur, double perBeat, double g) { long a = at(t0), z = at(t1); double f = 440 * pow(2, (midi + CHART_TUNE - 69) / 12.0), ph = 0, lp = 0, bp = 0; const double rate = perBeat / beatDur, q = 0.28; @@ -469,8 +498,8 @@ static double v_sis_hum(const ChartBar *b, int x) { (void)x; int s = section_of( // way and a long stone tail grows under everything until it is a stadium by the end static int rec_pos(const ChartBar *b) { return (int)(b - CHART_BARS) + 1; } static double v_far(const ChartBar *b, int x) { (void)x; return rec_pos(b) < pos_n(11) ? 1 : rec_pos(b) < pos_n(44) ? 1 - evo(b->n, 13, 25) : 0; } // far = quiet -static double v_cath(const ChartBar *b, int x) { (void)x; return 0.6 * evo(rec_pos(b), pos_n(22), CHART_NBARS - 6); } // v22b: "we still need her to have an up front voice" — half the stone (was 1.3) -static double v_warm(const ChartBar *b, int x) { (void)x; return 1 - 0.6 * evo(rec_pos(b), pos_n(20), CHART_NBARS - 6); } // v25: she stays closer all the way (was 0.85) +static double v_cath(const ChartBar *b, int x) { (void)x; return 0.6 * evo(rec_pos(b), pos_n(22), CHART_NBARS - 6) * (section_of(b->n) == BRIDGE ? 0.3 : 1); } // v32: the cat-and-mouse verse is close — the stone steps back // v22b: "we still need her to have an up front voice" — half the stone (was 1.3) +static double v_warm(const ChartBar *b, int x) { (void)x; if (section_of(b->n) == BRIDGE) return 0.65; return 1 - 0.6 * evo(rec_pos(b), pos_n(20), CHART_NBARS - 6); } // v32: "bring her voice back in" for the bridge — at the mic again // v25: she stays closer all the way (was 0.85) static double v_thick(const ChartBar *b, int x) { (void)x; int s = section_of(b->n); return s == INTRO ? 0 : s == VERSE1 ? 0.25 * evo(b->n, 16, 24) : s == BREAK ? 0 : s == VERSE2 ? 0.18 : 0.2; } // v15: the doubles trimmed so the lead stays in front; v26: thinner still static double v_harm_g(const ChartBar *b, int h) { return harm_at(b->n, h).g; } static double v_harm_az(const ChartBar *b, int h) { return harm_at(b->n, h).az; } @@ -503,7 +532,7 @@ static double el_near(double t) { (void)t; return 5; } // kick and sub never move (they are not on a spatial bus); ring tones open // with a short noise event — the explosion below. static const int IMPACT_BARS[] = { 28, 52, 73, 81 }; // v25: IMPLOSIONS at every lift — chorus 1, chorus 2, the bridge, the finale (v11: 52, 73) -#define VOICE_LAG 0.05 // v7: her sung onset sits ~50 ms behind the strum (ANALYSIS.md §2); the explosion waits for it +#define VOICE_LAG 0.0 // v7: her sung onset sits ~50 ms behind the strum (ANALYSIS.md §2); the explosion waits for it // v6: the evolution — 0 before `from`, 1 at `to`, cosine between (one lane per phrase) static double evo(int bar, int from, int to) { if (bar < from) return 0; if (bar >= to) return 1; double x = (double)(bar - from) / (to - from); return 0.5 - 0.5 * cos(PI * x); } #define NIMPACT ((int)(sizeof IMPACT_BARS / sizeof *IMPACT_BARS)) @@ -511,8 +540,19 @@ static double IMPACT_T[NIMPACT]; // v25: TURNS — the whole ring turns once (360°, quintic ease) across the bar before every lift, and in the // finale it keeps turning, one lap every eight bars static double TURN_T0[4], TURN_D[4], FIN_T0 = 1e9, FIN_LAP = 15; +// v35: THE PICKUP — "right at 0:34 is where the chorus should start": the chorus begins on "Oh, won't you", beat 3 of the bar +// before "kiss" (bars 27 and 51). Everything that marks a chorus moves to that beat. +static int pickup_bar(int n) { return n == 27 || n == 51; } +static int pickup_j(const ChartBar *b) { return b->nb > 2 ? b->nb - 2 : 0; } // v51: "27.4" — TWO beats before "kiss" (27.4 and 51.3), on her "you" +static double pickup_t(const ChartBar *b) { return b->beats[pickup_j(b)]; } +static double SHIFT_T[3] = { 1e9, 1e9, 1e9 }, SPIN_T0 = 1e9, SPIN_T1 = 1e9; // v61: shifts on chorus 2's phrase downbeats; a spin out of the break +static double LAP_T0 = 1e9, LAP_T1 = 1e9, WOB_T0 = 1e9, WOB_T1 = 1e9; // v65: one slow lap across chorus 2; a wobble through the bridge climb static double turn_disp(double t) { double d = 0; + for (int k = 0; k < 3; k++) { double u = t - SHIFT_T[k]; if (u >= 0 && u < 2.0) d += 90 * exp(-u * 2.2); } // a 90° jerk that eases back + if (t >= SPIN_T0 && t < SPIN_T1) { double x = (t - SPIN_T0) / (SPIN_T1 - SPIN_T0); d += 360 * x * x * (3 - 2 * x); } // v65: one lap, eased (two was a blur) + if (t >= LAP_T0 && t < LAP_T1) d += 360 * (t - LAP_T0) / (LAP_T1 - LAP_T0); // v65: the whole ring turns once, slowly, across chorus 2 + if (t >= WOB_T0 && t < WOB_T1) { double x = (t - WOB_T0) / (WOB_T1 - WOB_T0); d += 35 * sin(2 * PI * 0.5 * (t - WOB_T0)) * fmin(1, x * 4) * fmin(1, (1 - x) * 4); } // v65: ±35° at 0.5 Hz for (int k = 0; k < 4; k++) { double x = (t - TURN_T0[k]) / TURN_D[k]; if (x > 0 && x < 1) d += 360 * x * x * x * (x * (6 * x - 15) + 10); } if (t > FIN_T0) d += 360 * (t - FIN_T0) / FIN_LAP; return d; @@ -527,8 +567,8 @@ static double last_impact(double t) { double best = -1e9; for (int k = 0; k < NI // the explosion: one full lap around the head in 0.7 s, climbing overhead static double next_impact(double t) { double best = 1e9; for (int k = 0; k < NIMPACT; k++) if (IMPACT_T[k] >= t && IMPACT_T[k] < best) best = IMPACT_T[k]; return best; } // the implosion: 1.5 laps spiralling IN from the far ring to the centre over the 0.9 s before the downbeat, coming down from overhead -static double expl_az(double t) { double u = next_impact(t) - t; return u > 0.9 ? 0 : 540 * u / 0.9; } -static double expl_el(double t) { double u = next_impact(t) - t; return u > 0.9 ? 0 : 55 * u / 0.9; } +static double expl_az(double t) { double u = next_impact(t) - t, w = t - last_impact(t); return u <= 0.9 ? 540 * u / 0.9 : w <= 1.2 ? 540 * w / 1.2 : 0; } // v28: in before, OUT after +static double expl_el(double t) { double u = next_impact(t) - t, w = t - last_impact(t); return u <= 0.9 ? 55 * u / 0.9 : w <= 1.2 ? 55 * w / 1.2 : 0; } // every seat's distance: pulled in over the 0.9 s before an implosion (to 0.45 of its place), then springs back at 1.1 Hz static double ring_pull(double t) { double p = 1; @@ -538,6 +578,14 @@ static double ring_pull(double t) { return p; } static float *exM, *hookM; +// v28: the BLAST — the implosion's answer: a whoosh falling 6 kHz → 250 Hz over the 1.2 s after the downbeat, spiralling out (expl_az) +static void blast(double t, double g) { + long a = at(t); double b1 = 0, b2 = 0; + for (long i = 0; i < 1.2 * SR; i++) { double x = (double)i / (1.2 * SR), fc = 6000 * pow(1.0 / 24, x), k = 1 - exp(-2 * PI * fc / SR); + double nz = rnd(); b1 += (nz - b1) * k; b2 += (b1 - b2) * k; + double env = fmin(1, x / 0.02) * (1 - x) * (1 - x); + add(exM, a + i, (b1 - b2) * env * g * 2.0); } +} static void explosion(double t, double g) { // v11: an IMPLOSION — a reversed whoosh: bandpass rising 250 Hz → 6 kHz over the 0.9 s before t, cut dead on the downbeat, then a sub thump long a = at(t - 0.9); double b1 = 0, b2 = 0, ph = 0; for (long i = 0; i < 0.9 * SR; i++) { double x = (double)i / (0.9 * SR), fc = 250 * pow(24, x), k = 1 - exp(-2 * PI * fc / SR); @@ -595,26 +643,132 @@ static float *zeros(void) { return (float *)calloc(N, sizeof(float)); } // humanize: ±4 ms, ±12 % — a hand, not a sequencer ("a bit midi like") static double hum_t(double t) { return t + rnd() * 0.004; } static double hum_g(double g) { return g * (1 + rnd() * 0.12); } -static double hum_t2(double t, double ms) { return t + rnd() * ms / 1000; } // v6.4: looser hands +static double hum_t2(double t, double ms) { return t - EAGER + rnd() * ms / 1000; } // v6.4: looser hands; v73: eager — ahead of the beat static double hum_g2(double g, double pct) { return g * (1 + rnd() * pct); } // ── the dance layer (v5.2: "turn the song into a dance mix") ───────────── // Her ~120 is house tempo, so four on HER floor: a kick on every one of her // beats, claps 2 + 4, open hats on every offbeat, an offbeat house bass on // her roots, risers into the drops. -static void dance_kick(double t, double g) { - long a = at(t); double ph = 0; - for (long i = 0; i < 0.42 * SR; i++) { double u = (double)i / SR; - ph += 2 * PI * (50 + 160 * exp(-u * 38) + 40 * exp(-u * 300)) / SR; - double click = i < 0.003 * SR ? rnd() * 0.6 * (1 - u / 0.003) : 0; - double v = (tanh(sin(ph) * 2.4) * 0.85 * exp(-u * 5.5) + click) * g; +// v46: every kick has its own velocity, attack and decay — `vel` scales the hit and hardens the click, `atk` sets how fast the +// pitch sweep falls into the body (a slow sweep is a softer front), `dec` the body's ring (1 = v38's 4.2/s). The pump follows. +static void dance_kick_v(double t, double g, double vel, double atk, double dec) { + long a = at(t); double ph = 0, pb = 0; const double decay = 7.5 / dec, sweep = 48 * atk; // v49: "too long … punchier, boxier" — the body dies in ~130 ms, a box at 190 Hz, a harder front + for (long i = 0; i < 0.4 * SR; i++) { double u = (double)i / SR; + ph += 2 * PI * (51.9 + 190 * exp(-u * sweep) + 60 * exp(-u * 400 * atk)) / SR; pb += 2 * PI * 155.6 / SR; // v58: body on G#1 (her root), the box on D#3 (the fifth) — in key, under her range + double click = i < 0.0025 * SR ? rnd() * (0.4 + 0.6 * vel * atk) * (1 - u / 0.0025) : 0; + double box = sin(pb) * 0.28 * exp(-u * 22); // the "box": a short 190 Hz knock + double v = (tanh(sin(ph) * (1.9 + 1.0 * vel)) * 1.05 * exp(-u * decay) + box + click) * g * (0.75 + 0.25 * vel); // v58: less drive — the 208 Hz harmonic sat on her G#3 add(dL, a + i, v); add(dR, a + i, v); } - for (long i = 0; i < 0.3 * SR; i++) add(duck, a + i, g * 1.6 * exp(-(double)i / SR * 8)); + for (long i = 0; i < 0.25 * SR; i++) add(duck, a + i, g * (1.6 + 0.4 * vel) * exp(-(double)i / SR * 11 / sqrt(dec))); +} +static void dance_kick(double t, double g) { dance_kick_v(t, g, 1, 1, 1); } +// v30: "our kit / tom drums are pretty weak / weird" — a SNARE under the claps and TOMS for the fills, synthesized +static void snare_hit(double t, double g) { // v30: the pop snare (the v2 brushy one above stays for the verses' table) + long a = at(t); double ph = 0, p1 = 0, b1 = 0; + for (long i = 0; i < 0.22 * SR; i++) { double u = (double)i / SR; + ph += 2 * PI * (190 + 60 * exp(-u * 60)) / SR; double body = sin(ph) * exp(-u * 24) * 0.7; + double nz = rnd(); b1 += (nz - b1) * 0.35; double hp = nz - b1; p1 += (hp - p1) * 0.6; + double wire = p1 * exp(-u * 13) * 0.9 * fmin(1, u / 0.0015); + double v = (body + wire) * g; add(pcM, a + i, v); } + for (long i = 0; i < 0.15 * SR; i++) add(duck, a + i, g * 0.5 * exp(-(double)i / SR * 14)); +} +// v31d: "wish we had more cool sounds for them" — real toms: four CC0 one-shots from Freesound (src/kit/tom-1..4.wav, +// hi rack → low rack → floor → very low; ids 634272, 634273, 808545, 685559), each normalized at load, played with a +// hair of random pitch, the synth tom underneath at 40 % for weight +static Stereo TOM_S[4]; +static void tom(double t, double hz, double g, double pan) { // pan −1 (left, high) … +1 (right, floor) + long a = at(t); double ph = 0; + { int idx = hz >= 200 ? 0 : hz >= 140 ? 1 : hz >= 100 ? 2 : 3; const Stereo *sm = &TOM_S[idx]; + if (sm->L) { double r = 1 + 0.03 * rnd(), pos = 0; for (long i = 0; pos < sm->n - 1; i++, pos += r) { long j = (long)pos; double f = pos - j; + double v = (sm->L[j] * (1 - f) + sm->L[j + 1] * f) * g * 1.3; add(pcM, a + i, v); } g *= 0.4; } } + for (long i = 0; i < 0.45 * SR; i++) { double u = (double)i / SR; + ph += 2 * PI * (hz * (1 + 0.6 * exp(-u * 30))) / SR; + double click = i < 0.002 * SR ? rnd() * 0.5 * (1 - u / 0.002) : 0; + double v = (tanh(sin(ph) * 1.6) * 0.8 * exp(-u * 6.5) + click) * g; + add(pcM, a + i, v); } } +// v59: OCTAVE PLAY ON HER GUITAR — a granular pitch shift (50 ms Hann grains, half-overlap, time preserved): `ratio(t)` per grain. +// Used for a 12-string octave-up double under the big sections, and a climb up the scale in quantized 8ths out of the break. +static void shift_into(const float *src, long n, float *dst, long a, long z, double (*ratio)(double), double g) { + const long W = (long)(0.05 * SR), H = W / 2; + for (long p = a; p < z; p += H) { double r = ratio((double)p / SR); if (r <= 0) continue; + for (long k = 0; k < W; k++) { long o = p + k; if (o >= N) break; double w = 0.5 - 0.5 * cos(2 * PI * (k + 0.5) / W); + double pos = p + (k - W / 2.0) * r + W / 2.0; long j = (long)floor(pos); double f = pos - j; + double x = (j >= 0 && j + 1 < n) ? src[j] * (1 - f) + src[j + 1] * f : 0; dst[o] += (float)(x * w * g); } } +} +static double ratio_octave(double t) { (void)t; return 2.0; } +static double PITCHY_T0 = 1e9, PITCHY_T1 = 1e9, PITCHY_BEAT = 0.48; // v73: bars 73–76 — her strums re-pitched per beat: octave · fifth · fourth · octave +static double ratio_pitchy(double t) { if (t < PITCHY_T0 || t >= PITCHY_T1) return 0; static const double R[4] = { 2.0, 1.4983, 1.3348, 2.0 }; int k = (int)((t - PITCHY_T0) / PITCHY_BEAT) % 4; return R[k]; } +static double CLIMB_T0 = 0, CLIMB_T1 = 0, CLIMB_STEP = 0.24; +static double ratio_climb(double t) { if (t < CLIMB_T0 || t >= CLIMB_T1) return 0; static const int DEG[8] = { 0, 2, 3, 5, 7, 8, 10, 12 }; int k = (int)((t - CLIMB_T0) / CLIMB_STEP); if (k > 7) k = 7; return pow(2, DEG[k] / 12.0); } +static float *g12L = NULL, *g12R = NULL; +// v61: REVERSES — a kick, snare or tom synthesized into a scratch buffer and laid down backwards so it swells INTO `t` +static void rev_kick(double t, double g, double len) { + long n = (long)(len * SR); float *b = (float *)calloc(n, sizeof(float)); double ph = 0; + for (long i = 0; i < n; i++) { double u = (double)i / SR; ph += 2 * PI * (51.9 + 190 * exp(-u * 48)) / SR; b[i] = (float)(tanh(sin(ph) * 2.4) * exp(-u * 5.0)); } + long a = at(t) - n; for (long i = 0; i < n; i++) { double w = fmin(1, (double)(n - 1 - i) / (0.004 * SR)); add(dL, a + i, b[n - 1 - i] * g * w); add(dR, a + i, b[n - 1 - i] * g * w); } + free(b); ev(t - len, "rev-kick", len, g, -1); +} +static void rev_snare(double t, double g, double len) { + long n = (long)(len * SR); float *b = (float *)calloc(n, sizeof(float)); double ph = 0, p1 = 0, b1 = 0; + for (long i = 0; i < n; i++) { double u = (double)i / SR; ph += 2 * PI * 190 / SR; double nz = rnd(); b1 += (nz - b1) * 0.35; double hp = nz - b1; p1 += (hp - p1) * 0.6; + b[i] = (float)(sin(ph) * 0.6 * exp(-u * 20) + p1 * 0.9 * exp(-u * 9)); } + long a = at(t) - n; for (long i = 0; i < n; i++) add(pcM, a + i, b[n - 1 - i] * g * fmin(1, (double)(n - 1 - i) / (0.004 * SR))); + free(b); ev(t - len, "rev-snare", len, g, -1); +} +static void rev_tom(double t, double hz, double g, double len) { + long n = (long)(len * SR); float *b = (float *)calloc(n, sizeof(float)); double ph = 0; + for (long i = 0; i < n; i++) { double u = (double)i / SR; ph += 2 * PI * hz * (1 + 0.6 * exp(-u * 30)) / SR; b[i] = (float)(tanh(sin(ph) * 1.6) * 0.8 * exp(-u * 5.5)); } + long a = at(t) - n; for (long i = 0; i < n; i++) add(pcM, a + i, b[n - 1 - i] * g * fmin(1, (double)(n - 1 - i) / (0.004 * SR))); + free(b); ev(t - len, "rev-tom", len, g, -1); +} +// v62: THE GRAND — AC OS's Salamander grand (CC0, fedac/native/samples/piano/.raw: f32 mono 48 kHz, every 3 semitones +// from A0). A note picks the nearest anchor and is resampled to pitch; velocity shapes level and a touch of brightness; +// a 120 ms release. Everything lands on a mono bus the listener hears from just right of her. +#define PIANO_DIR "/Users/jas/aesthetic-computer/fedac/native/samples/piano" +static float *PIANO_S[128]; static long PIANO_N[128]; static int PIANO_LOADED = 0; +static float *pianoM = NULL; +static void piano_load(void) { char pth[512]; int n = 0; + for (int m = 21; m <= 108; m += 3) { snprintf(pth, sizeof pth, PIANO_DIR "/%d.raw", m); FILE *f = fopen(pth, "rb"); if (!f) continue; + fseek(f, 0, SEEK_END); long bytes = ftell(f); fseek(f, 0, SEEK_SET); PIANO_S[m] = (float *)malloc(bytes); PIANO_N[m] = (long)fread(PIANO_S[m], 1, bytes, f) / 4; fclose(f); n++; } + PIANO_LOADED = n; fprintf(stderr, "piano: %d anchors\n", n); } +static void piano(double t, int midi, double dur, double vel) { + if (!PIANO_LOADED) return; int best = -1; for (int m = 21; m <= 108; m += 3) if (PIANO_S[m] && (best < 0 || fabs(m - midi) < fabs(best - midi))) best = m; + if (best < 0) return; double r = pow(2, (midi - best) / 12.0), g = 0.9 * pow(vel, 1.3), pos = 0; long a = at(t), n = PIANO_N[best]; + long len = (long)((dur + 0.12) * SR); double lp = 0; const double kb = 1 - exp(-2 * PI * (2500 + 6000 * vel) / SR); + for (long i = 0; i < len && pos < n - 1; i++, pos += r) { long j = (long)pos; double f = pos - j, x = PIANO_S[best][j] * (1 - f) + PIANO_S[best][j + 1] * f; + lp += (x - lp) * kb; double u = (double)i / SR, env = u < dur ? 1 : exp(-(u - dur) / 0.04); add(pianoM, a + i, lp * g * env * fmin(1, i / (0.001 * SR))); } + ev(t, "piano", dur, vel, midi); +} +static double seat_piano(double t) { return 26 + 4 * sin(2 * PI * t / 19); } +// v68: HER VOWEL CHOIR — "ooo" and "aaa" resynthesized from her own held vowels (bin/pitch-fx.py → src/vox/vowels/-.wav), +// one note each at the chord tones, played as a small choir of her just behind her +static Stereo VOWEL[2][128]; static float *vowM[3] = { 0 }; +static void vowel_load(void) { char pth[512]; int n = 0; static const char *VN[2] = { "oo", "aa" }; static const int VM[8] = { 56, 59, 63, 66, 68, 71, 75, 78 }; + for (int v = 0; v < 2; v++) for (int k = 0; k < 8; k++) { snprintf(pth, sizeof pth, LANE "/src/vox/vowels/%s-%d.wav", VN[v], VM[k]); if (access(pth, F_OK) == 0) { VOWEL[v][VM[k]] = load_wav(pth); n++; } } + fprintf(stderr, "vowels: %d notes\n", n); } +static void vowel(double t, int midi, double dur, double g, int which, int seat) { + const Stereo *sm = &VOWEL[which][midi]; if (!sm->L) return; long a = at(t), n = (long)fmin(sm->n, (dur + 0.6) * SR); + for (long i = 0; i < n; i++) { double u = (double)i / SR, env = u < dur ? 1 : exp(-(u - dur) / 0.25); add(vowM[seat % 3], a + i, sm->L[i] * g * env); } + ev(t, which ? "aaa" : "ooo", dur, g, midi); } +static double vow_az0(double t) { return -28 + 6 * sin(2 * PI * t / 15); } +static double vow_az1(double t) { return 0 + 6 * sin(2 * PI * t / 12 + 2); } +static double vow_az2(double t) { return 28 + 6 * sin(2 * PI * t / 14 + 4); } +// v64: THE HORSE — trancepenta's CC0 gallop (archive.org Red_Library_Animals_Horses_1 / R13-10) and stallion neigh (mixkit 1762), +// src/sfx/*.wav. The gallop's stride is 0.48 s = this record's beat, so one stride is triggered per kick, no stretching: it +// arrives at the break, passes right → left across the break and the bridge, and is gone by the finale. +static Stereo GALLOP, NEIGH; static float *horseM = NULL; static double HORSE_T0 = 0, HORSE_T1 = 1; +static double horse_az(double t) { double x = fmin(1, fmax(0, (t - HORSE_T0) / (HORSE_T1 - HORSE_T0))); return 80 - 160 * x; } +static void stride(double t, int k, double g) { // one stride from the steady part of the sample (0.9 s on), the k-th of eight + if (!GALLOP.L) return; long sa = at(0.9 + 0.48 * (k % 8)), n = (long)(0.52 * SR), a = at(t); + for (long i = 0; i < n; i++) { double w = fmin(1, i / (0.01 * SR)) * fmin(1, (n - i) / (0.06 * SR)); add(horseM, a + i, sample(GALLOP.L, GALLOP.n, sa + i) * w * g); } } +static void neigh(double t, double rate, double g) { if (!NEIGH.L) return; long a = at(t); double pos = 0; + for (long i = 0; pos < NEIGH.n - 1; i++, pos += rate) { long j = (long)pos; double f = pos - j; add(horseM, a + i, (NEIGH.L[j] * (1 - f) + NEIGH.L[j + 1] * f) * g); } ev(t, "neigh", NEIGH.n / SR / rate, g, -1); } static void open_hat(double t, double g) { long a = at(t); double p1 = 0, p2 = 0; - for (long i = 0; i < 0.16 * SR; i++) { double u = (double)i / SR, nz = rnd(), h1 = nz - p1; p1 = nz; double h2 = h1 - p2; p2 = h1; - double v = h2 * fmin(1, u / 0.002) * exp(-u * 16) * g * 0.3; add(tL, a + i, v * 0.8); add(tR, a + i, v * 1.1); } + for (long i = 0; i < 0.24 * SR; i++) { double u = (double)i / SR, nz = rnd(), h1 = nz - p1; p1 = nz; double h2 = h1 - p2; p2 = h1; + double v = h2 * fmin(1, u / 0.002) * exp(-u * 11) * g * 0.34; add(tL, a + i, v * 0.8); add(tR, a + i, v * 1.1); } // v38: longer, louder — club offbeats } // house bass: a saturated sine pluck with a closing lowpass, on the offbeat static void house_bass(double t, int midi, double dur, double g) { @@ -632,12 +786,12 @@ static void riser(double t0, double t1, double g) { long a = at(t0), len = at(t1) - a; double b1 = 0, b2 = 0; for (long i = 0; i < len; i++) { double x = (double)i / len, fc = 300 * pow(40, x), k = 1 - exp(-2 * PI * fc / SR); double nz = rnd(); b1 += (nz - b1) * k; b2 += (b1 - b2) * k; - double v = (b1 - b2) * x * x * g; add(tL, a + i, v * (1 - 0.3 * sin(PI * 8 * x))); add(tR, a + i, v * (1 + 0.3 * sin(PI * 8 * x))); } + double v = (b1 - b2) * x * x * g; add(rsL, a + i, v * (1 - 0.3 * sin(PI * 8 * x))); add(rsR, a + i, v * (1 + 0.3 * sin(PI * 8 * x))); } } // 4otf clap ohat hbass (v5.2) static const double DANCE[NSEC][4] = { - [INTRO] = { 0, 0, 0, 0 }, [VERSE1] = { .8, 0, .5, .7 }, [CHORUS1] = { 1.1, 1, .9, 1.1 }, [VERSE2] = { .8, .4, .5, .7 }, - [CHORUS2] = { 1.15, 1, 1, 1.1 }, [BREAK] = { .9, .5, .6, .8 }, [BRIDGE] = { 1.1, .9, .9, 1 }, [OUTRO] = { 1.2, 1, 1, 1.1 } }; // v24: the break keeps the beat; the outro is the finale + [INTRO] = { 0, 0, 0, 0 }, [VERSE1] = { .8, 0, .5, .7 }, [CHORUS1] = { 1.1, 1, .9, 1.1 }, [VERSE2] = { .5, 0, .3, .6 }, + [CHORUS2] = { 1.25, 1, 1.1, 1.1 }, [BREAK] = { .9, .5, .6, .8 }, [BRIDGE] = { 1.2, .9, 1, 1 }, [OUTRO] = { 1.3, 1, 1.1, 1.1 } }; // v24: the break keeps the beat; the outro is the finale // ── hand percussion (v5.1: "we have no actual percussion yet") ─────────── // shaker: band-passed noise with a swell-in (the bead mass lags the hand) @@ -691,7 +845,7 @@ static void air(double t0, double t1, double g) { } // shaker tamb conga static const double PERC[NSEC][3] = { - [INTRO] = { 0, 0, 0 }, [VERSE1] = { 0, 0, 0 }, [CHORUS1] = { 0, 0, 0 }, [VERSE2] = { 0, 0, 0 }, + [INTRO] = { 0, 0, 0 }, [VERSE1] = { 0, 0, 0 }, [CHORUS1] = { 0, 0, 0 }, [VERSE2] = { 0, 0, .5 }, // v28: the shaker carries verse 1 under her voice (v30b: no congas there — they read as toms); v27: congas in verse 2 [CHORUS2] = { 0, 0, 0 }, [BREAK] = { 0, 0, 0 }, [BRIDGE] = { 0, 0, 0 }, [OUTRO] = { 0, 0, 0 } }; // ── pop acoustic chain for her guitar (v5.1: "doesn't feel poppy") ─────── @@ -773,7 +927,17 @@ int main(void) { Stereo sisHi = load_wav(STEM("sister-high")), sisLo = load_wav(STEM("sister-low")), sisHum = load_wav(STEM("sister-hum")); // v11: bin/sister.py Stereo orch[NORCH]; int norch = 0; for (int o = 0; o < NORCH; o++) { snprintf(pth, sizeof pth, LANE "/src/orch/%s.wav", ORCH_FILE[o]); orch[o] = access(pth, F_OK) == 0 ? load_wav(pth) : (Stereo){ 0 }; norch += !!orch[o].L; } - fprintf(stderr, "stems: %s · orchestra: %d/%d parts\n", stems, norch, NORCH); + // v33: the OCTAVE FX (bin/pitch-fx.py → src/vox/fx): WORLD resyntheses of her own vowel — two held "long"s sliding an + // octave down (crossfaded IN over her lead), and an octave-down ghost under her opening line + // v36: the held "long"s RISE an octave and keep going (bin/pitch-fx.py: f0 cleaned, the vowel extended on her own frames); + // the engine replaces her lead with the rise, and lays a gliding sine + bells on every scale step the glide crosses (the .curve) + // v55: a fourth: "kiss" itself, placed a beat and a bit before where it was sung and held to "me" (60.84) — only the start of the word moves + static struct { const char *name; double t0, t1, orig; int slide; } FX[4] = { { "rise-long-1", 86.40, 0, 90.95, 1 }, { "rise-long-2", 132.68, 0, 137.08, 1 }, { "hold-out", 159.40, 0, 160.97, 1 }, { "kiss-hold-OFF", 60.07, 0, 60.84, 1 } }; // v57: off — her timing + Stereo fxS[4]; int nfx = 0; for (int q = 0; q < 4; q++) { snprintf(pth, sizeof pth, LANE "/src/vox/fx/%s.wav", FX[q].name); fxS[q] = access(pth, F_OK) == 0 ? load_wav(pth) : (Stereo){ 0 }; nfx += !!fxS[q].L; + if (fxS[q].L && FX[q].t1 == 0) FX[q].t1 = FX[q].t0 + (double)fxS[q].n / SR; } + int ntom = 0; for (int q = 0; q < 4; q++) { snprintf(pth, sizeof pth, LANE "/src/kit/tom-%d.wav", q + 1); TOM_S[q] = access(pth, F_OK) == 0 ? load_wav(pth) : (Stereo){ 0 }; + if (TOM_S[q].L) { double pk = 0; for (long i = 0; i < TOM_S[q].n; i++) pk = fmax(pk, fabs(TOM_S[q].L[i])); if (pk > 0) for (long i = 0; i < TOM_S[q].n; i++) TOM_S[q].L[i] *= (float)(0.8 / pk); ntom++; } } + fprintf(stderr, "stems: %s · orchestra: %d/%d parts · toms: %d/4 samples · octave fx: %d/3\n", stems, norch, NORCH, ntom, nfx); // v7: her first sung word = the first 30 ms window of the lead stem after bar START_BAR // above −45 dBFS RMS (guitar bleed in the stem sits near −60; her voice enters near −35) double startSecOut = bar_n(START_BAR)->t; @@ -781,21 +945,78 @@ int main(void) { for (long i = from; i + w < vox.n; i += w / 3) { double acc = 0; for (long j = 0; j < w; j++) acc += (double)vox.L[i + j] * vox.L[i + j]; if (sqrt(acc / w) > 0.0056) { startSecOut = (double)i / SR - 0.06; break; } } } if (!vox.L || !gtr.L) { fprintf(stderr, "! run bin/aesthetivox.py + bin/lock-vox.mjs first\n"); return 1; } + // v52: THE HESITATION — "27.4 is where 'kiss' should start, but she hesitated": after "you" (ends 60.06) there is 0.4 s of + // nothing, the false "k-" (60.46), then "kiss" at 60.68. The window 60.08–60.66 is removed from her VOICE only (every stem made + // from it) and "kiss me on the mouth … sailor?" slides 0.58 s earlier onto 27.4; the time comes back as a breath before "And" + // (64.29). Her guitar and the band do not move. Her chart notes shift with her (bin/orchestra.mjs mirrors this: VOX_CUT). + if (0) { const double ca = 60.08, cz = 60.66, until = 64.29, d = cz - ca; Stereo *all[16]; int na = 0; all[na++] = &vox; all[na++] = &halo; // v53: OFF — the regularizer fits bar 27 instead + for (int h = 0; h < NHARM; h++) all[na++] = &harm[h]; for (int c = 0; c < 3; c++) all[na++] = &choir[c]; all[na++] = &sisHi; all[na++] = &sisLo; all[na++] = &sisHum; + long A = at(ca), Z = at(cz), U = at(until), D = Z - A, xf = (long)(0.006 * SR); + for (int q = 0; q < na; q++) { Stereo *st = all[q]; if (!st->L || U > st->n) continue; float *ch[2] = { st->L, st->R }; + for (int c = 0; c < 2; c++) { float *b = ch[c]; if (!b) continue; + for (long i = A; i < U - D; i++) { double w = i < A + xf ? (double)(i - A) / xf : 1; b[i] = (float)(b[i] * (1 - w) + b[i + D] * w); } + for (long i = U - D; i < U; i++) { double w = fmin(1, (double)(i - (U - D)) / xf); b[i] = (float)(b[i + D < U ? i + D : U - 1] * (1 - w)); } } } + ChartNote *cn = (ChartNote *)CHART_NOTES; for (int k = 0; k < CHART_NNOTES; k++) if (cn[k].t >= ca && cn[k].t < until) cn[k].t -= d; // her notes move with her + fprintf(stderr, "hesitation: %.2f s of her voice removed at %.2f — \"kiss\" now at %.2f\n", d, ca, 60.68 - d); } + // v49: her "k-" false start before chorus 1's "kiss" (60.440–60.660 s) is cut from the performance — from her lead AND every + // stem made from it (halo, harmonies, choir, sisters), since the v48 lead-only gate left the burst audible in the doubles + if (0) { const double ka = 60.440, kz = 60.660, r = 0.006; Stereo *all[16]; int na = 0; all[na++] = &vox; all[na++] = &halo; // v57: OFF — "let's go back to putting the glitch in … and enhance it" + // v55: the stems made from her voice (not the lead) go quiet from 59.57 to 60.84 — the lead's "kiss" now lives there + { Stereo *dv[16]; int nd = 0; dv[nd++] = &halo; for (int h = 0; h < NHARM; h++) dv[nd++] = &harm[h]; for (int c = 0; c < 3; c++) dv[nd++] = &choir[c]; dv[nd++] = &sisHi; dv[nd++] = &sisLo; dv[nd++] = &sisHum; + for (int q = 0; q < nd; q++) { Stereo *st = dv[q]; if (!st->L) continue; for (long i = at(60.05); i < at(60.86) && i < st->n; i++) { double t = (double)i / SR, g = t < 60.07 ? (60.07 - t) / 0.02 : t > 60.84 ? fmin(1, (t - 60.84) / 0.02) : 0; st->L[i] *= (float)g; if (st->R) st->R[i] *= (float)g; } } } + for (int h = 0; h < NHARM; h++) all[na++] = &harm[h]; for (int c = 0; c < 3; c++) all[na++] = &choir[c]; all[na++] = &sisHi; all[na++] = &sisLo; all[na++] = &sisHum; + for (int q = 0; q < na; q++) { Stereo *st = all[q]; if (!st->L) continue; + for (long i = at(ka - r); i < at(kz + r + 0.04) && i < st->n; i++) { double t = (double)i / SR, g = t < ka ? (ka - t) / r : t > kz ? fmin(1, (t - kz) / r) : 0; + if (i >= 0) { st->L[i] *= (float)g; if (st->R) st->R[i] *= (float)g; } } } } // v25b: "the start still has weird intro guitar" — no lowpass. v25c: "a few twangs before she starts singing, // smoothed": two bars of her guitar at its own level, risen out of silence by a 2 s fade on the whole mix - startSecOut = bar_n(9)->t; - N = vox.n; + const double firstWordT = startSecOut; // v27: her first word (the detection above) + // v63: THE TAPE-START — her first utterance begins 0.83 s before she really sang it, at 0.45× (−14 semitones), and glides to + // 1× over 3 s; the rate's deficit over the glide equals the head start, so by the end she is exactly in time with herself + // and the engine hands back to her own stem. Written into the lead in place, so every double follows. + if (0) { const double r0 = 0.45, D = 3.0, X = D * (1 - (r0 + 1) / 2); const double t0 = firstWordT - X, tz = t0 + D; long a0 = at(t0), az = at(tz); // v68: OFF — "the first 'I saw' still needs to be hearable" + float *tmp = (float *)calloc(az - a0 + 1, sizeof(float)); double pos = firstWordT * SR; + for (long i = a0; i < az; i++) { double u = (double)(i - a0) / (az - a0), k = u * u * (3 - 2 * u), r = r0 + (1 - r0) * k; + long j = (long)pos; double f = pos - j; tmp[i - a0] = (float)(sample(vox.L, vox.n, j) * (1 - f) + sample(vox.L, vox.n, j + 1) * f); pos += r; } + double drift = pos / SR - tz; // should be ~0: where the glide hands back to her + for (long i = a0; i < az && i < vox.n; i++) { double w = fmin(1, (double)(az - i) / (0.03 * SR)); vox.L[i] = (float)(tmp[i - a0] * w + sample(vox.L, vox.n, i) * (1 - w) * (i >= at(firstWordT) ? 0 : 1)); if (vox.R && vox.R != vox.L) vox.R[i] = vox.L[i]; } + free(tmp); fprintf(stderr, "tape-start: %.2f → %.2f s, hand-back drift %.3f s\n", t0, tz, drift); } + // v72: "start right with her vocal" — the record opens on her first word (60 ms early), no pre-roll, no radio + N = vox.n + 3 * SR; // v27: three seconds past the stems so the button, the 808 and the 7.5 s tail release (v26 faded them at 0.4 s) pL = zeros(); pR = zeros(); bedroom_level(>r, bar_n(16)->t); // v6: until bar 16 pop_guitar(>r, 1.5); pop_guitar(&acg, 1.3); + // v59: HER HAND — the strum attacks lifted: the 2–6 kHz band's fast envelope against its slow one, the burst of a pick/nail boosted for its length + { float *ch[2] = { gtr.L, gtr.R }; const double kh = 1 - exp(-2 * PI * 2000 / SR), kl = 1 - exp(-2 * PI * 6000 / SR); + for (int c = 0; c < 2; c++) { double h = 0, l = 0, fast = 0, slow = 0; float *b = ch[c]; + for (long i = 0; i < gtr.n; i++) { double x = b[i]; h += (x - h) * kh; double hf = x - h; l += (hf - l) * kl; double band = l, a = fabs(band); + fast = a > fast ? fast + (a - fast) * 0.3 : fast * 0.998; slow += (a - slow) * 0.0015; + double boost = fmin(1.8, fmax(0, (fast / (slow + 1e-4) - 1.5) * 0.8)); b[i] = (float)(x + band * boost * 0.8); } } } + { double lp = 0; const double k15 = 1 - exp(-2 * PI * 1500 / SR); // v27: mono above 1.5 kHz — the phone's highs were out of phase + for (long i = 0; i < gtr.n; i++) { double sd = (gtr.L[i] - gtr.R[i]) / 2; lp += (sd - lp) * k15; double hp = sd - lp; gtr.L[i] -= (float)hp; gtr.R[i] += (float)hp; } } dL = zeros(); dR = zeros(); tL = zeros(); tR = zeros(); b808 = zeros(); sL = zeros(); sR = zeros(); hiM = zeros(); bellM = zeros(); vibM = zeros(); duck = zeros(); exM = zeros(); jL = zeros(); jR = zeros(); hookM = zeros(); for (int v = 0; v < 3; v++) padM[v] = zeros(); - wubM = zeros(); float *stM = zeros(), *throwM = zeros(); // v24: the wub bass and the stutter; v25: the throws + wubM = zeros(); rsL = zeros(); rsR = zeros(); melM = zeros(); mirM = zeros(); radL = zeros(); radR = zeros(); g12L = zeros(); g12R = zeros(); pcM = zeros(); pianoM = zeros(); piano_load(); + for (int q = 0; q < 3; q++) vowM[q] = zeros(); vowel_load(); + horseM = zeros(); GALLOP = access(LANE "/src/sfx/gallop.wav", F_OK) == 0 ? load_wav(LANE "/src/sfx/gallop.wav") : (Stereo){ 0 }; NEIGH = access(LANE "/src/sfx/neigh.wav", F_OK) == 0 ? load_wav(LANE "/src/sfx/neigh.wav") : (Stereo){ 0 }; + HORSE_T0 = bar_n(68)->t; HORSE_T1 = bar_n(80)->t + bar_n(80)->dur; fprintf(stderr, "horse: gallop %s, neigh %s\n", GALLOP.L ? "yes" : "no", NEIGH.L ? "yes" : "no"); + // v59: the 12-string — her guitar an octave up, quietly, under the choruses, the bridge climb and the finale + { static const int SEG[4][2] = { { 28, 43 }, { 52, 67 }, { 77, 80 }, { 81, 82 } }; static const double G12[4] = { .22, .3, .3, .35 }; + for (int q = 0; q < 4; q++) { long a = at(bar_n(SEG[q][0])->t), z = at(bar_n(SEG[q][1])->t + bar_n(SEG[q][1])->dur); + shift_into(gtr.L, gtr.n, g12L, a, z, ratio_octave, G12[q]); shift_into(gtr.R, gtr.n, g12R, a, z, ratio_octave, G12[q]); } } + // v59: THE CLIMB — out of the break, bars 71–72, her guitar steps up the scale an 8th at a time to the octave, into the bridge + { const ChartBar *b71 = bar_n(71), *b72 = bar_n(72); CLIMB_T0 = b71->t; CLIMB_T1 = b72->t + b72->dur; CLIMB_STEP = (CLIMB_T1 - CLIMB_T0) / 8; + shift_into(gtr.L, gtr.n, g12L, at(CLIMB_T0), at(CLIMB_T1), ratio_climb, 0.9); shift_into(gtr.R, gtr.n, g12R, at(CLIMB_T0), at(CLIMB_T1), ratio_climb, 0.9); + ev(CLIMB_T0, "gtr-climb", CLIMB_T1 - CLIMB_T0, 1, -1); } + { const ChartBar *b73 = bar_n(73), *b76 = bar_n(76); PITCHY_T0 = b73->t; PITCHY_T1 = b76->t + b76->dur; PITCHY_BEAT = b73->dur / b73->nb; // v73: the pitchy guitar in the dead zone + shift_into(gtr.L, gtr.n, g12L, at(PITCHY_T0), at(PITCHY_T1), ratio_pitchy, 0.85); shift_into(gtr.R, gtr.n, g12R, at(PITCHY_T0), at(PITCHY_T1), ratio_pitchy, 0.85); ev(PITCHY_T0, "gtr-pitchy", PITCHY_T1 - PITCHY_T0, 1, -1); } float *stM = zeros(), *throwM = zeros(); // v24: the wub bass and the stutter; v25: the throws for (int h = 0; h < NHARM; h++) { arpG[h] = zeros(); arpAz[h] = zeros(); } for (int q = 0; q < NIMPACT; q++) IMPACT_T[q] = -1e9; - { static const int TURN_BARS[4] = { 27, 51, 72, 80 }; for (int k = 0; k < 4; k++) { const ChartBar *tb = bar_n(TURN_BARS[k]); TURN_T0[k] = tb->t; TURN_D[k] = tb->dur; } - FIN_T0 = bar_n(81)->t; FIN_LAP = 8 * bar_n(81)->dur; } // v25: the turns + { static const int TURN_BARS[4] = { 27, 51, 72, 80 }; for (int k = 0; k < 4; k++) { const ChartBar *tb = bar_n(TURN_BARS[k]); if (pickup_bar(tb->n)) { TURN_D[k] = tb->dur / tb->nb; TURN_T0[k] = pickup_t(tb) - TURN_D[k]; } else { TURN_T0[k] = tb->t + tb->dur / 2; TURN_D[k] = tb->dur / 2; } } // v28: a whip; v35: into the pickup; v49: the beat before the pickup bar + FIN_T0 = bar_n(81)->t; FIN_LAP = 8 * bar_n(81)->dur; + SHIFT_T[0] = bar_n(56)->t; SHIFT_T[1] = bar_n(60)->t; SHIFT_T[2] = bar_n(64)->t; SPIN_T0 = bar_n(70)->t; SPIN_T1 = bar_n(73)->t; + LAP_T0 = bar_n(52)->t; LAP_T1 = bar_n(60)->t; WOB_T0 = bar_n(77)->t; WOB_T1 = bar_n(81)->t; } // v25: the turns; v61: shifts + the spin; v65: the lap + the wobble EV = fopen(LANE "/out/sailor-song-" VERSION ".events.json", "w"); if (EV) fprintf(EV, "{\"tempoBPM\":120,\"seconds\":%.2f,\"startSec\":%.3f,\"startBar\":%d,\"floorBar\":%d,\"endBar\":%d,\"stems\":\"%s\",\"sections\":[", (double)N / SR, startSecOut, START_BAR, FLOOR_BAR, END_BAR, stems); if (EV) for (int s = 0; s < NSEC; s++) { @@ -824,12 +1045,22 @@ int main(void) { const double swell = s == BRIDGE ? 0.75 + 0.25 * (b->n - 72) / 8.0 : 1; #define MID(j) (bt[j] + (bt[(j) + 1] - bt[j]) / 2) // pocket on her strum points - const double *dz = DANCE[s]; - for (int q = 0; q < NIMPACT; q++) if (IMPACT_BARS[q] == b->n) { IMPACT_T[q] = bt[0] + VOICE_LAG; explosion(bt[0] + VOICE_LAG, (b->n == FLOOR_BAR || b->n == 81) ? 0.9 : 0.65); } // v11: implosions; v25: at every lift - for (int q = 0; q < NIMPACT; q++) if (IMPACT_BARS[q] == b->n + 2) { riser(b->t, CHART_BARS[k + 2 < CHART_NBARS ? k + 2 : k].t, 0.14); ev(b->t, "riser", 2 * b->dur, 0.14, -1); } // v25: a two-bar noise riser into each lift + static const double DZ0[4] = { 0, 0, 0, 0 }; + const int release = s == OUTRO && b->n >= 82; // v27: her ring-out, the band leaves; v41: from 82 — the last word dissolves + const double *dzT = ((s == BREAK && b->n < 70) || release) ? DZ0 : DANCE[s]; // v27: the break's first two bars have no kit + const double dzv[4] = { dzT[0], KICK_ONLY ? 0 : dzT[1], KICK_ONLY ? 0 : dzT[2], dzT[3] }; const double *dz = dzv; // v48: kick only + const double kickLift = b->n >= 81 ? 1.41 : b->n >= 52 ? 1.26 : 1; // v27: the kick grows (+2 dB at the floor, +3 at the finale) + for (int q = 0; q < NIMPACT; q++) if (IMPACT_BARS[q] == b->n) { + const ChartBar *pb = bar_n(b->n - 1); const int pk = pb && pickup_bar(pb->n); + const double tI = bt[0] + VOICE_LAG; (void)pk; // v56: the implosion lands on "kiss" — its whoosh was covering "Oh, won't you" + IMPACT_T[q] = tI; if (b->n != 28 && b->n != 52) { explosion(tI, b->n == 81 ? 1.0 : 0.8); blast(tI, b->n == 81 ? 0.9 : 0.6); } + else gong(tI, 78, b->n == 52 ? 0.75 : 0.6); // v59: "kiss" rings a FEM gong (her F#4 an octave up), not a filter sweep + } // v11: implosions; v25: at every lift; v28: and a blast out; v33: chorus 1's is the biggest + for (int q = 0; q < NIMPACT; q++) if (IMPACT_BARS[q] == b->n + 2) { const ChartBar *nx = &CHART_BARS[k + 1 < CHART_NBARS ? k + 1 : k]; double tEnd = pickup_bar(nx->n) ? pickup_t(nx) : CHART_BARS[k + 2 < CHART_NBARS ? k + 2 : k].t; + (void)tEnd; } // v39: no risers — "filter sweeps are a little cheesy" (the implosion/blast stay) // v25: a two-bar noise riser into each lift; v35: ending on the pickup const int pos = k + 1, posV2 = pos_n(44), posC1 = pos_n_after(27, posV2); // v13: positions in the record // v22: by section — the take plays in its own order now. Chorus 1 is big but not the floor, verse 2 pulls back, chorus 2 lands whole - const double gDrop = b->n >= FLOOR_BAR ? 1 : s == CHORUS1 ? 0.6 + 0.2 * evo(b->n, 28, 36) : s == VERSE2 ? 0.45 : 0; (void)pos; (void)posV2; (void)posC1; + const double gDrop = b->n >= FLOOR_BAR ? 1 : s == CHORUS1 ? 0.6 + 0.2 * evo(b->n, 28, 36) : s == VERSE2 ? 0.45 : s == VERSE1 ? 0.5 * evo(b->n, 20, 28) : 0; // v27: verse 1's pads, high pair and pickup bass were gated to 0 (void)pos; (void)posV2; (void)posC1; // v6.6: hills — every section rises to its middle and settles into its edge const int secLen = (s + 1 < NSEC ? SEC_FROM[s + 1] : CHART_NBARS + 1) - SEC_FROM[s]; const double hill = s == INTRO ? 1 : 0.84 + 0.16 * sin(PI * (b->n - SEC_FROM[s] + 0.5) / secLen); @@ -837,30 +1068,61 @@ int main(void) { const int v1 = s == VERSE1; // v22: "start the kick sooner, slower build up" — her 1 and 3 from bar 14, soft, growing all the way to chorus 1 // v25d: "the kick is too loud at start" — from 12%, rising on a square - const double gKick = s == VERSE1 ? (b->n >= 14 ? 0.12 + 0.88 * pow(evo(b->n, 14, 27), 2) : 0) : 1, gHat = s == VERSE1 ? 0 : s == VERSE2 ? 0.5 : 1, gBass = s == VERSE1 ? evo(b->n, 24, 28) : 1; - const double gSub = evo(b->n, 16, 22), gTen = evo(b->n, 20, 26), gShk = evo(b->n, 14, 18), gCon = evo(b->n, 18, 22); // v7: her first line alone; the shuffle from bar 14, congas from 18 + // v31b: "the first 7 seconds no kicks" — hats from her first bar, the kick from bar 15 (12 %), rising on a square + const double gKick = s == VERSE1 ? (b->n >= 15 ? 0.12 + 0.88 * pow(evo(b->n, 15, 27), 2) : 0) : 1, gHat = s == VERSE1 ? 0 : s == VERSE2 ? 0.5 : 1, gBass = s == VERSE1 ? evo(b->n, 24, 28) : 1; + const double swellIn = s == CHORUS1 ? 0.25 + 0.75 * evo(b->n, 28, 32) : s == CHORUS2 ? 0.25 + 0.75 * evo(b->n, 52, 56) : 1; // v67: the chorus bed arrives over four bars, not on the downbeat + const double gSub = evo(b->n, 16, 22), gTen = evo(b->n, 20, 26) * swellIn, gShk = s == VERSE1 ? 0.6 + 0.4 * evo(b->n, 11, 16) : 1, gCon = s == VERSE1 ? 0.5 + 0.5 * evo(b->n, 11, 18) : 1; // v28: the percussion is there from her first word // v7: her first line alone; the shuffle from bar 14, congas from 18 // v6 HOCKET: the floor doubles her 1 and 3 and lands in her empty 2 and 4; // open hats on the complement's &1/&3; her own &2/&4 get a soft accent at her bin // v26: VARIATION — chorus 1 is half-time (kick 1 and 3 with an &4 pickup, clap on 3) so chorus 2's four on // the floor is an event; the hats drop out for the last bar of every other phrase; every phrase ends in a fill - const int ph = (b->n - SEC_FROM[s]) % 4, phN = (b->n - SEC_FROM[s]) / 4, halfTime = s == CHORUS1; + const int ph = (b->n - SEC_FROM[s]) % 4, phN = (b->n - SEC_FROM[s]) / 4, halfTime = 0; // v49: "a more steady kick throughout" — four on the floor from the chorus-1 pickup to the finale const int hatDrop = (s == CHORUS1 || s == CHORUS2 || s == OUTRO) && ph == 3 && (phN % 2 == 1); - const int fillBar = (s == CHORUS1 || s == CHORUS2 || s == BRIDGE || s == OUTRO || s == VERSE2) && ph == 3 && nb > 3; - if (dz[0] && gKick > 0) for (int j = 0; j < nb; j++) { if ((s == VERSE1 || s == VERSE2 || halfTime) && j % 2) continue; // v22: her 1 and 3 in the verses; four on the floor everywhere else - double g = 0.95 * dz[0] * (j % 2 ? 0.9 : 1) * gKick * hill; - dance_kick(bt[j], g); ev(bt[j], "kick", 0.1, g, -1); } - if (dz[0] && gKick > 0 && halfTime && nb > 3) { dance_kick(MID(3), 0.6 * dz[0] * gKick * hill); ev(MID(3), "kick", 0.1, 0.6 * dz[0], -1); } // v26: the &4 pickup - if (dz[1] && gKick > 0) for (int j = 0; j < nb; j++) { if (halfTime ? j != 2 : !(j % 2)) continue; clap(bt[j], 0.75 * dz[1] * swell * gDrop * hill * gKick); ev(bt[j], "clap", 0.1, dz[1], -1); } - if (fillBar && dz[1]) { for (int q = 0; q < 4; q++) { double t = bt[3] + (bt[4] - bt[3]) * q / 4, g = (0.3 + 0.17 * q) * dz[1] * gDrop * hill; clap(t, g); ev(t, "clap", 0.05, g, -1); } - if (phN % 2 == 0 && dz[0]) { dance_kick(MID(2), 0.5 * dz[0] * gKick); ev(MID(2), "kick", 0.1, 0.5, -1); } } // v26: the phrase-end fill — a clap roll, every other phrase a kick double + const int fillBar = (s == CHORUS1 || s == CHORUS2 || s == BRIDGE || s == OUTRO || s == VERSE2) && ph == 3 && nb > 3, lift27 = 0; + const double eag = 1 + 0.09 * ph / 3.0; // v73: velocity builds across each four-bar phrase — fast and furious + if (dz[0] && gKick > 0) for (int j = 0; j < nb; j++) { if ((s == VERSE1 || s == VERSE2) && j % 2) continue; // v49: only the verses sit on her 1 and 3 // v22: her 1 and 3 in the verses; v27: and in the finale (half-time, big) + // (v49: bars 73–76 keep the floor too — steady; the orchestra is what thins there) + double g = 0.95 * dz[0] * (j % 2 ? 0.9 : 1) * gKick * hill * kickLift; + // v46: the hit's own life — downbeats hardest and longest, 3 a touch under, 2 and 4 softer and shorter; half-time + // sections ring longer, the floor is tighter, the finale biggest; ±8 % velocity, ±15 % attack and decay per hit + const double vel = (j == 0 ? 1.0 : j == 2 ? 0.92 : 0.82) * (1 + 0.08 * rnd()); + const double decS = s == OUTRO ? 1.25 : s == CHORUS2 ? 0.95 : s == BRIDGE ? 1.0 : 1.1; + const double dec = decS * (j % 2 ? 0.85 : 1) * (1 + 0.15 * rnd()), atk = (j == 0 ? 1.1 : 0.9) * (1 + 0.15 * rnd()); + // (v49: no double time — "when the kick starts doubling up i don't like it") + dance_kick_v(hum_t2(bt[j], 2), g, vel, atk, dec); ev(bt[j], "kick", 0.1, g * vel, -1); } // v46: ±2 ms — the kick stays on her hand + if (dz[1] && gKick > 0 && !(s == BRIDGE && b->n < 77)) for (int j = 0; j < nb; j++) { if (halfTime ? j != 2 : !(j % 2)) continue; clap(hum_t2(bt[j], 4), hum_g2(0.75 * dz[1] * swell * gDrop * hill * gKick * eag, 0.1)); clap(hum_t2(bt[j] + 0.012, 4), hum_g2(0.4 * dz[1] * swell * gDrop * hill * gKick, 0.15)); ev(bt[j], "clap", 0.1, dz[1], -1); // v38: a second clap 12 ms late — wider; v46: humanized + snare_hit(hum_t2(bt[j], 3), hum_g2((halfTime ? 0.5 : 0.7) * dz[1] * gDrop * hill * kickLift * eag, 0.12)); ev(bt[j], "snare", 0.1, dz[1], -1); } // v30: a snare under every clap + // v30: TOM FILLS — hi → mid → low → floor in 16ths: on the last beat of bridge/finale phrases, and on beat 3 of the bar + // before each lift (beat 4 is the dropout); the taiko sample steps back to support them + { static const double TOMS[4] = { 220, 165, 120, 85 }; + const int tomFill = (fillBar && (s == BRIDGE || s == OUTRO) && !release && !lift27) ? 3 : (pickup_bar(b->n) && nb > 3) ? nb - 3 : (b->n == 72 || b->n == 80) && nb > 3 ? 2 : -1; // v51: the toms lead in on the beat before the pickup + if (tomFill >= 0 && dz[0] && !KICK_ONLY) for (int q = 0; q < 4; q++) { double t = bt[tomFill] + (bt[tomFill + 1] - bt[tomFill]) * q / 4; + { static const double PT[5] = { 1.0, 1.1225, 1.1892, 1.3348, 0.8909 }; double pr = PT[(b->n + q) % 5]; // v61: pitched around — a 2nd, b3rd, 4th up or a 2nd down, in key + tom(t, TOMS[q] * pr, (0.55 + 0.15 * q) * fmax(0.6, dz[0]) * kickLift, -1 + q * 0.66); ev(t, "tom", 0.1, 0.6, -1); } + if (pickup_bar(b->n)) { snare_hit(t, 0.25 + 0.15 * q); snare_hit(t + (bt[tomFill + 1] - bt[tomFill]) / 8, 0.2 + 0.12 * q); } } } // v33: a snare roll under the pickup into each chorus + // v35: from the pickup beat the chorus kit is already playing — kick on every beat, clap on the next beat, open hats + if (pickup_bar(b->n)) { const double dzc[4] = { .7, 1, .9, 1.1 }; for (int j = pickup_j(b); j < nb; j++) { // v56: softer under "Oh, won't you" + dance_kick(bt[j], 0.95 * dzc[0] * 1.26); ev(bt[j], "kick", 0.1, 1, -1); + if ((j == 2 || j == 4) && !KICK_ONLY) { clap(bt[j], 0.75 * dzc[1]); snare_hit(bt[j], 0.6); ev(bt[j], "clap", 0.1, 1, -1); } + if (!KICK_ONLY) { open_hat(MID(j) + BIN_OFF, 0.36 * dzc[2]); ev(MID(j), "hat", 0.1, 1, -1); } } } + // v61: REVERSE KICKS into every 4-bar phrase downbeat from the floor on; REVERSE SNARES into the fill-bar claps; WUB KICKS + // (the kick's tail wobbling through the filter) on chorus 2's and the finale's big downbeats; REVERSE TOMS into the climb + if ((s == CHORUS2 || s == BRIDGE || s == OUTRO) && ph == 3 && !release) { const ChartBar *nx = k + 1 < CHART_NBARS ? &CHART_BARS[k + 1] : NULL; if (nx) rev_kick(nx->t, 0.7 * kickLift, 0.9 * beatDur); } + if (fillBar && (s == CHORUS1 || s == CHORUS2) && nb > 3 && !KICK_ONLY) rev_snare(bt[3], 0.45, 0.75 * beatDur); + if ((b->n == 52 || b->n == 60 || b->n == 64 || b->n == 81) && dz[0]) { wub(bt[0], bt[0] + 0.65, ROOT[b->chord] - 12, 0.65, 3, 0.55); ev(bt[0], "wub-kick", 0.65, 0.55, -1); } + if (s == BRIDGE && b->n >= 77 && ph % 2 == 0 && !KICK_ONLY) { const ChartBar *nx = k + 1 < CHART_NBARS ? &CHART_BARS[k + 1] : NULL; if (nx) rev_tom(nx->t, 120, 0.6, 1.2 * beatDur); } + // v27: one fill shape per section, never on a stutter bar (51): chorus 1 a clap roll in 16ths; chorus 2 kick + clap in 8ths across 3–4; bridge/finale leave it to the timpani + if (fillBar && dz[1] && b->n != 51 && s == CHORUS1) for (int q = 0; q < 4; q++) { double t = bt[3] + (bt[4] - bt[3]) * q / 4, g = (0.3 + 0.17 * q) * dz[1] * gDrop * hill; clap(t, g); ev(t, "clap", 0.05, g, -1); } + if (fillBar && dz[1] && b->n != 51 && s == CHORUS2) for (int q = 0; q < 4; q++) { double t = bt[2] + (bt[4] - bt[2]) * q / 4, g = (0.4 + 0.15 * q) * dz[1] * gDrop * hill; clap(t, g); ev(t, "clap", 0.05, g, -1); + if (q % 2 == 0 && dz[0]) { dance_kick(t, 0.55 * dz[0] * gKick * kickLift); ev(t, "kick", 0.1, 0.55, -1); } } if (dz[2] && gHat > 0 && !hatDrop) for (int j = 0; j < nb; j++) { - if (j % 2 == 0) { open_hat(MID(j) + BIN_OFF, 0.42 * dz[2] * swell * gHat * gDrop * hill); ev(MID(j), "hat", 0.1, dz[2], -1); } + if (j % 2 == 0) { open_hat(hum_t2(MID(j) + BIN_OFF, 4), hum_g2(0.42 * dz[2] * swell * gHat * gDrop * hill * (b->n >= 52 ? 0.8 : 1) * (s == BRIDGE && b->n < 77 ? 0.5 : 1) * eag, 0.12)); ev(MID(j), "hat", 0.1, dz[2], -1); } // v46: humanized // v27: −2 dB from the floor; half in 73–76 else { trap_hat(MID(j) + BIN_OFF, 0.24 * dz[2] * swell * gHat * gDrop, 0.3); ev(MID(j), "hat", 0.02, dz[2] * 0.5, -1); } } // v19: rolling hats from verse 2 on — ghost 16ths on every "e" and "a", and a 32nd roll into every other downbeat - if (dz[2] && gHat > 0 && !hatDrop) for (int j = 0; j < nb; j++) { + if (dz[2] && gHat > 0 && !hatDrop && s != OUTRO && s != CHORUS1) for (int j = 0; j < nb; j++) { // v27: no ghost 16ths in the half-time sections const double bd = bt[j + 1] - bt[j]; for (int q = 1; q < 4; q += 2) trap_hat(bt[j] + bd * q / 4 + BIN_OFF, (q == 3 ? 0.16 : 0.11) * dz[2] * swell * gDrop * hill, q == 3 ? 0.35 : -0.35); - if (j == nb - 1 && b->n % 2) for (int q = 0; q < 8; q++) trap_hat(bt[j] + bd * q / 8 + BIN_OFF, (0.07 + 0.02 * q) * dz[2] * swell * gDrop, -0.5 + q / 7.0); } + if (j == nb - 1 && ph == 3) for (int q = 0; q < 8; q++) trap_hat(bt[j] + bd * q / 8 + BIN_OFF, (0.07 + 0.02 * q) * dz[2] * swell * gDrop, -0.5 + q / 7.0); } // house bass: her pickups (&2/&4) in the verses, every offbeat in the choruses if (dz[3] && gBass > 0) for (int j = 0; j < nb; j++) { if (dz[3] < 0.95 && j % 2 == 0) continue; int r = ROOT[b->chord] - 12 + (j == nb - 1 && b->n % 2 ? 7 : 0); @@ -881,13 +1143,13 @@ int main(void) { if (o->kick && !dz[0]) { kick(bt[0], 0.95 * o->kick); ev(bt[0], "kick", 0.1, o->kick, -1); if (nb > 2) { kick(MID(1), 0.6 * o->kick); ev(MID(1), "kick", 0.1, o->kick * 0.6, -1); } } // v8: no snare — the 808 clap is the backbeat - if (o->clap && nb > 2 && !dz[1]) { clap(bt[2], 0.5 * o->clap * swell); ev(bt[2], "clap", 0.1, o->clap, -1); } - if (o->rim && nb > 3 && gHat > 0) { rim(MID(1) + BIN_OFF, 0.16 * o->rim * gHat); rim(MID(3) + BIN_OFF, 0.2 * o->rim * gHat); ev(MID(1), "rim", 0.05, o->rim, -1); ev(MID(3), "rim", 0.05, o->rim, -1); } // v8: 808 rim on her &2 / &4 - if (dz[0] && gHat > 0 && nb > 3) { bubble(MID(1) + BIN_OFF, 0.22 * gHat * gDrop, b->n % 2 ? -0.6 : 0.6); ev(MID(1), "bubble", 0.05, gHat, -1); + if (o->clap && nb > 2 && !dz[1] && !KICK_ONLY) { clap(bt[2], 0.5 * o->clap * swell); ev(bt[2], "clap", 0.1, o->clap, -1); } // v48b: this fallback was the snare under the kick + if (o->rim && nb > 3 && gHat > 0 && !KICK_ONLY) { rim(MID(1) + BIN_OFF, 0.16 * o->rim * gHat); rim(MID(3) + BIN_OFF, 0.2 * o->rim * gHat); ev(MID(1), "rim", 0.05, o->rim, -1); ev(MID(3), "rim", 0.05, o->rim, -1); } // v8: 808 rim on her &2 / &4 + if (dz[0] && gHat > 0 && nb > 3 && !KICK_ONLY) { bubble(MID(1) + BIN_OFF, 0.22 * gHat * gDrop, b->n % 2 ? -0.6 : 0.6); ev(MID(1), "bubble", 0.05, gHat, -1); if (b->n % 2 == 0) { bubble(MID(3) + BIN_OFF, 0.16 * gHat * gDrop, b->n % 4 ? 0.4 : -0.4); ev(MID(3), "bubble", 0.05, gHat, -1); } } // v11: bubble pops if (o->hat) for (int j = 0; j < nb; j++) { soft_hat(bt[j], 0.15 * o->hat, -0.35); soft_hat(MID(j), 0.09 * o->hat, 0.35); } { // hand percussion on her grid: shaker 16ths, tambourine backbeat, congas on her &2 / &4 - const double *pc = PERC[s]; + const double *pc = KICK_ONLY ? DZ0 : PERC[s]; // v48 // v6.5: the shuffle starts on 8ths and thickens into 16ths as the floor nears // (odd 16ths appear with a probability rising bar 14 → 28), then loses one 16th in // twelve at random so it never runs like a machine @@ -911,22 +1173,73 @@ int main(void) { if (b->n % 2 == 0 && nb > 2) { conga(hum_t2(bt[1] + (bt[2] - bt[1]) * 2 / 3.0, 9), hi, hum_g2(0.2 * cg, 0.25), 0.3, 1); } // v6.4: a triplet slap every other bar if (fillBar && s == VERSE2) for (int q = 0; q < 3; q++) { double t = bt[3] + (bt[4] - bt[3]) * q / 3; conga(t, q == 2 ? lo : hi, 0.3 * cg * (0.7 + 0.15 * q), 0.3, q % 2); ev(t, "conga", 0.08, cg, q == 2 ? lo : hi); } } // v26: verse 2 phrase ends on a conga fill } + // v49: BELLS OFF HER GUITAR — on each of her strum points (1, &2, 3, &4) in the last two bars of chorus 2 and through the + // break, a fem bell an 8th behind on the chord's top tones, ringing out: her playing trails into bells + if ((b->n >= 66 && b->n <= 72) && nb > 3) { int tops[4]; int nt = 0; for (int m = 83; m >= 72 && nt < 4; m--) { int pc = m % 12; if (pc == pcs[0] || pc == pcs[1] || pc == pcs[2]) tops[nt++] = m; } + const double pts[4] = { bt[0], MID(1), bt[2], MID(3) }; const double g = 0.13 * (b->n <= 67 ? 0.8 : 1.0) * evo(b->n, 66, 69); + for (int q = 0; q < 4; q++) { double t = pts[q] + beatDur / 2; fem_bell(hum_t(t), tops[q % nt], hum_g(g)); ev(t, "bell", 0.6, g, tops[q % nt]); } } // v24: the wub on her root, two octaves under the sub, one sweep per beat (8ths from the bridge) - if (WUB[s] > 0) { wub(b->t, b->t + b->dur, ROOT[b->chord] - 24, beatDur, WUB_RATE[s], WUB[s] * hill); ev(b->t, "wub", b->dur, WUB[s], ROOT[b->chord] - 24); } + if (WUB[s] > 0 && !release) { wub(b->t, b->t + b->dur, ROOT[b->chord] - 24, beatDur, WUB_RATE[s], WUB[s] * hill * (s == BRIDGE && b->n < 77 ? 0.5 : 1)); ev(b->t, "wub", b->dur, WUB[s], ROOT[b->chord] - 24); } + // v62: THE PIANO — jazz voicings from her cycle: G#m9 (G# B D# F# A#), Emaj7 (E G# B D#) on her Emaj7/G# bar, Bmaj9 + // (B D# F# A# C#). Right hand above her while she sings (69+), left hand below (≤ 55). Verses: broken 8ths. Choruses: + // comped on 1, the & of 2 and 4 (Charleston) alternating with the & of 1 and 3. Chorus 2: a lament-bass left hand. + // The break: her kiss figure answered on piano. Bridge climb: repeated chords. Finale: both hands, big. Release: high and few. + // v70: the grand OPENS the record — a slow broken G#m under the radio, one soft note a beat, into her first word; then quiet + // single notes under her first line until the part proper begins at 16 + if (PIANO_ON && PIANO_LOADED && ((b->n >= 9 && b->n <= 10) || (s == VERSE1 && b->n < 16))) { + static const int OPEN[8] = { 44, 56, 59, 63, 68, 63, 59, 56 }; const double pv0 = b->n <= 10 ? 0.38 : 0.26; + if (b->n <= 10) { for (int j = 0; j < nb; j++) piano(hum_t2(bt[j], 0.01), OPEN[((b->n - 9) * 4 + j) % 8], beatDur * 2.2, pv0 * (j == 0 ? 1 : 0.8)); } + else { piano(hum_t2(bt[0], 0.01), 44, b->dur * 1.5, pv0); if (nb > 2) piano(hum_t2(bt[2], 0.01), OPEN[2 + b->n % 3], b->dur, pv0 * 0.7); } } + if (PIANO_ON && PIANO_LOADED && !(s == INTRO) && !(s == VERSE1 && b->n < 16)) { + static const int RH[3][5] = { { 71, 75, 78, 82, 87 }, { 71, 75, 76, 80, 83 }, { 70, 73, 75, 78, 82 } }; // G#m9 / Emaj7 / Bmaj9, above her + static const int LH[3] = { 44, 44, 47 }; + const int *rh = RH[b->chord]; const double jit = 0.006, pv = s == VERSE1 ? 0.35 + 0.25 * evo(b->n, 16, 27) : s == VERSE2 ? 0.5 : s == CHORUS1 ? 0.6 : s == CHORUS2 ? 0.75 : s == BREAK ? 0.6 : s == BRIDGE ? (b->n < 77 ? 0.45 : 0.7) : release ? 0.4 : 0.85; + if (s == VERSE1 || s == VERSE2 || (s == BRIDGE && b->n < 77)) { // broken 8ths, LH root on 1, RH climbing and falling + piano(hum_t2(bt[0], jit), LH[b->chord] + 12, beatDur * 2, pv * 0.8); + static const int ORD[8] = { 0, 1, 2, 3, 4, 3, 2, 1 }; for (int j = 0; j < nb; j++) for (int q = 0; q < 2; q++) { int k = (j * 2 + q) % 8; piano(hum_t2(bt[j] + (bt[j + 1] - bt[j]) * q / 2, jit), rh[ORD[k]], beatDur * 0.9, pv * (q ? 0.7 : 0.85)); } + } else if (s == CHORUS1 || s == CHORUS2 || (s == BRIDGE && b->n >= 77) || (s == OUTRO && !release)) { + const int alt = (b->n % 2); double hits[3]; int nh = 0; + if (!alt) { hits[nh++] = bt[0]; if (nb > 1) hits[nh++] = MID(1); if (nb > 3) hits[nh++] = MID(3); } else { hits[nh++] = MID(0); if (nb > 2) hits[nh++] = bt[2]; if (nb > 2) hits[nh++] = MID(2); } + for (int h = 0; h < nh; h++) { double t = hum_t2(hits[h], jit); for (int k = 1; k < 5; k++) piano(t + k * 0.004, rh[k], beatDur * (h == 0 ? 1.4 : 0.7), pv * (h == 0 ? 1 : 0.8) * (0.9 + 0.1 * rnd())); } + if (s == CHORUS2 || s == OUTRO) { static const int LAM_G[4] = { 44, 42, 40, 39 }, LAM_B[3] = { 39, 37, 35 }; int rp = ph % 4; // the lament bass, octaves + for (int hlf = 0; hlf < 2; hlf++) { int m = b->chord == 2 ? LAM_B[(rp * 2 + hlf) % 3] : LAM_G[(rp * 2 + hlf) % 4]; piano(hum_t2(b->t + hlf * b->dur / 2, jit), m, b->dur / 2, pv * 0.9); piano(hum_t2(b->t + hlf * b->dur / 2, jit), m - 12, b->dur / 2, pv * 0.7); } } + else piano(hum_t2(bt[0], jit), LH[b->chord], b->dur * 0.95, pv * 0.85); + } else if (s == BREAK) { // the kiss figure, answered on piano, over the break's first two bars; then comping + if (b->n == 68) { static const int KF[7] = { 66, 64, 63, 66, 64, 61, 59 }; static const double KO[7] = { 0.02, 0.49, 1.08, 1.74, 2.36, 2.92, 3.13 }, KD[7] = { .48, .59, .37, .63, .56, .2, .3 }; + for (int k = 0; k < 7; k++) { piano(hum_t2(b->t + KO[k] / 1.915 * b->dur, jit), KF[k] + 12, KD[k] / 1.915 * b->dur * 1.3, 0.75); piano(hum_t2(b->t + KO[k] / 1.915 * b->dur, jit), KF[k], KD[k] / 1.915 * b->dur * 1.3, 0.45); } } + else if (b->n >= 70) { for (int k = 0; k < 4; k++) piano(hum_t2(bt[0], jit) + k * 0.005, rh[k], b->dur * 0.9, pv * 0.8); piano(hum_t2(bt[0], jit), LH[b->chord], b->dur, pv * 0.8); } + } else if (release) { if (nb > 2) { piano(hum_t2(bt[0], jit), rh[4], b->dur * 1.5, 0.45); piano(hum_t2(bt[2], jit), rh[3], b->dur, 0.35); } } + } + // v64: the horse — a stride on every beat from the break through the bridge, swelling in over 68–70, leaving across 79–80 + if ((s == BREAK || s == BRIDGE) && GALLOP.L) { double g = 0.55 * evo(b->n, 68, 71) * (b->n >= 79 ? 1 - 0.5 * (b->n - 78) : 1); + for (int j = 0; j < nb; j++) stride(bt[j] - 0.03, (b->n * 4 + j), g * (j == 0 ? 1 : 0.85)); ev(b->t, "gallop", b->dur, g, -1); } + // v68b: no neighs ("lose the neigh but keep the gallops") + // v68: her vowel choir — "ooo" swelling in over the opening bars and under her first line, "aaa" through chorus 2 and the + // climb, both in the finale, "ooo" quiet in the release; three voices on the chord tones in her range, seated around her + { int vt[3], nv = 0; for (int m = 56; m <= 78 && nv < 3; m++) { int pc = m % 12; if ((pc == pcs[0] || pc == pcs[1] || pc == pcs[2]) && VOWEL[0][m].L) vt[nv++] = m; } + double gv = 0; int which = 0; + // v69: not at the start ("they don't blend with the first vocal") — more elsewhere: chorus 1's back half, verse 2, the break + if (s == CHORUS1 && b->n >= 36) { gv = 0.36 * evo(b->n, 36, 40); which = 1; } else if (s == VERSE2) { gv = 0.26 * evo(b->n, 46, 50); which = 0; } else if (s == BREAK) { gv = 0.4; which = 0; } + else if (s == CHORUS2) { gv = 0.45 * swellIn; which = 1; } else if (s == BRIDGE && b->n >= 77) { gv = 0.45; which = 1; } + else if (s == OUTRO && !release) { gv = 0.55; which = (b->n % 2); } else if (release) { gv = 0.3; which = 0; } + if (gv > 0) for (int k = 0; k < nv; k++) vowel(hum_t2(b->t, 12), vt[k], b->dur * 1.02, gv * (k == 1 ? 0.85 : 1), which, k); } // 808 on the kick points, gliding into her root if (o->b808 && !dz[3]) { int r = ROOT[b->chord] - 12; eight08(bt[0], r, beatDur * 1.4, 0.8 * o->b808); ev(bt[0], "808", beatDur * 1.4, o->b808, r); if (nb > 2) { eight08(MID(1), r, beatDur * 1.3, 0.6 * o->b808); ev(MID(1), "808", beatDur * 1.3, o->b808 * 0.6, r); } } // trap hats: 16ths, accents on the beat, a roll into every other bar line - if (o->trap) { + // v27: the trap hats keep the form — 8ths in chorus 1 and the finale (half-time), 16ths in chorus 2 and the bridge and + // under the pre-chorus line (bars 22–27); they wait for the kick in verse 1 and honour the hat drop + const double trapG = s == VERSE1 ? 0.15 + 0.85 * evo(b->n, 12, 18) : 1; // v31c: hats barely there under her first line, in by 18 + if (o->trap && trapG > 0 && !hatDrop && !release && !KICK_ONLY) { int roll = 0, trip = 0; for (int j = 0; j < nb; j++) { - int last = j == nb - 1 && roll, div = last ? (trip ? 6 : 8) : ((s == CHORUS1 || s == CHORUS2) ? 4 : 2); // v9: 16ths in the choruses, 8ths elsewhere + int last = j == nb - 1 && roll, div = last ? (trip ? 6 : 8) : ((s == CHORUS2 || s == BRIDGE || (s == VERSE1 && b->n >= 22)) ? 4 : 2); for (int q = 0; q < div; q++) { double t = bt[j] + (bt[j + 1] - bt[j]) * q / div; double acc = q == 0 ? 1 : (q % 2 ? 0.55 : 0.75); - double g = 0.5 * o->trap * acc * (last ? 0.6 + 0.4 * q / div : 1) * swell; - trap_hat(t, g, q % 2 ? 0.45 : -0.25); ev(t, "hat", 0.02, g, -1); + double g = 0.5 * o->trap * acc * (last ? 0.6 + 0.4 * q / div : 1) * swell * trapG * eag; + trap_hat(hum_t2(t, 3), hum_g2(g, 0.15), q % 2 ? 0.45 : -0.25); ev(t, "hat", 0.02, g, -1); // v46: humanized } } } @@ -935,7 +1248,14 @@ int main(void) { if (o->sub && gSub > 0) { sine(sL, sR, b->t, dur, ROOT[b->chord] - 12, 0.26 * o->sub * gSub, 0, 0.35, 0.9, 0); sine(sL, sR, b->t, dur, ROOT[b->chord], 0.16 * o->sub * gSub, 0, 0.35, 0.9, 1); ev(b->t, "sub", dur, o->sub * gSub, ROOT[b->chord] - 12); } lead(tenor, 3, pcs, 67, 79); - if (o->tenor && gTen > 0) for (int v = 0; v < 3; v++) { sine(padM[v], NULL, b->t, dur, tenor[v], 0.26 * o->tenor * swell * gTen * gDrop * hill, 0, 0.35, 0.9, 7); ev(b->t, "pad", dur, o->tenor * gTen, tenor[v]); } + if (o->tenor && gTen > 0) for (int v = 0; v < 3; v++) { sine(padM[v], NULL, b->t, dur, tenor[v], 0.4 * o->tenor * swell * gTen * gDrop * hill, 0, 0.35, 0.9, 7); ev(b->t, "pad", dur, o->tenor * gTen, tenor[v]); } // v44: up (was .26) + // v44: "the main pads as sine waves" — the whole chord, 51–83, as slow detuned sines on the touring pad seats; the sampled strings step back + if (o->tenor && gTen > 0) { int vp[6], nv = 0; for (int m = 51; m <= 83 && nv < 6; m++) { int pc = m % 12; if (pc == pcs[0] || pc == pcs[1] || pc == pcs[2]) vp[nv++] = m; } + const int struck = (s == CHORUS1 || s == CHORUS2 || s == OUTRO || (s == BRIDGE && b->n >= 77)); // v70: in the big sections the pad is STRUCK on her strum motif (1, &2, 3, &4) — snappy, with her hand — over a low sustain + for (int k = 0; k < nv; k++) { sine(padM[k % 3], NULL, b->t, dur, vp[k], 0.11 * o->tenor * swell * gTen * gDrop * hill * (k >= 3 ? 0.7 : 1) * (struck ? 0.45 : 1), 0, 0.5, 1.2, 9); ev(b->t, "pad", dur, o->tenor * gTen * 0.5, vp[k]); } + if (struck && nb > 3) { const double pts[4] = { bt[0], MID(1), bt[2], MID(3) }; const double pg[4] = { 1.0, 0.7, 0.85, 0.7 }; + for (int q = 0; q < 4; q++) for (int k = 0; k < nv && k < 4; k++) { sine(padM[k % 3], NULL, pts[q] + BIN_OFF, beatDur * 0.42, vp[k] + (k >= 2 ? 12 : 0), 0.13 * o->tenor * gTen * gDrop * hill * pg[q] * (k == 3 ? 0.7 : 1), 0, 0.02, 0.22, 9); } + ev(bt[0], "pad-hit", b->dur, o->tenor, vp[0]); } } lead(high, 2, pcs, 76, 88); if (o->high) for (int v = 0; v < 2; v++) { sine(hiM, NULL, b->t, dur, high[v], 0.10 * o->high * swell * gDrop, 0, 0.8, 1.4, 7); ev(b->t, "high", dur, o->high, high[v]); } if (o->descant) { // one long high chord tone per bar, leaning down by step @@ -957,22 +1277,74 @@ int main(void) { } // v25: THE BUTTON — the end of bar 84 is the last downbeat: implosion, kick, a long 808 on her root; the // orchestra holds its chord (bin/orchestra.mjs) while her guitar rings down and she reaches for the phone - { const ChartBar *b84 = bar_n(84); double tE = b84->t + b84->dur; - explosion(tE, 1.0); dance_kick(tE, 1.3); eight08(tE, ROOT[b84->chord] - 12, 3.5, 1.0); ev(tE, "impact", 3.5, 1, -1); } + { const ChartBar *b84 = bar_n(84); double tE = b84->t; // v27: on her LAST STRUM (bar 84's downbeat), not the computed bar end + explosion(tE, 1.0); dance_kick(tE, 1.3); eight08(tE, ROOT[b84->chord] - 12, 1.5, 0.63); ev(tE, "impact", 1.5, 1, -1); } + // v27: the first thing that is not the phone is weight, not a hat — one sub note under her first bar + // v31c: no sub under her first word — "just hats, guitar and vocal" // v25: THROWS — her "sailor?" at the end of each chorus thrown into a dotted-8th echo that spins round the head - { static const double THROW_T[2] = { 63.37, 109.27 }; // onsets, engine clock (src/words-record.json + startSec) + { static const double THROW_T[2] = { 63.37 - SHIFT27, 109.27 - SHIFT27 }, THROW_G[2] = { 63.332 - SHIFT27, 109.191 - SHIFT27 }; // v53: on the fitted clock // her onsets, and the 8th-grid points they sit on (v27: the echoes ride the grid) for (int q = 0; q < 2; q++) { const ChartBar *tb = bar_at(THROW_T[q]); if (!tb) continue; double dot = tb->dur / 4 * 1.5; long sa = at(THROW_T[q]); int n = (int)(0.55 * SR); - for (int h = 1; h <= 3; h++) { long a = at(THROW_T[q] + h * dot); double g = 0.34 * pow(0.62, h - 1); // v26: three, quieter + for (int h = 1; h <= 3; h++) { long a = at(THROW_G[q] + h * dot); double g = 0.34 * pow(0.62, h - 1); // v26: three, quieter for (int i = 0; i < n; i++) { double w = fmin(1, i / (0.006 * SR)) * fmin(1, (n - i) / (0.08 * SR)); add(throwM, a + i, sample(vox.L, vox.n, sa + i) * w * g); } ev(THROW_T[q] + h * dot, "throw", 0.55, g, -1); } } } + // v43: THE RADIO — from the record's first sample to her first word: static whose band wanders and locks onto her, + // a heterodyne whistle sliding down twice, crackle, and chopped & screwed fragments of her first words surfacing + // through the static's band on the 8th grid; the static snaps off 40 ms before she sings + { const double r0 = startSecOut, r1 = (double)N / SR - 0.1, len = fmax(0.5, firstWordT - r0); long a0 = at(r0), a1 = at(r1); // v73: len was 0 once the record opened on her word → 0/0 → NaN // v60: the air stays — a floor through the whole record + double b1 = 0, b2 = 0, c1 = 0, c2 = 0, wph = 0; unsigned seed = 7; + double genv = 0; double resF[3] = { mtof(56), mtof(63), mtof(68) }, resX1[3] = { 0 }, resX2[3] = { 0 }, resY1[3] = { 0 }, resY2[3] = { 0 }, resOut[3] = { 0 }; // v60c: the air's resonators + for (long i = a0; i < a1 && i < N; i++) { double u = (double)(i - a0) / (a1 - a0), t = (double)i / SR; + double us = fmin(1, (t - r0) / len), tune = 200 * pow(7.5, 0.5 + 0.5 * sin(2 * PI * 0.35 * (t - r0)) * (1 - us) + 0.45 * us); // v66: the tuning settles toward 750 Hz — an octave lower + double k = 1 - exp(-2 * PI * tune / SR), nz1 = rnd(), nz2 = rnd(); + b1 += (nz1 - b1) * k; b2 += (b1 - b2) * k; c1 += (nz2 - c1) * k; c2 += (c1 - c2) * k; + seed = seed * 1103515245u + 12345u; double crackle = ((seed >> 16) & 0x3fff) < 6 && t < firstWordT ? (rnd() * 1.6) : 0; // sparse pops, before her only + double drop = 0.75 + 0.25 * sin(2 * PI * 1.7 * (t - r0)) * sin(2 * PI * 0.23 * (t - r0) + 1); // the signal fades in and out + const double air = 0.015, floor_ = 0.006, t20 = bar_n(20)->t, t24 = bar_n(24)->t; // v72: a trace // v60: "keep a bit of air" — down to a floor by bar 24, never gone + // v70: the radio is back before she sings; the air under her stays a whisper + double after = t < firstWordT ? 0.3 * fmin(1, (t - r0) / fmax(0.5, len)) : t < firstWordT + 1.6 ? 0.3 - (0.3 - air) * (t - firstWordT) / 1.6 : t < t20 ? air : t < t24 ? air + (floor_ - air) * (t - t20) / (t24 - t20) : floor_; // v68: from silence, a whisper before she sings + double env = fmin(1, (t - r0) / len * 1.6) * (t < firstWordT ? drop : 1) * after; // steady once she is in — air, not drops + (void)u; double w = fmax(0, (t - r0) < len * 0.5 ? 1 - (t - r0) / (len * 0.5) : 1 - ((t - r0) - len * 0.5) / (len * 0.5)); + wph += 2 * PI * (700 + 2600 * w * w) / SR; double whistle = sin(wph) * 0.05 * fmax(0, 1 - (t - r0) / len); // the whistle is gone by her entry + // v60c: PITCHED AIR — once she is in, the bed runs through three resonators tuned to the bar's chord tones (an octave + // above her root), gliding as the chord changes: the hiss hums the song's harmony, the dry static fades under it + { const ChartBar *cb = bar_at(t); int ch = cb ? cb->chord : 0; const int *pc3 = CHORD_PCS[ch]; double mix = t < firstWordT ? 0 : fmin(1, (t - firstWordT) / 4.0); + const int csec = cb ? section_of(cb->n) : 0, up = csec == CHORUS1 || csec == CHORUS2 || csec == OUTRO || (csec == BRIDGE && cb->n >= 77); // v73: the air sits an octave higher in the choruses + for (int k = 0; k < 3; k++) { int m = up ? 56 : 44; while (m % 12 != pc3[k]) m++; m += k == 0 ? 0 : 12 * (k == 2); double fT = mtof(m); + genv = fmax(fabs(sample(gtr.L, gtr.n, i)), genv * 0.9994); fT *= 1 + 0.07 * fmin(1, genv * 5); // v68: the air's pitch flexes up with each of her strums + resF[k] += (fT - resF[k]) * 0.00004; // a slow glide between chords + double w0 = 2 * PI * resF[k] / SR, alpha = sin(w0) / (2 * 28.0), b0 = alpha / (1 + alpha), a1 = -2 * cos(w0) / (1 + alpha), a2 = (1 - alpha) / (1 + alpha); + double xin = (b1 - b2) * 0.9, y = b0 * xin - b0 * resX2[k] - a1 * resY1[k] - a2 * resY2[k]; resX2[k] = resX1[k]; resX1[k] = xin; resY2[k] = resY1[k]; resY1[k] = y; resOut[k] = y; } + double tonal = (resOut[0] + resOut[1] + resOut[2]) * 3.2; + double dryL = (b1 - b2) * 0.9, dryR = (c1 - c2) * 0.9; + add(radL, i, (dryL * (1 - 0.7 * mix) + tonal * mix + crackle + whistle) * env * 0.22); add(radR, i, (dryR * (1 - 0.7 * mix) + tonal * mix * 0.9 + crackle + whistle) * env * 0.22); } } + // the fragments: her first words, re-triggered on the 8th grid, each slower and lower, through the static's band + // v45: just "I saw", tuning in — at 0.6× from bar 10, at 0.8× from bar 11, then her real one at 26.20: one gesture, not a collage + static const double FR[2][2] = { { 26.20, 1.25 }, { 26.20, 1.25 } }, RT[2] = { 0.6, 0.8 }, LPF[2] = { 1600, 3200 }; static const int FB[2] = { 10, 11 }, FJ[2] = { 0, 0 }; + // v63: OFF (q < 0) — one opening, not previews + for (int q = 0; q < 0; q++) { const ChartBar *fb = bar_n(FB[q]); if (!fb || fb->nb <= FJ[q]) continue; long a = at(fb->beats[FJ[q]] + (q % 2 ? fb->dur / 8 : 0)); int n = (int)(FR[q][1] * SR / RT[q]); long sa = at(FR[q][0]); + double lp = 0, hp = 0; const double kl = 1 - exp(-2 * PI * LPF[q] / SR), kh = 1 - exp(-2 * PI * (q ? 220 : 350) / SR); + for (int i = 0; i < n; i++) { double pos = i * RT[q]; long j = sa + (long)pos; double f = pos - floor(pos), x = sample(vox.L, vox.n, j) * (1 - f) + sample(vox.L, vox.n, j + 1) * f; + hp += (x - hp) * kh; x -= hp; lp += (x - lp) * kl; x = lp; // the radio's band + double w = fmin(1, i / (0.02 * SR)) * fmin(1, (n - i) / (0.25 * SR)), g = q ? 0.95 : 0.7; // the second nearly her level + add(radL, a + i, x * w * g * 1.5); add(radR, a + i, x * w * g * 1.5); } + ev(fb->beats[FJ[q]], "radio", FR[q][1] / RT[q], 1, -1); } } + // v39: CHOPPED & SCREWED — her last word, "out" (159.46 s), re-triggered across the finale, each repeat slower and lower + // than the last (resampled: rate 1 → 0.7), two to a bar on 1 and 3, the last one alone on bar 84's downbeat + { const double OUT_T = 159.46 - SHIFT27, OUT_L = 1.3; static const int OB[8] = { 80, 81, 81, 82, 82, 83, 83, 84 }; static const int OJ[8] = { 2, 0, 2, 0, 2, 0, 2, 0 }; // v41: from bar 80 beat 3 — right off her own "out" + static const double RATE[8] = { 1.0, 0.95, 0.9, 0.85, 0.8, 0.75, 0.7, 0.64 }, OG[8] = { .9, .9, .85, .82, .8, .78, .76, .8 }; + long sa = at(OUT_T); + for (int q = 0; q < 8; q++) { const ChartBar *ob = bar_n(OB[q]); if (!ob || ob->nb <= OJ[q]) continue; long a = at(ob->beats[OJ[q]]); int n = (int)(OUT_L * SR / RATE[q]); + for (int i = 0; i < n; i++) { double pos = i * RATE[q]; long j = sa + (long)pos; double f = pos - floor(pos); + double w = fmin(1, i / (0.006 * SR)) * fmin(1, (n - i) / (0.15 * SR)); add(stM, a + i, (sample(vox.L, vox.n, j) * (1 - f) + sample(vox.L, vox.n, j + 1) * f) * w * OG[q]); } + ev(ob->beats[OJ[q]], "out", OUT_L / RATE[q], OG[q], -1); } } // v24: THE STUTTER — "the k-kiss hiccup should be musically recovered": the first 90 ms of her own // "kiss" (the chorus downbeat word) repeated on 16ths across the last two beats of the bar before // each chorus and the bridge, rising, a trap hat under each — the hiccup becomes the pickup - { static const double KISS_T[2] = { 60.67, 106.60 }; // her "kiss" onsets (src/words-record.json, record clock) + { static const double KISS_T[3] = { 60.67, 106.60, 146.065 }; // her "kiss" onsets, and the bridge's own first word "And" (v27) static const int INTO[3] = { 28, 52, 73 }; const double SL = 0.09; - for (int q = 0; q < 3; q++) { const ChartBar *pb = bar_n(INTO[q] - 1); if (!pb || pb->nb < 4) continue; - const double src = KISS_T[q < 2 ? q : 0], step = pb->dur / 16; long sa = at(src); - for (int h = 0; h < 8; h++) { double t = pb->beats[2] + h * step, g = 0.3 + 0.7 * h / 7.0; long a = at(t); int n = (int)(SL * SR); + for (int q = 0; q < 0; q++) { const ChartBar *pb = bar_n(INTO[q] - 1); if (!pb || pb->nb < 4) continue; // v28: OFF — "i don't like the added glitchiness on the k-kiss"; the dropout and the whip do the work + const double src = KISS_T[q], t0 = pb->beats[pb->nb - 2], step = (pb->beats[pb->nb] - t0) / 8; long sa = at(src); // v27: the LAST two beats (bar 27 has five) + for (int h = 0; h < 8; h++) { double t = t0 + h * step, g = 0.3 + 0.7 * h / 7.0; long a = at(t); int n = (int)(SL * SR); for (int i = 0; i < n; i++) { double w = fmin(1, i / (0.004 * SR)) * fmin(1, (n - i) / (0.012 * SR)); add(stM, a + i, sample(vox.L, vox.n, sa + i) * w * g); } trap_hat(t, 0.25 * g, h % 2 ? 0.4 : -0.4); ev(t, "stutter", SL, g, -1); } } } // her melody, shadowed a 3rd up and an octave up @@ -983,6 +1355,19 @@ int main(void) { ev(v->t, "vox", v->dur, 1, v->midi); if (o->third) sine(sL, sR, v->t, v->dur, third_above(v->midi), 0.06 * o->third, 0.3, 0.06, 0.35, 2); if (o->octave) sine(hiM, NULL, v->t, v->dur, v->midi + 12, 0.03 * o->octave, 0, 0.08, 0.5, 4); + // v29: COUNTERPOINT — "sine bells and sines that mirror or chorale her lead": a sine MIRROR of her line (inverted + // about her median D#4, snapped to the key, an octave up, one beat behind — contrary motion in canon), a three-voice + // sine CHORALE under each note (a 3rd and a 6th below, in the key), and BELLS in canon on her longer notes + { static const double MIRROR[NSEC] = { 0, 0, .5, .3, .8, .6, .8, .6 }, CHORALE[NSEC] = { 0, .25, .6, .4, .9, .5, .9, .7 }, CANON[NSEC] = { 0, 0, .4, .5, .7, .8, .7, .5 }; + const int sec = section_of(b->n); const double beat = b->dur / b->nb, gV1 = sec == VERSE1 ? evo(b->n, 20, 27) : 1; + // v33: THE SISTER SINE — a sine on her exact pitch (and its octave), following every note she sings; on the melody + // bus, which the hollow does not duck (the v29 melody sines sat on the sine bus and were ducked 8 dB while she sang) + { static const double SIS[NSEC] = { 0, .35, .7, .5, .9, .6, .85, .8 }; + if (SIS[sec] > 0) { sine(melM, NULL, v->t, v->dur, v->midi, 0.075 * SIS[sec] * gV1, 0, 0.03, 0.3, 2); sine(melM, NULL, v->t, v->dur, v->midi + 12, 0.028 * SIS[sec] * gV1, 0, 0.05, 0.4, 4); ev(v->t, "sister", v->dur, SIS[sec], v->midi); } } + if (MIRROR[sec] > 0) { int mm = scale_step(2 * 63 - v->midi, 0) + 12; sine(mirM, NULL, v->t + beat, v->dur, mm, 0.05 * MIRROR[sec], 0, 0.05, 0.45, 5); ev(v->t + beat, "mirror", v->dur, MIRROR[sec], mm); } + if (CHORALE[sec] > 0) { int c3 = scale_step(v->midi, -2), c6 = scale_step(v->midi, -5); + sine(melM, NULL, v->t, v->dur, c3, 0.04 * CHORALE[sec] * gV1, 0, 0.05, 0.4, 3); sine(melM, NULL, v->t, v->dur, c6, 0.034 * CHORALE[sec] * gV1, 0, 0.05, 0.4, 3); ev(v->t, "chorale", v->dur, CHORALE[sec], c3); } + if (CANON[sec] > 0 && v->dur >= 0.35) { fem_bell(v->t + beat / 2, v->midi + 12, 0.14 * CANON[sec]); ev(v->t + beat / 2, "bell", 0.5, CANON[sec], v->midi + 12); } } } // fem bell answers: in every breath > 1 s her last three notes ring back for (int k = 1; k < CHART_NNOTES; k++) { @@ -1022,6 +1407,30 @@ int main(void) { float *exL = zeros(), *exR = zeros(); spatialize(exM, NULL, expl_az, expl_el, 0.8, exL, exR, 1.0); // the explosion laps the head spatialize(throwM, NULL, spin_az, el_up, 1.3, exL, exR, 1.0); // v25: the throws spin, overhead + // v36: along each rise — a sine on the curve (and its octave), swelling in over 0.4 s; a bell on every scale step crossed upward + for (int q = 0; q < 3; q++) { if (!fxS[q].L) continue; snprintf(pth, sizeof pth, LANE "/src/vox/fx/%s.curve", FX[q].name); FILE *cf = fopen(pth, "r"); if (!cf) continue; + static double ct[4096], cm[4096]; int nc = 0; while (nc < 4096 && fscanf(cf, "%lf %lf", &ct[nc], &cm[nc]) == 2) nc++; fclose(cf); if (nc < 2) continue; + double ph = 0, ph2 = 0; int lastStep = scale_step((int)lround(cm[0]), 0); long a0 = at(ct[0]), a1 = at(ct[nc - 1]); int ci = 0; + for (long i = a0; i < a1 && i < N; i++) { double t = (double)i / SR; while (ci < nc - 2 && ct[ci + 1] <= t) ci++; + double f = (t - ct[ci]) / fmax(1e-6, ct[ci + 1] - ct[ci]), m = cm[ci] + (cm[ci + 1] - cm[ci]) * fmin(1, fmax(0, f)); + double hz = 440 * pow(2, (m + CHART_TUNE - 69) / 12.0); ph += 2 * PI * hz / SR; ph2 += 2 * PI * hz * 2 / SR; + double u = (t - ct[0]) / 0.4, g = fmin(1, u) * fmin(1, (ct[nc - 1] - t) / 0.5); g = g * g * (3 - 2 * g); + add(melM, i, (sin(ph) * 0.07 + sin(ph2) * 0.025) * g); + int st = scale_step((int)floor(m + 0.02), 0); if (st > lastStep) { fem_bell(t, st + 12, 0.16); ev(t, "bell", 0.5, 1, st + 12); lastStep = st; } } + ev(ct[0], "rise", ct[nc - 1] - ct[0], 1, (int)lround(cm[0])); + if (q < 2) { const ChartBar *gb = bar_n(q == 0 ? 44 : 68); gong(gb->t, (int)lround(cm[nc - 1]) + 12, q == 0 ? 0.6 : 0.5); } } // v42: the gong on the climb's top note starts the next part + // v60: THE LISTENER — claps, snare and toms from a seat that sways slowly front-right ↔ front-left (the kick stays centre); + // her guitar from where it sits in the room, a little left of her and near + float *pcL = zeros(), *pcR = zeros(); spatialize(pcM, NULL, sway_pc, el_near, 1.15, pcL, pcR, 1.0); + // v65: the hats on the ring too (they were plain stereo, outside the HRTF) — their ticks are what makes a turn audible + float *htL = zeros(), *htR = zeros(); { float *hm = zeros(); for (long i = 0; i < N; i++) hm[i] = 0.5f * (tL[i] + tR[i]); spatialize(hm, NULL, hat_az, el_up, 1.1, htL, htR, 1.0); free(hm); for (long i = 0; i < N; i++) { tL[i] = 0; tR[i] = 0; } } + float *pnL = zeros(), *pnR = zeros(); spatialize(pianoM, NULL, seat_piano, el_low, 1.2, pnL, pnR, 1.0); // v62: the grand, just right of her + float *hsL = zeros(), *hsR = zeros(); spatialize(horseM, NULL, horse_az, el_low, 1.6, hsL, hsR, 1.0); // v64: the horse passes + float *vwL = zeros(), *vwR = zeros(); spatialize(vowM[0], NULL, vow_az0, el_near, 1.05, vwL, vwR, 1.0); spatialize(vowM[1], NULL, vow_az1, el_near, 1.1, vwL, vwR, 1.0); spatialize(vowM[2], NULL, vow_az2, el_near, 1.05, vwL, vwR, 1.0); // v68: her vowel choir around her + float *gsL = zeros(), *gsR = zeros(); { float *gm = zeros(); for (long i = 0; i < N; i++) gm[i] = 0.5f * (sample(gtr.L, gtr.n, i) + sample(gtr.R, gtr.n, i)); spatialize(gm, NULL, seat_gtr, el_low, 0.7, gsL, gsR, 1.0); free(gm); } // v66: nearer + float *melL = zeros(), *melR = zeros(); // v33: the melody bus — sister + chorale just behind her, the mirror sweeping + spatialize(melM, NULL, seat_c, el_near, 1.05, melL, melR, 1.0); + spatialize(mirM, NULL, sweep_az, el_up, 1.3, melL, melR, 1.0); float *hL = zeros(), *hR = zeros(); for (int h = 0; h < NHARM; h++) { if (!harm[h].L) continue; @@ -1063,7 +1472,9 @@ int main(void) { // ── mix ── float *sendA = automate(v_send, 0), *airA = automate(v_air, 0), *thickA = automate(v_thick, 0), *warmA = automate(v_warm, 0); float *herA = automate(v_her, 0), *acgA = automate(v_acg, 0), *elgA = automate(v_elg, 0); - float *farA = automate(v_far, 0), *cathA = automate(v_cath, 0); + float *farA = automate(v_far, 0), *cathA = automate(v_cath, 0), *roomA = automate(v_room, 0), *dissA = automate(v_dissolve, 0); + double dsL = 0, dsR = 0; // v41: the dissolve lowpass state + double gbL = 0, gbR = 0; const double k3kG = 1 - exp(-2 * PI * 3000 / SR); // v48: her guitar's brightness shelf after the button float *screamA = automate(v_scream, 0), *orchA[NORCH]; for (int o = 0; o < NORCH; o++) orchA[o] = automate(v_orch, o); // v24: "spatialize the thing more" — the orchestra sits in the room on paths, one per part: the section // strings tour, the cello right and low, horns behind, timpani centre, the harp sweeps, the glock orbits @@ -1075,14 +1486,45 @@ int main(void) { [O_GLOCK] = { orbit_az, orbit_el, 1.2, 1.0 }, [O_AAHS] = { orbit2, el_back, 1.7, 1.0 }, [O_VLN1] = { q_vln1, el_near, 1.2, 1.0 }, [O_VLN2] = { q_vln2, el_near, 1.25, 1.0 }, [O_VIOLA] = { q_viola, el_near, 1.25, 1.0 }, [O_QCELLO] = { q_qcello, el_low, 1.3, 1.0 }, [O_TAIKO] = { wide_az, el_zero, 1.0, 1.1 } }; - for (int o = 0; o < NORCH; o++) { if (!orch[o].L) continue; float *m = zeros(); int any = 0; - for (long i = 0; i < N; i++) { m[i] = 0.5f * (sample(orch[o].L, orch[o].n, i) + sample(orch[o].R, orch[o].n, i)) * orchA[o][i]; any |= m[i] != 0; } + const long hpFrom = at(bar_n(68)->t); const double k180 = 1 - exp(-2 * PI * 180 / SR); + for (int o = 0; o < NORCH; o++) { if (!orch[o].L) continue; float *m = zeros(); int any = 0; double h1 = 0, h2 = 0; + const int lowPart = o == O_CELLO || o == O_QCELLO || o == O_AAHS || o == O_HORNS; // v27: high-passed at 180 Hz from the break (the 808 and sub own 80–250 there) + for (long i = 0; i < N; i++) { double x = 0.5 * (sample(orch[o].L, orch[o].n, i) + sample(orch[o].R, orch[o].n, i)) * orchA[o][i]; + if (lowPart && i >= hpFrom) { h1 += (x - h1) * k180; double y = x - h1; h2 += (y - h2) * k180; x = y - h2; } + m[i] = (float)x; any |= m[i] != 0; } if (any) spatialize(m, NULL, SEAT[o].az, SEAT[o].el, SEAT[o].dist, ORCH_DRUM[o] ? orDL : orKL, ORCH_DRUM[o] ? orDR : orKR, SEAT[o].g); free(m); } } + // v27: the orchestra buses — side high-passed at 500 Hz always, side −6 dB and a +4 dB shelf above 3 kHz where she is + // not singing (break, finale): the seats' motion was turning the mids anti-phase and the top end went dark without her + { float *sideA = automate(v_orch_side, 0), *shelfA = automate(v_orch_shelf, 0); const double k500 = 1 - exp(-2 * PI * 500 / SR), k3k = 1 - exp(-2 * PI * 3000 / SR); + float *bus[2][2] = { { orKL, orKR }, { orDL, orDR } }; + for (int q = 0; q < 2; q++) { double slp = 0, mlp = 0; + for (long i = 0; i < N; i++) { double m = (bus[q][0][i] + bus[q][1][i]) / 2, sd = (bus[q][0][i] - bus[q][1][i]) / 2; + slp += (sd - slp) * k500; double sh = (sd - slp) * sideA[i]; + mlp += (m - mlp) * k3k; if (!q) m += (m - mlp) * shelfA[i]; + bus[q][0][i] = (float)(m + sh); bus[q][1][i] = (float)(m - sh); } } + free(sideA); free(shelfA); } + // v27: the cathedral ducks 6 dB from the button so her guitar is the ring-down + { long atE = at(bar_n(84)->t); for (long i = atE; i < N; i++) cathA[i] *= 0.5f; } + // v27: THE DROPOUT — the last beat before every lift (bars 27, 51, 72) the band leaves: her, her guitar, the stutter and the riser tail alone, then the impact + // v57: THE GLITCH IS THE DROP — on her false "k-" (60.44) everything stops dead with her; 0.23 s of nothing but her hesitation, + // then the chorus lands on the real "kiss" (60.675, bar 28's downbeat) + { long a = at(60.435), z = at(60.672), r = (long)(0.003 * SR); + float *gated[24] = { dL, dR, tL, tR, sL, sR, b808, spL, spR, hiL, hiR, hL, hR, cL, cR, sisL, sisR, jL, jR, orKL, orKR, orDL, orDR, wubM }; + for (int q = 0; q < 24; q++) for (long i = a - r; i < z; i++) { if (i < 0 || i >= N) continue; double g = i < a ? 1 - (double)(i - (a - r)) / r : 0; gated[q][i] *= (float)g; } } + { static const int DROP_BARS[1] = { 72 }; // v56: no dropout under "Oh, won't you" (27, 51) — only into the bridge + float *gate = (float *)malloc(N * sizeof(float)); for (long i = 0; i < N; i++) gate[i] = 1; + for (int q = 0; q < 1; q++) { const ChartBar *db = bar_n(DROP_BARS[q]); double zT = pickup_bar(db->n) ? pickup_t(db) : db->t + db->dur, bd = pickup_bar(db->n) ? db->dur / db->nb : (db->t + db->dur - db->beats[db->nb - 1]); + long a = at(zT - bd / 2), z = at(zT), r = (long)(0.005 * SR); // v33: the last 8th before the lift; v35: before the pickup + for (long i = a - r; i < z; i++) { if (i < 0 || i >= N) continue; double g = i < a ? 1 - (double)(i - (a - r)) / r : i >= z - r ? (double)(i - (z - r)) / r : 0; gate[i] = (float)fmin(gate[i], g); } } + float *gated[24] = { dL, dR, tL, tR, sL, sR, b808, spL, spR, hiL, hiR, hL, hR, cL, cR, sisL, sisR, jL, jR, orKL, orKR, orDL, orDR, wubM }; + for (int q = 0; q < 24; q++) for (long i = 0; i < N; i++) gated[q][i] *= gate[i]; + free(gate); } + const long atButton = at(bar_n(84)->t), atFirstWord = at(firstWordT); // v22: the scream — her lead levelled, driven into a clip, high-passed, growled at 31 Hz float *scr = zeros(); { double env = 0, hp = 0; const double k250 = 1 - exp(-2 * PI * 250 / SR); - for (long i = 0; i < N; i++) { double x = vox.L[i]; env = fmax(fabs(x), env * 0.9996); + for (long i = 0; i < N; i++) { double x = sample(vox.L, vox.n, i); env = fmax(fabs(x), env * 0.9996); double nz = env > 0.004 ? x / env : 0, d = tanh(nz * 3.2) * 0.9; hp += (d - hp) * k250; scr[i] = (float)((d - hp) * (1 + 0.45 * sin(2 * PI * 31 * (double)i / SR))); } } float *L = zeros(), *R = zeros(), *xL = zeros(), *xR = zeros(); @@ -1091,20 +1533,42 @@ int main(void) { const double k350 = 1 - exp(-2 * PI * 350 / SR); const double aA = exp(-1 / (0.02 * SR)), aR = exp(-1 / (0.35 * SR)); // v25: slower, gentler leveler double dlp5 = 0, dsEnv = 0; const double k5500 = 1 - exp(-2 * PI * 5500 / SR); // v25: de-esser state + double cHp = 0, cLp = 0, cFast = 0, cSlow = 0; const double kc22 = 1 - exp(-2 * PI * 2200 / SR), kc8 = 1 - exp(-2 * PI * 8000 / SR); // v34: consonant enhancer state + double vb1 = 0, vb2 = 0, vb3 = 0, vb4 = 0; const double kb350 = 1 - exp(-2 * PI * 350 / SR), kb2k = 1 - exp(-2 * PI * 2000 / SR), kb4k = 1 - exp(-2 * PI * 4000 / SR), kb6k = 1 - exp(-2 * PI * 6000 / SR); // v55: tone bands const double k7 = 1 - exp(-2 * PI * 7000 / SR); + { struct { const char *n; float *b; } B[25] = { {"dL",dL},{"tL",tL},{"sL",sL},{"spL",spL},{"hiL",hiL},{"hL",hL},{"cL",cL},{"sisL",sisL},{"orKL",orKL},{"orDL",orDL},{"wubM",wubM},{"melL",melL},{"pcL",pcL},{"htL",htL},{"gsL",gsL},{"g12L",g12L},{"vwL",vwL},{"hsL",hsL},{"pnL",pnL},{"radL",radL},{"stM",stM},{"exL",exL},{"rsL",rsL},{"b808",b808},{"bellM",bellM} }; + for (int q = 0; q < 25; q++) { if (!B[q].b) continue; long bad = -1; for (long i = 0; i < N; i++) if (B[q].b[i] != B[q].b[i]) { bad = i; break; } if (bad >= 0) fprintf(stderr, "NaN in %s at %.2f s\n", B[q].n, (double)bad / SR); } } for (long i = 0; i < N; i++) { // sidechain: kick + 808 pump the sines and the replay guitars - e = fmax(duck[i], e * 0.99990); double pump = 1 - 0.7 * fmin(1, e), hpump = 1 - 0.4 * fmin(1, e); // v9: a firmer pump + const double tt = (double)i / SR; + e = fmax(duck[i], e * 0.99992); double pump = 1 - 0.8 * fmin(1, e), hpump = 1 - 0.45 * fmin(1, e); // v9: a firmer pump; v38: club // vocal leveler: RMS 4:1 over threshold, 10 ms / 200 ms (v6.3: harder, louder — she is the record) - double x = vox.L[i], pw = x * x; + double x = sample(vox.L, vox.n, i), ghost = 0; + if (tt >= 60.43 && tt < 60.67) x *= 2.0; // v57: her false "k-" lifted +6 dB — the glitch, foregrounded + // (v49: the k- cut moved to load time, across all her stems) + for (int q = 0; q < 4; q++) { if (!fxS[q].L) continue; double u = tt - FX[q].t0; if (u < 0 || tt >= FX[q].t1) continue; + double y = sample(fxS[q].L, fxS[q].n, i - at(FX[q].t0)); + if (FX[q].slide) { double w = fmin(1, u / 0.12); w = w * w * (3 - 2 * w); double keep = fmin(1, fmax(0, (FX[q].orig - tt) / 0.08)); // v37: replace her only while HER note lasts; + x = x * (1 - w * keep) + y; } // past it the extension is ADDED — her next words stay + else ghost += y * 0.38; } // the ghost sits under her + // v34: CONSONANTS — the 2–8 kHz band's fast envelope against its slow one: when a burst stands out (a c, k, t, p), that band + // is lifted for its length only; vowels and held sibilants are not. The first "coughed" gets a further lift by hand. + { cHp += (x - cHp) * kc22; double hf = x - cHp; cLp += (hf - cLp) * kc8; double band = cLp; + double a = fabs(band); cFast = a > cFast ? cFast + (a - cFast) * 0.25 : cFast * 0.9975; cSlow += (a - cSlow) * 0.0012; + double ratio = cFast / (cSlow + 1e-4), boost = fmin(2.2, fmax(0, (ratio - 1.6) * 0.9)); + if (tt >= 39.50 && tt < 39.64) boost += 1.5; // the first "coughed" (39.517 s on the stem clock) + x += band * boost * 0.9; } + double pw = x * x; env = pw > env ? aA * env + (1 - aA) * pw : aR * env + (1 - aR) * pw; double lv = sqrt(env), gt = lv > 0.06 ? pow(lv / 0.06, 1.0 / 2.5 - 1) : 1; // v25: 2.5:1 (was 4:1) — "less processed" gcur = gt < gcur ? gt : gcur + (gt - gcur) * 0.0005; - double v0 = x * gcur * (2.2 + 0.25 * warmA[i]) * (1 - 0.22 * fmin(1, e)); // v25: she barely pumps // v19: her voice pumps with the kick, audibly (was 0.2) + double v0 = (x + ghost) * gcur * (3.3 + 0.25 * warmA[i]) * (1 - 0.36 * fmin(1, e)); // v68: she NEEDS to be stronger // v61: she is the loudest thing (2.2 → 2.8) // v30: she pumps with the kick, ~−4 dB (v25: −2); v33: + the ghost // v19: her voice pumps with the kick, audibly (was 0.2) // v15: a hair louder when close vlp += (v0 - vlp) * k7; // her voice rides the kick's pump, lightly vwarm += (v0 - vwarm) * k350; const double warm = warmA[i]; - double v = v0 + (v0 - vlp) * airA[i] * (1 - 0.85 * warm) * 0.8 + vwarm * 0.45 * warm; // v25: half the air, a little more body — close, not bright + vb1 += (v0 - vb1) * kb350; vb2 += (v0 - vb2) * kb2k; vb3 += (v0 - vb3) * kb4k; vb4 += (v0 - vb4) * kb6k; // v55: body / presence / tin bands + double v = v0 + (v0 - vlp) * airA[i] * (1 - 0.85 * warm) * 0.5 + vwarm * 0.45 * warm // less air still + + vb1 * 0.32 + (vb3 - vb2) * 0.22 - (v0 - vb4) * 0.28; // + body below 350, + presence 2–4 k, − tin above 6 k dlp5 += (v - dlp5) * k5500; { double hf = v - dlp5; dsEnv = fmax(fabs(hf), dsEnv * 0.9992); double ds = dsEnv > 0.05 ? 0.05 / dsEnv : 1; v = dlp5 + hf * ds; } // v25: de-esser above 5.5 kHz // v19: proximity halved (0.75) — less bedroom boom // air above 7 kHz; proximity when warm v *= 1 - 0.65 * farA[i]; // v19: far = quiet (−9 dB), nothing else — she comes up as she comes closer // v6.3: HOLLOW — the bed is keyed to her: while she sings, sines, guitars, @@ -1114,7 +1578,6 @@ int main(void) { double hv = sample(halo.L, halo.n, i) * 0.15 * hd * (1 - 0.6 * warm); // v26: halo down // v8.1: the halo up; v8.2: mostly out while she is up close // v6.4: THICK — two drifting copies of her lead, 28 and 41 ms late (the platter's // unison spacing), each wandering ±1.2 ms so they detune a few cents, panned apart - double tt = (double)i / SR; double d1 = (0.028 + 0.0012 * sin(2 * PI * 0.13 * tt)) * SR, d2 = (0.041 + 0.0012 * sin(2 * PI * 0.31 * tt + 1)) * SR; long j1 = i - (long)d1, j2 = i - (long)d2; double f1 = d1 - floor(d1), f2 = d2 - floor(d2); double c1 = (sample(vox.L, vox.n, j1) * (1 - f1) + sample(vox.L, vox.n, j1 - 1) * f1) * gcur * 2.0 * thickA[i]; @@ -1125,12 +1588,13 @@ int main(void) { // v23 INTRO: "hear her guitar just a bit in the very start, a semblance of it in lower pitches" — // before her first word (bar 11) her guitar comes through a lowpass that opens from 220 Hz // and a gain that creeps up from a third, so the picture of her strumming has a sound - double gtl = sample(gtr.L, gtr.n, i), gtrr = sample(gtr.R, gtr.n, i); + double gtl = gsL[i], gtrr = gsR[i]; // v60: her guitar from its seat // v23b: "too much of her starting guitar" — an eighth to start, held low until the last bars (k³), lowpass from 150 Hz if (0 && tt < introT) { double k = fmax(0, (tt - introT0) / (introT - introT0)), fc = 150 * pow(6000 / 150.0, k * k * k), kc = 1 - exp(-2 * PI * fc / SR); ilpL += (gtl - ilpL) * kc; ilpR += (gtrr - ilpR) * kc; double ig = 0.12 + 0.88 * k * k * k; gtl = ilpL * ig; gtrr = ilpR * ig; } - double gl = (gtl * herA[i] * 0.8 * hpump + (sample(acg.L, acg.n, i) * acgA[i] * 0.55 + sample(elg.L, elg.n, i) * elgA[i] * 0.8) * pump) * vd; - double gr = (gtrr * herA[i] * 0.8 * hpump + (sample(acg.R, acg.n, i) * acgA[i] * 0.55 + sample(elg.R, elg.n, i) * elgA[i] * 0.8) * pump) * vd; + const double gBtn = (i >= atButton ? 1.6 : 1) * (tt >= CLIMB_T0 && tt < CLIMB_T1 ? fmax(0.15, 1 - (tt - CLIMB_T0) / (CLIMB_T1 - CLIMB_T0) * 1.2) : 1) * (tt >= bar_n(70)->t && tt < PITCHY_T1 ? 1.6 : 1) * (tt >= PITCHY_T0 && tt < PITCHY_T1 ? 0.5 : 1); // v73: +4 dB through the dead zone; the dry guitar yields to the pitchy one // v27: +4 dB after the button; v59: the dry guitar yields to the climb + double gl = ((gtl + g12L[i]) * herA[i] * 1.3 * hpump * gBtn) + (sample(acg.L, acg.n, i) * acgA[i] * 0.55 + sample(elg.L, elg.n, i) * elgA[i] * 0.8) * pump * vd; // v66: HER guitar is not hollowed under her voice (the replays still are) + double gr = ((gtrr + g12R[i]) * herA[i] * 1.3 * hpump * gBtn) + (sample(acg.R, acg.n, i) * acgA[i] * 0.55 + sample(elg.R, elg.n, i) * elgA[i] * 0.8) * pump * vd; double pl = (spL[i] + hiL[i] * pump) * vd, pr = (spR[i] + hiR[i] * pump) * vd; double jl = jL[i] * pump, jr = jR[i] * pump; double jd = (sample(jeff[0].L, jeff[0].n, i) * 0.7 + sample(jeff[1].L, jeff[1].n, i) * 0.4) * jg[i] * pump * hd; // the drone: centre, never moves @@ -1139,14 +1603,21 @@ int main(void) { // v22: the scream rides with her (not keyed), two copies 9 and 14 ms late, wide double scl = sample(scr, N, i - 432) * screamA[i] * 0.22, scrr = sample(scr, N, i - 672) * screamA[i] * 0.22; // v22: the orchestra — pads keyed to her (hollow) and pumped; the timpani and pizz untouched by her voice - double ol = (orKL[i] * pump * vd + orDL[i] * hpump) * 0.7, orr = (orKR[i] * pump * vd + orDR[i] * hpump) * 0.7; // v24: from the spatial buses + double ol = (orKL[i] * pump * vd + orDL[i] * hpump) * 0.6, orr = (orKR[i] * pump * vd + orDR[i] * hpump) * 0.6; // v61: under her // v24: from the spatial buses double wb = wubM[i] * pump * 0.55; // v24: the wub, pumped with the kick, mono (bass rule) - L[i] = (float)(v + thL + hL[i] * hpump * hd + hv * 0.6 * hpump + gl + dlp * 1.45 + tL[i] * 1.25 + pL[i] * 0.9 + b808[i] * 0.42 + sl * 0.85 + pl + exL[i] * 0.5 + jl + chl + jd + ssl + scl + ol + wb + stM[i] * 1.5); - R[i] = (float)(v + thR + hR[i] * hpump * hd + hv * 0.6 * hpump + gr + drp * 1.45 + tR[i] * 1.25 + pR[i] * 0.9 + b808[i] * 0.42 + sr * 0.85 + pr + exR[i] * 0.5 + jr + chr + jd + ssr + scrr + orr + wb + stM[i] * 1.5); + // v41: everything that is not her closes through a lowpass across the finale (8 kHz → 300 Hz by bar 84) — the dissolve + double roomGl = 0, roomGr = 0; + if (i >= atButton) { double d = fmin(1, (double)(i - atButton) / (0.8 * SR)); // v48: over 0.8 s her guitar steps out of the dissolve, +6 dB above 3 kHz — the room, bright and dry + gbL += (gl - gbL) * k3kG; gbR += (gr - gbR) * k3kG; roomGl = (gl + (gl - gbL) * 1.0) * d; roomGr = (gr + (gr - gbR) * 1.0) * d; gl *= 1 - d; gr *= 1 - d; } + double bandL = hL[i] * hpump * hd + hv * 0.6 * hpump + gl + dlp * 1.3 + pcL[i] * 1.2 + htL[i] * 1.3 + pnL[i] * pump * vd * 0.9 + hsL[i] * 1.0 + vwL[i] * hpump * 1.1 + (tL[i] + rsL[i]) * 1.3 + pL[i] * 0.9 + b808[i] * 0.42 + sl * 0.85 + pl + exL[i] * 0.5 + jl + chl + jd + ssl + ol + wb + melL[i] * pump; + double bandR = hR[i] * hpump * hd + hv * 0.6 * hpump + gr + drp * 1.3 + pcR[i] * 1.2 + htR[i] * 1.3 + pnR[i] * pump * vd * 0.9 + hsR[i] * 1.0 + vwR[i] * hpump * 1.1 + (tR[i] + rsR[i]) * 1.3 + pR[i] * 0.9 + b808[i] * 0.42 + sr * 0.85 + pr + exR[i] * 0.5 + jr + chr + jd + ssr + orr + wb + melR[i] * pump; + if (dissA[i] > 0.001) { double d = dissA[i], fc = 8000 * pow(300.0 / 8000, d), kd = 1 - exp(-2 * PI * fc / SR); dsL += (bandL - dsL) * kd; dsR += (bandR - dsR) * kd; bandL = dsL; bandR = dsR; } + L[i] = (float)(v + thL + scl + stM[i] * 1.5 + bandL + radL[i] + roomGl); + R[i] = (float)(v + thR + scrr + stM[i] * 1.5 + bandR + radR[i] + roomGr); // v6.4: SPACE — more of everything into the room, the doubles and the jets too // v8.2: no room on her in the opening — the send is closed while warm, and opens as the mix grows - xL[i] = (float)(1 - 0.97 * warm) * (float)(v * sendA[i] * 1.5 + thL * 0.8 + hL[i] * 0.5 + hv * 1.2 + sl * 0.5 + pl * 0.7 + dlp * 0.06 + gl * 0.1 + exL[i] * 0.8 + jl * 0.6 + chl * 0.9 + jd * 0.5 + ssl * 1.0 + scl * 0.6 + ol * 0.7 + wb * 0.15 + stM[i] * 0.8); - xR[i] = (float)(1 - 0.97 * warm) * (float)(v * sendA[i] * 1.5 + thR * 0.8 + hR[i] * 0.5 + hv * 1.2 + sr * 0.5 + pr * 0.7 + drp * 0.06 + gr * 0.1 + exR[i] * 0.8 + jr * 0.6 + chr * 0.9 + jd * 0.5 + ssr * 1.0 + scrr * 0.6 + orr * 0.7 + wb * 0.15 + stM[i] * 0.8); + xL[i] = (float)(1 - 0.97 * warm) * roomA[i] * (float)(v * sendA[i] * 1.5 + thL * 0.8 + hL[i] * 0.5 + hv * 1.2 + sl * 0.5 + pl * 0.7 + dlp * 0.06 + gl * 0.1 + exL[i] * 0.8 + jl * 0.6 + chl * 0.9 + jd * 0.5 + ssl * 1.0 + scl * 0.6 + ol * 0.7 + wb * 0.15 + stM[i] * 0.8 + melL[i] * 0.5 + gl * sendA[i] * 1.3); // v68: her guitar in her room + xR[i] = (float)(1 - 0.97 * warm) * roomA[i] * (float)(v * sendA[i] * 1.5 + thR * 0.8 + hR[i] * 0.5 + hv * 1.2 + sr * 0.5 + pr * 0.7 + drp * 0.06 + gr * 0.1 + exR[i] * 0.8 + jr * 0.6 + chr * 0.9 + jd * 0.5 + ssr * 1.0 + scrr * 0.6 + orr * 0.7 + wb * 0.15 + stM[i] * 0.8 + melR[i] * 0.5 + gr * sendA[i] * 1.3); } // the room: near early reflections always on, a 2.2 s dark tail behind float *wL = zeros(), *wR = zeros(); @@ -1163,14 +1634,30 @@ int main(void) { for (int r = 0; r < 6; r++) { long j = i - lround(ROOM[r][0] * SR); if (j >= 0) { double y = (xL[j] + xR[j]) * ROOM[r][1]; if (ROOM[r][2] > 0) er += y; else el += y; } } L[i] += (float)(wL[i] * 0.5 + el); R[i] += (float)(wR[i] * 0.5 + er); } + // v27: OPEN AS THE PHONE — until her first word the whole mix is band-limited (300 Hz – 3.4 kHz, two poles each + // side) like the recording it came from; it opens to the full band over 250 ms on the word + { double h[2][2] = { { 0 } }, l[2][2] = { { 0 } }; const double kh = 1 - exp(-2 * PI * 300 / SR), kl = 1 - exp(-2 * PI * 3400 / SR); + long z = atFirstWord + (long)(2.2 * SR); // v43b: her first phrase arrives through the radio's band and opens over 2.2 s + for (long i = 0; i < z && i < N; i++) { double k = i < atFirstWord ? 1 : 1 - (double)(i - atFirstWord) / (2.2 * SR); k = k * k * (3 - 2 * k); + float *ch[2] = { L, R }; + for (int c = 0; c < 2; c++) { double x = ch[c][i]; h[c][0] += (x - h[c][0]) * kh; double y = x - h[c][0]; h[c][1] += (y - h[c][1]) * kh; y -= h[c][1]; + l[c][0] += (y - l[c][0]) * kl; l[c][1] += (l[c][0] - l[c][1]) * kl; ch[c][i] = (float)(x * (1 - k) + l[c][1] * 1.6 * k); } } } + // v60: THE WAX PRINT — pop/lib/substrate.mjs "vinyl": tube drive 1.8 (tanh, normalized), an even-harmonic bias, a soft hiss + // v60b: "things are maxing out" — the sum is brought to a 0.5 peak BEFORE the print (it was going in hot), drive 1.2 (was 1.8) + { double pk = 1e-6; for (long i = 0; i < N; i++) { pk = fmax(pk, fabs(L[i])); pk = fmax(pk, fabs(R[i])); } const double pre = 0.5 / pk; + const double drive = 1.2, nrm = 1 / tanh(drive), bias = 0.30 * 0.12, hiss = 0.0035; double hl = 0, hr = 0; const double kh = 1 - exp(-2 * PI * 6000 / SR); + for (long i = 0; i < N; i++) { double l = L[i] * pre, r = R[i] * pre; l = tanh(l * drive) * nrm + bias * l * fabs(l); r = tanh(r * drive) * nrm + bias * r * fabs(r); + hl += (rnd() - hl) * kh; hr += (rnd() - hr) * kh; L[i] = (float)(l * 0.9 + hl * hiss); R[i] = (float)(r * 0.9 + hr * hiss); } } // bass mono below 120 Hz (house rule) { double ml = 0, mr = 0, k = 1 - exp(-2 * PI * 120 / SR); for (long i = 0; i < N; i++) { ml += (L[i] - ml) * k; mr += (R[i] - mr) * k; double m = (ml + mr) / 2; L[i] += (float)(m - ml); R[i] += (float)(m - mr); } } // v6.6: the record starts on her first sung word (the first charted note after 23 s), 60 ms early long start = at(startSecOut); if (start < 0) start = 0; long endAt = END_BAR <= CHART_BARS[CHART_NBARS - 1].n ? at(bar_n(END_BAR)->t + 1.6) : N; if (endAt > N) endAt = N; + { long last = at(bar_n(84)->t); for (long i = N - 1; i > last; i--) if (fabs(L[i]) > 0.004 || fabs(R[i]) > 0.004) { last = i; break; } // v67: "too many dead seconds" — the file ends 0.5 s after the last thing heard + long cut = last + (long)(0.5 * SR); if (cut < endAt) endAt = cut; } long M = endAt - start; float *oL = L + start, *oR = R + start; - long fin = (long)(2.0 * SR), fout = (long)(0.4 * SR); // v25c: a 2 s rise into her intro bars; v23: her take ends itself + long fin = (long)(0.005 * SR), fout = (long)(0.4 * SR); // v72: she is the first sample; v67: a short fall at the trimmed end for (long i = 0; i < fin; i++) { double g = 0.5 - 0.5 * cos(PI * i / fin); oL[i] *= (float)g; oR[i] *= (float)g; } for (long i = 0; i < fout; i++) { double g = 0.5 - 0.5 * cos(PI * i / fout); oL[M - 1 - i] *= (float)g; oR[M - 1 - i] *= (float)g; } double peak = 0; for (long i = 0; i < M; i++) { peak = fmax(peak, fabs(oL[i])); peak = fmax(peak, fabs(oR[i])); } @@ -1179,7 +1666,7 @@ int main(void) { // v12: her lead alone with a click on her (regularized) beats — to hear the vocal's smoothness on its own { float *cl = zeros(), *cr = zeros(); double env2 = 0, g2 = 1; const double aA2 = exp(-1 / (0.01 * SR)), aR2 = exp(-1 / (0.2 * SR)); - for (long i = 0; i < N; i++) { double x = vox.L[i], pw = x * x; env2 = pw > env2 ? aA2 * env2 + (1 - aA2) * pw : aR2 * env2 + (1 - aR2) * pw; + for (long i = 0; i < N; i++) { double x = sample(vox.L, vox.n, i), pw = x * x; env2 = pw > env2 ? aA2 * env2 + (1 - aA2) * pw : aR2 * env2 + (1 - aR2) * pw; double lv = sqrt(env2), gt = lv > 0.06 ? pow(lv / 0.06, 1.0 / 4 - 1) : 1; g2 = gt < g2 ? gt : g2 + (gt - g2) * 0.0005; cl[i] = cr[i] = (float)(x * g2 * 2.0); } for (int k = 0; k < CHART_NBARS; k++) for (int j = 0; j < CHART_BARS[k].nb; j++) { long a2 = at(CHART_BARS[k].beats[j]); double f = j == 0 ? 1800 : 1200, g = j == 0 ? 0.35 : 0.22; diff --git a/pop/sailor-song/measures.cut.json b/pop/sailor-song/measures.cut.json index 71f357f9c9..e12f9dcba3 100644 --- a/pop/sailor-song/measures.cut.json +++ b/pop/sailor-song/measures.cut.json @@ -116,251 +116,251 @@ 53.09008787847, 53.59888157195405, 54.10785525989205, - 54.616828947830044, - 55.125622641314095, - 55.634589060954305, - 56.14263359231784, - 56.64975956898965, - 57.15696410426977, - 57.6642631186425, - 58.17152788872035, - 58.678758551701094, - 59.18541386204914, - 59.691199036124, - 60.19601853055413, - 60.69984212125789, - 61.1793063988632, - 61.65838829939644, - 62.1370132883883, - 62.61518223654269, - 63.09307812139763, - 63.57068577196881, - 64.04796741163675, - 64.52554757855512, - 65.003340831606, - 65.48038845947893, - 65.95679533391554, - 66.43295638614387, - 66.908872836237, - 67.38452813220306, - 67.8602832663776, - 68.33632788850873, - 68.81257995322045, - 69.28873197107286, - 69.76488398892528, - 70.24105244769295, - 70.71722090646062, - 71.1933893652283, - 71.66925052956792, - 72.14492336850425, - 72.62040689559939, - 73.0957685620713, - 73.57142958459357, - 74.04728798420392, - 74.52304407159352, - 74.99869830180342, - 75.47454990346328, - 75.95049907881076, - 76.42634833450181, - 76.90219759019286, - 77.37785739362131, - 77.85321055857922, - 78.32883283793144, - 78.80472558781302, - 79.28051844172595, - 79.75653534634141, - 80.23225244693313, - 80.70805671249583, - 81.1841681989808, - 81.66018204522325, - 82.13601519997621, - 82.61195070010314, - 83.08816902465163, - 83.56438734920013, - 84.04040799802951, - 84.51622140578252, - 84.9920516278738, - 85.4680714380324, - 85.94410891585052, - 86.41955363944031, - 86.8946288065843, - 87.36990086480995, - 87.84579380551482, - 88.32242876340804, - 88.79953856035861, - 89.2769359908199, - 89.75460591509497, - 90.23264798402873, - 90.7111565845216, - 91.18993265676293, - 91.6688052126767, - 92.14797442374717, - 92.62782295682089, - 93.1081244227451, - 93.589077168313, - 94.07087718150237, - 94.55309236922395, - 95.03549386564183, - 95.51799331261576, - 96.00013763639116, - 96.48200705917789, - 96.96389224218849, - 97.44594695704059, - 97.92818710651267, - 98.4104114725341, - 98.89272754895644, - 99.37486999050621, - 99.85701243205598, - 100.33904054716423, - 100.82079754565754, - 101.30228373234343, - 101.78331888883112, - 102.26390385933115, - 102.74448882983118, - 103.2252667823867, - 103.70612410037047, - 104.1861734206947, - 104.66531940292464, - 105.14397093606209, - 105.62197962066358, - 106.09943284309054, - 106.57651338134494, - 107.05274339839181, - 107.52838391015919, - 108.0036300256327, - 108.47861051006056, - 108.95349381753606, - 109.42827998781421, - 109.90286966929953, - 110.37707472958185, - 110.85056954493281, - 111.32318549922621, - 111.79543627982753, - 112.26817988977741, - 112.74135194249897, - 113.21452399522052, - 113.68737869171198, - 114.16024999407782, - 114.63272043012573, - 115.10508272059961, - 115.57753309305029, - 116.04989752492108, - 116.52214168949467, - 116.99410096847804, - 117.4659619958692, - 117.93763673277475, - 118.40898817101623, - 118.88033960925772, - 119.35201434616327, - 119.82350293961994, - 120.29448274760031, - 120.7650380718522, - 121.23507383536553, - 121.70588375286549, - 122.17667720895277, - 122.64786868955088, - 123.11906017014898, - 123.59005651655644, - 124.06133658689365, - 124.53291806164542, - 125.00487991175814, - 125.47703608030204, - 125.94927811365403, - 126.42194768070125, - 126.89483663672131, - 127.36760205500283, - 127.84036747328436, - 128.31345813349867, - 128.78685700982066, - 129.26069643439885, - 129.73461119929644, - 130.20898447081603, - 130.68316946329983, - 131.15795472608758, - 131.63304276945246, - 132.10794647448725, - 132.58254451481505, - 133.0567579203967, - 133.53077531087553, - 134.00449128349214, - 134.4782916124099, - 134.9519831861583, - 135.42600345462373, - 135.90021187131168, - 136.37450690092894, - 136.84892324484102, - 137.32332204122, - 137.79707434613707, - 138.26996775877035, - 138.74286117140363, - 139.21535529931515, - 139.6877634707289, - 140.16015466334403, - 140.63266619816537, - 141.1049641116907, - 141.57726202521602, - 142.04955993874134, - 142.5222230988828, - 142.9949945424239, - 143.46745685998428, - 143.93951900404934, - 144.4112822109413, - 144.88304541783324, - 145.3549117060568, - 145.82696443613506, - 146.2994173237413, - 146.77187021134753, - 147.24434050282505, - 147.7167933904313, - 148.18916033654267, - 148.6615103068186, - 149.13417695596576, - 149.60663927352613, - 150.07951905009202, - 150.55163298397414, - 151.0236389354043, - 151.49573283595507, - 151.96804017324905, - 152.44111398132586, - 152.91408460140627, - 153.38686341975009, - 153.85934968131488, - 154.33163176719088, - 154.8039138530669, - 155.27617854893404, - 155.74884214168688, - 156.22140016133048, - 156.69376671366393, - 157.16601299762056, - 157.63827667023006, - 158.1098999360764, - 158.58152320192275, - 159.05294173079446, - 159.52347991359056, - 159.99348754567202, - 160.46240196642222, - 160.93078948980357, - 161.3987354819744, - 161.86657538965613, - 162.33422292867684, - 162.80146010041048, - 163.26828590011118, - 163.73453137478074, - 164.20067153449637, - 164.66701469186685, - 165.1334585753361, - 165.59955673938802, - 166.065746953508, - 166.5317767598561, - 166.99788309008798, - 167.4647473938636, - 167.93195415720174, - 168.39960530348034, - 168.8677642407363, - 169.3557642407363, - 169.8427642407363, - 170.3187642407363, - 170.7947642407363 + 54.62766658064677, + 55.1484212976279, + 55.66257224102413, + 56.17766658064677, + 56.67577978819394, + 57.17483639196753, + 57.67860997687319, + 58.18238356177885, + 58.674836391967524, + 59.168232618382625, + 59.682383561778856, + 60.166540371867484, + 60.64974204140264, + 61.159176003666786, + 61.66860996593093, + 62.1535156263083, + 62.63936468291207, + 63.12521373951584, + 63.60282139008702, + 64.08010302975497, + 64.55768319667334, + 65.03547644972421, + 65.51252407759715, + 65.98893917193676, + 66.46535426627638, + 66.94176936061601, + 67.41818445495562, + 67.91158068137071, + 68.38762530350184, + 68.86387736821355, + 69.34002938606596, + 69.81618140391838, + 70.29234986268605, + 70.76851832145373, + 71.2446867802214, + 71.72110187456101, + 72.19751696890063, + 72.67300049599577, + 73.14836216246768, + 73.62477725680729, + 74.10213574737332, + 74.57855084171295, + 75.05496593605257, + 75.53081753771244, + 76.01289300941056, + 76.4887422651016, + 76.96459152079265, + 77.44666699249076, + 77.92874246418889, + 78.40436474354111, + 78.88025749342269, + 79.3623329651208, + 79.84440843681892, + 80.32012553741065, + 80.79592980297335, + 81.27204128945831, + 81.74805513570077, + 82.24145136211585, + 82.73390419230454, + 83.21012251685303, + 83.68634084140153, + 84.16236149023091, + 84.63817489798392, + 85.11458999232353, + 85.59100508666315, + 86.06704256448127, + 86.54248728807106, + 87.02456275976917, + 87.50663823146728, + 87.98253117217214, + 88.45916613006537, + 88.93627592701594, + 89.41367335747722, + 89.8913432817523, + 90.36938535068606, + 90.84789395117893, + 91.32996942287704, + 91.8394033851412, + 92.34883734740535, + 92.84129017759402, + 93.3346864040091, + 93.82713923419779, + 94.32053546061287, + 94.81864866816005, + 95.31676187570721, + 95.80449772476383, + 96.29223357382044, + 96.79034678136762, + 97.28845998891478, + 97.79789395117893, + 98.30732791344307, + 98.7895522794645, + 99.27186835588685, + 99.75960420494347, + 100.24734005400008, + 100.73979288418874, + 101.23318911060385, + 101.7369626955095, + 102.24073628041518, + 102.73318911060386, + 103.23696269550952, + 103.72469854456612, + 104.21243439362274, + 104.69356646909443, + 105.17564194079256, + 105.65771741249067, + 106.13979288418878, + 106.6218683558869, + 107.10394382758501, + 107.59639665777368, + 108.08884948796236, + 108.56409560343587, + 109.03907608786373, + 109.51395939533923, + 109.98874556561738, + 110.4633352471027, + 110.93754030738502, + 111.41103512273598, + 111.88365107702938, + 112.3559018576307, + 112.82864546758059, + 113.30506056192021, + 113.78147565625983, + 114.2543303527513, + 114.72720165511713, + 115.19967209116504, + 115.67203438163892, + 116.1444847540896, + 116.61684918596039, + 117.08909335053399, + 117.56105262951735, + 118.0329136569085, + 118.50461177011606, + 118.97596320835754, + 119.44731464659903, + 119.91898938350458, + 120.39047797696125, + 120.86145778494162, + 121.33201310919351, + 121.80276782617464, + 122.27357774367461, + 122.74437119976189, + 123.21556268036, + 123.6867541609581, + 124.15775050736556, + 124.62903057770276, + 125.10061205245454, + 125.57257390256726, + 126.06597012898234, + 126.53821216233433, + 127.01088172938155, + 127.48377068540161, + 127.95653610368313, + 128.43295119802275, + 128.9093662923624, + 129.3914417640605, + 129.87351723575858, + 130.34743200065617, + 130.82180527217577, + 131.29599026465957, + 131.7707755274473, + 132.2458635708122, + 132.72076727584698, + 133.1953653161748, + 133.66957872175644, + 134.1676919293036, + 134.66580513685076, + 135.1396054657685, + 135.6216809374666, + 136.09570120593204, + 136.56990962262, + 137.04420465223726, + 137.51862099614934, + 137.99301979252832, + 138.46677209744539, + 138.93966551007867, + 139.41255892271195, + 139.88505305062347, + 140.35746122203722, + 140.82985241465235, + 141.3023639494737, + 141.774661862999, + 142.24695977652433, + 142.71925769004966, + 143.1919208501911, + 143.66469229373223, + 144.1371546112926, + 144.60921675535766, + 145.08097996224961, + 145.55274316914156, + 146.02460945736513, + 146.49666218744338, + 146.9891150176321, + 147.46156790523833, + 147.93403819671585, + 148.40649108432208, + 148.87885803043346, + 149.3512080007094, + 149.82387464985655, + 150.29633696741692, + 150.7692167439828, + 151.24133067786494, + 151.7133366292951, + 152.18543052984586, + 152.65773786713984, + 153.13081167521665, + 153.60378229529707, + 154.07656111364088, + 154.54904737520567, + 155.02132946108168, + 155.49361154695768, + 155.96587624282483, + 156.43853983557767, + 156.93099266576635, + 157.4033592180998, + 157.87560550205643, + 158.34786917466593, + 158.81949244051228, + 159.29111570635862, + 159.76253423523033, + 160.24460970692843, + 160.7146173390099, + 161.1835317597601, + 161.65191928314144, + 162.11986527531226, + 162.587705182994, + 163.0553527220147, + 163.52258989374835, + 163.98941569344905, + 164.4556611681186, + 164.92180132783423, + 165.38814448520472, + 165.85458836867397, + 166.3206865327259, + 166.78687674684588, + 167.25290655319395, + 167.71901288342585, + 168.18587718720147, + 168.6530839505396, + 169.1207350968182, + 169.58889403407417, + 170.07689403407417, + 170.56389403407417, + 171.03989403407417, + 171.51589403407417 ], "hitFraction": 0.584, "trackerOffsetMs": { @@ -763,94 +763,94 @@ { "n": 25, "t": 54.108, - "dur": 2.035, + "dur": 2.07, "beats": [ 54.108, - 54.617, - 55.126, - 55.635, - 56.143 + 54.628, + 55.148, + 55.663, + 56.178 ], - "bpm": 117.9, + "bpm": 116, "chord": "B", "agree": 1, "strum": "X..XX.X." }, { "n": 26, - "t": 56.143, - "dur": 2.029, + "t": 56.178, + "dur": 2.005, "beats": [ - 56.143, - 56.65, - 57.157, - 57.664, - 58.172 + 56.178, + 56.676, + 57.175, + 57.679, + 58.182 ], - "bpm": 118.3, + "bpm": 119.7, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 27, - "t": 58.172, - "dur": 2.528, + "t": 58.182, + "dur": 2.467, "beats": [ - 58.172, - 58.679, - 59.185, - 59.691, - 60.196, - 60.7 + 58.182, + 58.675, + 59.168, + 59.682, + 60.167, + 60.65 ], - "bpm": 118.7, + "bpm": 121.6, "chord": "B", "agree": 0.8, "strum": "X..XX.X..." }, { "n": 28, - "t": 60.7, - "dur": 1.915, + "t": 60.65, + "dur": 1.99, "beats": [ - 60.7, - 61.179, - 61.658, - 62.137, - 62.615 + 60.65, + 61.159, + 61.669, + 62.154, + 62.639 ], - "bpm": 125.3, + "bpm": 120.6, "chord": "Emaj7", "agree": 1, "strum": "X..XX..X" }, { "n": 29, - "t": 62.615, - "dur": 1.91, + "t": 62.639, + "dur": 1.918, "beats": [ - 62.615, - 63.093, - 63.571, - 64.048, - 64.526 + 62.639, + 63.125, + 63.603, + 64.08, + 64.558 ], - "bpm": 125.6, + "bpm": 125.1, "chord": "Emaj7", "agree": 0.75, "strum": "..X.X..X" }, { "n": 30, - "t": 64.526, - "dur": 1.907, + "t": 64.558, + "dur": 1.908, "beats": [ - 64.526, - 65.003, - 65.48, - 65.957, - 66.433 + 64.558, + 65.035, + 65.513, + 65.989, + 66.465 ], "bpm": 125.8, "chord": "G#m", @@ -859,30 +859,30 @@ }, { "n": 31, - "t": 66.433, - "dur": 1.903, + "t": 66.465, + "dur": 1.922, "beats": [ - 66.433, - 66.909, - 67.385, - 67.86, - 68.336 + 66.465, + 66.942, + 67.418, + 67.912, + 68.388 ], - "bpm": 126.1, + "bpm": 124.9, "chord": "G#m", "agree": 1, "strum": "X..XXXXX" }, { "n": 32, - "t": 68.336, + "t": 68.388, "dur": 1.905, "beats": [ - 68.336, - 68.813, - 69.289, - 69.765, - 70.241 + 68.388, + 68.864, + 69.34, + 69.816, + 70.292 ], "bpm": 126, "chord": "B", @@ -891,95 +891,94 @@ }, { "n": 33, - "t": 70.241, - "dur": 1.904, + "t": 70.292, + "dur": 1.905, "beats": [ - 70.241, - 70.717, - 71.193, - 71.669, - 72.145 + 70.292, + 70.769, + 71.245, + 71.721, + 72.198 ], - "bpm": 126.1, + "bpm": 126, "chord": "B", "agree": 1, "strum": "X..XX..." }, { "n": 34, - "t": 72.145, - "dur": 1.902, + "t": 72.198, + "dur": 1.905, "beats": [ - 72.145, - 72.62, - 73.096, - 73.571, - 74.047 + 72.198, + 72.673, + 73.148, + 73.625, + 74.102 ], - "bpm": 126.2, + "bpm": 126, "chord": "B", "agree": 0.5, "strum": "X..XX..X" }, { "n": 35, - "t": 74.047, - "dur": 1.903, + "t": 74.102, + "dur": 1.911, "beats": [ - 74.047, - 74.523, - 74.999, - 75.475, - 75.95 + 74.102, + 74.579, + 75.055, + 75.531, + 76.013 ], - "bpm": 126.1, + "bpm": 125.6, "chord": "G#m", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 36, - "t": 75.95, - "dur": 1.903, + "t": 76.013, + "dur": 1.916, "beats": [ - 75.95, - 76.426, - 76.902, - 77.378, - 77.853 + 76.013, + 76.489, + 76.965, + 77.447, + 77.929 ], - "bpm": 126.1, + "bpm": 125.3, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 37, - "t": 77.853, - "dur": 1.903, + "t": 77.929, + "dur": 1.916, "beats": [ - 77.853, - 78.329, - 78.805, - 79.281, - 79.757 + 77.929, + 78.404, + 78.88, + 79.362, + 79.844 ], - "bpm": 126.1, + "bpm": 125.3, "chord": "G#m", "agree": 1, "strum": "X..XXXXX" }, { "n": 38, - "t": 79.757, + "t": 79.844, "dur": 1.904, "beats": [ - 79.757, - 80.232, - 80.708, - 81.184, - 81.66, - 81.661 + 79.844, + 80.32, + 80.796, + 81.272, + 81.748 ], "bpm": 126.1, "chord": "B", @@ -988,62 +987,62 @@ }, { "n": 39, - "t": 81.66, - "dur": 1.904, + "t": 81.748, + "dur": 1.938, "beats": [ - 81.66, - 82.136, - 82.612, - 83.088, - 83.564 + 81.748, + 82.241, + 82.734, + 83.21, + 83.686 ], - "bpm": 126, + "bpm": 123.8, "chord": "B", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 40, - "t": 83.564, - "dur": 1.904, + "t": 83.686, + "dur": 1.905, "beats": [ - 83.564, - 84.04, - 84.516, - 84.992, - 85.468 + 83.686, + 84.162, + 84.638, + 85.115, + 85.591 ], - "bpm": 126.1, + "bpm": 126, "chord": "B", "agree": 0.5, "strum": "X..XX..X" }, { "n": 41, - "t": 85.468, - "dur": 1.902, + "t": 85.591, + "dur": 1.916, "beats": [ - 85.468, - 85.944, - 86.42, - 86.895, - 87.37 + 85.591, + 86.067, + 86.542, + 87.025, + 87.507 ], - "bpm": 126.2, + "bpm": 125.3, "chord": "Emaj7", "agree": 0.75, "strum": "X..XX..X" }, { "n": 42, - "t": 87.37, + "t": 87.507, "dur": 1.907, "beats": [ - 87.37, - 87.846, - 88.322, - 88.8, - 89.277 + 87.507, + 87.983, + 88.459, + 88.936, + 89.414 ], "bpm": 125.8, "chord": "B", @@ -1052,175 +1051,174 @@ }, { "n": 43, - "t": 89.277, - "dur": 1.913, + "t": 89.414, + "dur": 1.916, "beats": [ - 89.277, - 89.755, - 90.233, - 90.711, - 91.19 + 89.414, + 89.891, + 90.369, + 90.848, + 91.33 ], - "bpm": 125.5, + "bpm": 125.2, "chord": "G#m", "agree": 0.75, "strum": "XXX.XXXX" }, { "n": 44, - "t": 91.19, - "dur": 1.918, + "t": 91.33, + "dur": 2.005, "beats": [ - 91.19, - 91.669, - 92.148, - 92.628, - 93.108 + 91.33, + 91.839, + 92.349, + 92.841, + 93.335 ], - "bpm": 125.1, + "bpm": 119.7, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 45, - "t": 93.108, - "dur": 1.927, + "t": 93.335, + "dur": 1.982, "beats": [ - 93.108, - 93.589, - 94.071, - 94.553, - 95.035 + 93.335, + 93.827, + 94.321, + 94.819, + 95.317 ], - "bpm": 124.5, + "bpm": 121.1, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 46, - "t": 95.035, - "dur": 1.928, + "t": 95.317, + "dur": 1.972, "beats": [ - 95.035, - 95.518, - 96, - 96.482, - 96.964 + 95.317, + 95.804, + 96.292, + 96.79, + 97.288 ], - "bpm": 124.5, + "bpm": 121.7, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 47, - "t": 96.964, - "dur": 1.929, + "t": 97.288, + "dur": 1.983, "beats": [ - 96.964, - 97.446, - 97.928, - 98.41, - 98.893 + 97.288, + 97.798, + 98.307, + 98.79, + 99.272 ], - "bpm": 124.4, + "bpm": 121, "chord": "B", "agree": 0.75, "strum": "X..XX..X" }, { "n": 48, - "t": 98.893, - "dur": 1.928, + "t": 99.272, + "dur": 1.961, "beats": [ - 98.893, - 99.375, - 99.857, - 100.339, - 100.821 + 99.272, + 99.76, + 100.247, + 100.74, + 101.233 ], - "bpm": 124.5, + "bpm": 122.4, "chord": "G#m", "agree": 0.75, "strum": "X..XX..X" }, { "n": 49, - "t": 100.821, - "dur": 1.924, + "t": 101.233, + "dur": 2.004, "beats": [ - 100.821, - 101.302, - 101.783, - 102.264, - 102.744, - 102.745 + 101.233, + 101.737, + 102.241, + 102.733, + 103.237 ], - "bpm": 124.8, + "bpm": 119.8, "chord": "Emaj7", "agree": 0.75, "strum": "X..XX.X." }, { "n": 50, - "t": 102.744, - "dur": 1.921, + "t": 103.237, + "dur": 1.939, "beats": [ - 102.744, - 103.225, - 103.706, - 104.186, - 104.665 + 103.237, + 103.725, + 104.212, + 104.694, + 105.176 ], - "bpm": 124.9, + "bpm": 123.8, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 51, - "t": 104.665, - "dur": 1.911, + "t": 105.176, + "dur": 1.928, "beats": [ - 104.665, - 105.144, - 105.622, - 106.099, - 106.577 + 105.176, + 105.658, + 106.14, + 106.622, + 107.104 ], - "bpm": 125.6, + "bpm": 124.5, "chord": "G#m", "agree": 1, "strum": "X..XX.XX" }, { "n": 52, - "t": 106.577, - "dur": 1.902, + "t": 107.104, + "dur": 1.935, "beats": [ - 106.577, - 107.053, - 107.528, - 108.004, - 108.479 + 107.104, + 107.596, + 108.089, + 108.564, + 109.039 ], - "bpm": 126.2, + "bpm": 124, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 53, - "t": 108.479, + "t": 109.039, "dur": 1.898, "beats": [ - 108.479, - 108.953, - 109.428, - 109.903, - 110.377 + 109.039, + 109.514, + 109.989, + 110.463, + 110.938 ], "bpm": 126.4, "chord": "B", @@ -1229,14 +1227,14 @@ }, { "n": 54, - "t": 110.377, + "t": 110.938, "dur": 1.891, "beats": [ - 110.377, - 110.851, - 111.323, - 111.795, - 112.268 + 110.938, + 111.411, + 111.884, + 112.356, + 112.829 ], "bpm": 126.9, "chord": "B", @@ -1245,30 +1243,30 @@ }, { "n": 55, - "t": 112.268, - "dur": 1.892, + "t": 112.829, + "dur": 1.899, "beats": [ - 112.268, - 112.741, - 113.215, - 113.687, - 114.16 + 112.829, + 113.305, + 113.781, + 114.254, + 114.727 ], - "bpm": 126.8, + "bpm": 126.4, "chord": "G#m", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 56, - "t": 114.16, + "t": 114.727, "dur": 1.89, "beats": [ - 114.16, - 114.633, - 115.105, - 115.578, - 116.05 + 114.727, + 115.2, + 115.672, + 116.144, + 116.617 ], "bpm": 127, "chord": "G#m", @@ -1277,14 +1275,14 @@ }, { "n": 57, - "t": 116.05, + "t": 116.617, "dur": 1.888, "beats": [ - 116.05, - 116.522, - 116.994, - 117.466, - 117.938 + 116.617, + 117.089, + 117.561, + 118.033, + 118.505 ], "bpm": 127.1, "chord": "G#m", @@ -1293,14 +1291,14 @@ }, { "n": 58, - "t": 117.938, + "t": 118.505, "dur": 1.886, "beats": [ - 117.938, - 118.409, - 118.88, - 119.352, - 119.824 + 118.505, + 118.976, + 119.447, + 119.919, + 120.39 ], "bpm": 127.3, "chord": "B", @@ -1309,30 +1307,30 @@ }, { "n": 59, - "t": 119.824, - "dur": 1.882, + "t": 120.39, + "dur": 1.883, "beats": [ - 119.824, - 120.294, - 120.765, - 121.235, - 121.706 + 120.39, + 120.861, + 121.332, + 121.803, + 122.274 ], - "bpm": 127.5, + "bpm": 127.4, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 60, - "t": 121.706, + "t": 122.274, "dur": 1.884, "beats": [ - 121.706, - 122.177, - 122.648, - 123.119, - 123.59 + 122.274, + 122.744, + 123.216, + 123.687, + 124.158 ], "bpm": 127.4, "chord": "B", @@ -1341,30 +1339,30 @@ }, { "n": 61, - "t": 123.59, - "dur": 1.887, + "t": 124.158, + "dur": 1.908, "beats": [ - 123.59, - 124.061, - 124.533, - 125.005, - 125.477 + 124.158, + 124.629, + 125.101, + 125.573, + 126.066 ], - "bpm": 127.2, + "bpm": 125.8, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 62, - "t": 125.477, + "t": 126.066, "dur": 1.891, "beats": [ - 125.477, - 125.949, - 126.422, - 126.895, - 127.368 + 126.066, + 126.538, + 127.011, + 127.484, + 127.957 ], "bpm": 126.9, "chord": "G#m", @@ -1373,30 +1371,30 @@ }, { "n": 63, - "t": 127.368, - "dur": 1.893, + "t": 127.957, + "dur": 1.917, "beats": [ - 127.368, - 127.84, - 128.313, - 128.787, - 129.261 + 127.957, + 128.433, + 128.909, + 129.391, + 129.874 ], - "bpm": 126.8, + "bpm": 125.2, "chord": "G#m", "agree": 1, "strum": "X..XX.XX" }, { "n": 64, - "t": 129.261, + "t": 129.874, "dur": 1.897, "beats": [ - 129.261, - 129.735, - 130.209, - 130.683, - 131.158 + 129.874, + 130.347, + 130.822, + 131.296, + 131.771 ], "bpm": 126.5, "chord": "B", @@ -1405,14 +1403,14 @@ }, { "n": 65, - "t": 131.158, + "t": 131.771, "dur": 1.899, "beats": [ - 131.158, - 131.633, - 132.108, - 132.583, - 133.057 + 131.771, + 132.246, + 132.721, + 133.195, + 133.67 ], "bpm": 126.4, "chord": "B", @@ -1421,30 +1419,30 @@ }, { "n": 66, - "t": 133.057, - "dur": 1.895, + "t": 133.67, + "dur": 1.952, "beats": [ - 133.057, - 133.531, - 134.004, - 134.478, - 134.952 + 133.67, + 134.168, + 134.666, + 135.14, + 135.622 ], - "bpm": 126.6, + "bpm": 122.9, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 67, - "t": 134.952, + "t": 135.622, "dur": 1.897, "beats": [ - 134.952, - 135.426, - 135.9, - 136.375, - 136.849 + 135.622, + 136.096, + 136.57, + 137.044, + 137.519 ], "bpm": 126.5, "chord": "G#m", @@ -1453,14 +1451,14 @@ }, { "n": 68, - "t": 136.849, + "t": 137.519, "dur": 1.894, "beats": [ - 136.849, - 137.323, - 137.797, - 138.27, - 138.743 + 137.519, + 137.993, + 138.467, + 138.94, + 139.413 ], "bpm": 126.7, "chord": "G#m", @@ -1469,14 +1467,14 @@ }, { "n": 69, - "t": 138.743, + "t": 139.413, "dur": 1.89, "beats": [ - 138.743, - 139.215, - 139.688, - 140.16, - 140.633 + 139.413, + 139.885, + 140.357, + 140.83, + 141.302 ], "bpm": 127, "chord": "G#m", @@ -1485,15 +1483,14 @@ }, { "n": 70, - "t": 140.633, + "t": 141.302, "dur": 1.89, "beats": [ - 140.633, - 141.105, - 141.577, - 142.05, - 142.522, - 142.523 + 141.302, + 141.775, + 142.247, + 142.719, + 143.192 ], "bpm": 127, "chord": "G#m", @@ -1502,14 +1499,14 @@ }, { "n": 71, - "t": 142.522, + "t": 143.192, "dur": 1.889, "beats": [ - 142.522, - 142.995, - 143.467, - 143.94, - 144.411 + 143.192, + 143.665, + 144.137, + 144.609, + 145.081 ], "bpm": 127, "chord": "B", @@ -1518,30 +1515,30 @@ }, { "n": 72, - "t": 144.411, - "dur": 1.888, + "t": 145.081, + "dur": 1.908, "beats": [ - 144.411, - 144.883, - 145.355, - 145.827, - 146.299 + 145.081, + 145.553, + 146.025, + 146.497, + 146.989 ], - "bpm": 127.1, + "bpm": 125.8, "chord": "B", "agree": 0.5, "strum": "X.XXX.XX" }, { "n": 73, - "t": 146.299, + "t": 146.989, "dur": 1.89, "beats": [ - 146.299, - 146.772, - 147.244, - 147.717, - 148.189 + 146.989, + 147.462, + 147.934, + 148.406, + 148.879 ], "bpm": 127, "chord": "Emaj7", @@ -1550,14 +1547,14 @@ }, { "n": 74, - "t": 148.189, + "t": 148.879, "dur": 1.89, "beats": [ - 148.189, - 148.662, - 149.134, - 149.607, - 150.08 + 148.879, + 149.351, + 149.824, + 150.296, + 150.769 ], "bpm": 127, "chord": "B", @@ -1566,15 +1563,14 @@ }, { "n": 75, - "t": 150.08, + "t": 150.769, "dur": 1.889, "beats": [ - 150.08, - 150.552, - 151.024, - 151.496, - 151.968, - 151.969 + 150.769, + 151.241, + 151.713, + 152.185, + 152.658 ], "bpm": 127.1, "chord": "G#m", @@ -1583,14 +1579,14 @@ }, { "n": 76, - "t": 151.968, + "t": 152.658, "dur": 1.891, "beats": [ - 151.968, - 152.441, - 152.914, - 153.387, - 153.859 + 152.658, + 153.131, + 153.604, + 154.077, + 154.549 ], "bpm": 126.9, "chord": "G#m", @@ -1599,14 +1595,14 @@ }, { "n": 77, - "t": 153.859, + "t": 154.549, "dur": 1.889, "beats": [ - 153.859, - 154.332, - 154.804, - 155.276, - 155.749 + 154.549, + 155.021, + 155.494, + 155.966, + 156.439 ], "bpm": 127, "chord": "B", @@ -1615,46 +1611,46 @@ }, { "n": 78, - "t": 155.749, - "dur": 1.889, + "t": 156.439, + "dur": 1.909, "beats": [ - 155.749, - 156.221, - 156.694, - 157.166, - 157.638 + 156.439, + 156.931, + 157.403, + 157.876, + 158.348 ], - "bpm": 127, + "bpm": 125.7, "chord": "B", "agree": 1, "strum": "XXXXX..X" }, { "n": 79, - "t": 157.638, - "dur": 1.885, + "t": 158.348, + "dur": 1.897, "beats": [ - 157.638, - 158.11, - 158.582, - 159.053, - 159.523 + 158.348, + 158.819, + 159.291, + 159.763, + 160.245 ], - "bpm": 127.3, + "bpm": 126.5, "chord": "B", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 80, - "t": 159.523, + "t": 160.245, "dur": 1.875, "beats": [ - 159.523, - 159.993, - 160.462, - 160.931, - 161.399 + 160.245, + 160.715, + 161.184, + 161.652, + 162.12 ], "bpm": 128, "chord": "Emaj7", @@ -1663,15 +1659,14 @@ }, { "n": 81, - "t": 161.399, + "t": 162.12, "dur": 1.87, "beats": [ - 161.399, - 161.867, - 162.334, - 162.801, - 163.268, - 163.269 + 162.12, + 162.588, + 163.055, + 163.523, + 163.989 ], "bpm": 128.4, "chord": "G#m", @@ -1680,14 +1675,14 @@ }, { "n": 82, - "t": 163.268, + "t": 163.989, "dur": 1.865, "beats": [ - 163.268, - 163.735, - 164.201, - 164.667, - 165.133 + 163.989, + 164.456, + 164.922, + 165.388, + 165.855 ], "bpm": 128.7, "chord": "G#m", @@ -1696,14 +1691,14 @@ }, { "n": 83, - "t": 165.133, + "t": 165.855, "dur": 1.864, "beats": [ - 165.133, - 165.6, - 166.066, - 166.532, - 166.998 + 165.855, + 166.321, + 166.787, + 167.253, + 167.719 ], "bpm": 128.7, "chord": "G#m", @@ -1712,14 +1707,14 @@ }, { "n": 84, - "t": 166.998, + "t": 167.719, "dur": 1.87, "beats": [ - 166.998, - 167.465, - 167.932, - 168.4, - 168.868 + 167.719, + 168.186, + 168.653, + 169.121, + 169.589 ], "bpm": 128.4, "chord": "B", @@ -2339,1517 +2334,1517 @@ "dir": "U" }, { - "t": 54.836, + "t": 54.852, "amp": 0.55, "dir": "D" }, { - "t": 55.126, + "t": 55.148, "amp": 0.82, "dir": "U" }, { - "t": 55.635, + "t": 55.663, "amp": 0.74, "dir": "D" }, { - "t": 56.143, + "t": 56.178, "amp": 1.16, "dir": "U" }, { - "t": 56.912, + "t": 56.933, "amp": 0.36, "dir": "D" }, { - "t": 57.157, + "t": 57.175, "amp": 0.69, "dir": "U" }, { - "t": 57.928, + "t": 57.941, "amp": 0.68, "dir": "U" }, { - "t": 58.172, + "t": 58.182, "amp": 1.08, "dir": "U" }, { - "t": 58.949, + "t": 58.938, "amp": 0.59, "dir": "D" }, { - "t": 59.185, + "t": 59.168, "amp": 0.82, "dir": "U" }, { - "t": 59.691, + "t": 59.682, "amp": 0.7, "dir": "D" }, { - "t": 60.7, + "t": 60.65, "amp": 0.97, "dir": "U" }, { - "t": 61.359, + "t": 61.351, "amp": 0.56, "dir": "D" }, { - "t": 61.658, + "t": 61.669, "amp": 0.76, "dir": "U" }, { - "t": 62.285, + "t": 62.304, "amp": 0.42, "dir": "D" }, { - "t": 63.093, + "t": 63.125, "amp": 1.08, "dir": "U" }, { - "t": 63.571, + "t": 63.603, "amp": 0.77, "dir": "D" }, { - "t": 64.298, + "t": 64.33, "amp": 0.58, "dir": "D" }, { - "t": 64.526, + "t": 64.558, "amp": 0.94, "dir": "U" }, { - "t": 65.327, + "t": 65.359, "amp": 0.32, "dir": "D" }, { - "t": 65.48, + "t": 65.513, "amp": 0.72, "dir": "U" }, { - "t": 66.226, + "t": 66.258, "amp": 0.66, "dir": "U" }, { - "t": 66.456, + "t": 66.488, "amp": 0.31, "dir": "D" }, { - "t": 67.046, + "t": 67.08, "amp": 0.49, "dir": "D" }, { - "t": 67.385, + "t": 67.418, "amp": 0.95, "dir": "U" }, { - "t": 67.628, + "t": 67.671, "amp": 0.27, "dir": "D" }, { - "t": 67.86, + "t": 67.912, "amp": 0.54, "dir": "D" }, { - "t": 68.06, + "t": 68.111, "amp": 0.33, "dir": "D" }, { - "t": 68.336, + "t": 68.388, "amp": 0.78, "dir": "U" }, { - "t": 69.087, + "t": 69.138, "amp": 0.66, "dir": "D" }, { - "t": 69.289, + "t": 69.34, "amp": 0.8, "dir": "U" }, { - "t": 70.031, + "t": 70.082, "amp": 0.65, "dir": "D" }, { - "t": 70.241, + "t": 70.292, "amp": 0.88, "dir": "U" }, { - "t": 70.961, + "t": 71.012, "amp": 0.6, "dir": "U" }, { - "t": 71.193, + "t": 71.245, "amp": 0.9, "dir": "U" }, { - "t": 72.145, + "t": 72.198, "amp": 1.38, "dir": "U" }, { - "t": 72.875, + "t": 72.927, "amp": 0.56, "dir": "D" }, { - "t": 73.096, + "t": 73.148, "amp": 0.63, "dir": "U" }, { - "t": 73.665, + "t": 73.718, "amp": 0.12, "dir": "D" }, { - "t": 73.861, + "t": 73.915, "amp": 0.28, "dir": "D" }, { - "t": 74.047, + "t": 74.102, "amp": 0.7, "dir": "U" }, { - "t": 74.779, + "t": 74.835, "amp": 0.49, "dir": "D" }, { - "t": 74.999, + "t": 75.055, "amp": 0.7, "dir": "U" }, { - "t": 75.27, + "t": 75.327, "amp": 0.2, "dir": "D" }, { - "t": 75.475, + "t": 75.531, "amp": 1, "dir": "U" }, { - "t": 75.745, + "t": 75.804, "amp": 0.3, "dir": "D" }, { - "t": 75.95, + "t": 76.013, "amp": 1.24, "dir": "U" }, { - "t": 76.676, + "t": 76.738, "amp": 0.59, "dir": "D" }, { - "t": 76.902, + "t": 76.965, "amp": 0.84, "dir": "U" }, { - "t": 77.626, + "t": 77.699, "amp": 0.64, "dir": "D" }, { - "t": 77.853, + "t": 77.929, "amp": 1.03, "dir": "U" }, { - "t": 78.581, + "t": 78.657, "amp": 0.53, "dir": "D" }, { - "t": 78.805, + "t": 78.88, "amp": 0.6, "dir": "D" }, { - "t": 79.053, + "t": 79.132, "amp": 0.22, "dir": "D" }, { - "t": 79.281, + "t": 79.362, "amp": 0.81, "dir": "U" }, { - "t": 79.529, + "t": 79.614, "amp": 0.32, "dir": "D" }, { - "t": 79.757, + "t": 79.844, "amp": 0.95, "dir": "U" }, { - "t": 80.465, + "t": 80.553, "amp": 0.67, "dir": "D" }, { - "t": 80.708, + "t": 80.796, "amp": 0.91, "dir": "U" }, { - "t": 81.422, + "t": 81.51, "amp": 0.54, "dir": "U" }, { - "t": 81.66, + "t": 81.748, "amp": 0.89, "dir": "U" }, { - "t": 82.369, + "t": 82.482, "amp": 0.5, "dir": "D" }, { - "t": 82.612, + "t": 82.734, "amp": 0.69, "dir": "U" }, { - "t": 83.088, + "t": 83.21, "amp": 0.66, "dir": "D" }, { - "t": 83.354, + "t": 83.476, "amp": 0.35, "dir": "D" }, { - "t": 83.564, + "t": 83.686, "amp": 0.77, "dir": "U" }, { - "t": 84.27, + "t": 84.392, "amp": 0.57, "dir": "D" }, { - "t": 84.516, + "t": 84.638, "amp": 0.69, "dir": "U" }, { - "t": 85.282, + "t": 85.405, "amp": 0.48, "dir": "D" }, { - "t": 85.468, + "t": 85.591, "amp": 0.98, "dir": "U" }, { - "t": 86.187, + "t": 86.31, "amp": 0.67, "dir": "D" }, { - "t": 86.42, + "t": 86.542, "amp": 0.76, "dir": "U" }, { - "t": 87.132, + "t": 87.265, "amp": 0.52, "dir": "D" }, { - "t": 87.37, + "t": 87.507, "amp": 0.76, "dir": "U" }, { - "t": 87.646, + "t": 87.783, "amp": 0.27, "dir": "D" }, { - "t": 87.846, + "t": 87.983, "amp": 0.5, "dir": "D" }, { - "t": 88.073, + "t": 88.21, "amp": 0.36, "dir": "D" }, { - "t": 88.322, + "t": 88.459, "amp": 0.61, "dir": "U" }, { - "t": 88.589, + "t": 88.725, "amp": 0.11, "dir": "D" }, { - "t": 88.8, + "t": 88.936, "amp": 0.39, "dir": "D" }, { - "t": 89.277, + "t": 89.414, "amp": 0.42, "dir": "D" }, { - "t": 89.55, + "t": 89.687, "amp": 0.26, "dir": "D" }, { - "t": 89.755, + "t": 89.891, "amp": 0.71, "dir": "D" }, { - "t": 90.005, + "t": 90.142, "amp": 0.16, "dir": "D" }, { - "t": 90.233, + "t": 90.369, "amp": 0.47, "dir": "D" }, { - "t": 90.467, + "t": 90.603, "amp": 0.3, "dir": "D" }, { - "t": 90.711, + "t": 90.848, "amp": 0.78, "dir": "U" }, { - "t": 91.005, + "t": 91.144, "amp": 0.39, "dir": "D" }, { - "t": 91.19, + "t": 91.33, "amp": 0.98, "dir": "U" }, { - "t": 91.911, + "t": 92.097, "amp": 0.45, "dir": "D" }, { - "t": 92.148, + "t": 92.349, "amp": 0.75, "dir": "D" }, { - "t": 92.895, + "t": 93.116, "amp": 0.53, "dir": "D" }, { - "t": 93.108, + "t": 93.335, "amp": 0.7, "dir": "D" }, { - "t": 93.825, + "t": 94.069, "amp": 0.49, "dir": "D" }, { - "t": 94.071, + "t": 94.321, "amp": 0.56, "dir": "D" }, { - "t": 94.803, + "t": 95.076, "amp": 0.6, "dir": "D" }, { - "t": 95.035, + "t": 95.317, "amp": 0.79, "dir": "U" }, { - "t": 95.783, + "t": 96.072, "amp": 0.46, "dir": "D" }, { - "t": 96, + "t": 96.292, "amp": 0.7, "dir": "U" }, { - "t": 96.72, + "t": 97.037, "amp": 0.61, "dir": "D" }, { - "t": 96.964, + "t": 97.288, "amp": 0.69, "dir": "U" }, { - "t": 97.742, + "t": 98.11, "amp": 0.35, "dir": "D" }, { - "t": 97.928, + "t": 98.307, "amp": 0.78, "dir": "U" }, { - "t": 98.63, + "t": 99.009, "amp": 0.57, "dir": "U" }, { - "t": 98.893, + "t": 99.272, "amp": 1.08, "dir": "U" }, { - "t": 99.618, + "t": 100.006, "amp": 0.59, "dir": "D" }, { - "t": 99.857, + "t": 100.247, "amp": 0.9, "dir": "U" }, { - "t": 100.596, + "t": 101.003, "amp": 0.63, "dir": "D" }, { - "t": 100.821, + "t": 101.233, "amp": 0.96, "dir": "U" }, { - "t": 101.532, + "t": 101.978, "amp": 0.56, "dir": "D" }, { - "t": 101.783, + "t": 102.241, "amp": 0.81, "dir": "U" }, { - "t": 102.264, + "t": 102.733, "amp": 0.72, "dir": "U" }, { - "t": 102.744, + "t": 103.237, "amp": 0.92, "dir": "U" }, { - "t": 103.479, + "t": 103.982, "amp": 0.23, "dir": "D" }, { - "t": 103.706, + "t": 104.212, "amp": 0.82, "dir": "U" }, { - "t": 104.426, + "t": 104.935, "amp": 0.62, "dir": "U" }, { - "t": 104.665, + "t": 105.176, "amp": 0.92, "dir": "U" }, { - "t": 105.394, + "t": 105.91, "amp": 0.48, "dir": "D" }, { - "t": 105.622, + "t": 106.14, "amp": 0.82, "dir": "U" }, { - "t": 106.099, + "t": 106.622, "amp": 1.12, "dir": "U" }, { - "t": 106.37, + "t": 106.895, "amp": 0.51, "dir": "U" }, { - "t": 106.577, + "t": 107.104, "amp": 0.7, "dir": "U" }, { - "t": 107.285, + "t": 107.837, "amp": 0.44, "dir": "D" }, { - "t": 107.528, + "t": 108.089, "amp": 0.8, "dir": "U" }, { - "t": 108.255, + "t": 108.816, "amp": 0.63, "dir": "D" }, { - "t": 108.479, + "t": 109.039, "amp": 0.54, "dir": "U" }, { - "t": 109.182, + "t": 109.743, "amp": 0.7, "dir": "U" }, { - "t": 109.428, + "t": 109.989, "amp": 0.67, "dir": "U" }, { - "t": 109.682, + "t": 110.243, "amp": 0.26, "dir": "D" }, { - "t": 110.135, + "t": 110.695, "amp": 0.58, "dir": "D" }, { - "t": 110.377, + "t": 110.938, "amp": 0.7, "dir": "U" }, { - "t": 111.096, + "t": 111.656, "amp": 0.55, "dir": "D" }, { - "t": 111.323, + "t": 111.884, "amp": 0.77, "dir": "U" }, { - "t": 112.268, + "t": 112.829, "amp": 0.92, "dir": "U" }, { - "t": 112.975, + "t": 113.54, "amp": 0.64, "dir": "D" }, { - "t": 113.215, + "t": 113.781, "amp": 0.91, "dir": "U" }, { - "t": 113.468, + "t": 114.034, "amp": 0.27, "dir": "D" }, { - "t": 113.687, + "t": 114.254, "amp": 0.99, "dir": "U" }, { - "t": 113.924, + "t": 114.491, "amp": 0.45, "dir": "D" }, { - "t": 114.16, + "t": 114.727, "amp": 0.8, "dir": "U" }, { - "t": 114.883, + "t": 115.45, "amp": 0.5, "dir": "D" }, { - "t": 115.105, + "t": 115.672, "amp": 0.8, "dir": "U" }, { - "t": 115.852, + "t": 116.419, "amp": 0.51, "dir": "D" }, { - "t": 116.05, + "t": 116.617, "amp": 1.25, "dir": "U" }, { - "t": 116.761, + "t": 117.327, "amp": 0.63, "dir": "D" }, { - "t": 116.994, + "t": 117.561, "amp": 0.99, "dir": "U" }, { - "t": 117.248, + "t": 117.815, "amp": 0.24, "dir": "D" }, { - "t": 117.466, + "t": 118.033, "amp": 0.45, "dir": "D" }, { - "t": 117.707, + "t": 118.274, "amp": 0.4, "dir": "D" }, { - "t": 117.938, + "t": 118.505, "amp": 0.87, "dir": "U" }, { - "t": 118.639, + "t": 119.206, "amp": 0.48, "dir": "U" }, { - "t": 118.88, + "t": 119.447, "amp": 0.64, "dir": "U" }, { - "t": 119.61, + "t": 120.177, "amp": 0.62, "dir": "D" }, { - "t": 119.824, + "t": 120.39, "amp": 0.58, "dir": "U" }, { - "t": 120.396, + "t": 120.963, "amp": 0.11, "dir": "D" }, { - "t": 120.541, + "t": 121.108, "amp": 0.47, "dir": "D" }, { - "t": 120.765, + "t": 121.332, "amp": 1.01, "dir": "U" }, { - "t": 121.005, + "t": 121.573, "amp": 0.3, "dir": "D" }, { - "t": 121.235, + "t": 121.803, "amp": 0.58, "dir": "U" }, { - "t": 121.482, + "t": 122.05, "amp": 0.37, "dir": "U" }, { - "t": 121.706, + "t": 122.274, "amp": 0.88, "dir": "U" }, { - "t": 122.438, + "t": 123.006, "amp": 0.49, "dir": "D" }, { - "t": 122.648, + "t": 123.216, "amp": 0.9, "dir": "U" }, { - "t": 123.355, + "t": 123.922, "amp": 0.81, "dir": "D" }, { - "t": 123.59, + "t": 124.158, "amp": 0.78, "dir": "U" }, { - "t": 124.335, + "t": 124.903, "amp": 0.45, "dir": "D" }, { - "t": 124.533, + "t": 125.101, "amp": 0.92, "dir": "U" }, { - "t": 124.781, + "t": 125.349, "amp": 0.62, "dir": "U" }, { - "t": 125.005, + "t": 125.573, "amp": 0.64, "dir": "U" }, { - "t": 125.268, + "t": 125.847, "amp": 0.43, "dir": "D" }, { - "t": 125.477, + "t": 126.066, "amp": 1, "dir": "U" }, { - "t": 126.202, + "t": 126.791, "amp": 0.49, "dir": "D" }, { - "t": 126.422, + "t": 127.011, "amp": 1.04, "dir": "U" }, { - "t": 127.172, + "t": 127.761, "amp": 0.71, "dir": "D" }, { - "t": 127.368, + "t": 127.957, "amp": 0.93, "dir": "U" }, { - "t": 128.096, + "t": 128.69, "amp": 0.61, "dir": "D" }, { - "t": 128.313, + "t": 128.909, "amp": 1, "dir": "U" }, { - "t": 128.583, + "t": 129.184, "amp": 0.16, "dir": "D" }, { - "t": 128.787, + "t": 129.391, "amp": 0.55, "dir": "D" }, { - "t": 129.056, + "t": 129.665, "amp": 0.3, "dir": "D" }, { - "t": 129.261, + "t": 129.874, "amp": 1.14, "dir": "U" }, { - "t": 129.986, + "t": 130.599, "amp": 0.61, "dir": "U" }, { - "t": 130.209, + "t": 130.822, "amp": 0.43, "dir": "U" }, { - "t": 130.506, + "t": 131.119, "amp": 0.18, "dir": "D" }, { - "t": 130.964, + "t": 131.576, "amp": 0.37, "dir": "D" }, { - "t": 131.158, + "t": 131.771, "amp": 0.82, "dir": "U" }, { - "t": 131.633, + "t": 132.246, "amp": 0.65, "dir": "D" }, { - "t": 131.915, + "t": 132.528, "amp": 0.26, "dir": "D" }, { - "t": 132.108, + "t": 132.721, "amp": 0.82, "dir": "U" }, { - "t": 133.057, + "t": 133.67, "amp": 0.81, "dir": "U" }, { - "t": 133.349, + "t": 133.976, "amp": 0.14, "dir": "D" }, { - "t": 133.568, + "t": 134.206, "amp": 0.18, "dir": "D" }, { - "t": 133.796, + "t": 134.447, "amp": 0.54, "dir": "D" }, { - "t": 134.004, + "t": 134.666, "amp": 0.98, "dir": "U" }, { - "t": 134.264, + "t": 134.925, "amp": 0.3, "dir": "D" }, { - "t": 134.478, + "t": 135.14, "amp": 0.71, "dir": "U" }, { - "t": 134.716, + "t": 135.381, "amp": 0.24, "dir": "D" }, { - "t": 134.952, + "t": 135.622, "amp": 1.02, "dir": "U" }, { - "t": 135.22, + "t": 135.89, "amp": 0.17, "dir": "D" }, { - "t": 135.678, + "t": 136.347, "amp": 0.66, "dir": "U" }, { - "t": 135.9, + "t": 136.57, "amp": 0.79, "dir": "U" }, { - "t": 136.171, + "t": 136.841, "amp": 0.28, "dir": "D" }, { - "t": 136.612, + "t": 137.281, "amp": 0.74, "dir": "U" }, { - "t": 136.849, + "t": 137.519, "amp": 0.83, "dir": "U" }, { - "t": 137.091, + "t": 137.761, "amp": 0.24, "dir": "D" }, { - "t": 137.323, + "t": 137.993, "amp": 0.8, "dir": "U" }, { - "t": 137.554, + "t": 138.224, "amp": 0.38, "dir": "D" }, { - "t": 137.797, + "t": 138.467, "amp": 0.81, "dir": "U" }, { - "t": 138.04, + "t": 138.709, "amp": 0.51, "dir": "U" }, { - "t": 138.27, + "t": 138.94, "amp": 0.77, "dir": "U" }, { - "t": 138.512, + "t": 139.182, "amp": 0.18, "dir": "D" }, { - "t": 138.743, + "t": 139.413, "amp": 0.77, "dir": "U" }, { - "t": 139.457, + "t": 140.126, "amp": 0.56, "dir": "D" }, { - "t": 139.688, + "t": 140.357, "amp": 0.69, "dir": "U" }, { - "t": 140.388, + "t": 141.057, "amp": 0.59, "dir": "U" }, { - "t": 140.633, + "t": 141.302, "amp": 0.9, "dir": "U" }, { - "t": 141.341, + "t": 142.011, "amp": 0.85, "dir": "D" }, { - "t": 141.577, + "t": 142.247, "amp": 0.93, "dir": "U" }, { - "t": 141.819, + "t": 142.489, "amp": 0.4, "dir": "U" }, { - "t": 142.05, + "t": 142.719, "amp": 0.64, "dir": "D" }, { - "t": 142.274, + "t": 142.944, "amp": 0.22, "dir": "D" }, { - "t": 142.522, + "t": 143.192, "amp": 0.66, "dir": "U" }, { - "t": 143.209, + "t": 143.879, "amp": 0.59, "dir": "U" }, { - "t": 143.467, + "t": 144.137, "amp": 0.64, "dir": "U" }, { - "t": 144.156, + "t": 144.826, "amp": 0.72, "dir": "U" }, { - "t": 144.411, + "t": 145.081, "amp": 0.89, "dir": "U" }, { - "t": 144.883, + "t": 145.553, "amp": 1.02, "dir": "U" }, { - "t": 145.102, + "t": 145.772, "amp": 0.35, "dir": "U" }, { - "t": 145.355, + "t": 146.025, "amp": 0.78, "dir": "U" }, { - "t": 145.585, + "t": 146.255, "amp": 0.19, "dir": "U" }, { - "t": 145.827, + "t": 146.497, "amp": 0.72, "dir": "U" }, { - "t": 146.1, + "t": 146.782, "amp": 0.29, "dir": "D" }, { - "t": 146.299, + "t": 146.989, "amp": 0.99, "dir": "U" }, { - "t": 147.028, + "t": 147.717, "amp": 0.53, "dir": "D" }, { - "t": 147.244, + "t": 147.934, "amp": 0.87, "dir": "U" }, { - "t": 147.947, + "t": 148.637, "amp": 0.38, "dir": "D" }, { - "t": 148.189, + "t": 148.879, "amp": 0.82, "dir": "U" }, { - "t": 148.922, + "t": 149.612, "amp": 0.68, "dir": "D" }, { - "t": 149.134, + "t": 149.824, "amp": 1, "dir": "U" }, { - "t": 149.42, + "t": 150.11, "amp": 0.12, "dir": "D" }, { - "t": 149.607, + "t": 150.296, "amp": 0.73, "dir": "U" }, { - "t": 150.08, + "t": 150.769, "amp": 1.23, "dir": "U" }, { - "t": 150.81, + "t": 151.5, "amp": 0.73, "dir": "D" }, { - "t": 151.012, + "t": 151.702, "amp": 0.27, "dir": "D" }, { - "t": 151.732, + "t": 152.422, "amp": 0.4, "dir": "D" }, { - "t": 151.968, + "t": 152.658, "amp": 0.93, "dir": "U" }, { - "t": 152.236, + "t": 152.925, "amp": 0.23, "dir": "D" }, { - "t": 152.702, + "t": 153.392, "amp": 0.34, "dir": "D" }, { - "t": 152.914, + "t": 153.604, "amp": 0.87, "dir": "D" }, { - "t": 153.184, + "t": 153.874, "amp": 0.25, "dir": "D" }, { - "t": 153.387, + "t": 154.077, "amp": 0.36, "dir": "D" }, { - "t": 153.672, + "t": 154.362, "amp": 0.15, "dir": "D" }, { - "t": 153.859, + "t": 154.549, "amp": 1.18, "dir": "U" }, { - "t": 154.597, + "t": 155.286, "amp": 0.51, "dir": "D" }, { - "t": 154.804, + "t": 155.494, "amp": 0.73, "dir": "U" }, { - "t": 155.074, + "t": 155.763, "amp": 0.3, "dir": "D" }, { - "t": 155.524, + "t": 156.214, "amp": 0.51, "dir": "U" }, { - "t": 155.749, + "t": 156.439, "amp": 0.81, "dir": "U" }, { - "t": 156.011, + "t": 156.712, "amp": 0.29, "dir": "D" }, { - "t": 156.221, + "t": 156.931, "amp": 0.45, "dir": "D" }, { - "t": 156.458, + "t": 157.167, "amp": 0.44, "dir": "U" }, { - "t": 156.694, + "t": 157.403, "amp": 0.61, "dir": "U" }, { - "t": 157.399, + "t": 158.109, "amp": 0.48, "dir": "U" }, { - "t": 157.638, + "t": 158.348, "amp": 0.89, "dir": "U" }, { - "t": 158.346, + "t": 159.055, "amp": 0.36, "dir": "D" }, { - "t": 158.582, + "t": 159.291, "amp": 0.91, "dir": "U" }, { - "t": 159.053, + "t": 159.763, "amp": 0.76, "dir": "U" }, { - "t": 159.299, + "t": 160.014, "amp": 0.22, "dir": "D" }, { - "t": 159.523, + "t": 160.245, "amp": 1.12, "dir": "U" }, { - "t": 160.213, + "t": 160.934, "amp": 0.89, "dir": "U" }, { - "t": 160.462, + "t": 161.184, "amp": 0.95, "dir": "U" }, { - "t": 161.187, + "t": 161.908, "amp": 0.71, "dir": "D" }, { - "t": 161.399, + "t": 162.12, "amp": 0.73, "dir": "U" }, { - "t": 161.645, + "t": 162.366, "amp": 0.42, "dir": "U" }, { - "t": 161.867, + "t": 162.588, "amp": 0.75, "dir": "U" }, { - "t": 162.106, + "t": 162.827, "amp": 0.36, "dir": "D" }, { - "t": 162.334, + "t": 163.055, "amp": 0.91, "dir": "U" }, { - "t": 162.568, + "t": 163.289, "amp": 0.33, "dir": "U" }, { - "t": 162.801, + "t": 163.523, "amp": 0.78, "dir": "U" }, { - "t": 163.034, + "t": 163.755, "amp": 0.36, "dir": "D" }, { - "t": 163.268, + "t": 163.989, "amp": 0.91, "dir": "U" }, { - "t": 163.965, + "t": 164.686, "amp": 0.54, "dir": "D" }, { - "t": 164.201, + "t": 164.922, "amp": 0.78, "dir": "U" }, { - "t": 164.897, + "t": 165.618, "amp": 0.64, "dir": "U" }, { - "t": 165.133, + "t": 165.855, "amp": 0.8, "dir": "U" }, { - "t": 165.839, + "t": 166.56, "amp": 0.57, "dir": "D" }, { - "t": 166.066, + "t": 166.787, "amp": 0.73, "dir": "U" }, { - "t": 166.31, + "t": 167.031, "amp": 0.51, "dir": "D" }, { - "t": 166.543, + "t": 167.264, "amp": 0.23, "dir": "D" }, { - "t": 166.753, + "t": 167.474, "amp": 0.54, "dir": "D" }, { - "t": 166.998, + "t": 167.719, "amp": 0.92, "dir": "U" }, { - "t": 167.692, + "t": 168.414, "amp": 0.56, "dir": "U" }, { - "t": 167.932, + "t": 168.653, "amp": 0.71, "dir": "U" }, { - "t": 168.636, + "t": 169.357, "amp": 0.62, "dir": "U" }, { - "t": 168.868, + "t": 169.589, "amp": 0.8, "dir": "U" }, { - "t": 169.611, + "t": 170.332, "amp": 0.64, "dir": "U" }, { - "t": 169.843, + "t": 170.564, "amp": 0.74, "dir": "U" }, { - "t": 170.064, + "t": 170.785, "amp": 0.28, "dir": "U" }, { - "t": 170.319, + "t": 171.04, "amp": 0.49, "dir": "U" }, { - "t": 170.528, + "t": 171.249, "amp": 0.33, "dir": "U" }, { - "t": 170.795, + "t": 171.516, "amp": 0.95, "dir": "U" }, { - "t": 173.175, + "t": 173.896, "amp": 0.3, "dir": "D" }, { - "t": 173.454, + "t": 174.175, "amp": 0.25, "dir": "D" } @@ -3858,17 +3853,17 @@ "keep": 0.3, "floorBar": 24, "medianBpm": 120.2, - "totalSec": 173.545 + "totalSec": 174.266 }, "cut": { "segments": [ { "name": "take", "from": 0, - "to": 173.525, + "to": 174.246, "offset": 0 } ], - "totalSec": 173.525 + "totalSec": 174.246 } } \ No newline at end of file diff --git a/pop/sailor-song/measures.reg.json b/pop/sailor-song/measures.reg.json index a70c4bfe6b..b1e57be639 100644 --- a/pop/sailor-song/measures.reg.json +++ b/pop/sailor-song/measures.reg.json @@ -116,251 +116,251 @@ 53.09008787847, 53.59888157195405, 54.10785525989205, - 54.616828947830044, - 55.125622641314095, - 55.634589060954305, - 56.14263359231784, - 56.64975956898965, - 57.15696410426977, - 57.6642631186425, - 58.17152788872035, - 58.678758551701094, - 59.18541386204914, - 59.691199036124, - 60.19601853055413, - 60.69984212125789, - 61.1793063988632, - 61.65838829939644, - 62.1370132883883, - 62.61518223654269, - 63.09307812139763, - 63.57068577196881, - 64.04796741163675, - 64.52554757855512, - 65.003340831606, - 65.48038845947893, - 65.95679533391554, - 66.43295638614387, - 66.908872836237, - 67.38452813220306, - 67.8602832663776, - 68.33632788850873, - 68.81257995322045, - 69.28873197107286, - 69.76488398892528, - 70.24105244769295, - 70.71722090646062, - 71.1933893652283, - 71.66925052956792, - 72.14492336850425, - 72.62040689559939, - 73.0957685620713, - 73.57142958459357, - 74.04728798420392, - 74.52304407159352, - 74.99869830180342, - 75.47454990346328, - 75.95049907881076, - 76.42634833450181, - 76.90219759019286, - 77.37785739362131, - 77.85321055857922, - 78.32883283793144, - 78.80472558781302, - 79.28051844172595, - 79.75653534634141, - 80.23225244693313, - 80.70805671249583, - 81.1841681989808, - 81.66018204522325, - 82.13601519997621, - 82.61195070010314, - 83.08816902465163, - 83.56438734920013, - 84.04040799802951, - 84.51622140578252, - 84.9920516278738, - 85.4680714380324, - 85.94410891585052, - 86.41955363944031, - 86.8946288065843, - 87.36990086480995, - 87.84579380551482, - 88.32242876340804, - 88.79953856035861, - 89.2769359908199, - 89.75460591509497, - 90.23264798402873, - 90.7111565845216, - 91.18993265676293, - 91.6688052126767, - 92.14797442374717, - 92.62782295682089, - 93.1081244227451, - 93.589077168313, - 94.07087718150237, - 94.55309236922395, - 95.03549386564183, - 95.51799331261576, - 96.00013763639116, - 96.48200705917789, - 96.96389224218849, - 97.44594695704059, - 97.92818710651267, - 98.4104114725341, - 98.89272754895644, - 99.37486999050621, - 99.85701243205598, - 100.33904054716423, - 100.82079754565754, - 101.30228373234343, - 101.78331888883112, - 102.26390385933115, - 102.74448882983118, - 103.2252667823867, - 103.70612410037047, - 104.1861734206947, - 104.66531940292464, - 105.14397093606209, - 105.62197962066358, - 106.09943284309054, - 106.57651338134494, - 107.05274339839181, - 107.52838391015919, - 108.0036300256327, - 108.47861051006056, - 108.95349381753606, - 109.42827998781421, - 109.90286966929953, - 110.37707472958185, - 110.85056954493281, - 111.32318549922621, - 111.79543627982753, - 112.26817988977741, - 112.74135194249897, - 113.21452399522052, - 113.68737869171198, - 114.16024999407782, - 114.63272043012573, - 115.10508272059961, - 115.57753309305029, - 116.04989752492108, - 116.52214168949467, - 116.99410096847804, - 117.4659619958692, - 117.93763673277475, - 118.40898817101623, - 118.88033960925772, - 119.35201434616327, - 119.82350293961994, - 120.29448274760031, - 120.7650380718522, - 121.23507383536553, - 121.70588375286549, - 122.17667720895277, - 122.64786868955088, - 123.11906017014898, - 123.59005651655644, - 124.06133658689365, - 124.53291806164542, - 125.00487991175814, - 125.47703608030204, - 125.94927811365403, - 126.42194768070125, - 126.89483663672131, - 127.36760205500283, - 127.84036747328436, - 128.31345813349867, - 128.78685700982066, - 129.26069643439885, - 129.73461119929644, - 130.20898447081603, - 130.68316946329983, - 131.15795472608758, - 131.63304276945246, - 132.10794647448725, - 132.58254451481505, - 133.0567579203967, - 133.53077531087553, - 134.00449128349214, - 134.4782916124099, - 134.9519831861583, - 135.42600345462373, - 135.90021187131168, - 136.37450690092894, - 136.84892324484102, - 137.32332204122, - 137.79707434613707, - 138.26996775877035, - 138.74286117140363, - 139.21535529931515, - 139.6877634707289, - 140.16015466334403, - 140.63266619816537, - 141.1049641116907, - 141.57726202521602, - 142.04955993874134, - 142.5222230988828, - 142.9949945424239, - 143.46745685998428, - 143.93951900404934, - 144.4112822109413, - 144.88304541783324, - 145.3549117060568, - 145.82696443613506, - 146.2994173237413, - 146.77187021134753, - 147.24434050282505, - 147.7167933904313, - 148.18916033654267, - 148.6615103068186, - 149.13417695596576, - 149.60663927352613, - 150.07951905009202, - 150.55163298397414, - 151.0236389354043, - 151.49573283595507, - 151.96804017324905, - 152.44111398132586, - 152.91408460140627, - 153.38686341975009, - 153.85934968131488, - 154.33163176719088, - 154.8039138530669, - 155.27617854893404, - 155.74884214168688, - 156.22140016133048, - 156.69376671366393, - 157.16601299762056, - 157.63827667023006, - 158.1098999360764, - 158.58152320192275, - 159.05294173079446, - 159.52347991359056, - 159.99348754567202, - 160.46240196642222, - 160.93078948980357, - 161.3987354819744, - 161.86657538965613, - 162.33422292867684, - 162.80146010041048, - 163.26828590011118, - 163.73453137478074, - 164.20067153449637, - 164.66701469186685, - 165.1334585753361, - 165.59955673938802, - 166.065746953508, - 166.5317767598561, - 166.99788309008798, - 167.4647473938636, - 167.93195415720174, - 168.39960530348034, - 168.8677642407363, - 169.3557642407363, - 169.8427642407363, - 170.3187642407363, - 170.7947642407363 + 54.62766658064677, + 55.1484212976279, + 55.66257224102413, + 56.17766658064677, + 56.67577978819394, + 57.17483639196753, + 57.67860997687319, + 58.18238356177885, + 58.674836391967524, + 59.168232618382625, + 59.682383561778856, + 60.166540371867484, + 60.64974204140264, + 61.159176003666786, + 61.66860996593093, + 62.1535156263083, + 62.63936468291207, + 63.12521373951584, + 63.60282139008702, + 64.08010302975497, + 64.55768319667334, + 65.03547644972421, + 65.51252407759715, + 65.98893917193676, + 66.46535426627638, + 66.94176936061601, + 67.41818445495562, + 67.91158068137071, + 68.38762530350184, + 68.86387736821355, + 69.34002938606596, + 69.81618140391838, + 70.29234986268605, + 70.76851832145373, + 71.2446867802214, + 71.72110187456101, + 72.19751696890063, + 72.67300049599577, + 73.14836216246768, + 73.62477725680729, + 74.10213574737332, + 74.57855084171295, + 75.05496593605257, + 75.53081753771244, + 76.01289300941056, + 76.4887422651016, + 76.96459152079265, + 77.44666699249076, + 77.92874246418889, + 78.40436474354111, + 78.88025749342269, + 79.3623329651208, + 79.84440843681892, + 80.32012553741065, + 80.79592980297335, + 81.27204128945831, + 81.74805513570077, + 82.24145136211585, + 82.73390419230454, + 83.21012251685303, + 83.68634084140153, + 84.16236149023091, + 84.63817489798392, + 85.11458999232353, + 85.59100508666315, + 86.06704256448127, + 86.54248728807106, + 87.02456275976917, + 87.50663823146728, + 87.98253117217214, + 88.45916613006537, + 88.93627592701594, + 89.41367335747722, + 89.8913432817523, + 90.36938535068606, + 90.84789395117893, + 91.32996942287704, + 91.8394033851412, + 92.34883734740535, + 92.84129017759402, + 93.3346864040091, + 93.82713923419779, + 94.32053546061287, + 94.81864866816005, + 95.31676187570721, + 95.80449772476383, + 96.29223357382044, + 96.79034678136762, + 97.28845998891478, + 97.79789395117893, + 98.30732791344307, + 98.7895522794645, + 99.27186835588685, + 99.75960420494347, + 100.24734005400008, + 100.73979288418874, + 101.23318911060385, + 101.7369626955095, + 102.24073628041518, + 102.73318911060386, + 103.23696269550952, + 103.72469854456612, + 104.21243439362274, + 104.69356646909443, + 105.17564194079256, + 105.65771741249067, + 106.13979288418878, + 106.6218683558869, + 107.10394382758501, + 107.59639665777368, + 108.08884948796236, + 108.56409560343587, + 109.03907608786373, + 109.51395939533923, + 109.98874556561738, + 110.4633352471027, + 110.93754030738502, + 111.41103512273598, + 111.88365107702938, + 112.3559018576307, + 112.82864546758059, + 113.30506056192021, + 113.78147565625983, + 114.2543303527513, + 114.72720165511713, + 115.19967209116504, + 115.67203438163892, + 116.1444847540896, + 116.61684918596039, + 117.08909335053399, + 117.56105262951735, + 118.0329136569085, + 118.50461177011606, + 118.97596320835754, + 119.44731464659903, + 119.91898938350458, + 120.39047797696125, + 120.86145778494162, + 121.33201310919351, + 121.80276782617464, + 122.27357774367461, + 122.74437119976189, + 123.21556268036, + 123.6867541609581, + 124.15775050736556, + 124.62903057770276, + 125.10061205245454, + 125.57257390256726, + 126.06597012898234, + 126.53821216233433, + 127.01088172938155, + 127.48377068540161, + 127.95653610368313, + 128.43295119802275, + 128.9093662923624, + 129.3914417640605, + 129.87351723575858, + 130.34743200065617, + 130.82180527217577, + 131.29599026465957, + 131.7707755274473, + 132.2458635708122, + 132.72076727584698, + 133.1953653161748, + 133.66957872175644, + 134.1676919293036, + 134.66580513685076, + 135.1396054657685, + 135.6216809374666, + 136.09570120593204, + 136.56990962262, + 137.04420465223726, + 137.51862099614934, + 137.99301979252832, + 138.46677209744539, + 138.93966551007867, + 139.41255892271195, + 139.88505305062347, + 140.35746122203722, + 140.82985241465235, + 141.3023639494737, + 141.774661862999, + 142.24695977652433, + 142.71925769004966, + 143.1919208501911, + 143.66469229373223, + 144.1371546112926, + 144.60921675535766, + 145.08097996224961, + 145.55274316914156, + 146.02460945736513, + 146.49666218744338, + 146.9891150176321, + 147.46156790523833, + 147.93403819671585, + 148.40649108432208, + 148.87885803043346, + 149.3512080007094, + 149.82387464985655, + 150.29633696741692, + 150.7692167439828, + 151.24133067786494, + 151.7133366292951, + 152.18543052984586, + 152.65773786713984, + 153.13081167521665, + 153.60378229529707, + 154.07656111364088, + 154.54904737520567, + 155.02132946108168, + 155.49361154695768, + 155.96587624282483, + 156.43853983557767, + 156.93099266576635, + 157.4033592180998, + 157.87560550205643, + 158.34786917466593, + 158.81949244051228, + 159.29111570635862, + 159.76253423523033, + 160.24460970692843, + 160.7146173390099, + 161.1835317597601, + 161.65191928314144, + 162.11986527531226, + 162.587705182994, + 163.0553527220147, + 163.52258989374835, + 163.98941569344905, + 164.4556611681186, + 164.92180132783423, + 165.38814448520472, + 165.85458836867397, + 166.3206865327259, + 166.78687674684588, + 167.25290655319395, + 167.71901288342585, + 168.18587718720147, + 168.6530839505396, + 169.1207350968182, + 169.58889403407417, + 170.07689403407417, + 170.56389403407417, + 171.03989403407417, + 171.51589403407417 ], "hitFraction": 0.584, "trackerOffsetMs": { @@ -763,94 +763,94 @@ { "n": 25, "t": 54.108, - "dur": 2.035, + "dur": 2.07, "beats": [ 54.108, - 54.617, - 55.126, - 55.635, - 56.143 + 54.628, + 55.148, + 55.663, + 56.178 ], - "bpm": 117.9, + "bpm": 116, "chord": "B", "agree": 1, "strum": "X..XX.X." }, { "n": 26, - "t": 56.143, - "dur": 2.029, + "t": 56.178, + "dur": 2.005, "beats": [ - 56.143, - 56.65, - 57.157, - 57.664, - 58.172 + 56.178, + 56.676, + 57.175, + 57.679, + 58.182 ], - "bpm": 118.3, + "bpm": 119.7, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 27, - "t": 58.172, - "dur": 2.528, + "t": 58.182, + "dur": 2.467, "beats": [ - 58.172, - 58.679, - 59.185, - 59.691, - 60.196, - 60.7 + 58.182, + 58.675, + 59.168, + 59.682, + 60.167, + 60.65 ], - "bpm": 118.7, + "bpm": 121.6, "chord": "B", "agree": 0.8, "strum": "X..XX.X..." }, { "n": 28, - "t": 60.7, - "dur": 1.915, + "t": 60.65, + "dur": 1.99, "beats": [ - 60.7, - 61.179, - 61.658, - 62.137, - 62.615 + 60.65, + 61.159, + 61.669, + 62.154, + 62.639 ], - "bpm": 125.3, + "bpm": 120.6, "chord": "Emaj7", "agree": 1, "strum": "X..XX..X" }, { "n": 29, - "t": 62.615, - "dur": 1.91, + "t": 62.639, + "dur": 1.918, "beats": [ - 62.615, - 63.093, - 63.571, - 64.048, - 64.526 + 62.639, + 63.125, + 63.603, + 64.08, + 64.558 ], - "bpm": 125.6, + "bpm": 125.1, "chord": "Emaj7", "agree": 0.75, "strum": "..X.X..X" }, { "n": 30, - "t": 64.526, - "dur": 1.907, + "t": 64.558, + "dur": 1.908, "beats": [ - 64.526, - 65.003, - 65.48, - 65.957, - 66.433 + 64.558, + 65.035, + 65.513, + 65.989, + 66.465 ], "bpm": 125.8, "chord": "G#m", @@ -859,30 +859,30 @@ }, { "n": 31, - "t": 66.433, - "dur": 1.903, + "t": 66.465, + "dur": 1.922, "beats": [ - 66.433, - 66.909, - 67.385, - 67.86, - 68.336 + 66.465, + 66.942, + 67.418, + 67.912, + 68.388 ], - "bpm": 126.1, + "bpm": 124.9, "chord": "G#m", "agree": 1, "strum": "X..XXXXX" }, { "n": 32, - "t": 68.336, + "t": 68.388, "dur": 1.905, "beats": [ - 68.336, - 68.813, - 69.289, - 69.765, - 70.241 + 68.388, + 68.864, + 69.34, + 69.816, + 70.292 ], "bpm": 126, "chord": "B", @@ -891,94 +891,94 @@ }, { "n": 33, - "t": 70.241, - "dur": 1.904, + "t": 70.292, + "dur": 1.905, "beats": [ - 70.241, - 70.717, - 71.193, - 71.669, - 72.145 + 70.292, + 70.769, + 71.245, + 71.721, + 72.198 ], - "bpm": 126.1, + "bpm": 126, "chord": "B", "agree": 1, "strum": "X..XX..." }, { "n": 34, - "t": 72.145, - "dur": 1.902, + "t": 72.198, + "dur": 1.905, "beats": [ - 72.145, - 72.62, - 73.096, - 73.571, - 74.047 + 72.198, + 72.673, + 73.148, + 73.625, + 74.102 ], - "bpm": 126.2, + "bpm": 126, "chord": "B", "agree": 0.5, "strum": "X..XX..X" }, { "n": 35, - "t": 74.047, - "dur": 1.903, + "t": 74.102, + "dur": 1.911, "beats": [ - 74.047, - 74.523, - 74.999, - 75.475, - 75.95 + 74.102, + 74.579, + 75.055, + 75.531, + 76.013 ], - "bpm": 126.1, + "bpm": 125.6, "chord": "G#m", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 36, - "t": 75.95, - "dur": 1.903, + "t": 76.013, + "dur": 1.916, "beats": [ - 75.95, - 76.426, - 76.902, - 77.378, - 77.853 + 76.013, + 76.489, + 76.965, + 77.447, + 77.929 ], - "bpm": 126.1, + "bpm": 125.3, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 37, - "t": 77.853, - "dur": 1.903, + "t": 77.929, + "dur": 1.916, "beats": [ - 77.853, - 78.329, - 78.805, - 79.281, - 79.757 + 77.929, + 78.404, + 78.88, + 79.362, + 79.844 ], - "bpm": 126.1, + "bpm": 125.3, "chord": "G#m", "agree": 1, "strum": "X..XXXXX" }, { "n": 38, - "t": 79.757, + "t": 79.844, "dur": 1.904, "beats": [ - 79.757, - 80.232, - 80.708, - 81.184, - 81.66 + 79.844, + 80.32, + 80.796, + 81.272, + 81.748 ], "bpm": 126.1, "chord": "B", @@ -987,62 +987,62 @@ }, { "n": 39, - "t": 81.66, - "dur": 1.904, + "t": 81.748, + "dur": 1.938, "beats": [ - 81.66, - 82.136, - 82.612, - 83.088, - 83.564 + 81.748, + 82.241, + 82.734, + 83.21, + 83.686 ], - "bpm": 126, + "bpm": 123.8, "chord": "B", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 40, - "t": 83.564, - "dur": 1.904, + "t": 83.686, + "dur": 1.905, "beats": [ - 83.564, - 84.04, - 84.516, - 84.992, - 85.468 + 83.686, + 84.162, + 84.638, + 85.115, + 85.591 ], - "bpm": 126.1, + "bpm": 126, "chord": "B", "agree": 0.5, "strum": "X..XX..X" }, { "n": 41, - "t": 85.468, - "dur": 1.902, + "t": 85.591, + "dur": 1.916, "beats": [ - 85.468, - 85.944, - 86.42, - 86.895, - 87.37 + 85.591, + 86.067, + 86.542, + 87.025, + 87.507 ], - "bpm": 126.2, + "bpm": 125.3, "chord": "Emaj7", "agree": 0.75, "strum": "X..XX..X" }, { "n": 42, - "t": 87.37, + "t": 87.507, "dur": 1.907, "beats": [ - 87.37, - 87.846, - 88.322, - 88.8, - 89.277 + 87.507, + 87.983, + 88.459, + 88.936, + 89.414 ], "bpm": 125.8, "chord": "B", @@ -1051,174 +1051,174 @@ }, { "n": 43, - "t": 89.277, - "dur": 1.913, + "t": 89.414, + "dur": 1.916, "beats": [ - 89.277, - 89.755, - 90.233, - 90.711, - 91.19 + 89.414, + 89.891, + 90.369, + 90.848, + 91.33 ], - "bpm": 125.5, + "bpm": 125.2, "chord": "G#m", "agree": 0.75, "strum": "XXX.XXXX" }, { "n": 44, - "t": 91.19, - "dur": 1.918, + "t": 91.33, + "dur": 2.005, "beats": [ - 91.19, - 91.669, - 92.148, - 92.628, - 93.108 + 91.33, + 91.839, + 92.349, + 92.841, + 93.335 ], - "bpm": 125.1, + "bpm": 119.7, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 45, - "t": 93.108, - "dur": 1.927, + "t": 93.335, + "dur": 1.982, "beats": [ - 93.108, - 93.589, - 94.071, - 94.553, - 95.035 + 93.335, + 93.827, + 94.321, + 94.819, + 95.317 ], - "bpm": 124.5, + "bpm": 121.1, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 46, - "t": 95.035, - "dur": 1.928, + "t": 95.317, + "dur": 1.972, "beats": [ - 95.035, - 95.518, - 96, - 96.482, - 96.964 + 95.317, + 95.804, + 96.292, + 96.79, + 97.288 ], - "bpm": 124.5, + "bpm": 121.7, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 47, - "t": 96.964, - "dur": 1.929, + "t": 97.288, + "dur": 1.983, "beats": [ - 96.964, - 97.446, - 97.928, - 98.41, - 98.893 + 97.288, + 97.798, + 98.307, + 98.79, + 99.272 ], - "bpm": 124.4, + "bpm": 121, "chord": "B", "agree": 0.75, "strum": "X..XX..X" }, { "n": 48, - "t": 98.893, - "dur": 1.928, + "t": 99.272, + "dur": 1.961, "beats": [ - 98.893, - 99.375, - 99.857, - 100.339, - 100.821 + 99.272, + 99.76, + 100.247, + 100.74, + 101.233 ], - "bpm": 124.5, + "bpm": 122.4, "chord": "G#m", "agree": 0.75, "strum": "X..XX..X" }, { "n": 49, - "t": 100.821, - "dur": 1.924, + "t": 101.233, + "dur": 2.004, "beats": [ - 100.821, - 101.302, - 101.783, - 102.264, - 102.744 + 101.233, + 101.737, + 102.241, + 102.733, + 103.237 ], - "bpm": 124.8, + "bpm": 119.8, "chord": "Emaj7", "agree": 0.75, "strum": "X..XX.X." }, { "n": 50, - "t": 102.744, - "dur": 1.921, + "t": 103.237, + "dur": 1.939, "beats": [ - 102.744, - 103.225, - 103.706, - 104.186, - 104.665 + 103.237, + 103.725, + 104.212, + 104.694, + 105.176 ], - "bpm": 124.9, + "bpm": 123.8, "chord": "G#m", "agree": 1, "strum": "X..XX..X" }, { "n": 51, - "t": 104.665, - "dur": 1.911, + "t": 105.176, + "dur": 1.928, "beats": [ - 104.665, - 105.144, - 105.622, - 106.099, - 106.577 + 105.176, + 105.658, + 106.14, + 106.622, + 107.104 ], - "bpm": 125.6, + "bpm": 124.5, "chord": "G#m", "agree": 1, "strum": "X..XX.XX" }, { "n": 52, - "t": 106.577, - "dur": 1.902, + "t": 107.104, + "dur": 1.935, "beats": [ - 106.577, - 107.053, - 107.528, - 108.004, - 108.479 + 107.104, + 107.596, + 108.089, + 108.564, + 109.039 ], - "bpm": 126.2, + "bpm": 124, "chord": "B", "agree": 1, "strum": "X..XX..X" }, { "n": 53, - "t": 108.479, + "t": 109.039, "dur": 1.898, "beats": [ - 108.479, - 108.953, - 109.428, - 109.903, - 110.377 + 109.039, + 109.514, + 109.989, + 110.463, + 110.938 ], "bpm": 126.4, "chord": "B", @@ -1227,14 +1227,14 @@ }, { "n": 54, - "t": 110.377, + "t": 110.938, "dur": 1.891, "beats": [ - 110.377, - 110.851, - 111.323, - 111.795, - 112.268 + 110.938, + 111.411, + 111.884, + 112.356, + 112.829 ], "bpm": 126.9, "chord": "B", @@ -1243,30 +1243,30 @@ }, { "n": 55, - "t": 112.268, - "dur": 1.892, + "t": 112.829, + "dur": 1.899, "beats": [ - 112.268, - 112.741, - 113.215, - 113.687, - 114.16 + 112.829, + 113.305, + 113.781, + 114.254, + 114.727 ], - "bpm": 126.8, + "bpm": 126.4, "chord": "G#m", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 56, - "t": 114.16, + "t": 114.727, "dur": 1.89, "beats": [ - 114.16, - 114.633, - 115.105, - 115.578, - 116.05 + 114.727, + 115.2, + 115.672, + 116.144, + 116.617 ], "bpm": 127, "chord": "G#m", @@ -1275,14 +1275,14 @@ }, { "n": 57, - "t": 116.05, + "t": 116.617, "dur": 1.888, "beats": [ - 116.05, - 116.522, - 116.994, - 117.466, - 117.938 + 116.617, + 117.089, + 117.561, + 118.033, + 118.505 ], "bpm": 127.1, "chord": "G#m", @@ -1291,14 +1291,14 @@ }, { "n": 58, - "t": 117.938, + "t": 118.505, "dur": 1.886, "beats": [ - 117.938, - 118.409, - 118.88, - 119.352, - 119.824 + 118.505, + 118.976, + 119.447, + 119.919, + 120.39 ], "bpm": 127.3, "chord": "B", @@ -1307,30 +1307,30 @@ }, { "n": 59, - "t": 119.824, - "dur": 1.882, + "t": 120.39, + "dur": 1.883, "beats": [ - 119.824, - 120.294, - 120.765, - 121.235, - 121.706 + 120.39, + 120.861, + 121.332, + 121.803, + 122.274 ], - "bpm": 127.5, + "bpm": 127.4, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 60, - "t": 121.706, + "t": 122.274, "dur": 1.884, "beats": [ - 121.706, - 122.177, - 122.648, - 123.119, - 123.59 + 122.274, + 122.744, + 123.216, + 123.687, + 124.158 ], "bpm": 127.4, "chord": "B", @@ -1339,30 +1339,30 @@ }, { "n": 61, - "t": 123.59, - "dur": 1.887, + "t": 124.158, + "dur": 1.908, "beats": [ - 123.59, - 124.061, - 124.533, - 125.005, - 125.477 + 124.158, + 124.629, + 125.101, + 125.573, + 126.066 ], - "bpm": 127.2, + "bpm": 125.8, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 62, - "t": 125.477, + "t": 126.066, "dur": 1.891, "beats": [ - 125.477, - 125.949, - 126.422, - 126.895, - 127.368 + 126.066, + 126.538, + 127.011, + 127.484, + 127.957 ], "bpm": 126.9, "chord": "G#m", @@ -1371,30 +1371,30 @@ }, { "n": 63, - "t": 127.368, - "dur": 1.893, + "t": 127.957, + "dur": 1.917, "beats": [ - 127.368, - 127.84, - 128.313, - 128.787, - 129.261 + 127.957, + 128.433, + 128.909, + 129.391, + 129.874 ], - "bpm": 126.8, + "bpm": 125.2, "chord": "G#m", "agree": 1, "strum": "X..XX.XX" }, { "n": 64, - "t": 129.261, + "t": 129.874, "dur": 1.897, "beats": [ - 129.261, - 129.735, - 130.209, - 130.683, - 131.158 + 129.874, + 130.347, + 130.822, + 131.296, + 131.771 ], "bpm": 126.5, "chord": "B", @@ -1403,14 +1403,14 @@ }, { "n": 65, - "t": 131.158, + "t": 131.771, "dur": 1.899, "beats": [ - 131.158, - 131.633, - 132.108, - 132.583, - 133.057 + 131.771, + 132.246, + 132.721, + 133.195, + 133.67 ], "bpm": 126.4, "chord": "B", @@ -1419,30 +1419,30 @@ }, { "n": 66, - "t": 133.057, - "dur": 1.895, + "t": 133.67, + "dur": 1.952, "beats": [ - 133.057, - 133.531, - 134.004, - 134.478, - 134.952 + 133.67, + 134.168, + 134.666, + 135.14, + 135.622 ], - "bpm": 126.6, + "bpm": 122.9, "chord": "B", "agree": 0.5, "strum": "X..XXXXX" }, { "n": 67, - "t": 134.952, + "t": 135.622, "dur": 1.897, "beats": [ - 134.952, - 135.426, - 135.9, - 136.375, - 136.849 + 135.622, + 136.096, + 136.57, + 137.044, + 137.519 ], "bpm": 126.5, "chord": "G#m", @@ -1451,14 +1451,14 @@ }, { "n": 68, - "t": 136.849, + "t": 137.519, "dur": 1.894, "beats": [ - 136.849, - 137.323, - 137.797, - 138.27, - 138.743 + 137.519, + 137.993, + 138.467, + 138.94, + 139.413 ], "bpm": 126.7, "chord": "G#m", @@ -1467,14 +1467,14 @@ }, { "n": 69, - "t": 138.743, + "t": 139.413, "dur": 1.89, "beats": [ - 138.743, - 139.215, - 139.688, - 140.16, - 140.633 + 139.413, + 139.885, + 140.357, + 140.83, + 141.302 ], "bpm": 127, "chord": "G#m", @@ -1483,14 +1483,14 @@ }, { "n": 70, - "t": 140.633, + "t": 141.302, "dur": 1.89, "beats": [ - 140.633, - 141.105, - 141.577, - 142.05, - 142.522 + 141.302, + 141.775, + 142.247, + 142.719, + 143.192 ], "bpm": 127, "chord": "G#m", @@ -1499,14 +1499,14 @@ }, { "n": 71, - "t": 142.522, + "t": 143.192, "dur": 1.889, "beats": [ - 142.522, - 142.995, - 143.467, - 143.94, - 144.411 + 143.192, + 143.665, + 144.137, + 144.609, + 145.081 ], "bpm": 127, "chord": "B", @@ -1515,30 +1515,30 @@ }, { "n": 72, - "t": 144.411, - "dur": 1.888, + "t": 145.081, + "dur": 1.908, "beats": [ - 144.411, - 144.883, - 145.355, - 145.827, - 146.299 + 145.081, + 145.553, + 146.025, + 146.497, + 146.989 ], - "bpm": 127.1, + "bpm": 125.8, "chord": "B", "agree": 0.5, "strum": "X.XXX.XX" }, { "n": 73, - "t": 146.299, + "t": 146.989, "dur": 1.89, "beats": [ - 146.299, - 146.772, - 147.244, - 147.717, - 148.189 + 146.989, + 147.462, + 147.934, + 148.406, + 148.879 ], "bpm": 127, "chord": "Emaj7", @@ -1547,14 +1547,14 @@ }, { "n": 74, - "t": 148.189, + "t": 148.879, "dur": 1.89, "beats": [ - 148.189, - 148.662, - 149.134, - 149.607, - 150.08 + 148.879, + 149.351, + 149.824, + 150.296, + 150.769 ], "bpm": 127, "chord": "B", @@ -1563,14 +1563,14 @@ }, { "n": 75, - "t": 150.08, + "t": 150.769, "dur": 1.889, "beats": [ - 150.08, - 150.552, - 151.024, - 151.496, - 151.968 + 150.769, + 151.241, + 151.713, + 152.185, + 152.658 ], "bpm": 127.1, "chord": "G#m", @@ -1579,14 +1579,14 @@ }, { "n": 76, - "t": 151.968, + "t": 152.658, "dur": 1.891, "beats": [ - 151.968, - 152.441, - 152.914, - 153.387, - 153.859 + 152.658, + 153.131, + 153.604, + 154.077, + 154.549 ], "bpm": 126.9, "chord": "G#m", @@ -1595,14 +1595,14 @@ }, { "n": 77, - "t": 153.859, + "t": 154.549, "dur": 1.889, "beats": [ - 153.859, - 154.332, - 154.804, - 155.276, - 155.749 + 154.549, + 155.021, + 155.494, + 155.966, + 156.439 ], "bpm": 127, "chord": "B", @@ -1611,46 +1611,46 @@ }, { "n": 78, - "t": 155.749, - "dur": 1.889, + "t": 156.439, + "dur": 1.909, "beats": [ - 155.749, - 156.221, - 156.694, - 157.166, - 157.638 + 156.439, + 156.931, + 157.403, + 157.876, + 158.348 ], - "bpm": 127, + "bpm": 125.7, "chord": "B", "agree": 1, "strum": "XXXXX..X" }, { "n": 79, - "t": 157.638, - "dur": 1.885, + "t": 158.348, + "dur": 1.897, "beats": [ - 157.638, - 158.11, - 158.582, - 159.053, - 159.523 + 158.348, + 158.819, + 159.291, + 159.763, + 160.245 ], - "bpm": 127.3, + "bpm": 126.5, "chord": "B", "agree": 0.75, "strum": "X..XX.XX" }, { "n": 80, - "t": 159.523, + "t": 160.245, "dur": 1.875, "beats": [ - 159.523, - 159.993, - 160.462, - 160.931, - 161.399 + 160.245, + 160.715, + 161.184, + 161.652, + 162.12 ], "bpm": 128, "chord": "Emaj7", @@ -1659,14 +1659,14 @@ }, { "n": 81, - "t": 161.399, + "t": 162.12, "dur": 1.87, "beats": [ - 161.399, - 161.867, - 162.334, - 162.801, - 163.268 + 162.12, + 162.588, + 163.055, + 163.523, + 163.989 ], "bpm": 128.4, "chord": "G#m", @@ -1675,14 +1675,14 @@ }, { "n": 82, - "t": 163.268, + "t": 163.989, "dur": 1.865, "beats": [ - 163.268, - 163.735, - 164.201, - 164.667, - 165.133 + 163.989, + 164.456, + 164.922, + 165.388, + 165.855 ], "bpm": 128.7, "chord": "G#m", @@ -1691,14 +1691,14 @@ }, { "n": 83, - "t": 165.133, + "t": 165.855, "dur": 1.864, "beats": [ - 165.133, - 165.6, - 166.066, - 166.532, - 166.998 + 165.855, + 166.321, + 166.787, + 167.253, + 167.719 ], "bpm": 128.7, "chord": "G#m", @@ -1707,14 +1707,14 @@ }, { "n": 84, - "t": 166.998, + "t": 167.719, "dur": 1.87, "beats": [ - 166.998, - 167.465, - 167.932, - 168.4, - 168.868 + 167.719, + 168.186, + 168.653, + 169.121, + 169.589 ], "bpm": 128.4, "chord": "B", @@ -2334,1517 +2334,1517 @@ "dir": "U" }, { - "t": 54.836, + "t": 54.852, "amp": 0.55, "dir": "D" }, { - "t": 55.126, + "t": 55.148, "amp": 0.82, "dir": "U" }, { - "t": 55.635, + "t": 55.663, "amp": 0.74, "dir": "D" }, { - "t": 56.143, + "t": 56.178, "amp": 1.16, "dir": "U" }, { - "t": 56.912, + "t": 56.933, "amp": 0.36, "dir": "D" }, { - "t": 57.157, + "t": 57.175, "amp": 0.69, "dir": "U" }, { - "t": 57.928, + "t": 57.941, "amp": 0.68, "dir": "U" }, { - "t": 58.172, + "t": 58.182, "amp": 1.08, "dir": "U" }, { - "t": 58.949, + "t": 58.938, "amp": 0.59, "dir": "D" }, { - "t": 59.185, + "t": 59.168, "amp": 0.82, "dir": "U" }, { - "t": 59.691, + "t": 59.682, "amp": 0.7, "dir": "D" }, { - "t": 60.7, + "t": 60.65, "amp": 0.97, "dir": "U" }, { - "t": 61.359, + "t": 61.351, "amp": 0.56, "dir": "D" }, { - "t": 61.658, + "t": 61.669, "amp": 0.76, "dir": "U" }, { - "t": 62.285, + "t": 62.304, "amp": 0.42, "dir": "D" }, { - "t": 63.093, + "t": 63.125, "amp": 1.08, "dir": "U" }, { - "t": 63.571, + "t": 63.603, "amp": 0.77, "dir": "D" }, { - "t": 64.298, + "t": 64.33, "amp": 0.58, "dir": "D" }, { - "t": 64.526, + "t": 64.558, "amp": 0.94, "dir": "U" }, { - "t": 65.327, + "t": 65.359, "amp": 0.32, "dir": "D" }, { - "t": 65.48, + "t": 65.513, "amp": 0.72, "dir": "U" }, { - "t": 66.226, + "t": 66.258, "amp": 0.66, "dir": "U" }, { - "t": 66.456, + "t": 66.488, "amp": 0.31, "dir": "D" }, { - "t": 67.046, + "t": 67.08, "amp": 0.49, "dir": "D" }, { - "t": 67.385, + "t": 67.418, "amp": 0.95, "dir": "U" }, { - "t": 67.628, + "t": 67.671, "amp": 0.27, "dir": "D" }, { - "t": 67.86, + "t": 67.912, "amp": 0.54, "dir": "D" }, { - "t": 68.06, + "t": 68.111, "amp": 0.33, "dir": "D" }, { - "t": 68.336, + "t": 68.388, "amp": 0.78, "dir": "U" }, { - "t": 69.087, + "t": 69.138, "amp": 0.66, "dir": "D" }, { - "t": 69.289, + "t": 69.34, "amp": 0.8, "dir": "U" }, { - "t": 70.031, + "t": 70.082, "amp": 0.65, "dir": "D" }, { - "t": 70.241, + "t": 70.292, "amp": 0.88, "dir": "U" }, { - "t": 70.961, + "t": 71.012, "amp": 0.6, "dir": "U" }, { - "t": 71.193, + "t": 71.245, "amp": 0.9, "dir": "U" }, { - "t": 72.145, + "t": 72.198, "amp": 1.38, "dir": "U" }, { - "t": 72.875, + "t": 72.927, "amp": 0.56, "dir": "D" }, { - "t": 73.096, + "t": 73.148, "amp": 0.63, "dir": "U" }, { - "t": 73.665, + "t": 73.718, "amp": 0.12, "dir": "D" }, { - "t": 73.861, + "t": 73.915, "amp": 0.28, "dir": "D" }, { - "t": 74.047, + "t": 74.102, "amp": 0.7, "dir": "U" }, { - "t": 74.779, + "t": 74.835, "amp": 0.49, "dir": "D" }, { - "t": 74.999, + "t": 75.055, "amp": 0.7, "dir": "U" }, { - "t": 75.27, + "t": 75.327, "amp": 0.2, "dir": "D" }, { - "t": 75.475, + "t": 75.531, "amp": 1, "dir": "U" }, { - "t": 75.745, + "t": 75.804, "amp": 0.3, "dir": "D" }, { - "t": 75.95, + "t": 76.013, "amp": 1.24, "dir": "U" }, { - "t": 76.676, + "t": 76.738, "amp": 0.59, "dir": "D" }, { - "t": 76.902, + "t": 76.965, "amp": 0.84, "dir": "U" }, { - "t": 77.626, + "t": 77.699, "amp": 0.64, "dir": "D" }, { - "t": 77.853, + "t": 77.929, "amp": 1.03, "dir": "U" }, { - "t": 78.581, + "t": 78.657, "amp": 0.53, "dir": "D" }, { - "t": 78.805, + "t": 78.88, "amp": 0.6, "dir": "D" }, { - "t": 79.053, + "t": 79.132, "amp": 0.22, "dir": "D" }, { - "t": 79.281, + "t": 79.362, "amp": 0.81, "dir": "U" }, { - "t": 79.529, + "t": 79.614, "amp": 0.32, "dir": "D" }, { - "t": 79.757, + "t": 79.844, "amp": 0.95, "dir": "U" }, { - "t": 80.465, + "t": 80.553, "amp": 0.67, "dir": "D" }, { - "t": 80.708, + "t": 80.796, "amp": 0.91, "dir": "U" }, { - "t": 81.422, + "t": 81.51, "amp": 0.54, "dir": "U" }, { - "t": 81.66, + "t": 81.748, "amp": 0.89, "dir": "U" }, { - "t": 82.369, + "t": 82.482, "amp": 0.5, "dir": "D" }, { - "t": 82.612, + "t": 82.734, "amp": 0.69, "dir": "U" }, { - "t": 83.088, + "t": 83.21, "amp": 0.66, "dir": "D" }, { - "t": 83.354, + "t": 83.476, "amp": 0.35, "dir": "D" }, { - "t": 83.564, + "t": 83.686, "amp": 0.77, "dir": "U" }, { - "t": 84.27, + "t": 84.392, "amp": 0.57, "dir": "D" }, { - "t": 84.516, + "t": 84.638, "amp": 0.69, "dir": "U" }, { - "t": 85.282, + "t": 85.405, "amp": 0.48, "dir": "D" }, { - "t": 85.468, + "t": 85.591, "amp": 0.98, "dir": "U" }, { - "t": 86.187, + "t": 86.31, "amp": 0.67, "dir": "D" }, { - "t": 86.42, + "t": 86.542, "amp": 0.76, "dir": "U" }, { - "t": 87.132, + "t": 87.265, "amp": 0.52, "dir": "D" }, { - "t": 87.37, + "t": 87.507, "amp": 0.76, "dir": "U" }, { - "t": 87.646, + "t": 87.783, "amp": 0.27, "dir": "D" }, { - "t": 87.846, + "t": 87.983, "amp": 0.5, "dir": "D" }, { - "t": 88.073, + "t": 88.21, "amp": 0.36, "dir": "D" }, { - "t": 88.322, + "t": 88.459, "amp": 0.61, "dir": "U" }, { - "t": 88.589, + "t": 88.725, "amp": 0.11, "dir": "D" }, { - "t": 88.8, + "t": 88.936, "amp": 0.39, "dir": "D" }, { - "t": 89.277, + "t": 89.414, "amp": 0.42, "dir": "D" }, { - "t": 89.55, + "t": 89.687, "amp": 0.26, "dir": "D" }, { - "t": 89.755, + "t": 89.891, "amp": 0.71, "dir": "D" }, { - "t": 90.005, + "t": 90.142, "amp": 0.16, "dir": "D" }, { - "t": 90.233, + "t": 90.369, "amp": 0.47, "dir": "D" }, { - "t": 90.467, + "t": 90.603, "amp": 0.3, "dir": "D" }, { - "t": 90.711, + "t": 90.848, "amp": 0.78, "dir": "U" }, { - "t": 91.005, + "t": 91.144, "amp": 0.39, "dir": "D" }, { - "t": 91.19, + "t": 91.33, "amp": 0.98, "dir": "U" }, { - "t": 91.911, + "t": 92.097, "amp": 0.45, "dir": "D" }, { - "t": 92.148, + "t": 92.349, "amp": 0.75, "dir": "D" }, { - "t": 92.895, + "t": 93.116, "amp": 0.53, "dir": "D" }, { - "t": 93.108, + "t": 93.335, "amp": 0.7, "dir": "D" }, { - "t": 93.825, + "t": 94.069, "amp": 0.49, "dir": "D" }, { - "t": 94.071, + "t": 94.321, "amp": 0.56, "dir": "D" }, { - "t": 94.803, + "t": 95.076, "amp": 0.6, "dir": "D" }, { - "t": 95.035, + "t": 95.317, "amp": 0.79, "dir": "U" }, { - "t": 95.783, + "t": 96.072, "amp": 0.46, "dir": "D" }, { - "t": 96, + "t": 96.292, "amp": 0.7, "dir": "U" }, { - "t": 96.72, + "t": 97.037, "amp": 0.61, "dir": "D" }, { - "t": 96.964, + "t": 97.288, "amp": 0.69, "dir": "U" }, { - "t": 97.742, + "t": 98.11, "amp": 0.35, "dir": "D" }, { - "t": 97.928, + "t": 98.307, "amp": 0.78, "dir": "U" }, { - "t": 98.63, + "t": 99.009, "amp": 0.57, "dir": "U" }, { - "t": 98.893, + "t": 99.272, "amp": 1.08, "dir": "U" }, { - "t": 99.618, + "t": 100.006, "amp": 0.59, "dir": "D" }, { - "t": 99.857, + "t": 100.247, "amp": 0.9, "dir": "U" }, { - "t": 100.596, + "t": 101.003, "amp": 0.63, "dir": "D" }, { - "t": 100.821, + "t": 101.233, "amp": 0.96, "dir": "U" }, { - "t": 101.532, + "t": 101.978, "amp": 0.56, "dir": "D" }, { - "t": 101.783, + "t": 102.241, "amp": 0.81, "dir": "U" }, { - "t": 102.264, + "t": 102.733, "amp": 0.72, "dir": "U" }, { - "t": 102.744, + "t": 103.237, "amp": 0.92, "dir": "U" }, { - "t": 103.479, + "t": 103.982, "amp": 0.23, "dir": "D" }, { - "t": 103.706, + "t": 104.212, "amp": 0.82, "dir": "U" }, { - "t": 104.426, + "t": 104.935, "amp": 0.62, "dir": "U" }, { - "t": 104.665, + "t": 105.176, "amp": 0.92, "dir": "U" }, { - "t": 105.394, + "t": 105.91, "amp": 0.48, "dir": "D" }, { - "t": 105.622, + "t": 106.14, "amp": 0.82, "dir": "U" }, { - "t": 106.099, + "t": 106.622, "amp": 1.12, "dir": "U" }, { - "t": 106.37, + "t": 106.895, "amp": 0.51, "dir": "U" }, { - "t": 106.577, + "t": 107.104, "amp": 0.7, "dir": "U" }, { - "t": 107.285, + "t": 107.837, "amp": 0.44, "dir": "D" }, { - "t": 107.528, + "t": 108.089, "amp": 0.8, "dir": "U" }, { - "t": 108.255, + "t": 108.816, "amp": 0.63, "dir": "D" }, { - "t": 108.479, + "t": 109.039, "amp": 0.54, "dir": "U" }, { - "t": 109.182, + "t": 109.743, "amp": 0.7, "dir": "U" }, { - "t": 109.428, + "t": 109.989, "amp": 0.67, "dir": "U" }, { - "t": 109.682, + "t": 110.243, "amp": 0.26, "dir": "D" }, { - "t": 110.135, + "t": 110.695, "amp": 0.58, "dir": "D" }, { - "t": 110.377, + "t": 110.938, "amp": 0.7, "dir": "U" }, { - "t": 111.096, + "t": 111.656, "amp": 0.55, "dir": "D" }, { - "t": 111.323, + "t": 111.884, "amp": 0.77, "dir": "U" }, { - "t": 112.268, + "t": 112.829, "amp": 0.92, "dir": "U" }, { - "t": 112.975, + "t": 113.54, "amp": 0.64, "dir": "D" }, { - "t": 113.215, + "t": 113.781, "amp": 0.91, "dir": "U" }, { - "t": 113.468, + "t": 114.034, "amp": 0.27, "dir": "D" }, { - "t": 113.687, + "t": 114.254, "amp": 0.99, "dir": "U" }, { - "t": 113.924, + "t": 114.491, "amp": 0.45, "dir": "D" }, { - "t": 114.16, + "t": 114.727, "amp": 0.8, "dir": "U" }, { - "t": 114.883, + "t": 115.45, "amp": 0.5, "dir": "D" }, { - "t": 115.105, + "t": 115.672, "amp": 0.8, "dir": "U" }, { - "t": 115.852, + "t": 116.419, "amp": 0.51, "dir": "D" }, { - "t": 116.05, + "t": 116.617, "amp": 1.25, "dir": "U" }, { - "t": 116.761, + "t": 117.327, "amp": 0.63, "dir": "D" }, { - "t": 116.994, + "t": 117.561, "amp": 0.99, "dir": "U" }, { - "t": 117.248, + "t": 117.815, "amp": 0.24, "dir": "D" }, { - "t": 117.466, + "t": 118.033, "amp": 0.45, "dir": "D" }, { - "t": 117.707, + "t": 118.274, "amp": 0.4, "dir": "D" }, { - "t": 117.938, + "t": 118.505, "amp": 0.87, "dir": "U" }, { - "t": 118.639, + "t": 119.206, "amp": 0.48, "dir": "U" }, { - "t": 118.88, + "t": 119.447, "amp": 0.64, "dir": "U" }, { - "t": 119.61, + "t": 120.177, "amp": 0.62, "dir": "D" }, { - "t": 119.824, + "t": 120.39, "amp": 0.58, "dir": "U" }, { - "t": 120.396, + "t": 120.963, "amp": 0.11, "dir": "D" }, { - "t": 120.541, + "t": 121.108, "amp": 0.47, "dir": "D" }, { - "t": 120.765, + "t": 121.332, "amp": 1.01, "dir": "U" }, { - "t": 121.005, + "t": 121.573, "amp": 0.3, "dir": "D" }, { - "t": 121.235, + "t": 121.803, "amp": 0.58, "dir": "U" }, { - "t": 121.482, + "t": 122.05, "amp": 0.37, "dir": "U" }, { - "t": 121.706, + "t": 122.274, "amp": 0.88, "dir": "U" }, { - "t": 122.438, + "t": 123.006, "amp": 0.49, "dir": "D" }, { - "t": 122.648, + "t": 123.216, "amp": 0.9, "dir": "U" }, { - "t": 123.355, + "t": 123.922, "amp": 0.81, "dir": "D" }, { - "t": 123.59, + "t": 124.158, "amp": 0.78, "dir": "U" }, { - "t": 124.335, + "t": 124.903, "amp": 0.45, "dir": "D" }, { - "t": 124.533, + "t": 125.101, "amp": 0.92, "dir": "U" }, { - "t": 124.781, + "t": 125.349, "amp": 0.62, "dir": "U" }, { - "t": 125.005, + "t": 125.573, "amp": 0.64, "dir": "U" }, { - "t": 125.268, + "t": 125.847, "amp": 0.43, "dir": "D" }, { - "t": 125.477, + "t": 126.066, "amp": 1, "dir": "U" }, { - "t": 126.202, + "t": 126.791, "amp": 0.49, "dir": "D" }, { - "t": 126.422, + "t": 127.011, "amp": 1.04, "dir": "U" }, { - "t": 127.172, + "t": 127.761, "amp": 0.71, "dir": "D" }, { - "t": 127.368, + "t": 127.957, "amp": 0.93, "dir": "U" }, { - "t": 128.096, + "t": 128.69, "amp": 0.61, "dir": "D" }, { - "t": 128.313, + "t": 128.909, "amp": 1, "dir": "U" }, { - "t": 128.583, + "t": 129.184, "amp": 0.16, "dir": "D" }, { - "t": 128.787, + "t": 129.391, "amp": 0.55, "dir": "D" }, { - "t": 129.056, + "t": 129.665, "amp": 0.3, "dir": "D" }, { - "t": 129.261, + "t": 129.874, "amp": 1.14, "dir": "U" }, { - "t": 129.986, + "t": 130.599, "amp": 0.61, "dir": "U" }, { - "t": 130.209, + "t": 130.822, "amp": 0.43, "dir": "U" }, { - "t": 130.506, + "t": 131.119, "amp": 0.18, "dir": "D" }, { - "t": 130.964, + "t": 131.576, "amp": 0.37, "dir": "D" }, { - "t": 131.158, + "t": 131.771, "amp": 0.82, "dir": "U" }, { - "t": 131.633, + "t": 132.246, "amp": 0.65, "dir": "D" }, { - "t": 131.915, + "t": 132.528, "amp": 0.26, "dir": "D" }, { - "t": 132.108, + "t": 132.721, "amp": 0.82, "dir": "U" }, { - "t": 133.057, + "t": 133.67, "amp": 0.81, "dir": "U" }, { - "t": 133.349, + "t": 133.976, "amp": 0.14, "dir": "D" }, { - "t": 133.568, + "t": 134.206, "amp": 0.18, "dir": "D" }, { - "t": 133.796, + "t": 134.447, "amp": 0.54, "dir": "D" }, { - "t": 134.004, + "t": 134.666, "amp": 0.98, "dir": "U" }, { - "t": 134.264, + "t": 134.925, "amp": 0.3, "dir": "D" }, { - "t": 134.478, + "t": 135.14, "amp": 0.71, "dir": "U" }, { - "t": 134.716, + "t": 135.381, "amp": 0.24, "dir": "D" }, { - "t": 134.952, + "t": 135.622, "amp": 1.02, "dir": "U" }, { - "t": 135.22, + "t": 135.89, "amp": 0.17, "dir": "D" }, { - "t": 135.678, + "t": 136.347, "amp": 0.66, "dir": "U" }, { - "t": 135.9, + "t": 136.57, "amp": 0.79, "dir": "U" }, { - "t": 136.171, + "t": 136.841, "amp": 0.28, "dir": "D" }, { - "t": 136.612, + "t": 137.281, "amp": 0.74, "dir": "U" }, { - "t": 136.849, + "t": 137.519, "amp": 0.83, "dir": "U" }, { - "t": 137.091, + "t": 137.761, "amp": 0.24, "dir": "D" }, { - "t": 137.323, + "t": 137.993, "amp": 0.8, "dir": "U" }, { - "t": 137.554, + "t": 138.224, "amp": 0.38, "dir": "D" }, { - "t": 137.797, + "t": 138.467, "amp": 0.81, "dir": "U" }, { - "t": 138.04, + "t": 138.709, "amp": 0.51, "dir": "U" }, { - "t": 138.27, + "t": 138.94, "amp": 0.77, "dir": "U" }, { - "t": 138.512, + "t": 139.182, "amp": 0.18, "dir": "D" }, { - "t": 138.743, + "t": 139.413, "amp": 0.77, "dir": "U" }, { - "t": 139.457, + "t": 140.126, "amp": 0.56, "dir": "D" }, { - "t": 139.688, + "t": 140.357, "amp": 0.69, "dir": "U" }, { - "t": 140.388, + "t": 141.057, "amp": 0.59, "dir": "U" }, { - "t": 140.633, + "t": 141.302, "amp": 0.9, "dir": "U" }, { - "t": 141.341, + "t": 142.011, "amp": 0.85, "dir": "D" }, { - "t": 141.577, + "t": 142.247, "amp": 0.93, "dir": "U" }, { - "t": 141.819, + "t": 142.489, "amp": 0.4, "dir": "U" }, { - "t": 142.05, + "t": 142.719, "amp": 0.64, "dir": "D" }, { - "t": 142.274, + "t": 142.944, "amp": 0.22, "dir": "D" }, { - "t": 142.522, + "t": 143.192, "amp": 0.66, "dir": "U" }, { - "t": 143.209, + "t": 143.879, "amp": 0.59, "dir": "U" }, { - "t": 143.467, + "t": 144.137, "amp": 0.64, "dir": "U" }, { - "t": 144.156, + "t": 144.826, "amp": 0.72, "dir": "U" }, { - "t": 144.411, + "t": 145.081, "amp": 0.89, "dir": "U" }, { - "t": 144.883, + "t": 145.553, "amp": 1.02, "dir": "U" }, { - "t": 145.102, + "t": 145.772, "amp": 0.35, "dir": "U" }, { - "t": 145.355, + "t": 146.025, "amp": 0.78, "dir": "U" }, { - "t": 145.585, + "t": 146.255, "amp": 0.19, "dir": "U" }, { - "t": 145.827, + "t": 146.497, "amp": 0.72, "dir": "U" }, { - "t": 146.1, + "t": 146.782, "amp": 0.29, "dir": "D" }, { - "t": 146.299, + "t": 146.989, "amp": 0.99, "dir": "U" }, { - "t": 147.028, + "t": 147.717, "amp": 0.53, "dir": "D" }, { - "t": 147.244, + "t": 147.934, "amp": 0.87, "dir": "U" }, { - "t": 147.947, + "t": 148.637, "amp": 0.38, "dir": "D" }, { - "t": 148.189, + "t": 148.879, "amp": 0.82, "dir": "U" }, { - "t": 148.922, + "t": 149.612, "amp": 0.68, "dir": "D" }, { - "t": 149.134, + "t": 149.824, "amp": 1, "dir": "U" }, { - "t": 149.42, + "t": 150.11, "amp": 0.12, "dir": "D" }, { - "t": 149.607, + "t": 150.296, "amp": 0.73, "dir": "U" }, { - "t": 150.08, + "t": 150.769, "amp": 1.23, "dir": "U" }, { - "t": 150.81, + "t": 151.5, "amp": 0.73, "dir": "D" }, { - "t": 151.012, + "t": 151.702, "amp": 0.27, "dir": "D" }, { - "t": 151.732, + "t": 152.422, "amp": 0.4, "dir": "D" }, { - "t": 151.968, + "t": 152.658, "amp": 0.93, "dir": "U" }, { - "t": 152.236, + "t": 152.925, "amp": 0.23, "dir": "D" }, { - "t": 152.702, + "t": 153.392, "amp": 0.34, "dir": "D" }, { - "t": 152.914, + "t": 153.604, "amp": 0.87, "dir": "D" }, { - "t": 153.184, + "t": 153.874, "amp": 0.25, "dir": "D" }, { - "t": 153.387, + "t": 154.077, "amp": 0.36, "dir": "D" }, { - "t": 153.672, + "t": 154.362, "amp": 0.15, "dir": "D" }, { - "t": 153.859, + "t": 154.549, "amp": 1.18, "dir": "U" }, { - "t": 154.597, + "t": 155.286, "amp": 0.51, "dir": "D" }, { - "t": 154.804, + "t": 155.494, "amp": 0.73, "dir": "U" }, { - "t": 155.074, + "t": 155.763, "amp": 0.3, "dir": "D" }, { - "t": 155.524, + "t": 156.214, "amp": 0.51, "dir": "U" }, { - "t": 155.749, + "t": 156.439, "amp": 0.81, "dir": "U" }, { - "t": 156.011, + "t": 156.712, "amp": 0.29, "dir": "D" }, { - "t": 156.221, + "t": 156.931, "amp": 0.45, "dir": "D" }, { - "t": 156.458, + "t": 157.167, "amp": 0.44, "dir": "U" }, { - "t": 156.694, + "t": 157.403, "amp": 0.61, "dir": "U" }, { - "t": 157.399, + "t": 158.109, "amp": 0.48, "dir": "U" }, { - "t": 157.638, + "t": 158.348, "amp": 0.89, "dir": "U" }, { - "t": 158.346, + "t": 159.055, "amp": 0.36, "dir": "D" }, { - "t": 158.582, + "t": 159.291, "amp": 0.91, "dir": "U" }, { - "t": 159.053, + "t": 159.763, "amp": 0.76, "dir": "U" }, { - "t": 159.299, + "t": 160.014, "amp": 0.22, "dir": "D" }, { - "t": 159.523, + "t": 160.245, "amp": 1.12, "dir": "U" }, { - "t": 160.213, + "t": 160.934, "amp": 0.89, "dir": "U" }, { - "t": 160.462, + "t": 161.184, "amp": 0.95, "dir": "U" }, { - "t": 161.187, + "t": 161.908, "amp": 0.71, "dir": "D" }, { - "t": 161.399, + "t": 162.12, "amp": 0.73, "dir": "U" }, { - "t": 161.645, + "t": 162.366, "amp": 0.42, "dir": "U" }, { - "t": 161.867, + "t": 162.588, "amp": 0.75, "dir": "U" }, { - "t": 162.106, + "t": 162.827, "amp": 0.36, "dir": "D" }, { - "t": 162.334, + "t": 163.055, "amp": 0.91, "dir": "U" }, { - "t": 162.568, + "t": 163.289, "amp": 0.33, "dir": "U" }, { - "t": 162.801, + "t": 163.523, "amp": 0.78, "dir": "U" }, { - "t": 163.034, + "t": 163.755, "amp": 0.36, "dir": "D" }, { - "t": 163.268, + "t": 163.989, "amp": 0.91, "dir": "U" }, { - "t": 163.965, + "t": 164.686, "amp": 0.54, "dir": "D" }, { - "t": 164.201, + "t": 164.922, "amp": 0.78, "dir": "U" }, { - "t": 164.897, + "t": 165.618, "amp": 0.64, "dir": "U" }, { - "t": 165.133, + "t": 165.855, "amp": 0.8, "dir": "U" }, { - "t": 165.839, + "t": 166.56, "amp": 0.57, "dir": "D" }, { - "t": 166.066, + "t": 166.787, "amp": 0.73, "dir": "U" }, { - "t": 166.31, + "t": 167.031, "amp": 0.51, "dir": "D" }, { - "t": 166.543, + "t": 167.264, "amp": 0.23, "dir": "D" }, { - "t": 166.753, + "t": 167.474, "amp": 0.54, "dir": "D" }, { - "t": 166.998, + "t": 167.719, "amp": 0.92, "dir": "U" }, { - "t": 167.692, + "t": 168.414, "amp": 0.56, "dir": "U" }, { - "t": 167.932, + "t": 168.653, "amp": 0.71, "dir": "U" }, { - "t": 168.636, + "t": 169.357, "amp": 0.62, "dir": "U" }, { - "t": 168.868, + "t": 169.589, "amp": 0.8, "dir": "U" }, { - "t": 169.611, + "t": 170.332, "amp": 0.64, "dir": "U" }, { - "t": 169.843, + "t": 170.564, "amp": 0.74, "dir": "U" }, { - "t": 170.064, + "t": 170.785, "amp": 0.28, "dir": "U" }, { - "t": 170.319, + "t": 171.04, "amp": 0.49, "dir": "U" }, { - "t": 170.528, + "t": 171.249, "amp": 0.33, "dir": "U" }, { - "t": 170.795, + "t": 171.516, "amp": 0.95, "dir": "U" }, { - "t": 173.175, + "t": 173.896, "amp": 0.3, "dir": "D" }, { - "t": 173.454, + "t": 174.175, "amp": 0.25, "dir": "D" } @@ -3853,6 +3853,6 @@ "keep": 0.3, "floorBar": 24, "medianBpm": 120.2, - "totalSec": 173.545 + "totalSec": 174.266 } } \ No newline at end of file -- 2.51.2