Skip to content

JSON Driver Masterclass

A driver is a JSON file that tells Onset Engine what visual content to assign to each energy tier of your music. Without a driver, the engine uses raw CLIP similarity and motion scores. With a driver, you get precise creative control over what appears at each musical intensity level.

Think of it as a content brief for the AI: “During quiet sections, show landscapes. During medium energy, show dialogue. During the drop, show explosions.”

{
"meta": {
"name": "Action Anime Driver",
"version": "3.0",
"description": "Maps anime content to energy tiers with subject awareness"
},
"global": {
"min_rating": 3,
"exclude_tags": ["@Filler", "@Recap"]
},
"tiers": {
"1_LOW": {
"descriptions": [
"character standing in peaceful landscape",
"calm sky with clouds",
"characters talking quietly"
],
"subjects": ["@Goku"],
"moods": ["serene", "melancholic"],
"scene_types": ["wide", "medium"]
},
"2_MED": {
"descriptions": [
"character powering up with glowing aura",
"intense stare between fighters",
"character flying through sky"
],
"subjects": ["@Goku", "@Vegeta"],
"moods": ["tense"],
"scene_types": ["medium", "close-up"]
},
"3_HIGH": {
"descriptions": [
"fast martial arts combat with punching",
"energy beam attack",
"character dodging rapid attacks"
],
"subjects": ["@Goku"],
"moods": ["aggressive", "epic"],
"scene_types": ["close-up", "medium"]
},
"4_MAX": {
"descriptions": [
"massive energy explosion",
"character transforming with blinding light",
"devastating beam clash"
],
"subjects": ["@Goku"],
"moods": ["epic"],
"min_rating": 4
}
}
}
BlockDescription
metaDisplay name, version, and description
globalSettings applied across all tiers
tiersEnergy tier definitions keyed as 1_LOW, 2_MED, 3_HIGH, 4_MAX
FieldTypeDescription
namestringDisplay name for the driver
versionstringSchema version (use "3.0" for current)
descriptionstringWhat this driver is designed for
FieldTypeDefaultDescription
min_ratinginteger0Baseline rating preference for all tiers (0–5). A soft penalty, not a floor — see below
exclude_tagsstring[][]Drop clips carrying these tags from the pool entirely. The only hard filter in the driver system
tier_thresholdsnumber[][0.25, 0.50, 0.75]The three energy cutoffs between the four tiers. Raise them to make peak tiers rarer
tag_weightnumber0.3How much a tier’s @Tag references count toward the final score, vs. its descriptions

Each tier is keyed as 1_LOW, 2_MED, 3_HIGH, or 4_MAX:

FieldTypeDescription
descriptionsstring[]CLIP text descriptions — the engine computes cosine similarity against clip embeddings
tags (or subjects)string[]Subject tag references using @TagName syntax
moodsstring[]Preferred mood classification. Mismatches take a 0.50x score penalty
scene_typesstring[]Preferred scene type. Mismatches take a 0.60x penalty
min_ratingintegerPer-tier rating preference (overrides global). Lower-rated clips take a 0.70x penalty

The engine maps musical energy (0.0–1.0) to four tiers:

TierEnergy RangeMusical Moment
1_LOW0.0–0.25Intros, breakdowns, quiet sections
2_MED0.25–0.50Verses, building tension
3_HIGH0.50–0.75Choruses, buildups
4_MAX0.75–1.0Drops, climaxes, peak energy

Each description string is encoded into a 768-dim vector using the CLIP text encoder. The engine computes cosine similarity between the description vector and every clip’s embedding.

Description: "massive energy explosion"
↓ CLIP text encoder
↓ 768-dim vector
↓ cosine similarity vs. all clips
↓ ranked results
Clip #4821: cos_sim = 0.31 ← best match
Clip #1203: cos_sim = 0.28
Clip #0892: cos_sim = 0.24

v3 drivers use contrastive scoring — the engine doesn’t just pick clips with the highest absolute similarity to a tier’s descriptions. It measures tier specificity: how much more similar is this clip to the target tier than to all other tiers?

contrast = target_tier_sim - best_other_tier_sim
score = raw_similarity * 0.7 + contrast * 0.3

This prevents the common failure mode where the CLIP model’s highest-confidence clips dominate every tier. Contrastive scoring ensures that calm tiers get genuinely calm content, not just the model’s most confident matches.

Reference tagged clips using the @TagName syntax in the subjects array:

{
"4_MAX": {
"descriptions": ["massive energy explosion"],
"subjects": ["@Goku", "@Vegeta"],
"moods": ["epic"],
"min_rating": 4
}
}

Tags are created via the few-shot propagation system (tag 5 clips → engine finds 800 more).

MoodDescription
epicGrand, powerful, heroic content
melancholicSad, reflective, emotional
tenseSuspenseful, high-stakes
comedicLight, funny, playful
romanticIntimate, warm, affectionate
serenePeaceful, calm, meditative
aggressiveIntense, violent, forceful
mysteriousDark, eerie, shadowy
Scene TypeDescription
close-upFace or detail shot
mediumWaist-up or small group
wideFull environment or establishing shot
aerialDrone or overhead perspective
povFirst-person or subjective camera
slow_motionReduced playback speed content (note the underscore)
groupSeveral people together, crowd scene

What footage is in your library? Anime fights? Drone landscapes? Wedding ceremonies? The driver should reflect your actual content, not aspirational queries.

Be specific and visual — but write captions, not prose. CLIP was trained on image captions and alt-text, so it responds to how people label pictures: short, blunt, concrete. Full descriptive sentences consistently score worse than the tag-style phrasing of the same idea when measured against a real library.

// ❌ Too vague — matches everything, so it distinguishes nothing
"descriptions": ["action"]
// ❌ Too prose-y — the extra words dilute the match
"descriptions": ["a character performing a spinning kick in mid-air"]
// ✅ Concrete, caption-style
"descriptions": [
"spinning kick, mid-air",
"explosion, flying debris",
"sword slash, motion blur"
]

Step 2b: Escalate by content, not by speed

Section titled “Step 2b: Escalate by content, not by speed”

This is the single biggest driver mistake. If your four tiers describe the same thing at different speeds — “slow movement” → “fast movement” → “very fast movement” — they will all pull the same clips. CLIP reads what is in the frame far better than it reads pace.

Build the ladder out of things you could point at in a still: subject, framing, clothing, location, act, weather, time of day. Rewriting a driver from a pace ladder to a content ladder has been measured to cut tier overlap from ~27% to under 13%.

// ❌ Pace ladder — tiers will overlap heavily
"1_LOW": ["gentle unhurried movement"]
"4_MAX": ["blurred fast motion"]
// ✅ Content ladder — genuinely different clips
"1_LOW": ["empty street, dawn"]
"4_MAX": ["car chase, night, sparks"]

In Studio Mode, click ✨ Create in the Clip Direction section to open the Driver Wizard — a visual tier builder with live JSON preview. If you’ve entered text descriptions, the wizard pre-populates from those.

Use DJ Mode to preview how the driver selects clips in real time. Adjust descriptions based on what you see. The console shows per-tier diagnostic logging with similarity breakdowns.

The thing to watch for is tier separation — whether your tiers actually pull different clips. Step through the tiers in DJ Mode and look at what each one serves up. If two adjacent tiers keep offering you the same footage, their descriptions are saying the same thing to the AI even though they read differently to you, and the edit will feel flat no matter how the energy curve moves. Rewrite one of them to describe something the other genuinely doesn’t.

{
"meta": {
"name": "Nature Reel",
"version": "3.0"
},
"tiers": {
"1_LOW": {
"descriptions": ["calm ocean waves", "forest canopy from above", "sunrise over mountains"],
"scene_types": ["wide", "aerial"]
},
"2_MED": {
"descriptions": ["flowing river through valley", "birds in flight"],
"scene_types": ["wide", "medium"]
},
"3_HIGH": {
"descriptions": ["fast drone dive through canyon", "waterfall close-up"],
"scene_types": ["aerial", "pov"],
"min_rating": 2
},
"4_MAX": {
"descriptions": ["storm clouds time-lapse", "lightning strike over ocean"],
"scene_types": ["wide"],
"min_rating": 3
}
}
}
{
"meta": {
"name": "Wedding Highlights",
"version": "3.0"
},
"global": {
"min_rating": 2
},
"tiers": {
"1_LOW": {
"descriptions": ["wedding venue exterior", "floral decorations", "guests arriving"],
"moods": ["serene"],
"scene_types": ["wide"]
},
"2_MED": {
"descriptions": ["bride walking down aisle", "exchanging rings", "emotional guests"],
"moods": ["romantic", "melancholic"],
"scene_types": ["medium"]
},
"3_HIGH": {
"descriptions": ["first dance", "wedding party celebration", "champagne toast"],
"moods": ["romantic", "epic"],
"scene_types": ["medium", "close-up"]
},
"4_MAX": {
"descriptions": ["crowd dancing at reception", "confetti throw", "sparkler exit"],
"moods": ["epic"],
"scene_types": ["wide", "close-up"],
"min_rating": 3
}
}
}
  • Write 3–6 descriptions per tier for best results — more variety = better coverage
  • Use @Tag subjects only after running clip tagging in the GUI
  • The penalty multipliers stack: a clip with wrong mood AND scene can get 0.50 × 0.60 = 0.30× score
  • Per-tier min_rating overrides the global setting for that tier only