From e7750f56bdc43df84398043791ed516752ba5286 Mon Sep 17 00:00:00 2001 From: Pascal Scholz Date: Sun, 8 Nov 2026 13:41:25 +0000 Subject: [PATCH] =?UTF-8?q?Folge=203:=20Musik,=20Atmo=20und=20Ger=C3=A4usc?= =?UTF-8?q?he,=20Refrain=20gesungen=20(Suno)=20wie=20in=20Folge=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- remotion/src/folge03/Folge03.tsx | 60 +++++++++++++++++++++++++++----- remotion/src/folge03/lied.tsx | 42 ++++++++++++++++------ 2 files changed, 82 insertions(+), 20 deletions(-) diff --git a/remotion/src/folge03/Folge03.tsx b/remotion/src/folge03/Folge03.tsx index 44bfb07..39acaed 100644 --- a/remotion/src/folge03/Folge03.tsx +++ b/remotion/src/folge03/Folge03.tsx @@ -1,7 +1,8 @@ import React from 'react'; import {INTRO_OPTIONEN, Intro, OUTRO, Outro, introZeilen} from '../baukasten/buch'; import {baueFolge, type SzenenEintrag} from '../baukasten/folge'; -import {LIED, Lied} from './lied'; +import {mitKlang} from '../baukasten/geraeusche'; +import {GESUNGEN, LIED, LIED_AB, LIED_DATEI, Lied} from './lied'; import {TITEL, plane} from './plan'; import {S2, Szene2} from './szene2'; import {S3, Szene3} from './szene3'; @@ -10,18 +11,59 @@ import {S5, Szene5} from './szene5'; import {S6, Szene6} from './szene6'; // Folge 3 „Lulus Schal ist weg“ (1. Advent) – per Code aus der Figuren-Bibliothek. +// Musik wie Folge 1/2 (public/musik/folge01), Refrain gesungen (Suno), dazu Atmo und Geräusche. const INTRO = plane('intro', introZeilen(TITEL), INTRO_OPTIONEN); export const SZENEN: SzenenEintrag[] = [ - {name: 'Intro', datei: 'Folge03.tsx', plan: INTRO, K: () => }, - {name: 'Wo ist der Schal', datei: 'szene2.tsx', plan: S2, K: Szene2}, - {name: 'Suchen', datei: 'szene3.tsx', plan: S3, K: Szene3}, - {name: 'In der Tanne', datei: 'szene4.tsx', plan: S4, K: Szene4}, - {name: 'Refrain', datei: 'lied.tsx', plan: LIED, K: Lied}, - {name: 'Der Kranz', datei: 'szene5.tsx', plan: S5, K: Szene5}, - {name: 'Gute Nacht', datei: 'szene6.tsx', plan: S6, K: Szene6}, - {name: 'Outro', datei: 'Folge03.tsx', plan: OUTRO, K: () => }, + { + name: 'Intro', + datei: 'Folge03.tsx', + plan: INTRO, + K: mitKlang(() => , INTRO, { + toene: [{name: 'buch_auf', bei: 'buch', versatz: 0.7, lautstaerke: 0.35}], + }), + musik: {datei: 'musik/folge01/intro.mp3', lautstaerke: 0.35, rein: 0.2, raus: 1.2}, + }, + {name: 'Wo ist der Schal', datei: 'szene2.tsx', plan: S2, K: mitKlang(Szene2, S2, {atmo: 'wind', atmoLaut: 0.06})}, + { + name: 'Suchen', + datei: 'szene3.tsx', + plan: S3, + K: mitKlang(Szene3, S3, {atmo: 'wind', atmoLaut: 0.06, toene: [{name: 'rascheln', bei: 'bild0', versatz: 0.5, lautstaerke: 0.2, laenge: 1.5}]}), + }, + { + name: 'In der Tanne', + datei: 'szene4.tsx', + plan: S4, + K: mitKlang(Szene4, S4, {atmo: 'wind', atmoLaut: 0.07, toene: [{name: 'rascheln', bei: 'bild0', versatz: 0.8, lautstaerke: 0.2, laenge: 1.5}]}), + }, + { + name: 'Refrain', + datei: 'lied.tsx', + plan: LIED, + K: Lied, + musik: GESUNGEN + ? {datei: LIED_DATEI, ab: LIED_AB, lautstaerke: 0.9, rein: 0.2, raus: 0.8} + : {datei: 'musik/folge01/lied.mp3', lautstaerke: 0.4, ducken: 0.75, rein: 0.3, raus: 1.2}, + }, + {name: 'Der Kranz', datei: 'szene5.tsx', plan: S5, K: mitKlang(Szene5, S5, {atmo: 'zimmer', atmoLaut: 0.1})}, + { + name: 'Gute Nacht', + datei: 'szene6.tsx', + plan: S6, + K: mitKlang(Szene6, S6, {atmo: 'garten_nacht', atmoLaut: 0.1}), + musik: {datei: 'musik/folge01/schlaflied.mp3', lautstaerke: 0.3, rein: 3, raus: 0.1}, + }, + { + name: 'Outro', + datei: 'Folge03.tsx', + plan: OUTRO, + K: mitKlang(() => , OUTRO, { + toene: [{name: 'buch_zu', bei: 'buch', versatz: 3.2, lautstaerke: 0.45}], + }), + musik: {datei: 'musik/folge01/schlaflied.mp3', lautstaerke: 0.3, ab: S6.dauer / 30, rein: 0.1, raus: 2}, + }, ]; export const F03 = baueFolge('F03', SZENEN); diff --git a/remotion/src/folge03/lied.tsx b/remotion/src/folge03/lied.tsx index e6b7712..9efcdb5 100644 --- a/remotion/src/folge03/lied.tsx +++ b/remotion/src/folge03/lied.tsx @@ -4,22 +4,42 @@ import {Figur, Kamera} from '../baukasten/figur'; import {Blende, Vignette, klatschFolge} from '../baukasten/helfer'; import {BODEN, Ort} from '../baukasten/orte'; import {SCHRIFT, Untertitel} from '../baukasten/untertitel'; +import {SPRACHE} from '../baukasten/sprache'; +import {plane as planeOhneStimme} from '../baukasten/zeit'; +import {SUNO_LIEDER} from '../folge01/lied'; import {TEXTE, plane} from './plan'; // Refrain „Einer klein und einer groß“ am Waldrand (wie in Folge 1, nur der Refrain). +// Gesungen wie in Folge 2: die ersten vier Zeilen aus dem Suno-Lied von Folge 1. +// Ohne Suno-Fassung für die Sprache: gesprochen über das Instrumental. -const TAKT = 19; +const SUNO = SUNO_LIEDER[SPRACHE]; +export const GESUNGEN = !!SUNO; +const TAKT = SUNO ? (30 * 60) / SUNO.bpm : 19; // Frames pro Schlag +const IDS = ['r1', 'r2', 'r3', 'r4']; +export const LIED_DATEI = SUNO?.datei ?? ''; +export const LIED_AB = SUNO ? SUNO.zeiten[0] - SUNO.vor : 0; // ab hier läuft die Suno-Datei -export const LIED = plane( - 'lied', - [ - {id: 'r1', wer: 'ALLE', dauer: 3.2}, - {id: 'r2', wer: 'ALLE', dauer: 3.2}, - {id: 'r3', wer: 'ALLE', dauer: 3.2}, - {id: 'r4', wer: 'ALLE', dauer: 3.6}, - ], - {vorlauf: 1.0, nachlauf: 1.0}, -); +export const LIED = SUNO + ? planeOhneStimme( + IDS.map((id, i) => ({ + id, + wer: 'ALLE' as const, + text: TEXTE.zeilen[`lied/${id}`], + dauer: SUNO.zeiten[i + 1] - SUNO.zeiten[i] - 0.35, + })), + {vorlauf: SUNO.vor, nachlauf: 0.2}, + ) + : plane( + 'lied', + [ + {id: 'r1', wer: 'ALLE', dauer: 3.2}, + {id: 'r2', wer: 'ALLE', dauer: 3.2}, + {id: 'r3', wer: 'ALLE', dauer: 3.2}, + {id: 'r4', wer: 'ALLE', dauer: 3.6}, + ], + {vorlauf: 1.0, nachlauf: 1.0}, + ); export const Lied: React.FC = () => { const f = useCurrentFrame();