a3e735cc7a
11 production pipelines, 47 tools, 124 agent skills. Supports cloud APIs (fal.ai, OpenAI, ElevenLabs, Suno, HeyGen, Runway) and free local providers (diffusers, Piper TTS, WAN 2.1, Hunyuan, CogVideo). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.1 KiB
5.1 KiB
Music Generation Usage for OpenMontage
Sources: ElevenLabs Music API documentation, ElevenLabs best practices guide, Artlist BPM guide, existing Layer 3 skills at
.agents/skills/music/and.agents/skills/elevenlabs/
Quick Reference Card
API MODEL: music_v1
MIN DURATION: 3,000ms (3s)
MAX DURATION: 600,000ms (10 min)
INSTRUMENTAL: Always set force_instrumental=true for video background
COST: ~$0.05 per 30 seconds
KEY RULE: Music must be 18-20 dB below narration (see sound-design.md)
BPM Selection by Video Type
| Video Type | BPM Range | Prompt Fragment |
|---|---|---|
| Educational explainer | 80-100 | "gentle ambient electronic, 90 BPM" |
| Corporate / tech | 100-120 | "upbeat corporate pop, 110 BPM, positive" |
| Epic / dramatic reveal | 60-80 | "cinematic orchestral, 70 BPM, building tension" |
| Fast-paced montage | 120-140 | "energetic electronic, 130 BPM, driving beat" |
| Meditation / calm | 50-70 | "ambient drone, 60 BPM, peaceful" |
| Comedy / lighthearted | 100-130 | "playful ukulele pop, 120 BPM, whimsical" |
| Sad / reflective | 60-80 | "melancholic piano, 65 BPM, minor key" |
| Action / hype | 140-170 | "high-intensity drum and bass, 160 BPM" |
Key and Mood Mapping
| Mood | Key | Musical Characteristics |
|---|---|---|
| Happy / upbeat | C major, G major | Bright, resolved, energetic |
| Serious / professional | D minor, A minor | Grounded, authoritative |
| Mysterious / curious | E minor, B minor | Tension, anticipation |
| Triumphant / inspiring | D major, Bb major | Expansive, climactic |
| Melancholic / thoughtful | F minor, C minor | Reflective, emotional |
| Neutral / ambient | C major, Am (no strong key) | Unobtrusive, background |
Prompt Engineering
Structure
[GENRE/STYLE], [BPM], [KEY/MOOD], [INSTRUMENTS], [ENERGY LEVEL], [PURPOSE]
Examples
Educational explainer:
Gentle lo-fi ambient electronic, 90 BPM, C major, soft synth pads and light
percussion, calm and steady energy, background music for narration
Corporate product demo:
Modern upbeat corporate pop, 110 BPM, G major, acoustic guitar and light drums,
positive energy building gradually, underscore for product walkthrough
Technical deep-dive:
Minimal ambient electronic, 80 BPM, A minor, soft Rhodes piano and subtle
bass, contemplative and focused, background music for technical explanation
Key Prompting Rules
- Always include "background" or "underscore" — tells the model to stay dynamically even
- Always use
force_instrumental=true— lyrics compete with narration - Specify BPM explicitly — don't rely on genre to set tempo
- Avoid "bright hi-hats" or "prominent vocals" — high-frequency busy elements compete with speech in the 2-4 kHz intelligibility band
- Include energy direction — "steady energy" for explainers, "building gradually" for reveals
Duration Matching
Exact Duration
result = music_gen.execute({
"prompt": "Gentle ambient, 90 BPM, background underscore",
"duration_seconds": 150, # Match video length
"output_path": "assets/music/background.mp3"
})
Section-Mapped (Advanced)
For videos with distinct acts, generate sections separately:
| Video Section | Duration | Music Style |
|---|---|---|
| Intro / hook | 8-10s | Soft, building |
| Main explanation | 90-120s | Steady, neutral |
| Key reveal | 20-30s | Intensified, fuller |
| Outro | 10-15s | Fading, gentle |
Generate each as a separate track and crossfade in the audio_mixer.
Looping for Long Videos
For videos longer than the generated track:
- Generate a track 30-60% of video length
- Use FFmpeg to create a seamless loop:
ffmpeg -stream_loop 2 -i music.mp3 -c copy music_looped.mp3 - Add a 2-3 second crossfade at loop points in
audio_mixer
Better approach: Generate at the exact video duration. ElevenLabs supports up to 10 minutes per generation.
Stem Isolation
For cleaner ducking control, generate isolated stems:
"solo electric guitar in E minor, 90 BPM"— guitar-only track"soft ambient pad in C major, 80 BPM"— synth pad only- Layer stems in FFmpeg during composition for precise ducking control
Applying to OpenMontage
When using the music_gen tool:
- Match BPM to content type using the table above — don't default to a generic prompt
- Always set
force_instrumental=true— no lyrics under narration - Include "background" or "underscore" in every prompt
- Set duration to match video length — avoid looping when possible
- Budget check — at $0.05/30s, a 3-minute video costs ~$0.30 for music
- Duck music 18-20 dB below narration — see
skills/creative/sound-design.mdfor ducking rules - Cut 2-4 kHz on the music bed in
audio_mixerto clear the speech intelligibility band - Test on phone speakers — if narration disappears behind music, duck more aggressively
- One track per video — avoid switching music styles mid-video unless there's a clear narrative shift