diff --git a/pop/loner/bin/halo3.py b/pop/loner/bin/halo3.py --- a/pop/loner/bin/halo3.py +++ b/pop/loner/bin/halo3.py @@ -280,7 +280,7 @@ # too fast and abrupt # 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 @@ v0 += 1 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 --- a/pop/loner/c/loner-chart.h +++ b/pop/loner/c/loner-chart.h @@ -31,12 +31,12 @@ { 33.50, 2.00, 2 }, { 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 @@ { 4.00, 1.50, 3 }, }; 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 --- 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 @@ "beat": 0.0, "dur": 2.0, "st": 7, "t": "sitting\u00b7a", - "lead": 0.2237 + "lead": 0.0813 }, { "beat": 2.0, @@ -60,49 +60,49 @@ "beat": 4.0, "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 @@ "beat": 21.5, "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 --- 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.0, 23.97 ] ], - "beats": 57.5, + "beats": 59.5, "renders": { - "lead": 29.26 + "lead": 30.17 }, "snaps": [ "curled +65ms",