From aca594a7e4cae336c62b6ef1a5be7fbbe0b797e3 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Tue, 18 Aug 2026 13:57:23 -0400 Subject: [PATCH] =?UTF-8?q?loner:=20the=20up=E2=86=92in=20bleed=20was=20pe?= =?UTF-8?q?ak=20alignment=20leaning=20on=20a=20vowel=20=E2=80=94=20bound?= =?UTF-8?q?=20the=20lead=20to=20the=20consonant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @jeffrey: "also the end of up still has the start of in · clip bleed · tient and ly should each be one beat longer". Measured the boundary first, and the source is innocent: her "in" starts at 3.19 and up's span ends at 2.80, so nothing of "in" is inside up's audio. The bleed was mine. Peak alignment pulls a word's start ahead of its beat so the peak lands on it — but "in" opens on a VOWEL, so there was no consonant to lean with, and the 90 ms it borrowed was the vowel itself, sounding inside the previous word's block. A singer leans in with the consonant. The lead may now not exceed the word's own unvoiced runway, so a vowel-initial word starts ON its beat and a word with a real consonant can still place its peak. After it, the level either side of beat 8 reads: up decayed to 1.4% by beat 7.7, then "in" rising from 7.94 and full at 8.02 — its own attack, nothing more. tient and ly each gain a beat (2.5 apiece), which puts "ly" on the bar 11 downbeat. --- pop/loner/bin/halo3.py | 15 ++++-- pop/loner/c/loner-chart.h | 14 +++--- pop/loner/vox4/.chart.json | 94 +++++++++++++++++------------------ pop/loner/vox4/.manifest.json | 6 +-- 4 files changed, 69 insertions(+), 60 deletions(-) diff --git a/pop/loner/bin/halo3.py b/pop/loner/bin/halo3.py index 5fd81fb2a..10883026c 100644 --- a/pop/loner/bin/halo3.py +++ b/pop/loner/bin/halo3.py @@ -280,7 +280,7 @@ CHART = { # waiting splits like sitting did, so # "ing" lands on the half bar 12: 4.0, 13: 2.0, 14: 2.0, 15: 2.0, - 16: 2.0, 17: 2.0, 18: 1.5, 19: 1.5 }, + 16: 2.0, 17: 2.0, 18: 2.5, 19: 2.5 }, # words whose syllables carry a melody must not # be flattened to one tone by THE HOLD # patiently is pa·tient·ly, three notes @@ -613,10 +613,19 @@ def build_warp(a, unit_src, beats, dursb, gapsb=None, rest_src=None, lead_b=0.0, if not a["voiced"][min(v0, F - 1)]: v0 = s0 voiced_at.append(v0) # BEFORE the peak search + # The lead may not exceed the word's own CONSONANT runway. + # @jeffrey: "the end of up still has the start of in — clip + # bleed". He is describing peak alignment doing what it was told: + # pulling a word's start ahead of its beat so the peak lands on + # it. But "in" opens on a vowel, so there was no consonant to + # lean with — the 90 ms it borrowed was the vowel itself, sounding + # inside the previous word's block. A singer leans in with the + # consonant. A vowel-initial word starts ON the beat. + cons = max(0, v0 - s0) # unvoiced runway hi = min(s1, nfr, v0 + int(0.35 / FRAME_S)) # look in the attack - if hi > v0: + if hi > v0 and cons > 0: pk = v0 + int(np.argmax(fen[v0:hi])) - v0 = min(pk, v0 + lead_cap) + v0 = min(pk, v0 + min(lead_cap, cons)) ants.append(max(0, v0 - s0)) # THE PICKUP is the UNVOICED prefix only. Peak alignment made ants[0] # reach into the vowel, and this stretch used to swallow whatever was diff --git a/pop/loner/c/loner-chart.h b/pop/loner/c/loner-chart.h index 79e924b51..1401a29ec 100644 --- a/pop/loner/c/loner-chart.h +++ b/pop/loner/c/loner-chart.h @@ -31,12 +31,12 @@ static const ChartNote w_whole_line_notes[] = { { 35.50, 2.00, 0 }, { 37.50, 2.00, -2 }, { 39.50, 2.00, 7 }, - { 41.50, 1.50, 5 }, - { 43.00, 1.50, 3 }, - { 44.50, 2.00, 5 }, - { 46.50, 4.00, 7 }, - { 50.50, 4.00, 3 }, - { 54.50, 3.00, 3 }, + { 41.50, 2.50, 5 }, + { 44.00, 2.50, 3 }, + { 46.50, 2.00, 5 }, + { 48.50, 4.00, 7 }, + { 52.50, 4.00, 3 }, + { 56.50, 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.580, 57.50, 24, w_whole_line_notes }, + { "w-whole-line", 0.510, 59.50, 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 48bdd25a6..9ee67576d 100644 --- a/pop/loner/vox4/.chart.json +++ b/pop/loner/vox4/.chart.json @@ -1,43 +1,43 @@ { "w-whole-line": { - "leadIn": 0.58, - "beats": 57.5, + "leadIn": 0.51, + "beats": 59.5, "voiced": [ [ - -0.183, - 11.2342 + -0.0407, + 11.2952 ], [ - 11.3358, + 11.3968, 17.08 ], [ 17.3138, - 23.9323 + 24.1052 ], [ - 24.3187, - 31.2015 + 24.4508, + 31.354 ], [ - 31.3133, - 41.2868 + 31.4557, + 41.3072 ], [ - 41.3885, - 44.286 + 41.4088, + 46.4515 ], [ - 44.3063, - 46.1465 + 46.482, + 48.3222 ], [ - 46.1872, - 53.8935 + 48.3628, + 56.0895 ], [ - 54.0968, - 58.316 + 56.2725, + 60.3087 ] ], "notes": [ @@ -46,7 +46,7 @@ "dur": 2.0, "st": 7, "t": "sitting\u00b7a", - "lead": 0.2237 + "lead": 0.0813 }, { "beat": 2.0, @@ -60,49 +60,49 @@ "dur": 2.0, "st": 3, "t": "curled", - "lead": 0.183 + "lead": 0.0 }, { "beat": 6.0, "dur": 2.0, "st": 2, "t": "up", - "lead": 0.183 + "lead": 0.0 }, { "beat": 8.0, "dur": 2.0, "st": 0, "t": "in", - "lead": 0.183 + "lead": 0.0 }, { "beat": 10.0, "dur": 1.5, "st": 5, "t": "myself\u00b7a", - "lead": 0.0712 + "lead": 0.0 }, { "beat": 11.5, "dur": 2.0, "st": 2, "t": "myself\u00b7b", - "lead": 0.2643 + "lead": 0.2033 }, { "beat": 13.5, "dur": 2.0, "st": -2, "t": "i", - "lead": 0.0915 + "lead": 0.0 }, { "beat": 15.5, "dur": 2.0, "st": -5, "t": "think", - "lead": 0.183 + "lead": 0.0 }, { "beat": 17.5, @@ -116,98 +116,98 @@ "dur": 3.0, "st": 10, "t": "a", - "lead": 0.183 + "lead": 0.0 }, { "beat": 24.5, "dur": 3.0, "st": 5, "t": "stone", - "lead": 0.2338 + "lead": 0.1017 }, { "beat": 27.5, "dur": 4.0, "st": 2, "t": "just", - "lead": 0.183 + "lead": 0.0 }, { "beat": 31.5, "dur": 2.0, "st": 3, "t": "wait", - "lead": 0.2237 + "lead": 0.0813 }, { "beat": 33.5, "dur": 2.0, "st": 2, "t": "ing", - "lead": 0.0915 + "lead": 0.0 }, { "beat": 35.5, "dur": 2.0, "st": 0, "t": "ve", - "lead": 0.183 + "lead": 0.0 }, { "beat": 37.5, "dur": 2.0, "st": -2, "t": "ry", - "lead": 0.0813 + "lead": 0.0 }, { "beat": 39.5, "dur": 2.0, "st": 7, "t": "pa", - "lead": 0.0407 + "lead": 0.0 }, { "beat": 41.5, - "dur": 1.5, + "dur": 2.5, "st": 5, "t": "tient", - "lead": 0.2033 + "lead": 0.183 }, { - "beat": 43.0, - "dur": 1.5, + "beat": 44.0, + "dur": 2.5, "st": 3, "t": "ly", - "lead": 0.183 + "lead": 0.0 }, { - "beat": 44.5, + "beat": 46.5, "dur": 2.0, "st": 5, "t": "for", - "lead": 0.183 + "lead": 0.0 }, { - "beat": 46.5, + "beat": 48.5, "dur": 4.0, "st": 7, "t": "time", - "lead": 0.183 + "lead": 0.0 }, { - "beat": 50.5, + "beat": 52.5, "dur": 4.0, "st": 3, "t": "to", - "lead": 0.183 + "lead": 0.0 }, { - "beat": 54.5, + "beat": 56.5, "dur": 3.0, "st": 3, "t": "pass", - "lead": 0.183 + "lead": 0.0 } ] }, diff --git a/pop/loner/vox4/.manifest.json b/pop/loner/vox4/.manifest.json index 5c93a9d16..1b8296cd8 100644 --- a/pop/loner/vox4/.manifest.json +++ b/pop/loner/vox4/.manifest.json @@ -1,7 +1,7 @@ { "w-whole-line": { "slice": "f-whole-line", - "lead_in": 0.58, + "lead_in": 0.51, "spans": [ [ "sitting\u00b7a", @@ -124,9 +124,9 @@ 23.97 ] ], - "beats": 57.5, + "beats": 59.5, "renders": { - "lead": 29.26 + "lead": 30.17 }, "snaps": [ "curled +65ms", -- 2.51.2