--- name: remotion-music-picker description: How to choose royalty-free background music for a FlatRender template and sync the animation to its beat/vibe. Use when picking a music bed for a template, matching mood and BPM to the visuals, syncing reveals to the beat, or sourcing free/royalty-free tracks. --- # Music picker for templates > Status: templates currently ship without a music bed. This is the playbook for adding one. The right track + beat-synced motion is what makes a template feel "produced". ## Match music to the template's job | Template vibe | Genre / mood | Typical BPM | |---|---|---| | Corporate / SaaS logo | clean inspirational, soft piano + synth pluck | 90-110 | | Energetic promo / sale | upbeat pop, four-on-the-floor, claps | 120-130 | | Social / Insta / trendy | lo-fi or modern pop, punchy | 100-120 | | Epic / product reveal | cinematic build, big drum, riser | 70-90 build → hit | | Festive (birthday, Nowruz, party) | happy ukulele/marimba, bells | 110-128 | | Emotional (wedding, tribute) | warm piano/strings | 60-80 | | Tech / gaming | electronic, arpeggios, bass | 120-140 | | Luxury | downtempo, jazzy, smooth | 80-100 | | Minimal / explainer | light marimba/plucks, unobtrusive | 95-115 | ## Sync the animation to the beat (this is the magic) 1. Know the track's BPM → frames per beat = `fps * 60 / bpm` (e.g. 30fps, 120bpm → 15 frames/beat). 2. Land your hero reveals, pops, and cuts ON beats (multiples of frames-per-beat). Stagger small element pops on 1/2 or 1/4 beats. 3. Put the BIG reveal on a musical downbeat or right after a riser/drop. 4. For a known track, hardcode beat frames; for generic use, expose `bpm` as a prop and compute beat frames so motion stays in sync if the track changes. ```tsx const FPS = 30, BPM = 120; const beat = (FPS * 60) / BPM; // frames per beat const onBeat = (n: number) => Math.round(n * beat); // reveal hero on beat 4, CTA on beat 8 ``` ## Remotion wiring ```tsx import { Audio, staticFile, interpolate, useCurrentFrame, useVideoConfig } from "remotion"; const { durationInFrames } = useVideoConfig(); const f = useCurrentFrame();