Liedvideo „Einer klein und einer groß“ in DE/ES/FR: Zeiten, Mitlesetext und Karten je Sprache (ES/FR ohne Strophe 4)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lara 2026-11-08 14:19:20 +00:00
parent e7750f56bd
commit 1b79b14e22
3 changed files with 222 additions and 33 deletions

View file

@ -29,7 +29,7 @@ const BILD = {fps: 30, width: 1920, height: 1080} as const;
export const Root: React.FC = () => (
<>
<Composition id="Lied01" component={Lied01} durationInFrames={LIED01_DAUER} {...BILD} />
<Composition id="Lied03-DE" component={Lied03} durationInFrames={LIED03_DAUER} {...BILD} />
<Composition id="Lied03" component={Lied03} durationInFrames={LIED03_DAUER} {...BILD} />
<Composition id="GangTest" component={GangTest} durationInFrames={GANGTEST_DAUER} {...BILD} />
<Composition id="LaterneTest" component={LaterneTest} durationInFrames={420} {...BILD} />
<Composition id="VerformTest" component={VerformTest} durationInFrames={240} {...BILD} />

View file

@ -8,11 +8,11 @@ import {BODEN, Ort} from '../../baukasten/orte';
import {SCHRIFT} from '../../baukasten/untertitel';
import {plane} from '../../baukasten/zeit';
import {Karaoke} from '../karaoke';
import {DAUER, KARTEN, T, ZEILEN} from './zeiten';
import {DATEI, DAUER, KARTEN, T, TEXT, ZEILEN} from './zeiten';
// Liedvideo „Einer klein und einer groß“ (Pinos Liederbuch, Lied 3) – ENTWURF.
// Ton: Suno-Fassung „Noa in der Mitte“ (25385c27…, Pro-Download), auf −14 LUFS
// normalisiert nach public/musik/lieder/lied03-de.mp3. Alle Zeiten in Sekunden aus
// Liedvideo „Einer klein und einer groß“ (Pinos Liederbuch, Lied 3) in DE/ES/FR (--props='{"sprache":"es"}').
// Ton: Suno-Fassungen, auf −14 LUFS normalisiert nach public/musik/lieder/lied03-<sprache>.mp3.
// ES und FR haben keine Strophe 4 (lang/kurz): alles, was an T.v4 hängt, entfällt dort. Alle Zeiten in Sekunden aus
// Sunos Wort-Ausrichtung (zeiten.ts); das Bild folgt dem Gesang, nicht dem Drehbuch-Raster.
const FPS = 30;
@ -40,8 +40,12 @@ const KAMERA: [number, number, number, number][] = [
[T.v2z[3], 1260, 420, 1.55], // Lulu lauscht
[T.v3, 960, 620, 1.12], // schnell / langsam: weit
[T.c3, 1120, 660, 1.25],
...(T.v4 !== undefined && T.v4z
? ([
[T.v4, 1440, 440, 1.55], // Lulus Schal
[T.v4z[2], 780, 820, 1.8], // Pinos Zeh
] as [number, number, number, number][])
: []),
[T.m, 1120, 640, 1.18], // Mitmach-Teil
[T.gag, 1110, 700, 1.4],
[T.c4, 1120, 660, 1.25],
@ -85,8 +89,12 @@ const NOA: Posenfolge = [
[s(T.v2z[3]), 'noa_A3_lachen'],
...klatschen(T.c3, T.cz(T.c3)[3]),
[s(T.cz(T.c3)[3]), 'noa_A_arme-hoch'],
...(T.v4 !== undefined && T.v4z
? ([
[s(T.v4), 'noa_A6_blick-rechts'],
[s(T.v4z[2]), 'noa_A5_blick-links'],
] as Posenfolge)
: []),
[s(T.m), 'noa_B_zeigen'],
[s(T.gag), 'noa_A4_staunen'],
[s(T.gag + 4.5), 'noa_A3_lachen'],
@ -104,8 +112,12 @@ const PINO: Posenfolge = [
[s(T.c2), 'pino_A3_lachen'],
[s(T.v2z[2]), 'pino_A5_blick-links'], // raschelt leis
[s(T.v2z[3]), 'pino_A3_lachen'],
...(T.v4z
? ([
[s(T.v4z[2]), 'pino_A4_staunen'],
[s(T.v4z[3] + 1.4), 'pino_A3_lachen'],
] as Posenfolge)
: []),
[s(T.gag + 1), 'pino_A_hinterbeine'], // „Ich mach mich groß!“
[s(T.c4), 'pino_A3_lachen'],
[s(T.ende), 'pino_A3_lachen'],
@ -173,7 +185,8 @@ const Karten: React.FC = () => {
const karte = (inhalt: React.ReactNode, farbe: string, extra: React.CSSProperties = {}) => (
<div
style={{
width: 300,
minWidth: 300,
padding: '0 30px',
height: 150,
borderRadius: 30,
background: '#fbf4e4',
@ -222,8 +235,9 @@ const Garten: React.FC = () => {
const luluX = interpolate(f, [s(T.v3z[2]), s(T.c3 - 0.2)], [LULU_X, LULU_X2], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'});
// Strophe 4 und Gag: Recken und Ducken
const luluReck = interpolate(f, [s(T.v4z[1]), s(T.v4z[1] + 0.6), s(T.v4z[2]), s(T.v4z[2] + 0.4)], [1, 1.08, 1.08, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'});
const pinoDuck = interpolate(f, [s(T.v4z[3]), s(T.v4z[3] + 0.3), s(T.juchhe), s(T.juchhe + 0.15)], [1, 0.8, 0.8, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'});
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;
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'});
@ -231,7 +245,7 @@ const Garten: React.FC = () => {
// Hüpfer: am Refrain-Ende („hin!“), „juchhe“, Mitmach-Antworten
const pinoHuepf =
[T.cz(T.c1)[3] + 1.6, T.cz(T.c2)[3] + 1.6, T.cz(T.c3)[3] + 1.6, T.cz(T.c4)[3] + 1.6].reduce((a, t) => a + huepfer(f, s(t), 26, 12), 0) +
huepfer(f, s(T.juchhe), 46, 14) +
(T.juchhe !== undefined ? huepfer(f, s(T.juchhe), 46, 14) : 0) +
KARTEN.reduce((a, c) => a + huepfer(f, s(c.antwort), 22, 12), 0);
const abend = interpolate(f, [s(T.c5 - 1), s(T.c5 + 2)], [0, 1], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'});
@ -278,9 +292,9 @@ const Garten: React.FC = () => {
/>
)}
{imAbschnitt(f, T.v2 - 0.3, T.v2z[2]) && <Trommel x={NOA_X + 120} y={BODEN - 90} schlag={schlag} />}
<Ruf text="Bumm!" x={NOA_X + 140} y={BODEN - 260} start={s(T.bumm)} dauer={26} groesse={90} />
<Ruf text="Bumm, bumm!" x={NOA_X + 60} y={BODEN - 330} start={s(T.v2z[1] + 0.9)} dauer={30} groesse={80} farbe="#c8362c" />
<Ruf text="rischel, raschel …" x={PINO_X - 60} y={BODEN - 220} start={s(T.v2z[2] + 0.5)} dauer={50} groesse={46} farbe="#8a6a4a" />
<Ruf text={TEXT.bumm} x={NOA_X + 140} y={BODEN - 260} start={s(T.bumm)} dauer={26} groesse={90} />
<Ruf text={TEXT.bumm2} x={NOA_X + 60} y={BODEN - 330} start={s(T.v2z[1] + 0.9)} dauer={30} groesse={80} farbe="#c8362c" />
<Ruf text={TEXT.leise} x={PINO_X - 60} y={BODEN - 220} start={s(T.v2z[2] + 0.5)} dauer={50} groesse={46} farbe="#8a6a4a" />
<Funkeln x={(PINO_X + 230 + LULU_X - 150) / 2} y={BODEN - 230} start={s(T.gag + 4.6)} dauer={50} s={1.4} />
</Kamera>
{imAbschnitt(f, T.v2z[1], T.v2z[2]) && <Klatschen x={960} y={170} takt={SCHLAG / 2} s={1.1} />}
@ -301,7 +315,7 @@ const Garten: React.FC = () => {
opacity: interpolate(f, [s(T.c1), s(T.c1 + 0.6), s(T.v1 - 0.8), s(T.v1)], [0, 1, 1, 0], {extrapolateLeft: 'clamp', extrapolateRight: 'clamp'}),
}}
>
♫ Einer klein und einer groß ♫
♫ {TEXT.zeile} ♫
</div>
<Vignette />
</>
@ -322,14 +336,14 @@ export const Lied03: React.FC = () => (
</Sequence>
<Sequence durationInFrames={INTRO_DAUER}>
<AbsoluteFill style={{background: '#f4ead8'}}>
<Intro plan={INTRO} titel={'Einer klein\nund einer groß'} posen={['pino_A3_lachen', 'noa_A3_lachen', 'lulu_A3_lachen']} />
<Intro plan={INTRO} titel={TEXT.titel} posen={['pino_A3_lachen', 'noa_A3_lachen', 'lulu_A3_lachen']} />
</AbsoluteFill>
</Sequence>
<Sequence from={OUTRO_START}>
<Outro posen={['pino_A3_lachen', 'noa_A_arm-hoch-winken', 'lulu_A3_lachen']} />
</Sequence>
<Karaoke zeilen={ZEILEN} />
<Audio src={staticFile('musik/lieder/lied03-de.mp3')} />
<Audio src={staticFile(DATEI)} />
</AbsoluteFill>
);

View file

@ -1,3 +1,4 @@
import {SPRACHE, type Sprache} from '../../baukasten/sprache';
import type {LiedZeile} from '../karaoke';
// Zeiten (Sekunden) der Suno-Fassung „Noa in der Mitte“ (Song-ID 25385c27-bb5d-40d6-b3b6-cea78bfdaa0b),
@ -6,8 +7,16 @@ import type {LiedZeile} from '../karaoke';
// Achtung: Die Suno-Fassung singt noch Strophe 4 (lang/kurz) und die alte Mitmach-Frage
// „Ich klatsche laut, und jetzt bin ich … leise“ (Stand vor dem Team-Check).
// Strophe 4 (lang/kurz) und „juchhe“ singt nur die deutsche Fassung
type Zeiten = {
c1: number; v1: number; v1z: number[]; c2: number; v2: number; v2z: number[]; bumm: number; v3: number; v3z: number[]; c3: number;
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};
const REFRAIN = (z: [number, number, number, number]) => z;
const C = {
const C_DE = {
c1: REFRAIN([9.43, 11.53, 13.84, 16.03]),
c2: REFRAIN([27.59, 30.01, 32.33, 34.49]),
c3: REFRAIN([55.26, 57.64, 60.01, 62.14]),
@ -15,33 +24,33 @@ const C = {
c5: REFRAIN([119.6, 121.94, 124.25, 126.39]), // ~ erster Wert (Suno: 109,64, passt nicht zu „klein“ bei 120,09)
};
export const T = {
c1: C.c1[0],
const T_DE: Zeiten = {
c1: C_DE.c1[0],
v1: 18.41,
v1z: [18.41, 20.84, 23.04, 25.34],
c2: C.c2[0],
c2: C_DE.c2[0],
v2: 36.78,
v2z: [36.78, 39.22, 41.5, 43.79],
bumm: 38.59,
v3: 45.97,
v3z: [45.97, 48.26, 50.71, 52.9],
c3: C.c3[0],
c3: C_DE.c3[0],
v4: 65.0,
v4z: [65.0, 67.32, 69.68, 71.95],
juchhe: 73.38,
m: 74.22,
gag: 93.6, // ~ Instrumental-Groove nach „Langsam!“ (Platz für den gesprochenen Gag)
c4: C.c4[0],
c4: C_DE.c4[0],
zw: 110.5, // ~ Zwischenspiel nach Refrain 4
c5: C.c5[0],
c5: C_DE.c5[0],
ende: 128.6, // ~ Outro (Glockenspiel)
cz: (start: number) => Object.values(C).find((z) => z[0] === start)!,
cz: (start: number) => Object.values(C_DE).find((z) => z[0] === start)!,
};
export const DAUER = Math.round(139.68 * 30);
const DAUER_DE = Math.round(139.68 * 30);
// Mitmach-Teil: Frage beginnt, Antwort des Chors
export const KARTEN = [
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'},
@ -55,7 +64,7 @@ const refrain = (z: [number, number, number, number], d = [0, 0, 0, 0]): LiedZei
`zusammen@${z[3]} kriegen@${(z[3] + 0.48).toFixed(2)} wir@${(z[3] + 0.95).toFixed(2)} alles@${(z[3] + 1.21).toFixed(2)} hin!@${(z[3] + 1.62).toFixed(2)}`,
];
export const ZEILEN: LiedZeile[] = [
const ZEILEN_DE: LiedZeile[] = [
// Refrain 1 (gemessene Wortzeiten)
'Einer@9.43 klein@9.69 und@10.12 einer@10.32 groß,@10.76',
'und@11.53 dazwischen_–@11.73 na,@12.66 wer@12.86 bloß?@13.01',
@ -69,7 +78,7 @@ export const ZEILEN: LiedZeile[] = [
// Refrain 2 (Wortabstände wie Refrain 1, Zeilenanfänge gemessen)
'Einer@27.59 klein@28.17 und@28.57 einer@28.81 groß,@29.26',
'und@30.01 dazwischen_–@30.21 na,@31.15 wer@31.35 bloß?@31.51',
...refrain(C.c2).slice(2),
...refrain(C_DE.c2).slice(2),
// Strophe 2: laut / leise
'Laut@36.78 klingt@37.07 Noas@37.45 Trommel:@37.83 bumm!@38.59',
'Alle@39.22 klatschen@39.64 laut@40.24 herum.@40.57',
@ -106,3 +115,169 @@ export const ZEILEN: LiedZeile[] = [
'Noa@124.25 steht@124.64 in@124.98 der@125.09 Mitte@125.27 drin,@125.66',
'zusammen@126.39 kriegen@126.9 wir@127.35 alles@127.61 hin!@128.03',
];
// ---------------------------------------------------------------- ES und FR
// Suno-Fassungen „Uno pequeño, una grande“ (0821f657) und „Un tout petit, un très grand“ (52b8359a), ohne
// Strophe 4 (lang/kurz). Zeiten am 08.11.2026 mit faster-whisper (small) gemessen, +0,43 s wie bei den
// Zeilenanfängen in folge01/lied.tsx; Text aus drehbuecher/lieder/lied03-einer-klein-einer-gross/<sprache>.md.
// Genauigkeit etwa ±0,3 s.
const C_ES = {
c1: REFRAIN([5.03, 7.47, 9.45, 12.27]),
c2: REFRAIN([24.87, 27.03, 28.95, 31.57]),
c3: REFRAIN([52.53, 54.57, 56.51, 59.37]),
c4: REFRAIN([98.03, 100.45, 102.41, 105.29]),
c5: REFRAIN([106.87, 109.65, 111.57, 114.47]),
};
const T_ES: Zeiten = {
c1: C_ES.c1[0],
v1: 14.95,
v1z: [14.95, 17.49, 19.75, 21.81],
c2: C_ES.c2[0],
v2: 33.49,
v2z: [33.49, 36.55, 38.49, 40.81],
bumm: 35.61,
v3: 43.53,
v3z: [43.53, 45.63, 47.97, 50.01],
c3: C_ES.c3[0],
m: 61.07,
gag: 81.0,
c4: C_ES.c4[0],
zw: 106.5,
c5: C_ES.c5[0],
ende: 117.0,
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'},
];
const ZEILEN_ES: LiedZeile[] = [
'Uno@5.03 pequeño,@6.25 una@6.99 grande,@7.13',
'¿y@7.47 en@7.81 el@8.05 medio@8.25 quién@8.63 será?@8.99',
'¡Noa@9.45 en@10.59 el@10.89 medio,@11.07 ahí@11.41 está!@11.55',
'¡Juntos@12.27 todo@12.63 se@13.07 puede!@13.33',
'Arriba@14.95 cuelga@15.75 una@16.23 manzana,@16.45',
'Lulu@17.49 la@17.85 alcanza@18.15 con@18.69 ganas.@19.03',
'Abajo@19.75 hay@20.61 una@20.99 flor,@21.21',
'Pino@21.81 la@22.15 toma@22.39 con@22.97 amor.@23.43',
'Uno@24.87 pequeño,@25.77 una@26.57 grande,@26.67',
'¿y@27.03 en@27.35 el@27.55 medio@27.79 quién@28.13 será?@28.51',
'¡Noa@28.95 en@30.15 el@30.41 medio,@30.63 ahí@30.99 está!@31.11',
'¡Juntos@31.57 todo@32.17 se@32.59 puede!@32.85',
'Noa@33.49 toca@34.69 el@34.87 tambor:@35.03 ¡bum!@35.61',
'Aplaude@36.55 fuerte:@36.97 ¡bum,@37.51 bum!@37.86',
'Pino@38.49 susurra@39.03 bajito,@39.63',
'Lulu@40.81 escucha:@41.21 ¡qué@42.09 bonito!@42.55',
'Pino@43.53 corre@43.85 muy@44.23 deprisa,@44.69',
'pisa@45.63 fuerte,@45.95 ¡con@46.45 sonrisa!@46.91',
'Lulu@47.97 va@48.17 muy@48.53 despacio,@48.77',
'tú@50.01 también,@50.35 ¡paso@50.91 a@51.75 paso!@51.87',
'Uno@52.53 pequeño,@53.27 una@54.11 grande,@54.23',
'¿y@54.57 en@54.89 el@55.13 medio@55.35 quién@55.73 será?@56.07',
'¡Noa@56.51 en@57.65 el@58.01 medio,@58.21 ahí@58.65 está!@58.65',
'¡Juntos@59.37 todo@59.71 se@60.17 puede!@60.43',
'Pino@61.07 es@62.13 pequeño@62.49 y@62.93 Lulu@63.41 es_…@63.59',
'La@65.85 manzana@65.99 está@66.65 arriba,@67.21 la@68.05 flor_…@68.27',
'Noa@70.73 toca@71.31 fuerte,@71.63 y@72.21 Pino_…@72.53',
'Pino@75.19 va@75.93 rápido,@76.45 y@76.97 Lulu_…@77.41',
'Uno@98.03 pequeño,@99.17 una@99.99 grande,@100.09',
'¿y@100.45 en@100.81 el@101.01 medio@101.21 quién@101.59 será?@101.97',
'¡Noa@102.41 en@103.55 el@103.85 medio,@104.05 ahí@104.45 está!@104.53',
'¡Juntos@105.29 todo@105.59 se@106.03 puede!@106.29',
'Uno@106.87 pequeño,@108.41 una@109.21 grande,@109.29',
'¿y@109.65 en@109.97 el@110.19 medio@110.41 quién@110.75 será?@111.15',
'¡Noa@111.57 en@112.67 el@113.03 medio,@113.23 ahí@113.67 está!@113.69',
'¡Juntos@114.47 todo@114.75 se@115.19 puede!@115.47',
];
const C_FR = {
c1: REFRAIN([11.33, 13.77, 16.31, 18.59]),
c2: REFRAIN([30.17, 32.31, 34.87, 36.95]),
c3: REFRAIN([57.77, 60.01, 62.35, 64.57]),
c4: REFRAIN([102.87, 105.23, 107.83, 110.05]),
c5: REFRAIN([121.01, 122.4, 123.99, 125.4]), // Schluss: nur „Un tout petit, un très grand“ zweimal
};
const T_FR: Zeiten = {
c1: C_FR.c1[0],
v1: 20.37,
v1z: [20.37, 22.81, 25.39, 27.89],
c2: C_FR.c2[0],
v2: 38.77,
v2z: [38.77, 41.81, 44.11, 46.17],
bumm: 41.15,
v3: 48.47,
v3z: [48.47, 50.85, 53.01, 55.23],
c3: C_FR.c3[0],
m: 66.29,
gag: 86.0,
c4: C_FR.c4[0],
zw: 112.5,
c5: C_FR.c5[0],
ende: 128.0,
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'},
];
const ZEILEN_FR: LiedZeile[] = [
'Un@11.33 tout@11.95 petit,@12.21 un@12.89 très@12.93 grand,@13.09',
'et@13.77 au@14.27 milieu,@14.57 qui,@14.89 dis-moi_?@15.19',
'Noa@16.31 se@16.77 tient@17.03 entre@17.29 les@17.59 deux,@17.81',
'ensemble,@18.59 on@19.15 fait@19.67 de@19.81 notre@19.97 mieux_!@20.32',
'Une@20.37 pomme,@21.19 tout@21.63 là-haut,@22.01',
'Lulu@22.81 l\'attrape,@23.57 bravo_!@23.91',
'Une@25.39 fleur@25.71 bleue,@26.09 tout@26.49 en@26.61 bas,@26.87',
'Pino@27.89 la@28.31 cueille,@28.49 hop-là_!@28.99',
'Un@30.17 tout@30.41 petit,@30.67 un@31.29 très@31.37 grand,@31.53',
'et@32.31 au@32.73 milieu,@33.03 qui,@33.35 dis-moi_?@33.67',
'Noa@34.87 se@35.23 tient@35.49 entre@35.75 les@36.05 deux,@36.25',
'ensemble,@36.95 on@37.63 fait@38.11 de@38.27 notre@38.45 mieux_!@38.80',
'Le@38.77 tambour@39.57 de@40.23 Noa_:@40.47 boum_!@41.15',
'Frappe@41.81 fort@41.81 dans@42.07 tes@42.51 mains_:@42.75 boum_!@43.03',
'Pino@44.11 glisse@44.11 doucement,@44.45',
'Lulu@46.17 l\'entend,@46.63 c\'est@46.91 charmant.@47.19',
'Vite,@48.47 Pino@48.85 va@49.37 et@49.65 vient,@49.85',
'tape@50.85 des@51.09 pieds,@51.35 tout@51.85 va@51.91 bien.@52.11',
'Lentement,@53.01 Lulu@53.61 s\'en@54.07 va,@54.47',
'tape,@55.23 tape,@55.89 pas@56.41 à@56.55 pas.@56.81',
'Un@57.77 tout@57.99 petit,@58.23 un@58.91 très@58.95 grand,@59.11',
'et@60.01 au@60.29 milieu,@60.57 qui,@60.87 dis-moi_?@61.21',
'Noa@62.35 se@62.83 tient@63.03 entre@63.27 les@63.59 deux,@63.79',
'ensemble,@64.57 on@65.11 fait@65.59 de@65.79 notre@65.93 mieux_!@66.28',
'Pino@66.29 est@67.59 petit,@67.95 Lulu@68.77 est_…@68.95',
'La@71.01 pomme@71.63 est@72.17 en@72.59 haut,@72.89 et@73.23 la@73.59 fleur_…@73.75',
'Noa@76.01 tape@76.61 fort,@76.99 et@77.53 Pino_…@77.85',
'Pino@80.13 va@80.97 vite,@81.25 Lulu@82.05 va_…@82.13',
'Un@102.87 tout@103.47 petit,@103.73 un@104.35 très@104.43 grand,@104.59',
'et@105.23 au@105.75 milieu,@106.03 qui,@106.37 dis-moi_?@106.67',
'Noa@107.83 se@108.23 tient@108.49 entre@108.71 les@109.01 deux,@109.25',
'ensemble,@110.05 on@110.63 fait@111.03 de@111.21 notre@111.33 mieux_!@111.68',
'Un@121.01 tout@121.69 petit,@121.97 un@122.57 très@122.65 grand,@122.83',
'Un@123.99 tout@124.29 petit,@124.93 un@125.43 très@126.43 grand.@127.23',
];
// Texte im Bild je Sprache
const BILDTEXT = {
de: {titel: 'Einer klein\nund einer groß', zeile: 'Einer klein und einer groß', bumm: 'Bumm!', bumm2: 'Bumm, bumm!', leise: 'rischel, raschel …'},
es: {titel: 'Uno pequeño,\nuna grande', zeile: 'Uno pequeño, una grande', bumm: '¡Bum!', bumm2: '¡Bum, bum!', leise: 'chis, chis …'},
fr: {titel: 'Un tout petit,\nun très grand', zeile: 'Un tout petit, un très grand', bumm: 'Boum !', bumm2: 'Boum, boum !', leise: 'chut, chut …'},
};
const LIEDER: Record<Sprache, {T: Zeiten; dauer: number; karten: Karte[]; zeilen: LiedZeile[]; datei: string}> = {
de: {T: T_DE, dauer: DAUER_DE, karten: KARTEN_DE, zeilen: ZEILEN_DE, datei: 'musik/lieder/lied03-de.mp3'},
es: {T: T_ES, dauer: Math.round(126.4 * 30), karten: KARTEN_ES, zeilen: ZEILEN_ES, datei: 'musik/lieder/lied03-es.mp3'},
fr: {T: T_FR, dauer: Math.round(130.8 * 30), karten: KARTEN_FR, zeilen: ZEILEN_FR, datei: 'musik/lieder/lied03-fr.mp3'},
};
const L = LIEDER[SPRACHE];
export const T = L.T;
export const DAUER = L.dauer;
export const KARTEN = L.karten;
export const ZEILEN = L.zeilen;
export const DATEI = L.datei;
export const TEXT = BILDTEXT[SPRACHE];