diff --git a/remotion/src/lieder/lied03/Lied03.tsx b/remotion/src/lieder/lied03/Lied03.tsx index 376abe3..f19f476 100644 --- a/remotion/src/lieder/lied03/Lied03.tsx +++ b/remotion/src/lieder/lied03/Lied03.tsx @@ -95,7 +95,8 @@ const NOA: Posenfolge = [ [s(T.v4z[2]), 'noa_A5_blick-links'], ] as Posenfolge) : []), - [s(T.m), 'noa_B_zeigen'], + // Mitmach-Teil: Noa zeigt erst auf das Gefragte, bei der Antwort auf das andere (Seite: siehe noaZeigtLinks) + ...KARTEN.flatMap((c) => c.zeigt.map((seite, k) => [s(k ? c.antwort - 0.2 : c.frage), seite === 'keins' ? 'noa_A3_lachen' : 'noa_B_zeigen'] as [number, string])), [s(T.gag), 'noa_A4_staunen'], [s(T.gag + 4.5), 'noa_A3_lachen'], ...klatschen(T.c4, T.cz(T.c4)[3]), @@ -238,6 +239,12 @@ const Garten: React.FC = () => { const v4 = T.v4z; const luluReck = v4 ? interpolate(f, [s(v4[1]), s(v4[1] + 0.6), s(v4[2]), s(v4[2] + 0.4)], [1, 1.08, 1.08, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}) : 1; const pinoDuck = v4 && T.juchhe !== undefined ? interpolate(f, [s(v4[3]), s(v4[3] + 0.3), s(T.juchhe), s(T.juchhe + 0.15)], [1, 0.8, 0.8, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}) : 1; + // Noa zeigt im Mitmach-Teil nach links (gespiegelt), wenn die Antwort bzw. Frage Pino oder die Blume meint + const karte = KARTEN.findIndex((c, k) => f >= s(c.frage) && f < s(KARTEN[k + 1]?.frage ?? T.gag)); + const noaZeigtLinks = karte >= 0 && KARTEN[karte].zeigt[f >= s(KARTEN[karte].antwort - 0.2) ? 1 : 0] === 'links'; + // Strophe 1: Pino pflückt die Blume – sie fliegt in seine Pfote und bleibt dort bis in Refrain 2 + const pflueck = interpolate(f, [s(T.v1z[3]), s(T.v1z[3] + 0.8)], [0, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}); + const blumeBeiPino = imAbschnitt(f, T.v1z[3], T.c2 + 9); const pinoGross = interpolate(f, [s(T.gag + 1), s(T.gag + 1.6), s(T.c4 - 0.6), s(T.c4)], [1, 1.25, 1.25, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}); // Gag: Pino und Lulu rücken zusammen („Nase an Nase“) const gagNah = interpolate(f, [s(T.gag + 3), s(T.gag + 4.5), s(T.c4 - 0.8), s(T.c4)], [0, 1, 1, 0], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}); @@ -263,8 +270,7 @@ const Garten: React.FC = () => { {(imAbschnitt(f, T.v1 - 1, T.v1z[1] + 0.5) || imAbschnitt(f, KARTEN[1].frage, KARTEN[2].frage)) && ( )} - {(imAbschnitt(f, T.v1z[2] - 0.5, T.v1z[3] + 0.6) || imAbschnitt(f, KARTEN[1].frage, KARTEN[2].frage)) && } - {imAbschnitt(f, T.v1z[3] + 0.6, T.c2 + 9) && } + {(imAbschnitt(f, T.v1z[2] - 0.5, T.v1z[3]) || imAbschnitt(f, KARTEN[1].frage, KARTEN[2].frage)) && } {luluGeht ? ( @@ -278,7 +284,7 @@ const Garten: React.FC = () => { blende={8} /> )} - + {flitzen ? ( ) : ( @@ -287,10 +293,12 @@ const Garten: React.FC = () => { x={PINO_X + 230 * gagNah} y={BODEN + wipp(0, 16 * ruhig) - pinoHuepf} drehung={schwank(1, 4 * ruhig)} - stauchY={(1 - 0.03 * schlag) * pinoDuck * pinoGross} + stauchX={pinoGross} + stauchY={(1 - 0.03 * schlag) * pinoDuck * pinoGross} // groß werden: in beide Richtungen, sonst wirkt Pino dünn blende={8} /> )} + {blumeBeiPino && } {imAbschnitt(f, T.v2 - 0.3, T.v2z[2]) && } diff --git a/remotion/src/lieder/lied03/zeiten.ts b/remotion/src/lieder/lied03/zeiten.ts index a182463..8060e7b 100644 --- a/remotion/src/lieder/lied03/zeiten.ts +++ b/remotion/src/lieder/lied03/zeiten.ts @@ -13,7 +13,9 @@ type Zeiten = { v4?: number; v4z?: number[]; juchhe?: number; m: number; gag: number; c4: number; zw: number; c5: number; ende: number; cz: (start: number) => [number, number, number, number]; }; -type Karte = {frage: number; antwort: number; wort: string; gegenteil: string}; +// zeigt: wohin Noa bei Frage und Antwort zeigt (rechts = Lulu/Apfel, links = Pino/Blume, keins = sie selbst) +type Seite = 'rechts' | 'links' | 'keins'; +type Karte = {frage: number; antwort: number; wort: string; gegenteil: string; zeigt: [Seite, Seite]}; const REFRAIN = (z: [number, number, number, number]) => z; const C_DE = { @@ -51,10 +53,10 @@ const DAUER_DE = Math.round(139.68 * 30); // Mitmach-Teil: Frage beginnt, Antwort des Chors const KARTEN_DE: Karte[] = [ - {frage: 74.22, antwort: 78.95, wort: 'groß', gegenteil: 'klein'}, - {frage: 79.05, antwort: 83.59, wort: 'oben', gegenteil: 'unten'}, - {frage: 83.74, antwort: 88.22, wort: 'laut', gegenteil: 'leise'}, - {frage: 88.38, antwort: 92.9, wort: 'schnell', gegenteil: 'langsam'}, // ~ Antwortzeit + {frage: 74.22, antwort: 78.95, wort: 'groß', gegenteil: 'klein', zeigt: ['rechts', 'links']}, + {frage: 79.05, antwort: 83.59, wort: 'oben', gegenteil: 'unten', zeigt: ['rechts', 'links']}, + {frage: 83.74, antwort: 88.22, wort: 'laut', gegenteil: 'leise', zeigt: ['keins', 'keins']}, + {frage: 88.38, antwort: 92.9, wort: 'schnell', gegenteil: 'langsam', zeigt: ['links', 'rechts']}, // ~ Antwortzeit ]; const refrain = (z: [number, number, number, number], d = [0, 0, 0, 0]): LiedZeile[] => [ @@ -149,10 +151,10 @@ const T_ES: Zeiten = { cz: (start: number) => Object.values(C_ES).find((z) => z[0] === start)!, }; const KARTEN_ES: Karte[] = [ - {frage: 61.07, antwort: 64.71, wort: 'pequeño', gegenteil: 'grande'}, - {frage: 65.85, antwort: 69.39, wort: 'arriba', gegenteil: 'abajo'}, - {frage: 70.73, antwort: 73.79, wort: 'fuerte', gegenteil: 'bajito'}, - {frage: 75.19, antwort: 78.59, wort: 'rápido', gegenteil: 'despacio'}, + {frage: 61.07, antwort: 64.71, wort: 'pequeño', gegenteil: 'grande', zeigt: ['links', 'rechts']}, + {frage: 65.85, antwort: 69.39, wort: 'arriba', gegenteil: 'abajo', zeigt: ['rechts', 'links']}, + {frage: 70.73, antwort: 73.79, wort: 'fuerte', gegenteil: 'bajito', zeigt: ['keins', 'links']}, + {frage: 75.19, antwort: 78.59, wort: 'rápido', gegenteil: 'despacio', zeigt: ['links', 'rechts']}, ]; const ZEILEN_ES: LiedZeile[] = [ 'Uno@5.03 pequeño,@6.25 una@6.99 grande,@7.13', @@ -220,10 +222,10 @@ const T_FR: Zeiten = { cz: (start: number) => Object.values(C_FR).find((z) => z[0] === start)!, }; const KARTEN_FR: Karte[] = [ - {frage: 66.29, antwort: 69.47, wort: 'petit', gegenteil: 'grande'}, - {frage: 71.01, antwort: 74.53, wort: 'en haut', gegenteil: 'en bas'}, - {frage: 76.01, antwort: 78.43, wort: 'fort', gegenteil: 'doucement'}, - {frage: 80.13, antwort: 82.69, wort: 'vite', gegenteil: 'lentement'}, + {frage: 66.29, antwort: 69.47, wort: 'petit', gegenteil: 'grande', zeigt: ['links', 'rechts']}, + {frage: 71.01, antwort: 74.53, wort: 'en haut', gegenteil: 'en bas', zeigt: ['rechts', 'links']}, + {frage: 76.01, antwort: 78.43, wort: 'fort', gegenteil: 'doucement', zeigt: ['keins', 'links']}, + {frage: 80.13, antwort: 82.69, wort: 'vite', gegenteil: 'lentement', zeigt: ['links', 'rechts']}, ]; const ZEILEN_FR: LiedZeile[] = [ 'Un@11.33 tout@11.95 petit,@12.21 un@12.89 très@12.93 grand,@13.09',