@amg555/frameforge-mcp 2.4.10 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.claude-plugin/marketplace.json +22 -4
  2. package/CHANGELOG.md +174 -0
  3. package/CLAUDE.md +192 -9
  4. package/README.md +47 -6
  5. package/package.json +4 -3
  6. package/plugins/video-pipeline/.claude-plugin/plugin.json +8 -2
  7. package/plugins/video-pipeline/skills/.upstream-skills.json +143 -0
  8. package/plugins/video-pipeline/skills/html-renderer/SKILL.md +59 -15
  9. package/plugins/video-pipeline/skills/html-renderer/references/animation-patterns.md +609 -0
  10. package/plugins/video-pipeline/skills/html-renderer/references/character-animation.md +388 -0
  11. package/plugins/video-pipeline/skills/html-renderer/references/collage-broll.md +41 -0
  12. package/plugins/video-pipeline/skills/html-renderer/references/design.md +217 -0
  13. package/plugins/video-pipeline/skills/html-renderer/references/directing.md +165 -0
  14. package/plugins/video-pipeline/skills/html-renderer/references/earshot-audio.md +201 -0
  15. package/plugins/video-pipeline/skills/html-renderer/references/engine-api.md +480 -0
  16. package/plugins/video-pipeline/skills/html-renderer/references/film-styles.md +95 -0
  17. package/plugins/video-pipeline/skills/html-renderer/references/hyperframes-motion.md +208 -0
  18. package/plugins/video-pipeline/skills/html-renderer/references/onetake-camera.md +59 -0
  19. package/plugins/video-pipeline/skills/html-renderer/references/procedural-sfx.md +135 -0
  20. package/plugins/video-pipeline/skills/html-renderer/references/remotion-patterns.md +159 -0
  21. package/plugins/video-pipeline/skills/video-pipeline/SKILL.md +19 -2
  22. package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/orchestrator.md +15 -0
  23. package/plugins/video-pipeline/skills/video-pipeline/assets/project/pipeline/briefings/scene-author.md +21 -0
  24. package/plugins/video-pipeline/skills/video-pipeline/assets/project/reel/engine.js +1293 -20
  25. package/plugins/video-pipeline/skills/video-pipeline/assets/project/reel/virtual-clock.js +36 -6
  26. package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +126 -2
  27. package/scripts/deep-validate.js +52 -2
  28. package/src/audio-mixer/mixer.js +594 -63
  29. package/src/cli/doctor.js +36 -2
  30. package/src/cli/make.js +113 -9
  31. package/src/harness/bin/harness.mjs +127 -5
  32. package/src/harness/lib/capture.mjs +215 -192
  33. package/src/harness/lib/verify-quality.mjs +47 -7
  34. package/src/mcp-server/server.js +1015 -59
  35. package/src/skills/sync-upstream.js +290 -0
  36. package/src/utils/media-downloader.js +162 -0
  37. package/src/utils/transcribe.js +341 -0
  38. package/src/video-editor/editor.js +96 -11
  39. package/src/workflows/ingest.js +10 -0
  40. package/.bob/artifacts/enterprise-ai-video-agent-platform-agnostic-implementation-guide.html +0 -464
  41. package/out/check/purity_report.json +0 -79
  42. package/out/frames/f000000.jpg +0 -0
  43. package/out/frames/f000001.jpg +0 -0
  44. package/out/frames/f000002.jpg +0 -0
  45. package/out/frames/f000003.jpg +0 -0
  46. package/out/frames/f000004.jpg +0 -0
  47. package/out/frames/f000005.jpg +0 -0
  48. package/out/frames/f000006.jpg +0 -0
  49. package/out/frames/f000007.jpg +0 -0
  50. package/out/frames/f000008.jpg +0 -0
  51. package/out/frames/f000009.jpg +0 -0
  52. package/out/frames/f000010.jpg +0 -0
  53. package/out/frames/f000011.jpg +0 -0
  54. package/out/frames/f000012.jpg +0 -0
  55. package/out/frames/f000013.jpg +0 -0
  56. package/out/frames/f000014.jpg +0 -0
  57. package/out/frames/f000015.jpg +0 -0
  58. package/out/frames/f000016.jpg +0 -0
  59. package/out/frames/f000017.jpg +0 -0
  60. package/out/frames/f000018.jpg +0 -0
  61. package/out/frames/f000019.jpg +0 -0
  62. package/out/frames/f000020.jpg +0 -0
  63. package/out/frames/f000021.jpg +0 -0
  64. package/out/frames/f000022.jpg +0 -0
  65. package/out/frames/f000023.jpg +0 -0
  66. package/out/frames/f000024.jpg +0 -0
  67. package/out/frames/f000025.jpg +0 -0
  68. package/out/frames/f000026.jpg +0 -0
  69. package/out/frames/f000027.jpg +0 -0
  70. package/out/frames/f000028.jpg +0 -0
  71. package/out/frames/f000029.jpg +0 -0
  72. package/out/frames/f000030.jpg +0 -0
  73. package/out/frames/f000031.jpg +0 -0
  74. package/out/frames/f000032.jpg +0 -0
  75. package/out/frames/f000033.jpg +0 -0
  76. package/out/frames/f000034.jpg +0 -0
  77. package/out/frames/f000035.jpg +0 -0
  78. package/out/frames/f000036.jpg +0 -0
  79. package/out/frames/f000037.jpg +0 -0
  80. package/out/frames/f000038.jpg +0 -0
  81. package/out/frames/f000039.jpg +0 -0
  82. package/out/frames/f000040.jpg +0 -0
  83. package/out/frames/f000041.jpg +0 -0
  84. package/out/frames/f000042.jpg +0 -0
  85. package/out/frames/f000043.jpg +0 -0
  86. package/out/frames/f000044.jpg +0 -0
  87. package/out/frames/f000045.jpg +0 -0
  88. package/out/frames/f000046.jpg +0 -0
  89. package/out/frames/f000047.jpg +0 -0
  90. package/out/frames/f000048.jpg +0 -0
  91. package/out/frames/f000049.jpg +0 -0
  92. package/out/frames/f000050.jpg +0 -0
  93. package/out/frames/f000051.jpg +0 -0
  94. package/out/frames/f000052.jpg +0 -0
  95. package/out/frames/f000053.jpg +0 -0
  96. package/out/frames/f000054.jpg +0 -0
  97. package/out/frames/f000055.jpg +0 -0
  98. package/out/frames/f000056.jpg +0 -0
  99. package/out/frames/f000057.jpg +0 -0
  100. package/out/frames/f000058.jpg +0 -0
  101. package/out/frames/f000059.jpg +0 -0
  102. package/src/harness/test/fixtures/broken-scene.html +0 -27
  103. package/src/harness/test/fixtures/reference-scene.html +0 -23
  104. package/src/harness/test/fixtures/sample-script.json +0 -18
@@ -0,0 +1,165 @@
1
+ # Directing a Video Film — Professional Method
2
+
3
+ Adapted from `lemomo-ai/lemo-opuscar` DIRECTOR.md.
4
+ Applies to any FrameForge render: HTML compositor, Remotion, or FFmpeg pipeline.
5
+
6
+ A film is judged in this order: **sound, rhythm, camera, directing** (performance, staging, emotional arc).
7
+ Good-looking frames are only the starting point.
8
+
9
+ ---
10
+
11
+ ## 1. Before You Write Anything — Find a Benchmark
12
+
13
+ Before writing treatment or storyboard, pick one or two reference works (films, title sequences, ads) that set the bar for this style **and this topic**. They are your creative choice, not the demo's. Write down:
14
+
15
+ - **What to learn**: composition, pacing, camera grammar, colour logic, score structure
16
+ - **What NOT to copy**: characters, designs, melodies, specific shots, logos, fonts
17
+
18
+ The benchmark lifts quality more than any rule below.
19
+
20
+ ---
21
+
22
+ ## 2. Shape the Story (3-act minimum)
23
+
24
+ - **One subject, one goal, one turn.** A character (or object, product, idea) wants something, something changes, it ends differently from how it began.
25
+ - **Hook in the first 3 seconds.** No slow logo reveal before anything happens.
26
+ - **An ending that echoes.** Bookend the opening, reveal the scale, or let the character do the thing right the second time.
27
+ - **One native move**: a moment only this medium can do (a fold that becomes a transition, ink that blooms into the next scene, a type grid that snaps into the logo). Put it at the emotional peak.
28
+ - **Cut the extras.** One gag the audience reads at thumbnail size beats three they can't.
29
+
30
+ ---
31
+
32
+ ## 3. TREATMENT.md Before Any Code
33
+
34
+ Write `TREATMENT.md` before drawing or coding anything:
35
+
36
+ ```
37
+ 1. Three candidate structures (e.g.: single journey, before/after, countdown, list-that-turns)
38
+ → choose one + reason why
39
+ 2. Logline + arc: setup → turn → ending (one sentence)
40
+ 3. Benchmark: what to learn / what not to copy
41
+ 4. Shot list: for every shot → framing (wide/full/medium/close/insert), angle,
42
+ camera move (push/pull/pan/track/crane/zoom), duration, WHY
43
+ 5. Beat sheet: second by second
44
+ 6. Cue map: tempo, bar grid, instrumentation per section,
45
+ on which beat every cut / key action / subtitle lands
46
+ 7. Sound design table: for each section → ambience bed, main foley, music state
47
+ 8. Subtitle and title design: the type is part of the style
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 4. Sound Is Half the Film
53
+
54
+ - **Every visible action has a sound**: landings, page turns, cuts, drips, clicks, cloth. Match the material (paper, wood, metal, ink and glass all sound different).
55
+ - **Three audio layers**:
56
+ 1. **Ambience** (room, wind, rain, city)
57
+ 2. **Foley** (tied to specific actions)
58
+ 3. **Music** (bed — duck under dialogue and key foley)
59
+ - **At least two real silences** (or near-silences) before the turn or the emotional peak. The first sound after silence should be one of the most important sounds in the film.
60
+ - **J-cuts and L-cuts**: use sound as a transition at least twice:
61
+ - **J-cut**: bring the next scene's sound in before the picture cuts
62
+ - **L-cut**: let the last scene's sound run over into the next
63
+ - **Avoid generic "piano and strings"** — score in the instruments of the style's sound palette.
64
+ - **Earshot professional levels**: music bed sits around −18 to −14 LUFS for dialogue scenes, individual effects 3–6 dB over the bed. Target −14 LUFS final mix (social/web delivery).
65
+
66
+ ---
67
+
68
+ ## 5. Rhythm: Music Grid Comes First
69
+
70
+ - Write the **cue map** before animating. The picture locks to the grid.
71
+ - **Vary the pace**: alternate fast and slow; include one clear acceleration or deceleration; give the audience one breath (a long take or held pause).
72
+ - A film at one even speed has failed — contrast is what creates rhythm.
73
+ - One action, one sound, one cut — but don't cut on every beat. Leave time to see.
74
+ - **Pace for the viewer, not the clock**:
75
+ - Hold every subtitle at least 1.8 s (never shorter than spoken line + 0.6 s)
76
+ - After text finishes animating in, hold for roughly `(letters ÷ 15 + 1.5) s` in English
77
+ - Hold a title card at least 4 s
78
+ - Give failures and gags enough time to be understood
79
+ - Fast is fine: make it fast with **fewer words per screen**, not by cutting before people finish reading
80
+
81
+ ---
82
+
83
+ ## 6. Camera: Every Shot Needs a Reason
84
+
85
+ - Use at least **four different camera moves** and real changes of framing. 2D has a camera too: push, pull, parallax, focus pulls, frames within frames.
86
+ - **One signature shot** people remember: a oner, a scale reveal, a transition made from the medium itself.
87
+ - **Design transitions inside the medium** (a page turn, a carved line growing, ink spreading) as one consistent grammar. Avoid default fades and hard cuts.
88
+ - At key moments the subject fills **at least a third of the frame height**, with clear staging and a readable silhouette.
89
+
90
+ ---
91
+
92
+ ## 7. Performance (Character / Animated Elements)
93
+
94
+ - **Anticipation → action → follow-through** on every meaningful move.
95
+ - Characters change emotion. They do not just slide across the screen.
96
+ - **Motion continuity**:
97
+ - Blend every pose with keyframes and easing — never switch poses inside an `if`
98
+ - The only exception is a deliberate one-frame comic pop
99
+ - Check shoulders and arms on a large action test sheet before animating
100
+ - Held props sit **between the palms**, at a depth between the two arms
101
+ - A rolling object turns by `distance ÷ radius`
102
+ - Step through key actions at 0.2 s intervals, enlarged, before finalizing.
103
+ - Check every expression at final size. "Worried" and "angry" are one eyebrow flip apart.
104
+
105
+ ---
106
+
107
+ ## 8. The Review Loop (Run Before Delivery)
108
+
109
+ 1. **Contact sheet**: every shot's first, middle, and last frames — one sheet
110
+ 2. **Strip**: every frame of a key motion (transition, take, jump, throw) — 0.1–0.15 s step
111
+ 3. **Crop**: full-resolution detail check on faces, hands, contacts, glows
112
+ 4. **One full-speed viewing with sound** — watch it as the viewer will
113
+
114
+ What to check at each step:
115
+ - **Read**: is the event of each shot clear from its sheet alone?
116
+ - **Timing**: does every read have enough time to land before the next?
117
+ - **Motion**: does every move have anticipation and follow-through? Any pops or snaps?
118
+ - **Boil**: in a strip, does stable linework stay stable between frames?
119
+ - **Contacts**: do feet touch the ground? Do held objects touch the hands?
120
+ - **Transitions**: does every seam open and close with one?
121
+ - **Rules**: any text, any 3D, any dead stretch?
122
+ - **Sound**: every row of the sound design table actually in the mix?
123
+
124
+ ---
125
+
126
+ ## 9. Failures Seen Most Often
127
+
128
+ | Failure | Fix |
129
+ |---------|-----|
130
+ | Subject too small, too far, or pushed to frame edge | At key moments, fill ≥1/3 of frame height |
131
+ | Too dark to read, or colour on same colour | Check contrast at delivery size |
132
+ | Subtitles covering the subject | Position captions in clear negative space |
133
+ | A gag too fast to understand | Give it more frames — fast ≠ short |
134
+ | Blank frames in transitions | Verify every seam with a strip |
135
+ | Timed effect that doesn't track subject after camera moves | One world→screen projection function throughout |
136
+ | Everything at one even speed | Vary shot length by ≥4× across the film |
137
+ | Beats that replace each other instead of carrying | Something on screen must survive every section boundary |
138
+ | Full-bleed footage for the whole video | The genre is 70% white/negative space; full-bleed is the exception |
139
+
140
+ ---
141
+
142
+ ## 10. Delivery Checklist
143
+
144
+ ```
145
+ □ final.mp4 (−14 LUFS, correct fps, no black frames, no NaN frames)
146
+ □ poster.jpg (first clear frame)
147
+ □ final.srt (when narrated — in sync, not covering key action)
148
+ □ TREATMENT.md
149
+ □ CREDITS (every third-party asset: music, fonts, images, voice engine + source + licence)
150
+ □ build.sh (one-command reproducible render)
151
+ □ Source code / project folder
152
+ ```
153
+
154
+ **Tell the user** (in their language):
155
+ - Where the project folder and the film are
156
+ - That CREDITS lists third-party assets and their licences
157
+ - That they are responsible for the materials they supply
158
+
159
+ ---
160
+
161
+ ## 11. Copyright Red Lines
162
+
163
+ - References teach grammar only. Never copy characters, designs, melodies, shots, logos, or type designs.
164
+ - No existing works, games, brands, or events appear in the film unless the user owns them or has the right.
165
+ - Draw fictional stand-ins when rights are unclear.
@@ -0,0 +1,201 @@
1
+ # Earshot — Professional Audio Quality Workflow
2
+
3
+ Adapted from `Leonxlnx/earshot` SKILL.md.
4
+ AI-native audio analysis, verification, and synthesis.
5
+ **Core principle: Never say how audio sounds without measurement data behind it.**
6
+
7
+ ---
8
+
9
+ ## Why Earshot Matters for Agents
10
+
11
+ Agents cannot hear. Without measurement, every audio decision is a guess. Earshot provides:
12
+ - **Semantic matching**: describe a sound and find the closest asset
13
+ - **Realness detection**: is this audio synthesized code or a real recording?
14
+ - **Professional critique**: does the mix meet broadcast/launch film standards?
15
+ - **Synthesis optimization**: make a sound in code, measure it, improve it
16
+
17
+ ---
18
+
19
+ ## The 5 Loops
20
+
21
+ ### Loop 1: Choose an Asset
22
+
23
+ ```
24
+ 1. RANK: earshot rank "<description>" downloads/sfx/ --top 5
25
+ → shortlist from a folder by semantic match
26
+
27
+ 2. FIND: earshot find winner.ogg "<description>" --top 3
28
+ → best moments as sample trims (start/end in seconds)
29
+ → Each segment kind: stroke (one onset → decay), event (strokes that belong together),
30
+ window (stretch for beds/textures)
31
+ → "head cut" / "tail cut" = trim starts/ends inside a sound — don't use as-is
32
+
33
+ 3. DESCRIBE: earshot describe winner.ogg --start 1.12 --end 1.48
34
+ → what it actually sounds like; check attack/decay shape fits the picture
35
+
36
+ 4. REALNESS: earshot realness winner.ogg --start 1.12 --end 1.48
37
+ → p_real: is this recorded audio or code-synthesized?
38
+ → Thresholds for clips (≤6 s): lo 0.17 / hi 0.77
39
+ → "likely code-synthesized" → don't use if brief asks for real recorded sound
40
+ → Clean pro-synthesized tones (UI sounds, chimes, synth stabs) also read as code-synthesized
41
+
42
+ 5. COMPARE: earshot ab a.ogg b.ogg --query "<description>"
43
+ → which is closer, and how B differs from A in measured words
44
+ ```
45
+
46
+ ### Loop 2: Review a Mix or Film
47
+
48
+ ```
49
+ 1. TIMELINE: earshot timeline film.mp4 --cues cues.json
50
+ → listening transcript: events with time, level, and tags
51
+ → sections, loudness curve, picture cuts, sync per cut/cue
52
+ → sync offset_ms = sound minus picture (negative = early)
53
+ → A cut listed with no hit can still carry a soft whoosh — check with sheet before adding
54
+
55
+ 2. SHEET: earshot sheet film.mp4 -o sheet.png --cues cues.json
56
+ → annotated PNG: frames, sections, labelled events, spectrogram, loudness, beats, cue markers
57
+ → Green = within a frame, Amber = within 100 ms, Red = no sound
58
+ → OPEN THE PNG — gaps, pile-ups, masking, and late hits are obvious at a glance
59
+
60
+ 3. CRITIQUE: earshot critique film.mp4
61
+ → scorecard against measured range of professional launch films
62
+ → verdict: launch-grade / close / needs work / not launch-grade
63
+ → Fix critical rows first, re-run 1-3 on the new render
64
+
65
+ 4. MEASURE: earshot measure mix.wav
66
+ → LUFS, true peak dBTP, LRA, noise floor, attack/decay, brightness, bands
67
+ ```
68
+
69
+ ### Loop 3: A/B a Change
70
+
71
+ ```
72
+ earshot ab before.wav after.wav --query "<description>"
73
+ ```
74
+ - Which is closer, and how B differs from A in measured words (louder, brighter, longer decay)
75
+ - Change one thing at a time
76
+
77
+ ### Loop 4: Make a Sound in Code (Earshot Forge)
78
+
79
+ When the brief calls for a **made** sound (not chosen from a library):
80
+
81
+ 1. Write a recipe `render(params, r) -> 48 kHz array` using DSP primitives:
82
+ - Modal resonators, contact excitations, noise colours
83
+ - Time-varying SVF filter, computed room, mic with noise floor
84
+ - Model the physics of the real thing (what strikes what, what rings, how long, in what room)
85
+ 2. Run a search round with budget and reps
86
+ 3. **Evaluate by measurement** (not by model score):
87
+ - Tonal balance: which bands fall outside every reference
88
+ - `robust`: mean over new seeds, not the lucky best render
89
+ - Spectrograms vs reference: `ffmpeg -i x.wav -lavfi showspectrumpic=s=900x360:scale=log x.png`
90
+ 4. Fix recipe structure for what's wrong; repeat
91
+
92
+ **Goodhart warning**: The search optimises earshot's models. Made sounds routinely out-score real recordings on them, which means the critic is satisfied, not that the sound is better. Judge by measured closeness to references.
93
+
94
+ ### Loop 5: Make a Film's Sound Kit
95
+
96
+ Use when a code-made film needs its effects rendered from earshot's shipped sound bank:
97
+
98
+ ```bash
99
+ # Initialize a kit from a preset
100
+ earshot kit init --preset calm -o audio/kit.json
101
+ # calm = text-led, crisp = energetic product films, minimal = effects-only, launch = music-led
102
+
103
+ # Check candidates
104
+ earshot sfx list --kind hit
105
+
106
+ # Render the kit
107
+ earshot kit render audio/kit.json --out audio/kit
108
+
109
+ # Verify
110
+ earshot kit check audio/kit.json --out audio/kit
111
+ ```
112
+
113
+ **0.4 families for music-led launch films**:
114
+ - `ui_pop` — rounded mid pops for chips, bubbles, rows arriving (most-used effect)
115
+ - `knock` — mid-band wood and plastic
116
+ - `cut_hit` — short sub hits with a kick
117
+ - `mallet` — gated glockenspiel/celesta/marimba notes, soft pluck, chime runs (supports `--pitch`)
118
+ - `drip` — water drops (pitch rises)
119
+ - `shutter` — snap zooms, whip-cuts
120
+ - `reverse_swell` — peaks just after a cut (one per film)
121
+ - Plus: `whoosh_big`, `thump`, `riser`, `swish`, `glitch`, `notify`
122
+
123
+ **Levels against the music, not fixed**:
124
+ ```python
125
+ from earshot.forge import kit
126
+ lock = kit.render('audio/kit.json', 'audio/kit') # takes carry l50_lufs; roles bed_db
127
+ role = lock['roles']['pop']
128
+ take = role['takes'][i]
129
+ bed = kit.bed_level(music, t_cue) # the music's median 50ms level
130
+ gain = kit.gain_db(take, role, bed) # dB on the take file (never over -1 dBFS peak)
131
+ start = kit.place(take, role, t_cue) # onset on the frame for hits/touches, peak for whoosh
132
+ ```
133
+
134
+ Duck the music **6–12 dB for 0.3–0.5 s** before a hit, drop, big whoosh, or swell; bring it back on the hit.
135
+
136
+ ---
137
+
138
+ ## Professional Audio Numbers
139
+
140
+ | Number | What it is | Trust |
141
+ |--------|-----------|-------|
142
+ | LUFS, dBTP, LRA, dBFS, ms, Hz | Measurements (BS.1770 meter, spectrum, envelope) | Exact — use for levels |
143
+ | z (match/rank/find) | How far a description stands out among vocabulary | z ≥ 3 strong, 2.5–3 plausible, 2–2.5 weak, < 2 no match |
144
+ | p_real | Real-recorded vs code-synthesized | Strong evidence, not proof |
145
+ | cosine | Raw CLAP similarity | Never a probability; compare only same sound + same query |
146
+ | AudioSet labels (0..1) | Independent per-class probabilities | Good for broad classes; hears only up to 8 kHz |
147
+ | sync offset_ms | Sound minus picture per cut | Trust when well above chance |
148
+ | critique status | Value vs range of 7 professional launch films | A range, not a target |
149
+
150
+ ---
151
+
152
+ ## Writing Audio Queries
153
+
154
+ Describe the sound, not its use:
155
+ - ✓ "a heavy wooden door slamming in a small room"
156
+ - ✗ "a sound for the logo"
157
+
158
+ Give alternatives that are realistic confusions:
159
+ - ✓ `--alts "a click vs a typewriter key vs a thock"`
160
+
161
+ Job words are not heard. Check with 2–3 phrasings and keep the best.
162
+
163
+ ---
164
+
165
+ ## Professional Levels Quick Reference
166
+
167
+ | Platform | Target LUFS | True Peak |
168
+ |----------|-------------|-----------|
169
+ | YouTube | −14 LUFS | −1 dBTP |
170
+ | Podcast | −16 LUFS | −1 dBTP |
171
+ | Netflix | −27 LUFS | −2 dBTP |
172
+ | Instagram/TikTok | −14 LUFS | −1 dBTP |
173
+ | Broadcast | −23 LUFS | −1 dBTP |
174
+ | Music streaming | −14 LUFS | −1 dBTP |
175
+
176
+ Music under a voice: ~0.14 relative volume (≈ −17 dB).
177
+ Each SFX hit sits 3–6 dB over the music bed.
178
+
179
+ ---
180
+
181
+ ## FrameForge Integration
182
+
183
+ | Earshot concept | FrameForge tool | Parameter |
184
+ |----------------|-----------------|-----------|
185
+ | `earshot measure` | `mix_audio_pro` | Returns LUFS, dBTP in result |
186
+ | Sound-on-beat timing | `cue('sfxname', t, dur)` in edit.js | `cue()` in engine.js |
187
+ | Platform LUFS target | `mix_audio_pro` | `platform: "youtube" \| "podcast" \| "netflix"` |
188
+ | Room acoustics | `mix_audio_pro` | `roomProfile: "studio_dry" \| "broadcast" \| "cinematic"` |
189
+ | SFX synthesis types | `mix_audio_pro` | `sfxType: "chime" \| "buzz" \| "tick" \| "swish" \| ...` |
190
+ | Noise gate | `mix_audio_pro` | `noiseGate: true` |
191
+
192
+ ---
193
+
194
+ ## Earshot Limits (Cite These When They Matter)
195
+
196
+ - **Taste is not measured**: earshot says what a sound is and how it measures, not whether it is beautiful or right for the story. The user decides on taste; give them the evidence and the shortlist.
197
+ - **No speech recognition**: it can tell there is speech, not what is said.
198
+ - **CLAP hears 50 Hz – 14 kHz**, AST up to 8 kHz: check "air" and low-pass problems with `measure (bandwidth_hz, bands)`.
199
+ - **Very short sounds** are padded to a 10 s window; isolated hits read best with `find`/`describe` on a trimmed segment.
200
+ - **Picture cuts** from frame-difference detector: hard cuts and whips are reliable, slow crossfades are missed or found late.
201
+ - **Licence and provenance** are not audio questions: earshot cannot check them.