diff --git a/remotion/.gitignore b/remotion/.gitignore index a6af8be..7c23e95 100644 --- a/remotion/.gitignore +++ b/remotion/.gitignore @@ -3,3 +3,4 @@ out/ public/bibliothek/clips public/stimmen public/musik +public/geraeusche diff --git a/remotion/src/baukasten/geraeusche.json b/remotion/src/baukasten/geraeusche.json new file mode 100644 index 0000000..f8fc766 --- /dev/null +++ b/remotion/src/baukasten/geraeusche.json @@ -0,0 +1,22 @@ +{ + "garten_tag": {"sekunden": 20, "loop": true, "beschreibung": "Calm autumn garden ambience in daytime: soft breeze, occasional dry leaves rustling, a few distant small birds chirping. Gentle and peaceful. No voices, no music."}, + "garten_abend": {"sekunden": 20, "loop": true, "beschreibung": "Calm autumn garden at sunset: a blackbird singing softly in the distance, light breeze, very peaceful. No voices, no music."}, + "garten_nacht": {"sekunden": 20, "loop": true, "beschreibung": "Peaceful autumn night in a garden: very soft wind, one distant owl hoot now and then, quiet and cozy. No voices, no music."}, + "zimmer": {"sekunden": 15, "loop": true, "beschreibung": "Quiet cozy children's room ambience: faint warm room tone, soft ticking of a clock far away. No voices, no music."}, + "buch_auf": {"sekunden": 2, "beschreibung": "A big picture book being opened gently, soft paper page flip, warm and cozy."}, + "buch_zu": {"sekunden": 1.5, "beschreibung": "A big picture book being closed gently, soft soft thump of paper and cardboard."}, + "laub_sprung": {"sekunden": 2, "beschreibung": "A child jumping into a big pile of dry autumn leaves, loud happy crunchy rustle and whoosh."}, + "rascheln": {"sekunden": 2.5, "beschreibung": "A small animal rustling and moving inside a pile of dry autumn leaves, soft and close."}, + "hopser": {"sekunden": 1.5, "beschreibung": "Two tiny soft cartoon hops of a small hedgehog, light bouncy boing, cute."}, + "giraffe_schritte": {"sekunden": 3, "beschreibung": "Slow, big but gentle footsteps of a large animal walking on soft grass, friendly cartoon feel."}, + "apfel": {"sekunden": 1, "beschreibung": "Crisp snap of an apple stem being picked from a branch, small and clear."}, + "strecken": {"sekunden": 2, "beschreibung": "Funny cartoon stretching sound, a long neck bending down slowly, soft comic creak, gentle."}, + "schnuppern": {"sekunden": 1.5, "beschreibung": "Gentle cartoon sniffing of a flower, two soft sniffs, cute."}, + "schnarchen": {"sekunden": 3, "beschreibung": "One tiny, cute, soft cartoon snore of a small sleepy hedgehog, with a gentle little whistle on the out-breath."}, + "blaetter_sammeln": {"sekunden": 1.5, "beschreibung": "Soft crunchy rustle of a handful of dry autumn leaves being picked up and dropped on a pile."}, + "blaetter_regen": {"sekunden": 3, "beschreibung": "A gentle shower of dry autumn leaves falling from a shaken tree branch, soft whoosh and rustling."}, + "zugvoegel": {"sekunden": 5, "beschreibung": "A flock of wild geese honking high in the sky, flying away into the distance, gentle and far."}, + "malen": {"sekunden": 4, "beschreibung": "Crayon scribbling and drawing on paper on a wooden table, close and soft."}, + "kribbeln": {"sekunden": 2, "beschreibung": "Cute magical sparkle twinkle, soft glockenspiel shimmer, cartoon, happy."}, + "schlaff": {"sekunden": 2, "beschreibung": "Soft short descending cartoon slide whistle, a little sad but cute and gentle."} +} diff --git a/remotion/src/baukasten/geraeusche.tsx b/remotion/src/baukasten/geraeusche.tsx new file mode 100644 index 0000000..6bbd4ca --- /dev/null +++ b/remotion/src/baukasten/geraeusche.tsx @@ -0,0 +1,71 @@ +import React from 'react'; +import {Audio, Sequence, getInputProps, getStaticFiles, interpolate, staticFile, useVideoConfig} from 'remotion'; +import type {Geplant} from './zeit'; + +// Geräusche und Hintergrundklang (Atmo) je Szene. +// Die Klänge stehen in src/baukasten/geraeusche.json und werden mit +// npx tsx werkzeuge/geraeusche.mts +// nach public/geraeusche/.mp3 erzeugt (ElevenLabs Sound Effects, für alle Folgen). +// Ein Ton hängt an einer Zeile der Szene (`bei`, auch reine Bildzeilen wie 'buch') +// plus `versatz` in Sekunden. In FolgeNN.tsx: K: mitKlang(Szene2, S2, {atmo: 'garten_tag', toene: [...]}) +// Abschalten beim Rendern: --props='{"geraeusche": false}' + +const VORHANDEN = new Set(getStaticFiles().map((d) => d.name)); +const pfad = (name: string) => `geraeusche/${name}.mp3`; + +// laenge: Ton nach so vielen Sekunden weich ausblenden (sonst läuft die Datei ganz durch) +export type Ton = {name: string; bei: string; versatz?: number; lautstaerke?: number; laenge?: number}; +export type Klang = {atmo?: string; atmoLaut?: number; toene?: Ton[]}; +type Plan = {dauer: number; liste: Geplant[]}; + +export const Geraeusche: React.FC = ({atmo, atmoLaut = 0.12, toene = [], plan}) => { + const {fps} = useVideoConfig(); + if (getInputProps().geraeusche === false) return null; + const {dauer, liste} = plan; + const atmoDa = atmo !== undefined && VORHANDEN.has(pfad(atmo)); + return ( + <> + {atmoDa && ( +