From 36485ff214334eb732391a0b26e012e33079d6ab Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Tue, 18 Aug 2026 14:21:55 -0400 Subject: [PATCH] loner: up gains a beat, and its peak lands on the bar 1 beat 4 line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @jeffrey: "up should last one more beat · if we could get the peak of up to be on the bar 1:4 start line that be nice". up takes 2.5 beats. Placing its peak needed a measurement rather than a guess: "up" opens on a vowel, so it gets no consonant lead and its audio starts where its slot starts, which put the peak 0.71 beats in. The slot therefore has to OPEN at 6.29 for the peak to arrive on 7 — so curled runs 4.00–6.29, and 2.29 is deliberately not a grid value. Verified in the render: up's peak is at beat 7.02, ten milliseconds off the line. Recording the general move, since it will come up again: to put a word's peak on a beat, measure how far into its slot the peak falls at the stretch it will actually be played at, then subtract. Setting the slot start ON the beat only works for words that peak at their onset. --- pop/loner/bin/halo3.py | 6 ++- pop/loner/c/loner-chart.h | 46 ++++++++-------- pop/loner/vox4/.chart.json | 98 +++++++++++++++++------------------ pop/loner/vox4/.manifest.json | 4 +- 4 files changed, 79 insertions(+), 75 deletions(-) diff --git a/pop/loner/bin/halo3.py b/pop/loner/bin/halo3.py index aeb096c3c..0dbb881a7 100644 --- a/pop/loner/bin/halo3.py +++ b/pop/loner/bin/halo3.py @@ -248,7 +248,11 @@ CHART = { # on 20 — so OF starts the instant think ends # ("of should start sooner, right after # 'think' ends") with no rest needed at all. - "durs": { 0: 2.0, 1: 2.0, 2: 2.0, 3: 1.5, + # curled 2.29 is not a grid value on purpose: up's peak sits + # 0.71 beats into its slot, so the slot has + # to open at 6.29 for the peak to land on + # the bar 1 beat 4 line. + "durs": { 0: 2.0, 1: 2.0, 2: 2.29, 3: 2.5, # "my" a beat sooner: the warp is one # sequential frame map, so units cannot # truly overlap — "in" simply ends where diff --git a/pop/loner/c/loner-chart.h b/pop/loner/c/loner-chart.h index 37199ee75..adb1c98ae 100644 --- a/pop/loner/c/loner-chart.h +++ b/pop/loner/c/loner-chart.h @@ -15,28 +15,28 @@ typedef struct { const char *name; double leadIn; double beats; static const ChartNote w_whole_line_notes[] = { { 0.00, 2.00, 7 }, { 2.00, 2.00, 5 }, - { 4.00, 2.00, 3 }, - { 6.00, 1.50, 2 }, - { 7.50, 2.50, 0 }, - { 10.00, 0.50, 5 }, - { 10.50, 2.00, 2 }, - { 12.50, 2.00, -2 }, - { 14.50, 2.00, -5 }, - { 16.50, 4.00, 12 }, - { 20.50, 3.00, 10 }, - { 23.50, 3.00, 5 }, - { 26.50, 4.00, 2 }, - { 30.50, 2.00, 3 }, - { 32.50, 2.00, 2 }, - { 34.50, 2.00, 0 }, - { 36.50, 2.00, -2 }, - { 38.50, 2.00, 7 }, - { 40.50, 2.50, 5 }, - { 43.00, 2.50, 3 }, - { 45.50, 2.00, 5 }, - { 47.50, 4.00, 7 }, - { 51.50, 4.00, 3 }, - { 55.50, 3.00, 3 }, + { 4.00, 2.29, 3 }, + { 6.29, 2.50, 2 }, + { 8.79, 2.50, 0 }, + { 11.29, 0.50, 5 }, + { 11.79, 2.00, 2 }, + { 13.79, 2.00, -2 }, + { 15.79, 2.00, -5 }, + { 17.79, 4.00, 12 }, + { 21.79, 3.00, 10 }, + { 24.79, 3.00, 5 }, + { 27.79, 4.00, 2 }, + { 31.79, 2.00, 3 }, + { 33.79, 2.00, 2 }, + { 35.79, 2.00, 0 }, + { 37.79, 2.00, -2 }, + { 39.79, 2.00, 7 }, + { 41.79, 2.50, 5 }, + { 44.29, 2.50, 3 }, + { 46.79, 2.00, 5 }, + { 48.79, 4.00, 7 }, + { 52.79, 4.00, 3 }, + { 56.79, 3.00, 3 }, }; static const ChartNote w_sitting_curled_notes[] = { { 0.00, 3.00, 6 }, @@ -93,7 +93,7 @@ static const ChartNote w_n_for_time_to_pass_notes[] = { }; static const ChartPhrase CHART[] = { - { "w-whole-line", 0.510, 58.50, 24, w_whole_line_notes }, + { "w-whole-line", 0.510, 59.79, 24, w_whole_line_notes }, { "w-sitting-curled", 0.020, 11.00, 5, w_sitting_curled_notes }, { "w-i-think", 0.020, 3.50, 2, w_i_think_notes }, { "w-of-a-stone", 0.000, 8.00, 3, w_of_a_stone_notes }, diff --git a/pop/loner/vox4/.chart.json b/pop/loner/vox4/.chart.json index aff18d325..4b270658b 100644 --- a/pop/loner/vox4/.chart.json +++ b/pop/loner/vox4/.chart.json @@ -1,59 +1,59 @@ { "w-whole-line": { "leadIn": 0.51, - "beats": 58.5, + "beats": 59.79, "voiced": [ [ -0.0407, - 7.4725 + 8.7433 ], [ - 7.503, - 11.0105 + 8.7942, + 12.2915 ], [ - 11.0308, - 12.4237 + 12.322, + 13.7047 ], [ - 12.4542, - 16.3277 + 13.7352, + 17.6188 ], [ - 16.4903, - 23.0987 + 17.7815, + 24.3898 ], [ - 23.4443, - 30.3577 + 24.7355, + 31.6488 ], [ - 30.4593, - 38.1555 + 31.7505, + 39.4467 ], [ - 38.2673, - 40.3718 + 39.5585, + 41.6528 ], [ - 40.443, - 42.395 + 41.724, + 43.676 ], [ - 42.4865, - 45.445 + 43.7675, + 46.726 ], [ - 45.4755, - 47.3258 + 46.7667, + 48.617 ], [ - 47.3665, - 55.0932 + 48.6577, + 56.3843 ], [ - 55.2762, - 59.3123 + 56.5673, + 60.6035 ] ], "notes": [ @@ -73,153 +73,153 @@ }, { "beat": 4.0, - "dur": 2.0, + "dur": 2.29, "st": 3, "t": "curled", "lead": 0.0 }, { - "beat": 6.0, - "dur": 1.5, + "beat": 6.29, + "dur": 2.5, "st": 2, "t": "up", "lead": 0.0 }, { - "beat": 7.5, + "beat": 8.79, "dur": 2.5, "st": 0, "t": "in", "lead": 0.0 }, { - "beat": 10.0, + "beat": 11.29, "dur": 0.5, "st": 5, "t": "my", "lead": 0.0 }, { - "beat": 10.5, + "beat": 11.79, "dur": 2.0, "st": 2, "t": "self", "lead": 0.0 }, { - "beat": 12.5, + "beat": 13.79, "dur": 2.0, "st": -2, "t": "i", "lead": 0.0 }, { - "beat": 14.5, + "beat": 15.79, "dur": 2.0, "st": -5, "t": "think", "lead": 0.0 }, { - "beat": 16.5, + "beat": 17.79, "dur": 4.0, "st": 12, "t": "of", "lead": 0.0203 }, { - "beat": 20.5, + "beat": 21.79, "dur": 3.0, "st": 10, "t": "a", "lead": 0.0 }, { - "beat": 23.5, + "beat": 24.79, "dur": 3.0, "st": 5, "t": "stone", "lead": 0.1017 }, { - "beat": 26.5, + "beat": 27.79, "dur": 4.0, "st": 2, "t": "just", "lead": 0.0 }, { - "beat": 30.5, + "beat": 31.79, "dur": 2.0, "st": 3, "t": "wait", "lead": 0.0813 }, { - "beat": 32.5, + "beat": 33.79, "dur": 2.0, "st": 2, "t": "ing", "lead": 0.0 }, { - "beat": 34.5, + "beat": 35.79, "dur": 2.0, "st": 0, "t": "ve", "lead": 0.0 }, { - "beat": 36.5, + "beat": 37.79, "dur": 2.0, "st": -2, "t": "ry", "lead": 0.0 }, { - "beat": 38.5, + "beat": 39.79, "dur": 2.0, "st": 7, "t": "pa", "lead": 0.0 }, { - "beat": 40.5, + "beat": 41.79, "dur": 2.5, "st": 5, "t": "tient", "lead": 0.122 }, { - "beat": 43.0, + "beat": 44.29, "dur": 2.5, "st": 3, "t": "ly", "lead": 0.0 }, { - "beat": 45.5, + "beat": 46.79, "dur": 2.0, "st": 5, "t": "for", "lead": 0.0 }, { - "beat": 47.5, + "beat": 48.79, "dur": 4.0, "st": 7, "t": "time", "lead": 0.0 }, { - "beat": 51.5, + "beat": 52.79, "dur": 4.0, "st": 3, "t": "to", "lead": 0.0 }, { - "beat": 55.5, + "beat": 56.79, "dur": 3.0, "st": 3, "t": "pass", diff --git a/pop/loner/vox4/.manifest.json b/pop/loner/vox4/.manifest.json index e61a8d394..5bd660a18 100644 --- a/pop/loner/vox4/.manifest.json +++ b/pop/loner/vox4/.manifest.json @@ -124,9 +124,9 @@ 23.97 ] ], - "beats": 58.5, + "beats": 59.79, "renders": { - "lead": 29.68 + "lead": 30.315 }, "snaps": [ "curled +65ms", -- 2.51.2