+);
+
+// Weicher Schatten einer Figur an der Wand. Er steht hinter der Figur, ist um `k` vergrößert und
+// liegt vom Licht weg verschoben; je näher die Figur am Licht, desto größer (k aus `schattenGroesse`).
+// Weich, rund und bläulich-dunkel, ohne harten Rand (Drehbuch: groß, aber nicht unheimlich).
+export const schattenGroesse = (abstand: number) => Math.min(3.2, Math.max(1.05, 1 + 260 / Math.max(60, abstand)));
+
+export const WandSchatten: React.FC<{
+ pose: string | Posenfolge;
+ x: number; // Fußpunkt der Figur
+ licht: {x: number; y: number};
+ hoehe: number;
+ k: number;
+ wand?: {x0: number; x1: number; oben: number; unten: number};
+ deckkraft?: number;
+ drehung?: number;
+ stauchY?: number;
+}> = ({pose, x, licht, hoehe, k, wand = WAND, deckkraft = 0.42, drehung = 0, stauchY = 1}) => (
+
+
+
+
+
+);
+
+// Hand-Schatten an der Wand: Hase (zwei Ohren) und Igel (Faust mit gespreizten Fingern)
+export const HandSchatten: React.FC<{art: 'hase' | 'igel'; x: number; y: number; s?: number; deckkraft?: number; wackeln?: number}> = ({art, x, y, s = 1, deckkraft = 0.45, wackeln = 0}) => (
+
+);
+
+// Wo die Laterne in der Pose noa_A_laterne hängt, und wie groß unsere Laterne sein muss, um die orange
+// Laterne des Bildes ganz abzudecken (gemessen: 131 × 134 Bildpunkte, Mitte bei 73/423 im Bild, Bild bei 339/156)
+export const laterneInNoasHand = (noaX: number, noaY = BODEN) => ({
+ ...punkt('noa', noaX, noaY, 339 + 73.5, 156 + 423),
+ s: (1.2 * NOA_HOEHE) / FIGUREN.noa.refHoehe,
+});
+
+// Abend-Dämmerung über der ganzen Szene, aufgehellt um die Laterne (warmes Licht, Rest bläulich)
+export const Abenddunkel: React.FC<{licht: {x: number; y: number}; staerke?: number; radius?: number}> = ({licht, staerke = 0.4, radius = 500}) => (
+
+);
diff --git a/remotion/src/folge08/texte/de.json b/remotion/src/folge08/texte/de.json
new file mode 100644
index 0000000..f754c65
--- /dev/null
+++ b/remotion/src/folge08/texte/de.json
@@ -0,0 +1,58 @@
+{
+ "titel": "Noas Laterne",
+ "zeilen": {
+ "s2/l1": "Was machst du da, Noa?",
+ "s2/n1": "Rate mal! Es ist rund. Es hat einen Stab. Und innen drin leuchtet es.",
+ "s2/e1": "Rund, mit einem Stab, und innen leuchtet es. Was bastelt Noa wohl?",
+ "s2/n2": "Eine Laterne!",
+ "s2/p1": "Eine Laterne! Mit was drauf?",
+ "s2/n3": "Mit Sternen. Hilfst du mir zählen?",
+ "s2/z1": "Eins …",
+ "s2/z2": "zwei …",
+ "s2/z3": "drei …",
+ "s2/z4": "vier …",
+ "s2/z5": "fünf!",
+ "s2/p2": "Und ein Igel! Da muss ein Igel drauf!",
+ "s2/n4": "Natürlich muss da ein Igel drauf.",
+ "s2/l2": "Der Kleber ist noch nass. Ich puste!",
+ "s2/p3": "Das kitzelt!",
+ "s3/e1": "Es wird Abend in Noas Garten. Jetzt ist die richtige Zeit für eine Laterne.",
+ "s3/e2": "Noas Laterne hat ein kleines Lämpchen. Kein Feuer. So kann nichts passieren.",
+ "s3/p1": "Ooooh. Mein Igel leuchtet!",
+ "s3/v1": "Mein kleines Licht, so rund und warm,",
+ "s3/v2": "ich trag es durch den Garten.",
+ "s3/v3": "Der Mond schaut schon, die Sterne auch,",
+ "s3/v4": "die wollen auf uns warten.",
+ "s3/e3": "Kannst du mitsingen?",
+ "s3/w1": "Mein kleines Licht, so rund und warm,",
+ "s3/w2": "ich trag es durch den Garten.",
+ "s3/w3": "Der Mond schaut schon, die Sterne auch,",
+ "s3/w4": "die wollen auf uns warten.",
+ "s4/e1": "Schau mal, Pinos Stacheln gehen hoch. Wie fühlt sich Pino jetzt?",
+ "s4/p1": "Noa … da ist was Großes an der Wand. Ich hab ein bisschen Angst.",
+ "s4/n1": "Gut, dass du es mir sagst. Komm, wir schauen zusammen hin.",
+ "s4/e2": "Wenn man Angst hat, darf man das sagen. Dann ist man nicht allein.",
+ "s4/e3": "Der Schatten hat vier lange Beine. Und einen ganz langen Hals. Wem gehört wohl dieser Schatten?",
+ "s5/l1": "Huch! Das bin ja ich!",
+ "s5/p1": "Das ist ja Lulus Schatten! Der ist ja noch größer als Lulu!",
+ "s5/e1": "Die Laterne leuchtet auf Lulu. Hinter Lulu kommt das Licht nicht hin. Da wird es dunkel. Das ist ein Schatten.",
+ "s6/p1": "Mein Schatten ist so klein.",
+ "s6/n1": "Warte mal. Ich hab eine Idee.",
+ "s6/e1": "Pino geht ganz nah an die Laterne. Was meinst du: Wird sein Schatten jetzt größer oder kleiner?",
+ "s6/e2": "Größer! Je näher man am Licht ist, desto größer wird der Schatten.",
+ "s6/p2": "Jetzt bin ich der Größte von allen!",
+ "s6/l1": "Guten Abend, großer Pino!",
+ "s6/p3": "Einmal klein und einmal groß!",
+ "s7/n1": "Schau mal, ein Hase!",
+ "s7/e1": "Mach mal mit deiner Hand einen Hasen. Zwei Finger hoch für die Ohren.",
+ "s7/e2": "Hallo, Hase!",
+ "s7/p1": "Das bin ja ich!",
+ "s7/e3": "Und jetzt einen Igel. Mach eine Faust und streck die Finger hoch, wie Stacheln.",
+ "s7/e4": "Hallo, kleiner Igel!",
+ "s8/p1": "Jetzt ist es gar nicht mehr dunkel.",
+ "s8/n1": "Die Laterne passt auf dich auf. Gute Nacht, Pino.",
+ "s8/e1": "Und bei dir? Ist da auch ein kleines Licht, wenn du schlafen gehst?",
+ "s8/t1": "Tschüss! Bis bald!",
+ "s8/p2": "… bis bald …"
+ }
+}
\ No newline at end of file
diff --git a/remotion/src/folge08/texte/es.json b/remotion/src/folge08/texte/es.json
new file mode 100644
index 0000000..d10b776
--- /dev/null
+++ b/remotion/src/folge08/texte/es.json
@@ -0,0 +1,58 @@
+{
+ "titel": "El farolillo de Noa",
+ "zeilen": {
+ "s2/l1": "¿Qué haces, Noa?",
+ "s2/n1": "¡Adivina! Es redondo. Tiene un palito. Y por dentro brilla.",
+ "s2/e1": "Redondo, con un palito, y por dentro brilla. ¿Qué estará haciendo Noa?",
+ "s2/n2": "¡Un farolillo!",
+ "s2/p1": "¡Un farolillo! ¿Y qué lleva encima?",
+ "s2/n3": "Estrellas. ¿Me ayudas a contar?",
+ "s2/z1": "Una …",
+ "s2/z2": "dos …",
+ "s2/z3": "tres …",
+ "s2/z4": "cuatro …",
+ "s2/z5": "¡cinco!",
+ "s2/p2": "¡Y un erizo! ¡Tiene que llevar un erizo!",
+ "s2/n4": "Claro que tiene que llevar un erizo.",
+ "s2/l2": "El pegamento todavía está mojado. ¡Yo soplo!",
+ "s2/p3": "¡Me hace cosquillas!",
+ "s3/e1": "Se hace de noche en el jardín de Noa. Ahora es el momento para un farolillo.",
+ "s3/e2": "El farolillo de Noa tiene una lucecita. Nada de fuego. Así no puede pasar nada.",
+ "s3/p1": "¡Ooooh! ¡Mi erizo brilla!",
+ "s3/v1": "Mi farolillo, redondo y calentito,",
+ "s3/v2": "lo llevo por el jardín.",
+ "s3/v3": "La luna mira, y las estrellas,",
+ "s3/v4": "nos esperan hasta el fin.",
+ "s3/e3": "¿Cantas con nosotros?",
+ "s3/w1": "Mi farolillo, redondo y calentito,",
+ "s3/w2": "lo llevo por el jardín.",
+ "s3/w3": "La luna mira, y las estrellas,",
+ "s3/w4": "nos esperan hasta el fin.",
+ "s4/e1": "Mira, a Pino se le levantan las púas. ¿Cómo se siente Pino ahora?",
+ "s4/p1": "Noa… hay algo muy grande en la pared. Tengo un poquito de miedo.",
+ "s4/n1": "Qué bien que me lo dices. Ven, vamos a mirar juntos.",
+ "s4/e2": "Si tienes miedo, lo puedes decir. Así no estás solo.",
+ "s4/e3": "La sombra tiene cuatro patas largas. Y un cuello larguísimo. ¿De quién será esta sombra?",
+ "s5/l1": "¡Huy! ¡Pero si soy yo!",
+ "s5/p1": "¡Es la sombra de Lulu! ¡Y es todavía más grande que Lulu!",
+ "s5/e1": "El farolillo ilumina a Lulu. Detrás de Lulu, la luz no llega. Allí se pone oscuro. Eso es una sombra.",
+ "s6/p1": "Mi sombra es muy pequeña.",
+ "s6/n1": "Espera. Tengo una idea.",
+ "s6/e1": "Pino se acerca mucho al farolillo. ¿Qué crees: su sombra se hará más grande o más pequeña?",
+ "s6/e2": "¡Más grande! Cuanto más cerca de la luz, más grande es la sombra.",
+ "s6/p2": "¡Ahora soy el más grande de todos!",
+ "s6/l1": "¡Buenas noches, gran Pino!",
+ "s6/p3": "¡Una vez pequeño y una vez grande!",
+ "s7/n1": "¡Mira, un conejo!",
+ "s7/e1": "Haz un conejo con tu mano. Dos dedos arriba para las orejas.",
+ "s7/e2": "¡Hola, conejo!",
+ "s7/p1": "¡Pero si soy yo!",
+ "s7/e3": "Y ahora un erizo. Cierra la mano y estira los dedos hacia arriba, como púas.",
+ "s7/e4": "¡Hola, erizo pequeño!",
+ "s8/p1": "Ahora ya no está nada oscuro.",
+ "s8/n1": "El farolillo te cuida. Buenas noches, Pino.",
+ "s8/e1": "¿Y tú? ¿Tienes también una lucecita cuando te vas a dormir?",
+ "s8/t1": "¡Adiós! ¡Hasta pronto!",
+ "s8/p2": "…hasta pronto…"
+ }
+}
\ No newline at end of file
diff --git a/remotion/src/folge08/texte/fr.json b/remotion/src/folge08/texte/fr.json
new file mode 100644
index 0000000..9b8984a
--- /dev/null
+++ b/remotion/src/folge08/texte/fr.json
@@ -0,0 +1,58 @@
+{
+ "titel": "La lanterne de Noa",
+ "zeilen": {
+ "s2/l1": "Qu’est-ce que tu fais, Noa ?",
+ "s2/n1": "Devine ! C’est rond. Il y a un bâton. Et dedans, ça brille.",
+ "s2/e1": "Rond, avec un bâton, et dedans, ça brille. Qu’est-ce que Noa fabrique ?",
+ "s2/n2": "Une lanterne !",
+ "s2/p1": "Une lanterne ! Avec quoi dessus ?",
+ "s2/n3": "Avec des étoiles. Tu m’aides à compter ?",
+ "s2/z1": "Une …",
+ "s2/z2": "deux …",
+ "s2/z3": "trois …",
+ "s2/z4": "quatre …",
+ "s2/z5": "cinq !",
+ "s2/p2": "Et un hérisson ! Il faut un hérisson dessus !",
+ "s2/n4": "Bien sûr qu’il faut un hérisson dessus.",
+ "s2/l2": "La colle est encore mouillée. Je souffle !",
+ "s2/p3": "Ça chatouille !",
+ "s3/e1": "Le soir tombe dans le jardin de Noa. C’est le bon moment pour une lanterne.",
+ "s3/e2": "La lanterne de Noa a une petite lampe. Pas de feu. Comme ça, il ne peut rien arriver.",
+ "s3/p1": "Ooooh. Mon hérisson brille !",
+ "s3/v1": "Ma petite lumière, ronde et douce,",
+ "s3/v2": "je la promène au jardin.",
+ "s3/v3": "La lune regarde, les étoiles aussi,",
+ "s3/v4": "elles nous attendent en chemin.",
+ "s3/e3": "Tu chantes avec nous ?",
+ "s3/w1": "Ma petite lumière, ronde et douce,",
+ "s3/w2": "je la promène au jardin.",
+ "s3/w3": "La lune regarde, les étoiles aussi,",
+ "s3/w4": "elles nous attendent en chemin.",
+ "s4/e1": "Regarde, les piquants de Pino se dressent. Comment se sent Pino maintenant ?",
+ "s4/p1": "Noa… il y a quelque chose de grand sur le mur. J’ai un petit peu peur.",
+ "s4/n1": "C’est bien que tu me le dises. Viens, on regarde ensemble.",
+ "s4/e2": "Quand on a peur, on a le droit de le dire. Comme ça, on n’est pas tout seul.",
+ "s4/e3": "L’ombre a quatre longues pattes. Et un très long cou. À qui est cette ombre ?",
+ "s5/l1": "Oh ! Mais c’est moi !",
+ "s5/p1": "C’est l’ombre de Lulu ! Elle est encore plus grande que Lulu !",
+ "s5/e1": "La lanterne éclaire Lulu. Derrière Lulu, la lumière n’arrive pas. Là, il fait sombre. C’est une ombre.",
+ "s6/p1": "Mon ombre est toute petite.",
+ "s6/n1": "Attends. J’ai une idée.",
+ "s6/e1": "Pino s’approche tout près de la lanterne. À ton avis : son ombre va devenir plus grande ou plus petite ?",
+ "s6/e2": "Plus grande ! Plus on est près de la lumière, plus l’ombre est grande.",
+ "s6/p2": "Maintenant, c’est moi le plus grand de tous !",
+ "s6/l1": "Bonsoir, grand Pino !",
+ "s6/p3": "Une fois petit, une fois grand !",
+ "s7/n1": "Regarde, un lapin !",
+ "s7/e1": "Fais un lapin avec ta main. Deux doigts en l’air pour les oreilles.",
+ "s7/e2": "Bonjour, petit lapin !",
+ "s7/p1": "Mais c’est moi !",
+ "s7/e3": "Et maintenant un hérisson. Ferme la main et lève les doigts, comme des piquants.",
+ "s7/e4": "Bonjour, petit hérisson !",
+ "s8/p1": "Maintenant, il ne fait plus du tout noir.",
+ "s8/n1": "La lanterne veille sur toi. Bonne nuit, Pino.",
+ "s8/e1": "Et toi ? Est-ce qu’il y a aussi une petite lumière quand tu vas dormir ?",
+ "s8/t1": "Au revoir ! À bientôt !",
+ "s8/p2": "…à bientôt…"
+ }
+}
\ No newline at end of file
diff --git a/remotion/src/folge08/wand.tsx b/remotion/src/folge08/wand.tsx
new file mode 100644
index 0000000..07fbfe4
--- /dev/null
+++ b/remotion/src/folge08/wand.tsx
@@ -0,0 +1,61 @@
+import React from 'react';
+import {ClipFigur, Figur, Kamera, type Posenfolge} from '../baukasten/figur';
+import type {Gang} from '../baukasten/gang';
+import {Vignette} from '../baukasten/helfer';
+import {BODEN} from '../baukasten/orte';
+import {Abenddunkel, GartenAbend, Laterne, WAND_VOLL, WandSchatten, laterneInNoasHand} from './teile';
+
+// Gemeinsame Bühne für Szene 4–7: die drei an der Hauswand, die Laterne als einzige Lichtquelle.
+// Jede Figur wirft ihren Schatten an die Wand; er nimmt dieselbe Pose, Drehung und Stauchung an
+// (nickt Lulu, nickt ihr Schatten mit). Feste Plätze, damit die Szenen zusammenpassen.
+
+export const PLATZ = {noa: 700, pino: 880, lulu: 1330, laterneBoden: {x: 560, y: BODEN - 56}};
+
+export type Buehne = {
+ kam: {x: number; y: number; zoom: number};
+ laterne: {inHand: boolean; x?: number; y?: number; licht: number; schwung?: number};
+ noa: {pose: string | Posenfolge; x?: number};
+ pino: {pose: string | Posenfolge; x: number; gang?: Gang; drehung?: number; y?: number; k?: number};
+ lulu: {pose: string | Posenfolge; x?: number; hell?: number; drehung?: number; stauchY?: number; k?: number};
+ wandExtra?: React.ReactNode; // z. B. Hand-Schatten
+ f: number;
+};
+
+export const Wandszene: React.FC = ({kam, laterne, noa, pino, lulu, wandExtra, f}) => {
+ const noaX = noa.x ?? PLATZ.noa;
+ const luluX = lulu.x ?? PLATZ.lulu;
+ const hand = laterneInNoasHand(noaX);
+ const lat = laterne.inHand ? {x: hand.x, y: hand.y} : {x: laterne.x ?? PLATZ.laterneBoden.x, y: laterne.y ?? PLATZ.laterneBoden.y};
+ const s = hand.s;
+ const kLulu = lulu.k ?? 1 + 220 / Math.max(120, Math.abs(luluX - lat.x));
+ const kPino = pino.k ?? 1 + 220 / Math.max(80, Math.abs(pino.x - lat.x));
+ const kNoa = 1 + 220 / Math.max(120, Math.abs(noaX - lat.x));
+ const hell = lulu.hell ?? 1;
+ const pinoGeht = pino.gang?.geht(f);
+ return (
+ <>
+
+
+ {/* Schatten an der Wand (hinter den Figuren) */}
+
+
+
+ {wandExtra}
+
+
+ {laterne.inHand ? (
+
+ ) : (
+
+ )}
+ {pinoGeht && pino.gang ? (
+
+ ) : (
+
+ )}
+
+
+
+ >
+ );
+};
diff --git a/remotion/src/lieder/lied01/Lied01.tsx b/remotion/src/lieder/lied01/Lied01.tsx
index b67adfc..a90a4d6 100644
--- a/remotion/src/lieder/lied01/Lied01.tsx
+++ b/remotion/src/lieder/lied01/Lied01.tsx
@@ -329,7 +329,7 @@ const Garten: React.FC = () => {
))}
-
+
diff --git a/remotion/src/szenen/GangTest.tsx b/remotion/src/szenen/GangTest.tsx
new file mode 100644
index 0000000..b8d502b
--- /dev/null
+++ b/remotion/src/szenen/GangTest.tsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import {AbsoluteFill, useCurrentFrame} from 'remotion';
+import {ClipFigur, Figur} from '../baukasten/figur';
+import {gang} from '../baukasten/gang';
+
+// Prüfstand für baukasten/gang.ts: Noa und Pino gehen nach rechts, die Füße dürfen nicht rutschen.
+const NOA = gang('noa', 10, 300, 1500);
+const PINO = gang('pino', 10, 300, 900, 2.5);
+
+export const GangTest: React.FC = () => {
+ const f = useCurrentFrame();
+ const figur = (g: typeof NOA, y: number) =>
+ g.geht(f) ? (
+
+ ) : (
+
+ );
+ return (
+
+ {figur(NOA, 500)}
+ {figur(PINO, 950)}
+
+ );
+};
+export const GANGTEST_DAUER = Math.ceil(Math.max(NOA.ende, PINO.ende)) + 20;