+
+ {TEIL[teil].map(([cx, cy], k) => {
+ const p = punkt('noa', 102, 198, cx, cy, 180);
+ return
;
+ })}
+
+);
+
+const LIEDER = {de: DE, es: ES, fr: FR};
+const TITEL = {
+ de: {titel: 'Wer hat den\nlängsten Hals?', zeile: 'Wer hat den längsten Hals?'},
+ es: {titel: '¿Quién tiene el\ncuello más largo?', zeile: '¿Quién tiene el cuello más largo?'},
+ fr: {titel: 'Qui a le cou\nle plus long ?', zeile: 'Qui a le cou le plus long ?'},
+};
+const DATEN: LiedDaten = {...LIEDER[SPRACHE], datei: `musik/lieder/lied04-${SPRACHE}.mp3`, titel: TITEL[SPRACHE].titel, zeileTitel: TITEL[SPRACHE].zeile};
+
+const lage = (i: number) => {
+ const z = DATEN.zeilen;
+ let k = i;
+ while (k > 0 && z[k - 1].abschnitt === z[i].abschnitt) k--;
+ return i - k;
+};
+const NOA_NAH = {x: PLATZ.noa, y: 765, z: 1.75}; // ganze Noa über dem Mitlesetext
+const LULU_HALS = punkt('lulu', PLATZ.lulu, BODEN, 322 + 320, 23 + 230);
+
+const szene = (i: number, z: Zeile): Bild => {
+ const a = z.abschnitt.toLowerCase();
+ const n = lage(i);
+ const woerter = z.zeile.split(' ').map((w) => w.split('@')[0]);
+ if (a.startsWith('chorus')) {
+ if (n === 0) return {kamera: {x: PLATZ.lulu - 60, y: 420, z: 1.5}, luluStreckt: true, lulu: 'lulu_A3_lachen'};
+ if (n === 1) return {leuchten: [{...LULU_HALS, farbe: FARBE, r: 90}]};
+ return {};
+ }
+ if (a.startsWith('verse')) {
+ const teil = woerter.map(teilVon).find(Boolean) ?? 'ohren';
+ if (n === 0) return {kamera: NOA_NAH, noa: i % 2 ? 'noa_A5_blick-links' : 'noa_A6_blick-rechts', ruhig: true, karte: