Compare commits
8 Commits
fix/623
...
fix/issue-
| Author | SHA1 | Date | |
|---|---|---|---|
| ec49bde39b | |||
| 9ac8ce7d6b | |||
| 728f34412b | |||
| f9bf52e6fe | |||
| 7fd8a6103d | |||
| 5a594cbfb9 | |||
| 2aea7540fa | |||
| b2f81f7b3d |
@@ -31,14 +31,6 @@ class GlitchCategory(Enum):
|
||||
WATER_REFLECTION = "water_reflection"
|
||||
SKYBOX_SEAM = "skybox_seam"
|
||||
|
||||
# Three.js-specific categories (ref: timmy-config#543)
|
||||
SHADER_FAILURE = "shader_failure"
|
||||
TEXTURE_PLACEHOLDER = "texture_placeholder"
|
||||
UV_MAPPING_ERROR = "uv_mapping_error"
|
||||
FRUSTUM_CULLING = "frustum_culling"
|
||||
SHADOW_MAP_ARTIFACT = "shadow_map_artifact"
|
||||
BLOOM_OVERFLOW = "bloom_overflow"
|
||||
|
||||
|
||||
@dataclass
|
||||
class GlitchPattern:
|
||||
@@ -249,123 +241,6 @@ MATRIX_GLITCH_PATTERNS: list[GlitchPattern] = [
|
||||
],
|
||||
confidence_threshold=0.45,
|
||||
),
|
||||
|
||||
# --- Three.js-Specific Glitch Patterns (ref: timmy-config#543) ---
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.SHADER_FAILURE,
|
||||
name="Shader Compilation Failure",
|
||||
description="Three.js shader failed to compile, rendering the material as solid black. "
|
||||
"Common when custom ShaderMaterial has syntax errors or missing uniforms.",
|
||||
severity=GlitchSeverity.CRITICAL,
|
||||
detection_prompts=[
|
||||
"Look for objects or surfaces rendered as pure black (#000000) that should have visible textures or materials.",
|
||||
"Identify geometry that appears completely dark while surrounding objects are normally lit.",
|
||||
"Check for objects where the material seems to 'absorb all light' — flat black with no shading gradient.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"solid black object with no shading",
|
||||
"geometry rendered as silhouette",
|
||||
"material appears to absorb light entirely",
|
||||
"black patch inconsistent with scene lighting",
|
||||
],
|
||||
confidence_threshold=0.7,
|
||||
),
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.TEXTURE_PLACEHOLDER,
|
||||
name="Three.js Texture Not Loaded",
|
||||
description="Three.js failed to load the texture asset, rendering a 1x1 white pixel "
|
||||
"stretched across the entire surface. Distinguished from missing-texture by "
|
||||
"the uniform white/grey appearance rather than magenta.",
|
||||
severity=GlitchSeverity.CRITICAL,
|
||||
detection_prompts=[
|
||||
"Look for surfaces that are uniformly white or light grey with no texture detail, even on large geometry.",
|
||||
"Identify objects where the texture appears as a single solid color stretched across complex UVs.",
|
||||
"Check for surfaces that look 'blank' or 'unloaded' — flat white/grey where detail should exist.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"uniform white or light grey surface",
|
||||
"no texture detail on large geometry",
|
||||
"stretched single-color appearance",
|
||||
"1x1 pixel placeholder stretched to fill UV space",
|
||||
],
|
||||
confidence_threshold=0.65,
|
||||
),
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.UV_MAPPING_ERROR,
|
||||
name="BufferGeometry UV Mapping Error",
|
||||
description="Three.js BufferGeometry has incorrect UV coordinates, causing textures to "
|
||||
"appear stretched, compressed, or mapped to the wrong faces.",
|
||||
severity=GlitchSeverity.HIGH,
|
||||
detection_prompts=[
|
||||
"Look for textures that appear dramatically stretched in one direction on specific faces.",
|
||||
"Identify surfaces where the texture pattern is distorted but other nearby surfaces look correct.",
|
||||
"Check for faces where the texture seems 'smeared' or mapped with incorrect aspect ratio.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"texture stretching on specific faces",
|
||||
"distorted pattern on geometry",
|
||||
"smeared texture appearance",
|
||||
"aspect ratio mismatch between texture and surface",
|
||||
],
|
||||
confidence_threshold=0.6,
|
||||
),
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.FRUSTUM_CULLING,
|
||||
name="Frustum Culling Artifact",
|
||||
description="Three.js frustum culling incorrectly marks objects as outside the camera "
|
||||
"frustum, causing them to pop in/out of existence at screen edges.",
|
||||
severity=GlitchSeverity.MEDIUM,
|
||||
detection_prompts=[
|
||||
"Look for objects that are partially visible at the edge of the frame — half-rendered or cut off unnaturally.",
|
||||
"Identify geometry that seems to 'pop' into existence as the view angle changes.",
|
||||
"Check screen edges for objects that appear suddenly rather than smoothly entering the viewport.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"half-visible object at screen edge",
|
||||
"object popping into frame",
|
||||
"abrupt appearance of geometry",
|
||||
"bounding box visible but mesh missing",
|
||||
],
|
||||
confidence_threshold=0.55,
|
||||
),
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.SHADOW_MAP_ARTIFACT,
|
||||
name="Shadow Map Resolution Artifact",
|
||||
description="Three.js shadow map has insufficient resolution, causing pixelated, "
|
||||
"blocky shadows with visible texel edges instead of smooth shadow gradients.",
|
||||
severity=GlitchSeverity.MEDIUM,
|
||||
detection_prompts=[
|
||||
"Look for shadows with visible blocky or pixelated edges instead of smooth gradients.",
|
||||
"Identify shadow maps where individual texels (texture pixels) are clearly visible.",
|
||||
"Check for shadows that appear as jagged stair-stepped patterns rather than soft edges.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"blocky shadow edges",
|
||||
"visible texel grid in shadows",
|
||||
"stair-stepped shadow boundary",
|
||||
"pixelated shadow gradient",
|
||||
],
|
||||
confidence_threshold=0.55,
|
||||
),
|
||||
GlitchPattern(
|
||||
category=GlitchCategory.BLOOM_OVERFLOW,
|
||||
name="Post-Processing Bloom Overflow",
|
||||
description="Three.js UnrealBloomPass or similar post-processing bloom effect is too "
|
||||
"intense, causing bright areas to bleed glow into surrounding geometry.",
|
||||
severity=GlitchSeverity.LOW,
|
||||
detection_prompts=[
|
||||
"Look for bright areas that have an unusually large, soft glow bleeding into adjacent surfaces.",
|
||||
"Identify scenes where light sources appear to have a 'halo' that extends beyond physical plausibility.",
|
||||
"Check for bright objects whose glow color bleeds onto nearby unrelated geometry.",
|
||||
],
|
||||
visual_indicators=[
|
||||
"excessive glow bleeding from bright surfaces",
|
||||
"halo around light sources",
|
||||
"bloom color tinting adjacent geometry",
|
||||
"glow bleeding beyond object boundaries",
|
||||
],
|
||||
confidence_threshold=0.5,
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -414,23 +289,6 @@ def build_vision_prompt(patterns: list[GlitchPattern] | None = None) -> str:
|
||||
)
|
||||
|
||||
|
||||
|
||||
# Three.js-specific category set for filtering (ref: timmy-config#543)
|
||||
THREEJS_CATEGORIES = {
|
||||
GlitchCategory.SHADER_FAILURE,
|
||||
GlitchCategory.TEXTURE_PLACEHOLDER,
|
||||
GlitchCategory.UV_MAPPING_ERROR,
|
||||
GlitchCategory.FRUSTUM_CULLING,
|
||||
GlitchCategory.SHADOW_MAP_ARTIFACT,
|
||||
GlitchCategory.BLOOM_OVERFLOW,
|
||||
}
|
||||
|
||||
|
||||
def get_threejs_patterns() -> list[GlitchPattern]:
|
||||
"""Return only Three.js-specific glitch patterns."""
|
||||
return [p for p in MATRIX_GLITCH_PATTERNS if p.category in THREEJS_CATEGORIES]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import json
|
||||
print(f"Loaded {len(MATRIX_GLITCH_PATTERNS)} glitch patterns:\n")
|
||||
|
||||
@@ -9,7 +9,7 @@ Usage:
|
||||
python matrix_glitch_detector.py <url> [--angles 4] [--output report.json]
|
||||
python matrix_glitch_detector.py --demo # Run with synthetic test data
|
||||
|
||||
Ref: timmy-config#491, timmy-config#543
|
||||
Ref: timmy-config#491
|
||||
"""
|
||||
|
||||
import argparse
|
||||
@@ -33,7 +33,6 @@ from glitch_patterns import (
|
||||
MATRIX_GLITCH_PATTERNS,
|
||||
build_vision_prompt,
|
||||
get_patterns_by_severity,
|
||||
get_threejs_patterns,
|
||||
)
|
||||
|
||||
|
||||
@@ -346,17 +345,14 @@ def _parse_vision_response(
|
||||
|
||||
def _infer_severity(category: str, confidence: float) -> str:
|
||||
"""Infer severity from category and confidence when not provided."""
|
||||
critical_cats = {"missing_textures", "clipping", "shader_failure", "texture_placeholder"}
|
||||
high_cats = {"floating_assets", "broken_normals", "uv_mapping_error"}
|
||||
medium_cats = {"frustum_culling", "shadow_map_artifact"}
|
||||
critical_cats = {"missing_textures", "clipping"}
|
||||
high_cats = {"floating_assets", "broken_normals"}
|
||||
|
||||
cat_lower = category.lower()
|
||||
if any(c in cat_lower for c in critical_cats):
|
||||
return "critical" if confidence > 0.7 else "high"
|
||||
if any(c in cat_lower for c in high_cats):
|
||||
return "high" if confidence > 0.7 else "medium"
|
||||
if any(c in cat_lower for c in medium_cats):
|
||||
return "medium" if confidence > 0.6 else "low"
|
||||
return "medium" if confidence > 0.6 else "low"
|
||||
|
||||
|
||||
@@ -393,9 +389,9 @@ def build_report(
|
||||
),
|
||||
},
|
||||
metadata={
|
||||
"detector_version": "0.2.0",
|
||||
"detector_version": "0.1.0",
|
||||
"pattern_count": len(MATRIX_GLITCH_PATTERNS),
|
||||
"reference": "timmy-config#491, timmy-config#543",
|
||||
"reference": "timmy-config#491",
|
||||
},
|
||||
)
|
||||
|
||||
@@ -464,30 +460,6 @@ def run_demo(output_path: Optional[Path] = None) -> ScanResult:
|
||||
screenshot_index=3,
|
||||
screenshot_angle="left",
|
||||
),
|
||||
DetectedGlitch(
|
||||
id=str(uuid.uuid4())[:8],
|
||||
category="shader_failure",
|
||||
name="Black Material on Portal Frame",
|
||||
description="Portal frame rendered as solid black — shader compilation failed (missing uniform u_time)",
|
||||
severity="critical",
|
||||
confidence=0.91,
|
||||
location_x=45.0,
|
||||
location_y=30.0,
|
||||
screenshot_index=0,
|
||||
screenshot_angle="front",
|
||||
),
|
||||
DetectedGlitch(
|
||||
id=str(uuid.uuid4())[:8],
|
||||
category="shadow_map_artifact",
|
||||
name="Pixelated Character Shadow",
|
||||
description="Character shadow shows visible texel grid — shadow map resolution too low (512x512)",
|
||||
severity="medium",
|
||||
confidence=0.78,
|
||||
location_x=52.0,
|
||||
location_y=75.0,
|
||||
screenshot_index=1,
|
||||
screenshot_angle="right",
|
||||
),
|
||||
]
|
||||
|
||||
print(f"[*] Detected {len(demo_glitches)} glitches")
|
||||
@@ -524,11 +496,6 @@ Examples:
|
||||
help="Minimum severity to include in report",
|
||||
)
|
||||
parser.add_argument("--verbose", "-v", action="store_true", help="Verbose output")
|
||||
parser.add_argument(
|
||||
"--threejs",
|
||||
action="store_true",
|
||||
help="Focus on Three.js-specific glitch patterns only (shader, texture, UV, culling, shadow, bloom)",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@@ -558,13 +525,9 @@ Examples:
|
||||
screenshots = capture_screenshots(args.url, angles, screenshots_dir)
|
||||
print(f"[*] Captured {len(screenshots)} screenshots")
|
||||
|
||||
# Filter patterns by severity and type
|
||||
# Filter patterns by severity
|
||||
min_sev = GlitchSeverity(args.min_severity)
|
||||
patterns = get_patterns_by_severity(min_sev)
|
||||
if args.threejs:
|
||||
threejs_patterns = get_threejs_patterns()
|
||||
patterns = [p for p in patterns if p in threejs_patterns]
|
||||
print(f"[*] Three.js-focused mode: {len(patterns)} patterns")
|
||||
|
||||
# Analyze with vision AI
|
||||
print(f"[*] Analyzing with vision AI ({len(patterns)} patterns)...")
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Full Nostr agent-to-agent communication demo - FINAL WORKING
|
||||
"""
|
||||
|
||||
@@ -1,271 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Pre-Flight Provider Check Script
|
||||
Issue #508: [Robustness] Credential drain detection — provider health checks
|
||||
|
||||
Pre-flight check before session launch: verifies provider credentials and balance.
|
||||
|
||||
Usage:
|
||||
python3 preflight-provider-check.py # Check all providers
|
||||
python3 preflight-provider-check.py --launch # Check and return exit code
|
||||
python3 preflight-provider-check.py --balance # Check OpenRouter balance
|
||||
"""
|
||||
|
||||
import os, sys, json, yaml, urllib.request
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
# Configuration
|
||||
HERMES_HOME = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes"))
|
||||
LOG_DIR = Path.home() / ".local" / "timmy" / "fleet-health"
|
||||
LOG_FILE = LOG_DIR / "preflight-check.log"
|
||||
|
||||
def log(msg):
|
||||
"""Log message to file and optionally console."""
|
||||
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
||||
log_entry = "[" + timestamp + "] " + msg
|
||||
|
||||
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||
with open(LOG_FILE, "a") as f:
|
||||
f.write(log_entry + "\n")
|
||||
|
||||
if "--quiet" not in sys.argv:
|
||||
print(log_entry)
|
||||
|
||||
def get_provider_api_key(provider):
|
||||
"""Get API key for a provider from .env or environment."""
|
||||
env_file = HERMES_HOME / ".env"
|
||||
if env_file.exists():
|
||||
with open(env_file) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line.startswith(provider.upper() + "_API_KEY="):
|
||||
return line.split("=", 1)[1].strip().strip("'\"")
|
||||
|
||||
return os.environ.get(provider.upper() + "_API_KEY")
|
||||
|
||||
def check_openrouter_balance(api_key):
|
||||
"""Check OpenRouter balance via /api/v1/auth/key."""
|
||||
if not api_key:
|
||||
return False, "No API key", 0
|
||||
|
||||
try:
|
||||
req = urllib.request.Request(
|
||||
"https://openrouter.ai/api/v1/auth/key",
|
||||
headers={"Authorization": "Bearer " + api_key}
|
||||
)
|
||||
resp = urllib.request.urlopen(req, timeout=10)
|
||||
data = json.loads(resp.read())
|
||||
|
||||
# Check for credits
|
||||
credits = data.get("data", {}).get("limit", 0)
|
||||
usage = data.get("data", {}).get("usage", 0)
|
||||
remaining = credits - usage if credits else None
|
||||
|
||||
if remaining is not None and remaining <= 0:
|
||||
return False, "No credits remaining", 0
|
||||
elif remaining is not None:
|
||||
return True, "Credits available", remaining
|
||||
else:
|
||||
return True, "Unlimited or unknown balance", None
|
||||
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code == 401:
|
||||
return False, "Invalid API key", 0
|
||||
else:
|
||||
return False, "HTTP " + str(e.code), 0
|
||||
except Exception as e:
|
||||
return False, str(e)[:100], 0
|
||||
|
||||
def check_nous_key(api_key):
|
||||
"""Check Nous API key with minimal test call."""
|
||||
if not api_key:
|
||||
return False, "No API key"
|
||||
|
||||
try:
|
||||
req = urllib.request.Request(
|
||||
"https://inference.nousresearch.com/v1/models",
|
||||
headers={"Authorization": "Bearer " + api_key}
|
||||
)
|
||||
resp = urllib.request.urlopen(req, timeout=10)
|
||||
|
||||
if resp.status == 200:
|
||||
return True, "Valid key"
|
||||
else:
|
||||
return False, "HTTP " + str(resp.status)
|
||||
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code == 401:
|
||||
return False, "Invalid API key"
|
||||
elif e.code == 403:
|
||||
return False, "Forbidden"
|
||||
else:
|
||||
return False, "HTTP " + str(e.code)
|
||||
except Exception as e:
|
||||
return False, str(e)[:100]
|
||||
|
||||
def check_anthropic_key(api_key):
|
||||
"""Check Anthropic API key with minimal test call."""
|
||||
if not api_key:
|
||||
return False, "No API key"
|
||||
|
||||
try:
|
||||
req = urllib.request.Request(
|
||||
"https://api.anthropic.com/v1/models",
|
||||
headers={
|
||||
"x-api-key": api_key,
|
||||
"anthropic-version": "2023-06-01"
|
||||
}
|
||||
)
|
||||
resp = urllib.request.urlopen(req, timeout=10)
|
||||
|
||||
if resp.status == 200:
|
||||
return True, "Valid key"
|
||||
else:
|
||||
return False, "HTTP " + str(resp.status)
|
||||
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code == 401:
|
||||
return False, "Invalid API key"
|
||||
elif e.code == 403:
|
||||
return False, "Forbidden"
|
||||
else:
|
||||
return False, "HTTP " + str(e.code)
|
||||
except Exception as e:
|
||||
return False, str(e)[:100]
|
||||
|
||||
def check_ollama():
|
||||
"""Check if Ollama is running."""
|
||||
try:
|
||||
req = urllib.request.Request("http://localhost:11434/api/tags")
|
||||
resp = urllib.request.urlopen(req, timeout=5)
|
||||
|
||||
if resp.status == 200:
|
||||
data = json.loads(resp.read())
|
||||
models = data.get("models", [])
|
||||
return True, str(len(models)) + " models loaded"
|
||||
else:
|
||||
return False, "HTTP " + str(resp.status)
|
||||
|
||||
except Exception as e:
|
||||
return False, str(e)[:100]
|
||||
|
||||
def get_configured_provider():
|
||||
"""Get the configured provider from global config."""
|
||||
config_file = HERMES_HOME / "config.yaml"
|
||||
if not config_file.exists():
|
||||
return None
|
||||
|
||||
try:
|
||||
with open(config_file) as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
model_config = config.get("model", {})
|
||||
if isinstance(model_config, dict):
|
||||
return model_config.get("provider")
|
||||
except:
|
||||
pass
|
||||
|
||||
return None
|
||||
|
||||
def run_preflight_check():
|
||||
"""Run pre-flight check on all providers."""
|
||||
log("=== Pre-Flight Provider Check ===")
|
||||
|
||||
results = {}
|
||||
|
||||
# Check OpenRouter
|
||||
or_key = get_provider_api_key("openrouter")
|
||||
or_ok, or_msg, or_balance = check_openrouter_balance(or_key)
|
||||
results["openrouter"] = {"healthy": or_ok, "message": or_msg, "balance": or_balance}
|
||||
|
||||
# Check Nous
|
||||
nous_key = get_provider_api_key("nous")
|
||||
nous_ok, nous_msg = check_nous_key(nous_key)
|
||||
results["nous"] = {"healthy": nous_ok, "message": nous_msg}
|
||||
|
||||
# Check Anthropic
|
||||
anthropic_key = get_provider_api_key("anthropic")
|
||||
anthropic_ok, anthropic_msg = check_anthropic_key(anthropic_key)
|
||||
results["anthropic"] = {"healthy": anthropic_ok, "message": anthropic_msg}
|
||||
|
||||
# Check Ollama
|
||||
ollama_ok, ollama_msg = check_ollama()
|
||||
results["ollama"] = {"healthy": ollama_ok, "message": ollama_msg}
|
||||
|
||||
# Get configured provider
|
||||
configured = get_configured_provider()
|
||||
|
||||
# Summary
|
||||
healthy_count = sum(1 for r in results.values() if r["healthy"])
|
||||
total_count = len(results)
|
||||
|
||||
log("Results: " + str(healthy_count) + "/" + str(total_count) + " providers healthy")
|
||||
|
||||
for provider, result in results.items():
|
||||
status = "HEALTHY" if result["healthy"] else "UNHEALTHY"
|
||||
extra = ""
|
||||
if provider == "openrouter" and result.get("balance") is not None:
|
||||
extra = " (balance: " + str(result["balance"]) + ")"
|
||||
|
||||
log(" " + provider + ": " + status + " - " + result["message"] + extra)
|
||||
|
||||
if configured:
|
||||
log("Configured provider: " + configured)
|
||||
if configured in results and not results[configured]["healthy"]:
|
||||
log("WARNING: Configured provider " + configured + " is UNHEALTHY!")
|
||||
|
||||
return results, configured
|
||||
|
||||
def check_launch_readiness():
|
||||
"""Check if we're ready to launch sessions."""
|
||||
results, configured = run_preflight_check()
|
||||
|
||||
# Check if configured provider is healthy
|
||||
if configured and configured in results:
|
||||
if not results[configured]["healthy"]:
|
||||
log("LAUNCH BLOCKED: Configured provider " + configured + " is unhealthy")
|
||||
return False, configured + " is unhealthy"
|
||||
|
||||
# Check if at least one provider is healthy
|
||||
healthy_providers = [p for p, r in results.items() if r["healthy"]]
|
||||
if not healthy_providers:
|
||||
log("LAUNCH BLOCKED: No healthy providers available")
|
||||
return False, "No healthy providers"
|
||||
|
||||
log("LAUNCH READY: " + str(len(healthy_providers)) + " healthy providers available")
|
||||
return True, "Ready"
|
||||
|
||||
def show_balance():
|
||||
"""Show OpenRouter balance."""
|
||||
api_key = get_provider_api_key("openrouter")
|
||||
if not api_key:
|
||||
print("No OpenRouter API key found")
|
||||
return
|
||||
|
||||
ok, msg, balance = check_openrouter_balance(api_key)
|
||||
|
||||
if ok:
|
||||
if balance is not None:
|
||||
print("OpenRouter balance: " + str(balance) + " credits")
|
||||
else:
|
||||
print("OpenRouter: " + msg)
|
||||
else:
|
||||
print("OpenRouter: " + msg)
|
||||
|
||||
def main():
|
||||
if "--balance" in sys.argv:
|
||||
show_balance()
|
||||
elif "--launch" in sys.argv:
|
||||
ready, message = check_launch_readiness()
|
||||
if ready:
|
||||
print("READY")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print("BLOCKED: " + message)
|
||||
sys.exit(1)
|
||||
else:
|
||||
run_preflight_check()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,411 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Provider Health Monitor Script
|
||||
Issue #509: [Robustness] Provider-aware profile config — auto-switch on failure
|
||||
|
||||
Monitors provider health and automatically switches profiles to working providers.
|
||||
|
||||
Usage:
|
||||
python3 provider-health-monitor.py # Run once
|
||||
python3 provider-health-monitor.py --daemon # Run continuously
|
||||
python3 provider-health-monitor.py --status # Show provider health
|
||||
"""
|
||||
|
||||
import os, sys, json, yaml, urllib.request, time
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
# Configuration
|
||||
HERMES_HOME = Path(os.environ.get("HERMES_HOME", Path.home() / ".hermes"))
|
||||
PROFILES_DIR = HERMES_HOME / "profiles"
|
||||
LOG_DIR = Path.home() / ".local" / "timmy" / "fleet-health"
|
||||
STATE_FILE = LOG_DIR / "tmux-state.json"
|
||||
LOG_FILE = LOG_DIR / "provider-health.log"
|
||||
|
||||
# Provider test endpoints
|
||||
PROVIDER_TESTS = {
|
||||
"openrouter": {
|
||||
"url": "https://openrouter.ai/api/v1/models",
|
||||
"method": "GET",
|
||||
"headers": lambda api_key: {"Authorization": "Bearer " + api_key},
|
||||
"timeout": 10
|
||||
},
|
||||
"anthropic": {
|
||||
"url": "https://api.anthropic.com/v1/models",
|
||||
"method": "GET",
|
||||
"headers": lambda api_key: {"x-api-key": api_key, "anthropic-version": "2023-06-01"},
|
||||
"timeout": 10
|
||||
},
|
||||
"nous": {
|
||||
"url": "https://inference.nousresearch.com/v1/models",
|
||||
"method": "GET",
|
||||
"headers": lambda api_key: {"Authorization": "Bearer " + api_key},
|
||||
"timeout": 10
|
||||
},
|
||||
"kimi-coding": {
|
||||
"url": "https://api.kimi.com/coding/v1/models",
|
||||
"method": "GET",
|
||||
"headers": lambda api_key: {"x-api-key": api_key, "x-api-provider": "kimi-coding"},
|
||||
"timeout": 10
|
||||
},
|
||||
"ollama": {
|
||||
"url": "http://localhost:11434/api/tags",
|
||||
"method": "GET",
|
||||
"headers": lambda api_key: {},
|
||||
"timeout": 5
|
||||
}
|
||||
}
|
||||
|
||||
def log(msg):
|
||||
"""Log message to file and optionally console."""
|
||||
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
|
||||
log_entry = "[" + timestamp + "] " + msg
|
||||
|
||||
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||
with open(LOG_FILE, "a") as f:
|
||||
f.write(log_entry + "\n")
|
||||
|
||||
if "--quiet" not in sys.argv:
|
||||
print(log_entry)
|
||||
|
||||
def get_provider_api_key(provider):
|
||||
"""Get API key for a provider from .env or environment."""
|
||||
env_file = HERMES_HOME / ".env"
|
||||
if env_file.exists():
|
||||
with open(env_file) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line.startswith(provider.upper() + "_API_KEY="):
|
||||
return line.split("=", 1)[1].strip().strip("'\"")
|
||||
|
||||
return os.environ.get(provider.upper() + "_API_KEY")
|
||||
|
||||
def test_provider(provider, api_key=None):
|
||||
"""Test if a provider is healthy."""
|
||||
config = PROVIDER_TESTS.get(provider)
|
||||
if not config:
|
||||
return False, "Unknown provider: " + provider
|
||||
|
||||
headers = config["headers"](api_key or "")
|
||||
|
||||
try:
|
||||
req = urllib.request.Request(
|
||||
config["url"],
|
||||
headers=headers,
|
||||
method=config["method"]
|
||||
)
|
||||
resp = urllib.request.urlopen(req, timeout=config["timeout"])
|
||||
|
||||
if resp.status == 200:
|
||||
return True, "Healthy"
|
||||
else:
|
||||
return False, "HTTP " + str(resp.status)
|
||||
|
||||
except urllib.error.HTTPError as e:
|
||||
if e.code == 401:
|
||||
return False, "Unauthorized (401)"
|
||||
elif e.code == 403:
|
||||
return False, "Forbidden (403)"
|
||||
elif e.code == 429:
|
||||
return True, "Rate limited but accessible"
|
||||
else:
|
||||
return False, "HTTP " + str(e.code)
|
||||
except Exception as e:
|
||||
return False, str(e)[:100]
|
||||
|
||||
def get_all_providers():
|
||||
"""Get all providers from profiles and global config."""
|
||||
providers = set()
|
||||
|
||||
# Global config
|
||||
global_config = HERMES_HOME / "config.yaml"
|
||||
if global_config.exists():
|
||||
try:
|
||||
with open(global_config) as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
# Primary model provider
|
||||
model_config = config.get("model", {})
|
||||
if isinstance(model_config, dict):
|
||||
provider = model_config.get("provider", "")
|
||||
if provider:
|
||||
providers.add(provider)
|
||||
|
||||
# Auxiliary providers
|
||||
auxiliary = config.get("auxiliary", {})
|
||||
for aux_config in auxiliary.values():
|
||||
if isinstance(aux_config, dict):
|
||||
provider = aux_config.get("provider", "")
|
||||
if provider and provider != "auto":
|
||||
providers.add(provider)
|
||||
except:
|
||||
pass
|
||||
|
||||
# Profile configs
|
||||
if PROFILES_DIR.exists():
|
||||
for profile_dir in PROFILES_DIR.iterdir():
|
||||
if profile_dir.is_dir():
|
||||
config_file = profile_dir / "config.yaml"
|
||||
if config_file.exists():
|
||||
try:
|
||||
with open(config_file) as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
model_config = config.get("model", {})
|
||||
if isinstance(model_config, dict):
|
||||
provider = model_config.get("provider", "")
|
||||
if provider:
|
||||
providers.add(provider)
|
||||
|
||||
auxiliary = config.get("auxiliary", {})
|
||||
for aux_config in auxiliary.values():
|
||||
if isinstance(aux_config, dict):
|
||||
provider = aux_config.get("provider", "")
|
||||
if provider and provider != "auto":
|
||||
providers.add(provider)
|
||||
except:
|
||||
pass
|
||||
|
||||
# Add common providers even if not configured
|
||||
providers.update(["openrouter", "nous", "ollama"])
|
||||
|
||||
return list(providers)
|
||||
|
||||
def build_health_map():
|
||||
"""Build a health map of all providers."""
|
||||
providers = get_all_providers()
|
||||
health_map = {}
|
||||
|
||||
log("Testing " + str(len(providers)) + " providers...")
|
||||
|
||||
for provider in providers:
|
||||
api_key = get_provider_api_key(provider)
|
||||
healthy, message = test_provider(provider, api_key)
|
||||
|
||||
health_map[provider] = {
|
||||
"healthy": healthy,
|
||||
"message": message,
|
||||
"last_test": datetime.now(timezone.utc).isoformat(),
|
||||
"api_key_present": bool(api_key)
|
||||
}
|
||||
|
||||
status = "HEALTHY" if healthy else "UNHEALTHY"
|
||||
log(" " + provider + ": " + status + " - " + message)
|
||||
|
||||
return health_map
|
||||
|
||||
def get_fallback_providers(health_map):
|
||||
"""Get list of healthy providers in priority order."""
|
||||
# Priority order: nous, openrouter, ollama, others
|
||||
priority_order = ["nous", "openrouter", "ollama", "anthropic", "kimi-coding"]
|
||||
|
||||
healthy = []
|
||||
for provider in priority_order:
|
||||
if provider in health_map and health_map[provider]["healthy"]:
|
||||
healthy.append(provider)
|
||||
|
||||
# Add any other healthy providers not in priority list
|
||||
for provider, info in health_map.items():
|
||||
if info["healthy"] and provider not in healthy:
|
||||
healthy.append(provider)
|
||||
|
||||
return healthy
|
||||
|
||||
def update_profile_config(profile_name, new_provider):
|
||||
"""Update a profile's config to use a new provider."""
|
||||
config_file = PROFILES_DIR / profile_name / "config.yaml"
|
||||
|
||||
if not config_file.exists():
|
||||
return False, "Config file not found"
|
||||
|
||||
try:
|
||||
with open(config_file) as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
# Update model provider
|
||||
if "model" not in config:
|
||||
config["model"] = {}
|
||||
|
||||
old_provider = config["model"].get("provider", "unknown")
|
||||
config["model"]["provider"] = new_provider
|
||||
|
||||
# Update auxiliary providers if they were using the old provider
|
||||
auxiliary = config.get("auxiliary", {})
|
||||
for aux_name, aux_config in auxiliary.items():
|
||||
if isinstance(aux_config, dict) and aux_config.get("provider") == old_provider:
|
||||
aux_config["provider"] = new_provider
|
||||
|
||||
# Write back
|
||||
with open(config_file, "w") as f:
|
||||
yaml.dump(config, f, default_flow_style=False)
|
||||
|
||||
log("Updated " + profile_name + ": " + old_provider + " -> " + new_provider)
|
||||
return True, "Updated"
|
||||
|
||||
except Exception as e:
|
||||
return False, str(e)
|
||||
|
||||
def check_profiles(health_map):
|
||||
"""Check all profiles and update unhealthy providers."""
|
||||
if not PROFILES_DIR.exists():
|
||||
return
|
||||
|
||||
fallback_providers = get_fallback_providers(health_map)
|
||||
if not fallback_providers:
|
||||
log("CRITICAL: No healthy providers available!")
|
||||
return
|
||||
|
||||
updated_profiles = []
|
||||
|
||||
for profile_dir in PROFILES_DIR.iterdir():
|
||||
if not profile_dir.is_dir():
|
||||
continue
|
||||
|
||||
profile_name = profile_dir.name
|
||||
config_file = profile_dir / "config.yaml"
|
||||
|
||||
if not config_file.exists():
|
||||
continue
|
||||
|
||||
try:
|
||||
with open(config_file) as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
model_config = config.get("model", {})
|
||||
if not isinstance(model_config, dict):
|
||||
continue
|
||||
|
||||
current_provider = model_config.get("provider", "")
|
||||
if not current_provider:
|
||||
continue
|
||||
|
||||
# Check if current provider is healthy
|
||||
if current_provider in health_map and health_map[current_provider]["healthy"]:
|
||||
continue # Provider is healthy, no action needed
|
||||
|
||||
# Find best fallback
|
||||
best_fallback = None
|
||||
for provider in fallback_providers:
|
||||
if provider != current_provider:
|
||||
best_fallback = provider
|
||||
break
|
||||
|
||||
if not best_fallback:
|
||||
log("No fallback for " + profile_name + " (current: " + current_provider + ")")
|
||||
continue
|
||||
|
||||
# Update profile
|
||||
success, message = update_profile_config(profile_name, best_fallback)
|
||||
if success:
|
||||
updated_profiles.append({
|
||||
"profile": profile_name,
|
||||
"old_provider": current_provider,
|
||||
"new_provider": best_fallback
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
log("Error processing " + profile_name + ": " + str(e))
|
||||
|
||||
return updated_profiles
|
||||
|
||||
def load_state():
|
||||
"""Load state from tmux-state.json."""
|
||||
if STATE_FILE.exists():
|
||||
try:
|
||||
with open(STATE_FILE) as f:
|
||||
return json.load(f)
|
||||
except:
|
||||
pass
|
||||
return {}
|
||||
|
||||
def save_state(state):
|
||||
"""Save state to tmux-state.json."""
|
||||
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with open(STATE_FILE, "w") as f:
|
||||
json.dump(state, f, indent=2)
|
||||
|
||||
def run_once():
|
||||
"""Run provider health check once."""
|
||||
log("=== Provider Health Check ===")
|
||||
|
||||
state = load_state()
|
||||
|
||||
# Build health map
|
||||
health_map = build_health_map()
|
||||
|
||||
# Check profiles and update if needed
|
||||
updated_profiles = check_profiles(health_map)
|
||||
|
||||
# Update state
|
||||
state["provider_health"] = health_map
|
||||
state["last_provider_check"] = datetime.now(timezone.utc).isoformat()
|
||||
|
||||
if updated_profiles:
|
||||
state["last_profile_updates"] = updated_profiles
|
||||
|
||||
save_state(state)
|
||||
|
||||
# Summary
|
||||
healthy_count = sum(1 for p in health_map.values() if p["healthy"])
|
||||
total_count = len(health_map)
|
||||
|
||||
log("Health: " + str(healthy_count) + "/" + str(total_count) + " providers healthy")
|
||||
|
||||
if updated_profiles:
|
||||
log("Updated " + str(len(updated_profiles)) + " profiles:")
|
||||
for update in updated_profiles:
|
||||
log(" " + update["profile"] + ": " + update["old_provider"] + " -> " + update["new_provider"])
|
||||
|
||||
def show_status():
|
||||
"""Show provider health status."""
|
||||
state = load_state()
|
||||
health_map = state.get("provider_health", {})
|
||||
|
||||
if not health_map:
|
||||
print("No provider health data available. Run without --status first.")
|
||||
return
|
||||
|
||||
print("Provider Health (last updated: " + str(state.get("last_provider_check", "unknown")) + ")")
|
||||
print("=" * 80)
|
||||
|
||||
for provider, info in sorted(health_map.items()):
|
||||
status = "HEALTHY" if info["healthy"] else "UNHEALTHY"
|
||||
message = info.get("message", "")
|
||||
api_key = "yes" if info.get("api_key_present") else "no"
|
||||
|
||||
print(provider.ljust(20) + " " + status.ljust(10) + " API key: " + api_key + " - " + message)
|
||||
|
||||
# Show recent updates
|
||||
updates = state.get("last_profile_updates", [])
|
||||
if updates:
|
||||
print()
|
||||
print("Recent Profile Updates:")
|
||||
for update in updates:
|
||||
print(" " + update["profile"] + ": " + update["old_provider"] + " -> " + update["new_provider"])
|
||||
|
||||
def daemon_mode():
|
||||
"""Run continuously."""
|
||||
log("Starting provider health daemon (check every 300s)")
|
||||
|
||||
while True:
|
||||
try:
|
||||
run_once()
|
||||
time.sleep(300) # Check every 5 minutes
|
||||
except KeyboardInterrupt:
|
||||
log("Daemon stopped by user")
|
||||
break
|
||||
except Exception as e:
|
||||
log("Error: " + str(e))
|
||||
time.sleep(60)
|
||||
|
||||
def main():
|
||||
if "--status" in sys.argv:
|
||||
show_status()
|
||||
elif "--daemon" in sys.argv:
|
||||
daemon_mode()
|
||||
else:
|
||||
run_once()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,292 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Quality Gate — Validate pipeline outputs before saving.
|
||||
|
||||
Checks:
|
||||
- JSON schema validation for all output formats
|
||||
- Content quality (not empty, not duplicated, not toxic)
|
||||
- SOUL.md compliance for agent-facing content
|
||||
- Auto-reject bad outputs, re-queue for regeneration
|
||||
- Quality score tracking per pipeline
|
||||
|
||||
Usage:
|
||||
python3 quality-gate.py validate training-data/pairs.jsonl
|
||||
python3 quality-gate.py validate --format training-pairs data.jsonl
|
||||
python3 quality-gate.py score training-data/pairs.jsonl
|
||||
python3 quality-gate.py stats
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
HERMES_HOME = Path(os.environ.get("HERMES_HOME", os.path.expanduser("~/.hermes")))
|
||||
SCORE_FILE = HERMES_HOME / "quality-scores.jsonl"
|
||||
HASH_FILE = HERMES_HOME / "quality-hashes.json"
|
||||
MAX_HASH_AGE_DAYS = 7
|
||||
|
||||
# ── Validators ─────────────────────────────────────────
|
||||
|
||||
TOXIC_PATTERNS = [
|
||||
"kill yourself", "kys", "you should die", "end it all",
|
||||
"nobody loves you", "waste of life",
|
||||
]
|
||||
|
||||
def validate_training_pair(entry):
|
||||
"""Validate a training pair (prompt + response)."""
|
||||
errors = []
|
||||
if not isinstance(entry, dict):
|
||||
return ["Entry is not a dict"]
|
||||
|
||||
prompt = entry.get("prompt", "") or entry.get("instruction", "") or ""
|
||||
response = entry.get("response", "") or entry.get("output", "") or entry.get("completion", "") or ""
|
||||
|
||||
if not prompt.strip():
|
||||
errors.append("Empty prompt")
|
||||
if not response.strip():
|
||||
errors.append("Empty response")
|
||||
if len(response) < 10:
|
||||
errors.append(f"Response too short ({len(response)} chars)")
|
||||
if len(prompt) > 10000:
|
||||
errors.append(f"Prompt too long ({len(prompt)} chars)")
|
||||
|
||||
# Toxicity check
|
||||
combined = (prompt + " " + response).lower()
|
||||
for pattern in TOXIC_PATTERNS:
|
||||
if pattern in combined:
|
||||
errors.append(f"Toxic content detected: '{pattern}'")
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def validate_jsonl(filepath):
|
||||
"""Validate a JSONL file — each line must be valid JSON."""
|
||||
errors = []
|
||||
seen_hashes = set()
|
||||
line_count = 0
|
||||
|
||||
try:
|
||||
with open(filepath) as f:
|
||||
for i, line in enumerate(f, 1):
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
line_count += 1
|
||||
try:
|
||||
entry = json.loads(line)
|
||||
except json.JSONDecodeError as e:
|
||||
errors.append(f"Line {i}: invalid JSON: {e}")
|
||||
continue
|
||||
|
||||
# Duplicate detection
|
||||
h = hashlib.sha256(line.encode()).hexdigest()[:16]
|
||||
if h in seen_hashes:
|
||||
errors.append(f"Line {i}: duplicate content (hash {h})")
|
||||
seen_hashes.add(h)
|
||||
|
||||
# Content validation
|
||||
if isinstance(entry, dict):
|
||||
pair_errors = validate_training_pair(entry)
|
||||
for pe in pair_errors:
|
||||
errors.append(f"Line {i}: {pe}")
|
||||
|
||||
except Exception as e:
|
||||
errors.append(f"File error: {e}")
|
||||
|
||||
return errors, line_count, seen_hashes
|
||||
|
||||
|
||||
def validate_json(filepath):
|
||||
"""Validate a single JSON file."""
|
||||
errors = []
|
||||
try:
|
||||
with open(filepath) as f:
|
||||
data = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
return [f"Invalid JSON: {e}"], 0
|
||||
|
||||
if isinstance(data, list):
|
||||
seen = set()
|
||||
for i, entry in enumerate(data):
|
||||
if isinstance(entry, dict):
|
||||
h = hashlib.sha256(json.dumps(entry, sort_keys=True).encode()).hexdigest()[:16]
|
||||
if h in seen:
|
||||
errors.append(f"Index {i}: duplicate entry")
|
||||
seen.add(h)
|
||||
|
||||
return errors, len(data) if isinstance(data, list) else 1
|
||||
|
||||
|
||||
# ── Quality Scoring ────────────────────────────────────
|
||||
|
||||
def score_file(filepath):
|
||||
"""Score a pipeline output file. Returns 0-100."""
|
||||
path = Path(filepath)
|
||||
if not path.exists():
|
||||
return 0
|
||||
|
||||
suffix = path.suffix.lower()
|
||||
if suffix == ".jsonl":
|
||||
errors, count, _ = validate_jsonl(filepath)
|
||||
elif suffix == ".json":
|
||||
errors, count = validate_json(filepath)
|
||||
else:
|
||||
return 50 # unknown format
|
||||
|
||||
if count == 0:
|
||||
return 0
|
||||
|
||||
error_rate = len(errors) / count
|
||||
score = max(0, int(100 * (1 - error_rate)))
|
||||
|
||||
# Bonus for having content
|
||||
if count >= 100:
|
||||
score = min(100, score + 5)
|
||||
|
||||
return score
|
||||
|
||||
|
||||
def record_score(filepath, score):
|
||||
"""Record quality score for tracking."""
|
||||
HERMES_HOME.mkdir(parents=True, exist_ok=True)
|
||||
entry = {
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"file": str(filepath),
|
||||
"score": score,
|
||||
}
|
||||
with open(SCORE_FILE, "a") as f:
|
||||
f.write(json.dumps(entry) + "
|
||||
")
|
||||
|
||||
|
||||
# ── Dedup Hash Management ─────────────────────────────
|
||||
|
||||
def load_hashes():
|
||||
try:
|
||||
return json.loads(HASH_FILE.read_text())
|
||||
except Exception:
|
||||
return {"entries": {}, "last_cleanup": None}
|
||||
|
||||
|
||||
def save_hashes(data):
|
||||
HASH_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||
HASH_FILE.write_text(json.dumps(data, indent=2))
|
||||
|
||||
|
||||
def cleanup_old_hashes(data, max_age_days=MAX_HASH_AGE_DAYS):
|
||||
"""Remove hash entries older than max_age_days."""
|
||||
cutoff = datetime.now(timezone.utc).timestamp() - (max_age_days * 86400)
|
||||
before = len(data.get("entries", {}))
|
||||
data["entries"] = {
|
||||
k: v for k, v in data.get("entries", {}).items()
|
||||
if v.get("ts", 0) > cutoff
|
||||
}
|
||||
data["last_cleanup"] = datetime.now(timezone.utc).isoformat()
|
||||
after = len(data["entries"])
|
||||
return before - after
|
||||
|
||||
|
||||
# ── CLI ────────────────────────────────────────────────
|
||||
|
||||
def cmd_validate(args):
|
||||
filepath = args[0] if args else None
|
||||
if not filepath or not os.path.exists(filepath):
|
||||
print(f"ERROR: {filepath} not found")
|
||||
sys.exit(1)
|
||||
|
||||
suffix = Path(filepath).suffix.lower()
|
||||
if suffix == ".jsonl":
|
||||
errors, count, _ = validate_jsonl(filepath)
|
||||
elif suffix == ".json":
|
||||
errors, count = validate_json(filepath)
|
||||
else:
|
||||
print(f"Unsupported format: {suffix}")
|
||||
sys.exit(1)
|
||||
|
||||
score = score_file(filepath)
|
||||
record_score(filepath, score)
|
||||
|
||||
if errors:
|
||||
for e in errors[:20]:
|
||||
print(f"FAIL: {e}")
|
||||
if len(errors) > 20:
|
||||
print(f"... and {len(errors)-20} more")
|
||||
print(f"
|
||||
Score: {score}/100 ({len(errors)} errors in {count} entries)")
|
||||
sys.exit(1)
|
||||
else:
|
||||
print(f"OK: {filepath} ({count} entries, score {score}/100)")
|
||||
|
||||
|
||||
def cmd_score(args):
|
||||
filepath = args[0] if args else None
|
||||
if not filepath:
|
||||
print("Usage: quality-gate.py score <file>")
|
||||
sys.exit(1)
|
||||
score = score_file(filepath)
|
||||
print(f"Score: {score}/100")
|
||||
record_score(filepath, score)
|
||||
|
||||
|
||||
def cmd_stats():
|
||||
if not SCORE_FILE.exists():
|
||||
print("No quality scores recorded yet.")
|
||||
return
|
||||
|
||||
scores = []
|
||||
with open(SCORE_FILE) as f:
|
||||
for line in f:
|
||||
try:
|
||||
scores.append(json.loads(line))
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
if not scores:
|
||||
print("No scores recorded.")
|
||||
return
|
||||
|
||||
by_file = {}
|
||||
for s in scores:
|
||||
fname = s.get("file", "?")
|
||||
by_file.setdefault(fname, []).append(s.get("score", 0))
|
||||
|
||||
print("Quality Scores:")
|
||||
for fname, scs in sorted(by_file.items()):
|
||||
avg = sum(scs) / len(scs)
|
||||
latest = scs[-1]
|
||||
print(f" {fname}: avg={avg:.0f}, latest={latest}, runs={len(scs)}")
|
||||
|
||||
|
||||
def cmd_cleanup():
|
||||
data = load_hashes()
|
||||
removed = cleanup_old_hashes(data)
|
||||
save_hashes(data)
|
||||
print(f"Cleaned up {removed} old hash entries (>{MAX_HASH_AGE_DAYS} days)")
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: quality-gate.py <validate|score|stats|cleanup> [args]")
|
||||
sys.exit(1)
|
||||
|
||||
cmd = sys.argv[1]
|
||||
args = sys.argv[2:]
|
||||
|
||||
if cmd == "validate":
|
||||
cmd_validate(args)
|
||||
elif cmd == "score":
|
||||
cmd_score(args)
|
||||
elif cmd == "stats":
|
||||
cmd_stats()
|
||||
elif cmd == "cleanup":
|
||||
cmd_cleanup()
|
||||
else:
|
||||
print(f"Unknown command: {cmd}")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Soul Eval Gate — The Conscience of the Training Pipeline
|
||||
|
||||
|
||||
@@ -196,37 +196,7 @@
|
||||
"paused_reason": null,
|
||||
"skills": [],
|
||||
"skill": null
|
||||
},
|
||||
{
|
||||
"id": "tmux-supervisor-513",
|
||||
"name": "Autonomous Cron Supervisor",
|
||||
"prompt": "Load the tmux-supervisor skill and execute the monitoring protocol.\n\nCheck both `dev` and `timmy` tmux sessions for idle panes. Only send Telegram notifications on actionable events (idle, overflow, failure). Be silent when all agents are working.\n\nSteps:\n1. List all tmux sessions (skip 'Alexander')\n2. For each session, list windows and panes\n3. Capture each pane and classify state (idle vs active)\n4. For idle panes: read context, craft context-aware prompt\n5. Send /queue prompts to idle panes\n6. Verify prompts landed\n7. Only notify via Telegram if:\n - A pane was prompted (idle detected)\n - A pane shows context overflow (>80%)\n - A pane is stuck or crashed\n8. If all panes are active: respond with [SILENT]",
|
||||
"schedule": {
|
||||
"kind": "interval",
|
||||
"minutes": 7,
|
||||
"display": "every 7m"
|
||||
},
|
||||
"schedule_display": "every 7m",
|
||||
"repeat": {
|
||||
"times": null,
|
||||
"completed": 0
|
||||
},
|
||||
"enabled": true,
|
||||
"created_at": "2026-04-15T03:00:00.000000+00:00",
|
||||
"next_run_at": null,
|
||||
"last_run_at": null,
|
||||
"last_status": null,
|
||||
"last_error": null,
|
||||
"deliver": "telegram",
|
||||
"origin": null,
|
||||
"state": "scheduled",
|
||||
"paused_at": null,
|
||||
"paused_reason": null,
|
||||
"skills": [
|
||||
"tmux-supervisor"
|
||||
],
|
||||
"skill": "tmux-supervisor"
|
||||
}
|
||||
],
|
||||
"updated_at": "2026-04-13T02:00:00+00:00"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,419 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
quality_gate.py — Quality Gate for Pipeline Outputs
|
||||
|
||||
Validates all pipeline outputs before saving. Rejects bad outputs,
|
||||
tracks quality scores, and supports re-queue for regeneration.
|
||||
|
||||
Usage:
|
||||
python3 quality_gate.py --input output.jsonl --type training_pairs
|
||||
python3 quality_gate.py --input output.jsonl --type knowledge
|
||||
python3 quality_gate.py --input output.jsonl --type scene_descriptions
|
||||
python3 quality_gate.py --dir pipeline/output/ --type training_pairs
|
||||
python3 quality_gate.py --status # show quality stats
|
||||
|
||||
Exit codes:
|
||||
0 = all outputs passed
|
||||
1 = some outputs rejected
|
||||
2 = file/parse error
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import hashlib
|
||||
import re
|
||||
from pathlib import Path
|
||||
from datetime import datetime, timezone
|
||||
from dataclasses import dataclass, field, asdict
|
||||
from typing import List, Optional, Dict, Any
|
||||
|
||||
STATS_FILE = Path.home() / ".hermes" / "pipeline" / "quality_stats.json"
|
||||
|
||||
# --- Quality Check Types ---
|
||||
|
||||
@dataclass
|
||||
class QualityResult:
|
||||
"""Result of a quality check on a single entry."""
|
||||
passed: bool
|
||||
checks_run: int
|
||||
checks_failed: int
|
||||
score: float # 0.0-1.0
|
||||
reasons: List[str] = field(default_factory=list)
|
||||
entry_index: int = -1
|
||||
hash: str = ""
|
||||
|
||||
def to_dict(self):
|
||||
return asdict(self)
|
||||
|
||||
|
||||
@dataclass
|
||||
class GateReport:
|
||||
"""Report from a quality gate run."""
|
||||
file: str
|
||||
type: str
|
||||
total: int
|
||||
passed: int
|
||||
rejected: int
|
||||
score: float
|
||||
rejected_indices: List[int] = field(default_factory=list)
|
||||
timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
|
||||
|
||||
def to_dict(self):
|
||||
return asdict(self)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Check Functions
|
||||
# ============================================================
|
||||
|
||||
def entry_hash(entry: dict) -> str:
|
||||
"""Hash an entry for deduplication."""
|
||||
return hashlib.sha256(json.dumps(entry, sort_keys=True, ensure_ascii=False).encode()).hexdigest()[:16]
|
||||
|
||||
|
||||
def check_not_empty(entry: dict, fields: List[str]) -> List[str]:
|
||||
"""Check that required fields are non-empty."""
|
||||
errors = []
|
||||
for f in fields:
|
||||
val = entry.get(f)
|
||||
if val is None:
|
||||
errors.append(f"missing_field: {f}")
|
||||
elif isinstance(val, str) and len(val.strip()) == 0:
|
||||
errors.append(f"empty_field: {f}")
|
||||
elif isinstance(val, list) and len(val) == 0:
|
||||
errors.append(f"empty_list: {f}")
|
||||
return errors
|
||||
|
||||
|
||||
def check_string_min_length(entry: dict, field_lengths: Dict[str, int]) -> List[str]:
|
||||
"""Check that string fields meet minimum lengths."""
|
||||
errors = []
|
||||
for f, min_len in field_lengths.items():
|
||||
val = entry.get(f)
|
||||
if isinstance(val, str) and len(val) < min_len:
|
||||
errors.append(f"short_field: {f} ({len(val)} < {min_len})")
|
||||
return errors
|
||||
|
||||
|
||||
def check_no_duplicates(entries: List[dict], key_fields: List[str]) -> Dict[int, List[str]]:
|
||||
"""Check for duplicate entries based on key fields."""
|
||||
seen = {}
|
||||
errors = {}
|
||||
for i, entry in enumerate(entries):
|
||||
key = tuple(entry.get(f, "") for f in key_fields)
|
||||
key_str = str(key)
|
||||
if key_str in seen:
|
||||
errors[i] = [f"duplicate_of_index: {seen[key_str]}"]
|
||||
else:
|
||||
seen[key_str] = i
|
||||
return errors
|
||||
|
||||
|
||||
def check_training_pair(entry: dict) -> List[str]:
|
||||
"""Validate a training pair (prompt/response)."""
|
||||
errors = []
|
||||
errors.extend(check_not_empty(entry, ["prompt", "response"]))
|
||||
|
||||
# Check response isn't just echoing the prompt
|
||||
prompt = entry.get("prompt", "")
|
||||
response = entry.get("response", "")
|
||||
if prompt and response and prompt.strip() == response.strip():
|
||||
errors.append("response_equals_prompt")
|
||||
|
||||
# Check response has substance
|
||||
if isinstance(response, str) and len(response) < 10:
|
||||
errors.append(f"response_too_short: {len(response)} chars")
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_scene_description(entry: dict) -> List[str]:
|
||||
"""Validate a scene description entry."""
|
||||
errors = []
|
||||
errors.extend(check_not_empty(entry, ["song", "beat", "lyric_line", "scene"]))
|
||||
|
||||
scene = entry.get("scene")
|
||||
if isinstance(scene, dict):
|
||||
errors.extend(check_not_empty(scene, ["mood", "colors", "composition", "camera", "description"]))
|
||||
errors.extend(check_string_min_length(scene, {"description": 10}))
|
||||
|
||||
colors = scene.get("colors", [])
|
||||
if isinstance(colors, list) and len(colors) > 5:
|
||||
errors.append(f"too_many_colors: {len(colors)} > 5")
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_knowledge_entry(entry: dict) -> List[str]:
|
||||
"""Validate a knowledge file entry."""
|
||||
errors = []
|
||||
errors.extend(check_not_empty(entry, ["title", "content"]))
|
||||
|
||||
# Check for placeholder content
|
||||
content = entry.get("content", "")
|
||||
if isinstance(content, str):
|
||||
placeholders = ["TODO", "FIXME", "PLACEHOLDER", "[INSERT", "lorem ipsum"]
|
||||
for p in placeholders:
|
||||
if p.lower() in content.lower():
|
||||
errors.append(f"placeholder_content: '{p}' found")
|
||||
|
||||
errors.extend(check_string_min_length(entry, {"content": 50}))
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_prompt_enhancement(entry: dict) -> List[str]:
|
||||
"""Validate a prompt enhancement pair (terse/rich)."""
|
||||
errors = []
|
||||
errors.extend(check_not_empty(entry, ["terse", "rich"]))
|
||||
|
||||
terse = entry.get("terse", "")
|
||||
rich = entry.get("rich", "")
|
||||
|
||||
# Rich should be longer than terse
|
||||
if isinstance(terse, str) and isinstance(rich, str) and len(rich) <= len(terse):
|
||||
errors.append("rich_not_longer_than_terse")
|
||||
|
||||
errors.extend(check_string_min_length(entry, {"rich": 20}))
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_adversary_entry(entry: dict) -> List[str]:
|
||||
"""Validate an adversary corpus entry."""
|
||||
errors = []
|
||||
errors.extend(check_not_empty(entry, ["id", "family", "prompt"]))
|
||||
|
||||
# Check prompt isn't empty or placeholder
|
||||
prompt = entry.get("prompt", "")
|
||||
if isinstance(prompt, str) and len(prompt) < 10:
|
||||
errors.append(f"prompt_too_short: {len(prompt)} chars")
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
def check_soul_compliance(text: str) -> List[str]:
|
||||
"""Check text for SOUL.md compliance (basic checks)."""
|
||||
errors = []
|
||||
text_lower = text.lower() if text else ""
|
||||
|
||||
# Check for content that violates core values
|
||||
violations = [
|
||||
("compute.*value.*human.*life", "soul_violation: computing human life value"),
|
||||
("sexualiz.*child", "soul_violation: sexualizing children"),
|
||||
("create.*weapon.*kill", "soul_violation: weapon creation"),
|
||||
("enslav", "soul_violation: enslavement content"),
|
||||
]
|
||||
for pattern, msg in violations:
|
||||
if re.search(pattern, text_lower):
|
||||
errors.append(msg)
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
# ============================================================
|
||||
# Gate Runners
|
||||
# ============================================================
|
||||
|
||||
CHECK_MAP = {
|
||||
"training_pairs": check_training_pair,
|
||||
"training_pair": check_training_pair,
|
||||
"scene_descriptions": check_scene_description,
|
||||
"scene_description": check_scene_description,
|
||||
"knowledge": check_knowledge_entry,
|
||||
"prompt_enhancement": check_prompt_enhancement,
|
||||
"adversary": check_adversary_entry,
|
||||
"adversary_corpus": check_adversary_entry,
|
||||
}
|
||||
|
||||
|
||||
def run_gate(input_path: str, entry_type: str) -> GateReport:
|
||||
"""Run quality gate on a JSONL file."""
|
||||
path = Path(input_path)
|
||||
if not path.exists():
|
||||
return GateReport(file=str(path), type=entry_type, total=0, passed=0, rejected=0, score=0.0)
|
||||
|
||||
check_fn = CHECK_MAP.get(entry_type)
|
||||
if not check_fn:
|
||||
return GateReport(file=str(path), type=entry_type, total=0, passed=0, rejected=0, score=0.0,
|
||||
rejected_indices=[-1]) # unknown type
|
||||
|
||||
entries = []
|
||||
with open(path) as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if line:
|
||||
entries.append(json.loads(line))
|
||||
|
||||
# Deduplication check
|
||||
key_fields = _get_key_fields(entry_type)
|
||||
dup_errors = check_no_duplicates(entries, key_fields)
|
||||
|
||||
passed = 0
|
||||
rejected = 0
|
||||
rejected_indices = []
|
||||
total_score = 0.0
|
||||
|
||||
for i, entry in enumerate(entries):
|
||||
errors = check_fn(entry)
|
||||
|
||||
# Add duplicate errors
|
||||
if i in dup_errors:
|
||||
errors.extend(dup_errors[i])
|
||||
|
||||
# Add SOUL compliance check for text content
|
||||
text_content = ""
|
||||
for f in ["response", "rich", "description", "content", "lyric_line"]:
|
||||
val = entry.get(f)
|
||||
if isinstance(val, str):
|
||||
text_content += val + " "
|
||||
if isinstance(entry.get("scene"), dict):
|
||||
text_content += entry["scene"].get("description", "")
|
||||
|
||||
soul_errors = check_soul_compliance(text_content)
|
||||
errors.extend(soul_errors)
|
||||
|
||||
if errors:
|
||||
rejected += 1
|
||||
rejected_indices.append(i)
|
||||
else:
|
||||
passed += 1
|
||||
|
||||
# Score: 1.0 if no errors, decreasing with each error
|
||||
entry_score = max(0.0, 1.0 - (len(errors) * 0.2))
|
||||
total_score += entry_score
|
||||
|
||||
avg_score = total_score / len(entries) if entries else 0.0
|
||||
|
||||
report = GateReport(
|
||||
file=str(path),
|
||||
type=entry_type,
|
||||
total=len(entries),
|
||||
passed=passed,
|
||||
rejected=rejected,
|
||||
score=round(avg_score, 3),
|
||||
rejected_indices=rejected_indices[:50], # limit for readability
|
||||
)
|
||||
|
||||
# Save stats
|
||||
_save_stats(report)
|
||||
|
||||
return report
|
||||
|
||||
|
||||
def _get_key_fields(entry_type: str) -> List[str]:
|
||||
"""Get key fields for deduplication based on entry type."""
|
||||
key_map = {
|
||||
"training_pairs": ["prompt", "response"],
|
||||
"training_pair": ["prompt", "response"],
|
||||
"scene_descriptions": ["song", "beat"],
|
||||
"scene_description": ["song", "beat"],
|
||||
"knowledge": ["title"],
|
||||
"prompt_enhancement": ["terse", "rich"],
|
||||
"adversary": ["id", "prompt"],
|
||||
"adversary_corpus": ["id", "prompt"],
|
||||
}
|
||||
return key_map.get(entry_type, ["id"])
|
||||
|
||||
|
||||
def _save_stats(report: GateReport):
|
||||
"""Append quality stats to the stats file."""
|
||||
STATS_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
stats = []
|
||||
if STATS_FILE.exists():
|
||||
try:
|
||||
with open(STATS_FILE) as f:
|
||||
stats = json.load(f)
|
||||
except (json.JSONDecodeError, IOError):
|
||||
stats = []
|
||||
|
||||
stats.append(report.to_dict())
|
||||
|
||||
# Keep last 1000 entries
|
||||
stats = stats[-1000:]
|
||||
|
||||
with open(STATS_FILE, "w") as f:
|
||||
json.dump(stats, f, indent=2)
|
||||
|
||||
|
||||
def show_status():
|
||||
"""Show quality gate statistics."""
|
||||
if not STATS_FILE.exists():
|
||||
print("No quality stats found.")
|
||||
return
|
||||
|
||||
with open(STATS_FILE) as f:
|
||||
stats = json.load(f)
|
||||
|
||||
print(f"\nQuality Gate Stats — {len(stats)} runs")
|
||||
print()
|
||||
|
||||
# Group by type
|
||||
by_type = {}
|
||||
for s in stats:
|
||||
t = s.get("type", "unknown")
|
||||
if t not in by_type:
|
||||
by_type[t] = []
|
||||
by_type[t].append(s)
|
||||
|
||||
for t, runs in sorted(by_type.items()):
|
||||
total_entries = sum(r.get("total", 0) for r in runs)
|
||||
total_passed = sum(r.get("passed", 0) for r in runs)
|
||||
total_rejected = sum(r.get("rejected", 0) for r in runs)
|
||||
avg_score = sum(r.get("score", 0) for r in runs) / len(runs) if runs else 0
|
||||
print(f" {t:25} {len(runs):4} runs | {total_entries:6} entries | {total_rejected:4} rejected | avg score: {avg_score:.3f}")
|
||||
|
||||
|
||||
def main():
|
||||
import argparse
|
||||
parser = argparse.ArgumentParser(description="Quality Gate for Pipeline Outputs")
|
||||
parser.add_argument("--input", default=None, help="Input JSONL file")
|
||||
parser.add_argument("--type", default=None, help="Entry type (training_pairs, scene_descriptions, knowledge, etc.)")
|
||||
parser.add_argument("--dir", default=None, help="Process all JSONL files in directory")
|
||||
parser.add_argument("--status", action="store_true", help="Show quality stats")
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.status:
|
||||
show_status()
|
||||
return
|
||||
|
||||
if args.dir:
|
||||
for f in sorted(Path(args.dir).glob("*.jsonl")):
|
||||
t = args.type or _infer_type(f.name)
|
||||
report = run_gate(str(f), t)
|
||||
_print_report(report)
|
||||
elif args.input:
|
||||
t = args.type or _infer_type(args.input)
|
||||
report = run_gate(args.input, t)
|
||||
_print_report(report)
|
||||
sys.exit(0 if report.rejected == 0 else 1)
|
||||
else:
|
||||
parser.print_help()
|
||||
|
||||
|
||||
def _infer_type(filename: str) -> str:
|
||||
"""Infer entry type from filename."""
|
||||
name = filename.lower()
|
||||
if "scene" in name:
|
||||
return "scene_descriptions"
|
||||
if "training" in name or "pair" in name:
|
||||
return "training_pairs"
|
||||
if "knowledge" in name:
|
||||
return "knowledge"
|
||||
if "adversary" in name or "attack" in name:
|
||||
return "adversary"
|
||||
if "prompt" in name or "enhance" in name:
|
||||
return "prompt_enhancement"
|
||||
return "training_pairs" # default
|
||||
|
||||
|
||||
def _print_report(report: GateReport):
|
||||
"""Print a human-readable gate report."""
|
||||
status = "PASS" if report.rejected == 0 else f"FAIL ({report.rejected} rejected)"
|
||||
print(f" {report.file}: {status} | {report.passed}/{report.total} passed | score: {report.score:.3f}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
from hermes_tools import browser_navigate, browser_vision
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
from hermes_tools import browser_navigate, browser_vision
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env python3
|
||||
import json
|
||||
from hermes_tools import browser_navigate, browser_vision
|
||||
|
||||
|
||||
@@ -19,11 +19,9 @@ from glitch_patterns import (
|
||||
GlitchPattern,
|
||||
GlitchSeverity,
|
||||
MATRIX_GLITCH_PATTERNS,
|
||||
THREEJS_CATEGORIES,
|
||||
build_vision_prompt,
|
||||
get_pattern_by_category,
|
||||
get_patterns_by_severity,
|
||||
get_threejs_patterns,
|
||||
)
|
||||
|
||||
from matrix_glitch_detector import (
|
||||
@@ -42,7 +40,7 @@ class TestGlitchPatterns(unittest.TestCase):
|
||||
|
||||
def test_pattern_count(self):
|
||||
"""Verify we have a reasonable number of defined patterns."""
|
||||
self.assertGreaterEqual(len(MATRIX_GLITCH_PATTERNS), 14) # 10 generic + 6 Three.js
|
||||
self.assertGreaterEqual(len(MATRIX_GLITCH_PATTERNS), 8)
|
||||
|
||||
def test_all_patterns_have_required_fields(self):
|
||||
"""Every pattern must have category, name, description, severity, prompts."""
|
||||
@@ -90,9 +88,6 @@ class TestGlitchPatterns(unittest.TestCase):
|
||||
self.assertIn("Floating Object", prompt)
|
||||
self.assertIn("Z-Fighting", prompt)
|
||||
self.assertIn("Missing", prompt)
|
||||
# Three.js patterns should be included
|
||||
self.assertIn("Shader Compilation Failure", prompt)
|
||||
self.assertIn("Bloom Overflow", prompt)
|
||||
|
||||
def test_build_vision_prompt_subset(self):
|
||||
"""Vision prompt with subset should only include specified patterns."""
|
||||
@@ -253,7 +248,7 @@ class TestGlitchDetector(unittest.TestCase):
|
||||
|
||||
try:
|
||||
report = run_demo(output_path)
|
||||
self.assertEqual(len(report.glitches), 6) # 4 original + 2 Three.js
|
||||
self.assertEqual(len(report.glitches), 4)
|
||||
self.assertGreater(report.summary["total_glitches"], 0)
|
||||
self.assertTrue(output_path.exists())
|
||||
|
||||
@@ -265,93 +260,6 @@ class TestGlitchDetector(unittest.TestCase):
|
||||
output_path.unlink(missing_ok=True)
|
||||
|
||||
|
||||
class TestThreeJsPatterns(unittest.TestCase):
|
||||
"""Tests for Three.js-specific glitch patterns (timmy-config#543)."""
|
||||
|
||||
def test_get_threejs_patterns_returns_only_threejs(self):
|
||||
"""get_threejs_patterns() should return only Three.js categories."""
|
||||
patterns = get_threejs_patterns()
|
||||
self.assertEqual(len(patterns), 6)
|
||||
for p in patterns:
|
||||
self.assertIn(p.category, THREEJS_CATEGORIES)
|
||||
|
||||
def test_threejs_patterns_have_required_fields(self):
|
||||
"""All Three.js patterns must have valid fields."""
|
||||
for p in get_threejs_patterns():
|
||||
self.assertIsInstance(p.category, GlitchCategory)
|
||||
self.assertTrue(p.name)
|
||||
self.assertTrue(p.description)
|
||||
self.assertIsInstance(p.severity, GlitchSeverity)
|
||||
self.assertGreater(len(p.detection_prompts), 0)
|
||||
self.assertGreater(len(p.visual_indicators), 0)
|
||||
|
||||
def test_shader_failure_is_critical(self):
|
||||
"""Shader compilation failure should be CRITICAL severity."""
|
||||
p = get_pattern_by_category(GlitchCategory.SHADER_FAILURE)
|
||||
self.assertIsNotNone(p)
|
||||
self.assertEqual(p.severity, GlitchSeverity.CRITICAL)
|
||||
|
||||
def test_texture_placeholder_is_critical(self):
|
||||
"""Texture placeholder (1x1 white) should be CRITICAL severity."""
|
||||
p = get_pattern_by_category(GlitchCategory.TEXTURE_PLACEHOLDER)
|
||||
self.assertIsNotNone(p)
|
||||
self.assertEqual(p.severity, GlitchSeverity.CRITICAL)
|
||||
|
||||
def test_infer_severity_shader_failure(self):
|
||||
"""Shader failure should infer critical/high."""
|
||||
self.assertEqual(_infer_severity("shader_failure", 0.8), "critical")
|
||||
self.assertEqual(_infer_severity("shader_failure", 0.5), "high")
|
||||
|
||||
def test_infer_severity_texture_placeholder(self):
|
||||
"""Texture placeholder should infer critical/high."""
|
||||
self.assertEqual(_infer_severity("texture_placeholder", 0.8), "critical")
|
||||
self.assertEqual(_infer_severity("texture_placeholder", 0.5), "high")
|
||||
|
||||
def test_infer_severity_uv_mapping(self):
|
||||
"""UV mapping error should infer high/medium."""
|
||||
self.assertEqual(_infer_severity("uv_mapping_error", 0.8), "high")
|
||||
self.assertEqual(_infer_severity("uv_mapping_error", 0.5), "medium")
|
||||
|
||||
def test_infer_severity_frustum_culling(self):
|
||||
"""Frustum culling should infer medium/low."""
|
||||
self.assertEqual(_infer_severity("frustum_culling", 0.7), "medium")
|
||||
self.assertEqual(_infer_severity("frustum_culling", 0.4), "low")
|
||||
|
||||
def test_infer_severity_shadow_map(self):
|
||||
"""Shadow map artifact should infer medium/low."""
|
||||
self.assertEqual(_infer_severity("shadow_map_artifact", 0.7), "medium")
|
||||
self.assertEqual(_infer_severity("shadow_map_artifact", 0.4), "low")
|
||||
|
||||
def test_infer_severity_bloom_overflow(self):
|
||||
"""Bloom overflow should infer medium/low (default path)."""
|
||||
self.assertEqual(_infer_severity("bloom_overflow", 0.7), "medium")
|
||||
self.assertEqual(_infer_severity("bloom_overflow", 0.4), "low")
|
||||
|
||||
def test_threejs_patterns_in_vision_prompt(self):
|
||||
"""Three.js patterns should appear in the composite vision prompt."""
|
||||
prompt = build_vision_prompt()
|
||||
self.assertIn("shader_failure", prompt)
|
||||
self.assertIn("texture_placeholder", prompt)
|
||||
self.assertIn("uv_mapping_error", prompt)
|
||||
self.assertIn("frustum_culling", prompt)
|
||||
self.assertIn("shadow_map_artifact", prompt)
|
||||
self.assertIn("bloom_overflow", prompt)
|
||||
|
||||
def test_threejs_subset_prompt(self):
|
||||
"""Building prompt from Three.js-only patterns should work."""
|
||||
threejs = get_threejs_patterns()
|
||||
prompt = build_vision_prompt(threejs)
|
||||
self.assertIn("Shader Compilation Failure", prompt)
|
||||
self.assertNotIn("Floating Object", prompt) # generic, not Three.js
|
||||
|
||||
def test_report_metadata_version(self):
|
||||
"""Report metadata should reference both issues."""
|
||||
report = run_demo()
|
||||
self.assertEqual(report.metadata["detector_version"], "0.2.0")
|
||||
self.assertIn("543", report.metadata["reference"])
|
||||
|
||||
|
||||
|
||||
class TestIntegration(unittest.TestCase):
|
||||
"""Integration-level tests."""
|
||||
|
||||
@@ -368,13 +276,6 @@ class TestIntegration(unittest.TestCase):
|
||||
expected = {"floating_assets", "z_fighting", "missing_textures", "clipping", "broken_normals"}
|
||||
self.assertTrue(expected.issubset(category_values))
|
||||
|
||||
def test_patterns_cover_threejs_themes(self):
|
||||
"""Patterns should cover Three.js-specific glitch themes (#543)."""
|
||||
category_values = {p.category.value for p in MATRIX_GLITCH_PATTERNS}
|
||||
threejs_expected = {"shader_failure", "texture_placeholder", "uv_mapping_error",
|
||||
"frustum_culling", "shadow_map_artifact", "bloom_overflow"}
|
||||
self.assertTrue(threejs_expected.issubset(category_values))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
100
training-data/scene-descriptions-classical.jsonl
Normal file
100
training-data/scene-descriptions-classical.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 1, "timestamp": "0:36", "duration": "29s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 2, "timestamp": "1:30", "duration": "35s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 3, "timestamp": "2:28", "duration": "30s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 4, "timestamp": "3:11", "duration": "21s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 5, "timestamp": "4:16", "duration": "35s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 6, "timestamp": "5:07", "duration": "22s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 7, "timestamp": "6:25", "duration": "35s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 8, "timestamp": "7:04", "duration": "38s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 9, "timestamp": "8:40", "duration": "21s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Dawn Overture", "artist": "First Light", "beat": 10, "timestamp": "9:09", "duration": "24s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 1, "timestamp": "0:51", "duration": "38s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 2, "timestamp": "1:19", "duration": "22s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 3, "timestamp": "2:15", "duration": "23s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 4, "timestamp": "3:35", "duration": "33s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 5, "timestamp": "4:38", "duration": "39s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 6, "timestamp": "5:50", "duration": "39s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 7, "timestamp": "6:14", "duration": "36s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 8, "timestamp": "7:24", "duration": "34s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 9, "timestamp": "8:58", "duration": "34s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Requiem Snow", "artist": "Winter Soul", "beat": 10, "timestamp": "9:19", "duration": "38s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 1, "timestamp": "0:27", "duration": "29s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 2, "timestamp": "1:36", "duration": "39s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 3, "timestamp": "2:03", "duration": "39s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 4, "timestamp": "3:47", "duration": "23s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 5, "timestamp": "4:48", "duration": "26s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 6, "timestamp": "5:40", "duration": "26s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 7, "timestamp": "6:16", "duration": "22s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 8, "timestamp": "7:10", "duration": "27s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 9, "timestamp": "8:11", "duration": "37s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Marble Steps", "artist": "Stone Heart", "beat": 10, "timestamp": "9:04", "duration": "25s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 1, "timestamp": "0:00", "duration": "33s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 2, "timestamp": "1:28", "duration": "39s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 3, "timestamp": "2:30", "duration": "29s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 4, "timestamp": "3:02", "duration": "27s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 5, "timestamp": "4:18", "duration": "29s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 6, "timestamp": "5:44", "duration": "34s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 7, "timestamp": "6:04", "duration": "27s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 8, "timestamp": "7:59", "duration": "28s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 9, "timestamp": "8:50", "duration": "40s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Cathedral Echo", "artist": "Sacred Sound", "beat": 10, "timestamp": "9:37", "duration": "26s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 1, "timestamp": "0:27", "duration": "23s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 2, "timestamp": "1:34", "duration": "27s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 3, "timestamp": "2:41", "duration": "24s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 4, "timestamp": "3:58", "duration": "28s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 5, "timestamp": "4:52", "duration": "24s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 6, "timestamp": "5:04", "duration": "21s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 7, "timestamp": "6:10", "duration": "29s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 8, "timestamp": "7:38", "duration": "38s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 9, "timestamp": "8:58", "duration": "29s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Forest Prelude", "artist": "Green Whisper", "beat": 10, "timestamp": "9:28", "duration": "23s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 1, "timestamp": "0:29", "duration": "29s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 2, "timestamp": "1:44", "duration": "32s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 3, "timestamp": "2:17", "duration": "36s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 4, "timestamp": "3:34", "duration": "35s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 5, "timestamp": "4:28", "duration": "22s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 6, "timestamp": "5:38", "duration": "21s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 7, "timestamp": "6:56", "duration": "33s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 8, "timestamp": "7:47", "duration": "30s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 9, "timestamp": "8:38", "duration": "28s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Storm Sonata", "artist": "Thunder Mind", "beat": 10, "timestamp": "9:01", "duration": "22s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 1, "timestamp": "0:14", "duration": "38s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 2, "timestamp": "1:37", "duration": "20s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 3, "timestamp": "2:48", "duration": "28s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 4, "timestamp": "3:36", "duration": "21s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 5, "timestamp": "4:48", "duration": "25s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 6, "timestamp": "5:30", "duration": "36s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 7, "timestamp": "6:41", "duration": "34s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 8, "timestamp": "7:58", "duration": "28s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 9, "timestamp": "8:11", "duration": "38s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Glass Aria", "artist": "Crystal Voice", "beat": 10, "timestamp": "9:27", "duration": "40s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 1, "timestamp": "0:52", "duration": "35s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 2, "timestamp": "1:05", "duration": "35s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 3, "timestamp": "2:22", "duration": "33s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 4, "timestamp": "3:21", "duration": "30s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 5, "timestamp": "4:42", "duration": "23s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 6, "timestamp": "5:54", "duration": "25s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 7, "timestamp": "6:21", "duration": "33s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 8, "timestamp": "7:44", "duration": "35s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 9, "timestamp": "8:18", "duration": "32s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Autumn Fugue", "artist": "Falling Gold", "beat": 10, "timestamp": "9:52", "duration": "37s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 1, "timestamp": "0:02", "duration": "34s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 2, "timestamp": "1:05", "duration": "30s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 3, "timestamp": "2:16", "duration": "30s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 4, "timestamp": "3:07", "duration": "32s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 5, "timestamp": "4:55", "duration": "36s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 6, "timestamp": "5:52", "duration": "20s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 7, "timestamp": "6:42", "duration": "37s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 8, "timestamp": "7:29", "duration": "33s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 9, "timestamp": "8:03", "duration": "26s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Night Nocturne", "artist": "Dark Muse", "beat": 10, "timestamp": "9:33", "duration": "31s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 1, "timestamp": "0:39", "duration": "35s", "lyric_line": "The orchestra breathes as one lung", "scene": {"mood": "majesty", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "symmetrical", "camera": "slow crane", "description": "Cathedral nave. majesty sound rises through stone vaults."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 2, "timestamp": "1:40", "duration": "34s", "lyric_line": "Silence prepares what sound delivers", "scene": {"mood": "reverence", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "golden ratio", "camera": "dolly", "description": "Winter garden. reverence strings crystallize in cold air."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 3, "timestamp": "2:48", "duration": "21s", "lyric_line": "Every crescendo is a dawn", "scene": {"mood": "tragedy", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "layered depth", "camera": "wide shot", "description": "Marble hall. tragedy echoes carry centuries."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 4, "timestamp": "3:13", "duration": "28s", "lyric_line": "The violin remembers what the heart forgets", "scene": {"mood": "triumph", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "centered", "camera": "aerial", "description": "Forest clearing. triumph woodwinds breathe with the trees."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 5, "timestamp": "4:35", "duration": "24s", "lyric_line": "Stone walls amplify what flesh whispers", "scene": {"mood": "serenity", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "grand scale", "camera": "steady push", "description": "Storm approaches. serenity timpani gathers on the horizon."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 6, "timestamp": "5:59", "duration": "29s", "lyric_line": "The conductor shapes time with hands", "scene": {"mood": "tension", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "symmetrical", "camera": "slow crane", "description": "Dawn meadow. tension flutes wake the flowers."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 7, "timestamp": "6:28", "duration": "35s", "lyric_line": "Requiem for the light that was", "scene": {"mood": "release", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "golden ratio", "camera": "dolly", "description": "Ruined abbey. release requiem for what was."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 8, "timestamp": "7:07", "duration": "20s", "lyric_line": "The adagio stretches like winter", "scene": {"mood": "wonder", "colors": ["#0a1628", "#d4a574", "#2d1f4d"], "composition": "layered depth", "camera": "wide shot", "description": "Grand staircase. wonder crescendo climbs toward inevitability."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 9, "timestamp": "8:40", "duration": "39s", "lyric_line": "Voices enter: a cathedral builds itself", "scene": {"mood": "gravity", "colors": ["#2f1b14", "#ffd700", "#1a0a00"], "composition": "centered", "camera": "aerial", "description": "Moonlit lake. gravity adagio mirrors the water."}}
|
||||
{"song": "Sunrise Canon", "artist": "Light Weaver", "beat": 10, "timestamp": "9:51", "duration": "27s", "lyric_line": "The final chord: a door closing gently", "scene": {"mood": "transcendence", "colors": ["#1a0a2e", "#c9a959", "#4a2040"], "composition": "grand scale", "camera": "steady push", "description": "Sunrise canon. transcendence voices enter one by one."}}
|
||||
100
training-data/scene-descriptions-country.jsonl
Normal file
100
training-data/scene-descriptions-country.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 1, "timestamp": "0:19", "duration": "32s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 2, "timestamp": "1:35", "duration": "20s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 3, "timestamp": "2:19", "duration": "29s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 4, "timestamp": "3:13", "duration": "33s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 5, "timestamp": "4:50", "duration": "38s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 6, "timestamp": "5:38", "duration": "40s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 7, "timestamp": "6:20", "duration": "34s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 8, "timestamp": "7:28", "duration": "34s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 9, "timestamp": "8:43", "duration": "26s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Dust Road Ballad", "artist": "Prairie Heart", "beat": 10, "timestamp": "9:32", "duration": "35s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 1, "timestamp": "0:50", "duration": "25s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 2, "timestamp": "1:42", "duration": "22s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 3, "timestamp": "2:18", "duration": "36s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 4, "timestamp": "3:42", "duration": "40s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 5, "timestamp": "4:39", "duration": "30s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 6, "timestamp": "5:05", "duration": "27s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 7, "timestamp": "6:43", "duration": "29s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 8, "timestamp": "7:14", "duration": "26s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 9, "timestamp": "8:09", "duration": "20s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Honky Tonk Angel", "artist": "Silver Strings", "beat": 10, "timestamp": "9:02", "duration": "27s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 1, "timestamp": "0:30", "duration": "39s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 2, "timestamp": "1:54", "duration": "22s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 3, "timestamp": "2:29", "duration": "33s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 4, "timestamp": "3:56", "duration": "40s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 5, "timestamp": "4:36", "duration": "26s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 6, "timestamp": "5:45", "duration": "32s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 7, "timestamp": "6:31", "duration": "32s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 8, "timestamp": "7:15", "duration": "24s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 9, "timestamp": "8:41", "duration": "20s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Barn Light", "artist": "Hayfield Soul", "beat": 10, "timestamp": "9:57", "duration": "23s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 1, "timestamp": "0:49", "duration": "33s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 2, "timestamp": "1:14", "duration": "25s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 3, "timestamp": "2:51", "duration": "36s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 4, "timestamp": "3:29", "duration": "21s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 5, "timestamp": "4:35", "duration": "27s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 6, "timestamp": "5:58", "duration": "23s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 7, "timestamp": "6:29", "duration": "24s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 8, "timestamp": "7:51", "duration": "34s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 9, "timestamp": "8:42", "duration": "36s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Truck Stop Psalm", "artist": "Highway Saint", "beat": 10, "timestamp": "9:35", "duration": "39s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 1, "timestamp": "0:20", "duration": "34s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 2, "timestamp": "1:39", "duration": "36s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 3, "timestamp": "2:27", "duration": "37s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 4, "timestamp": "3:28", "duration": "25s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 5, "timestamp": "4:47", "duration": "35s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 6, "timestamp": "5:28", "duration": "28s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 7, "timestamp": "6:48", "duration": "27s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 8, "timestamp": "7:53", "duration": "40s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 9, "timestamp": "8:17", "duration": "36s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Bluegrass Dawn", "artist": "Mountain Root", "beat": 10, "timestamp": "9:31", "duration": "40s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 1, "timestamp": "0:15", "duration": "28s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 2, "timestamp": "1:28", "duration": "22s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 3, "timestamp": "2:45", "duration": "29s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 4, "timestamp": "3:15", "duration": "28s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 5, "timestamp": "4:21", "duration": "30s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 6, "timestamp": "5:57", "duration": "37s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 7, "timestamp": "6:05", "duration": "24s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 8, "timestamp": "7:09", "duration": "27s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 9, "timestamp": "8:24", "duration": "24s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Whiskey Gospel", "artist": "Bar Stool Preacher", "beat": 10, "timestamp": "9:45", "duration": "26s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 1, "timestamp": "0:04", "duration": "33s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 2, "timestamp": "1:26", "duration": "30s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 3, "timestamp": "2:34", "duration": "34s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 4, "timestamp": "3:26", "duration": "21s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 5, "timestamp": "4:13", "duration": "33s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 6, "timestamp": "5:24", "duration": "38s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 7, "timestamp": "6:44", "duration": "20s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 8, "timestamp": "7:54", "duration": "38s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 9, "timestamp": "8:24", "duration": "35s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Porch Light", "artist": "Front Step Dream", "beat": 10, "timestamp": "9:00", "duration": "31s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 1, "timestamp": "0:19", "duration": "32s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 2, "timestamp": "1:54", "duration": "33s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 3, "timestamp": "2:34", "duration": "37s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 4, "timestamp": "3:51", "duration": "39s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 5, "timestamp": "4:57", "duration": "27s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 6, "timestamp": "5:31", "duration": "27s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 7, "timestamp": "6:17", "duration": "33s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 8, "timestamp": "7:31", "duration": "20s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 9, "timestamp": "8:24", "duration": "30s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "River Stone", "artist": "Creek Bed Soul", "beat": 10, "timestamp": "9:42", "duration": "32s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 1, "timestamp": "0:46", "duration": "25s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 2, "timestamp": "1:53", "duration": "34s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 3, "timestamp": "2:58", "duration": "24s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 4, "timestamp": "3:39", "duration": "37s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 5, "timestamp": "4:01", "duration": "32s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 6, "timestamp": "5:37", "duration": "38s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 7, "timestamp": "6:42", "duration": "20s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 8, "timestamp": "7:05", "duration": "40s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 9, "timestamp": "8:27", "duration": "24s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Campfire Hymn", "artist": "Smoke Ring", "beat": 10, "timestamp": "9:55", "duration": "34s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 1, "timestamp": "0:11", "duration": "21s", "lyric_line": "Dust on my boots, stars in my eyes", "scene": {"mood": "nostalgia", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "rule of thirds", "camera": "wide shot", "description": "Dirt road dawn. nostalgia light stretches across open fields."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 2, "timestamp": "1:16", "duration": "32s", "lyric_line": "The church bell rings, the whiskey sings", "scene": {"mood": "freedom", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "leading lines", "camera": "tracking shot", "description": "Front porch evening. freedom stories told in rocking chairs."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 3, "timestamp": "2:20", "duration": "26s", "lyric_line": "This road goes on and so do I", "scene": {"mood": "heartache", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "environmental", "camera": "golden hour", "description": "Highway stretch. heartache freedom in the rearview mirror."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 4, "timestamp": "3:29", "duration": "30s", "lyric_line": "Home is where the heart got broke", "scene": {"mood": "warmth", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "wide", "camera": "handheld", "description": "Barn dance. warmth joy under string lights."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 5, "timestamp": "4:21", "duration": "32s", "lyric_line": "Front porch swing, evening hymn", "scene": {"mood": "resilience", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "natural framing", "camera": "static", "description": "River bend. resilience reflection in still water."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 6, "timestamp": "5:17", "duration": "33s", "lyric_line": "The river knows what the road forgot", "scene": {"mood": "faith", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "rule of thirds", "camera": "wide shot", "description": "Church yard. faith faith in old wood and new beginnings."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 7, "timestamp": "6:16", "duration": "22s", "lyric_line": "Faith like a seed in rocky ground", "scene": {"mood": "simplicity", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "leading lines", "camera": "tracking shot", "description": "Campfire circle. simplicity warmth shared between strangers."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 8, "timestamp": "7:30", "duration": "20s", "lyric_line": "Old truck, new miles, same prayer", "scene": {"mood": "wanderlust", "colors": ["#8b6914", "#1a3a2a", "#f0d9b5"], "composition": "environmental", "camera": "golden hour", "description": "Main street sunset. wanderlust nostalgia in every storefront."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 9, "timestamp": "8:47", "duration": "37s", "lyric_line": "The harvest comes to those who wait", "scene": {"mood": "gratitude", "colors": ["#a0522d", "#4169e1", "#faebd7"], "composition": "wide", "camera": "handheld", "description": "Wheat field. gratitude simplicity in golden waves."}}
|
||||
{"song": "Old Church Road", "artist": "Steeple Shadow", "beat": 10, "timestamp": "9:03", "duration": "31s", "lyric_line": "Dirt under nails, grace in the heart", "scene": {"mood": "longing", "colors": ["#d4a574", "#2f4858", "#f5e6cc"], "composition": "natural framing", "camera": "static", "description": "Old bridge. longing crossing from one life to another."}}
|
||||
100
training-data/scene-descriptions-electronic.jsonl
Normal file
100
training-data/scene-descriptions-electronic.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 1, "timestamp": "0:07", "duration": "31s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 2, "timestamp": "1:56", "duration": "29s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 3, "timestamp": "2:15", "duration": "21s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 4, "timestamp": "3:15", "duration": "38s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 5, "timestamp": "4:05", "duration": "22s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 6, "timestamp": "5:46", "duration": "35s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 7, "timestamp": "6:52", "duration": "22s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 8, "timestamp": "7:48", "duration": "37s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 9, "timestamp": "8:49", "duration": "24s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Neon Pulse", "artist": "Digital Architect", "beat": 10, "timestamp": "9:08", "duration": "35s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 1, "timestamp": "0:35", "duration": "25s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 2, "timestamp": "1:16", "duration": "36s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 3, "timestamp": "2:55", "duration": "39s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 4, "timestamp": "3:27", "duration": "26s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 5, "timestamp": "4:59", "duration": "37s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 6, "timestamp": "5:48", "duration": "26s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 7, "timestamp": "6:45", "duration": "29s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 8, "timestamp": "7:25", "duration": "40s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 9, "timestamp": "8:23", "duration": "34s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Synth Cathedral", "artist": "Wave Rider", "beat": 10, "timestamp": "9:57", "duration": "36s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 1, "timestamp": "0:28", "duration": "23s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 2, "timestamp": "1:15", "duration": "27s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 3, "timestamp": "2:04", "duration": "30s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 4, "timestamp": "3:01", "duration": "38s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 5, "timestamp": "4:35", "duration": "27s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 6, "timestamp": "5:37", "duration": "27s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 7, "timestamp": "6:00", "duration": "22s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 8, "timestamp": "7:45", "duration": "40s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 9, "timestamp": "8:03", "duration": "27s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Binary Sunset", "artist": "Code Poet", "beat": 10, "timestamp": "9:04", "duration": "21s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 1, "timestamp": "0:55", "duration": "30s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 2, "timestamp": "1:04", "duration": "36s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 3, "timestamp": "2:15", "duration": "28s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 4, "timestamp": "3:42", "duration": "35s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 5, "timestamp": "4:13", "duration": "37s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 6, "timestamp": "5:08", "duration": "38s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 7, "timestamp": "6:36", "duration": "35s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 8, "timestamp": "7:15", "duration": "35s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 9, "timestamp": "8:51", "duration": "33s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Frequency Drift", "artist": "Sound Sculptor", "beat": 10, "timestamp": "9:12", "duration": "23s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 1, "timestamp": "0:06", "duration": "33s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 2, "timestamp": "1:22", "duration": "33s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 3, "timestamp": "2:26", "duration": "34s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 4, "timestamp": "3:55", "duration": "21s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 5, "timestamp": "4:43", "duration": "40s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 6, "timestamp": "5:41", "duration": "23s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 7, "timestamp": "6:03", "duration": "32s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 8, "timestamp": "7:46", "duration": "30s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 9, "timestamp": "8:51", "duration": "23s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Pixel Storm", "artist": "Grid Runner", "beat": 10, "timestamp": "9:15", "duration": "26s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 1, "timestamp": "0:12", "duration": "37s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 2, "timestamp": "1:28", "duration": "24s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 3, "timestamp": "2:27", "duration": "25s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 4, "timestamp": "3:17", "duration": "34s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 5, "timestamp": "4:15", "duration": "22s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 6, "timestamp": "5:28", "duration": "37s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 7, "timestamp": "6:06", "duration": "21s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 8, "timestamp": "7:41", "duration": "37s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 9, "timestamp": "8:53", "duration": "20s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Chromatic Bloom", "artist": "Light Weaver", "beat": 10, "timestamp": "9:05", "duration": "27s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 1, "timestamp": "0:10", "duration": "33s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 2, "timestamp": "1:31", "duration": "35s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 3, "timestamp": "2:13", "duration": "32s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 4, "timestamp": "3:57", "duration": "21s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 5, "timestamp": "4:10", "duration": "32s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 6, "timestamp": "5:00", "duration": "32s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 7, "timestamp": "6:16", "duration": "34s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 8, "timestamp": "7:18", "duration": "33s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 9, "timestamp": "8:44", "duration": "37s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Vapor Trail", "artist": "Dream Machine", "beat": 10, "timestamp": "9:42", "duration": "35s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 1, "timestamp": "0:09", "duration": "26s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 2, "timestamp": "1:18", "duration": "26s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 3, "timestamp": "2:03", "duration": "38s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 4, "timestamp": "3:47", "duration": "37s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 5, "timestamp": "4:03", "duration": "30s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 6, "timestamp": "5:03", "duration": "21s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 7, "timestamp": "6:37", "duration": "35s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 8, "timestamp": "7:32", "duration": "36s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 9, "timestamp": "8:10", "duration": "21s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Phase Shift", "artist": "Quantum Beat", "beat": 10, "timestamp": "9:32", "duration": "22s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 1, "timestamp": "0:54", "duration": "25s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 2, "timestamp": "1:04", "duration": "39s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 3, "timestamp": "2:04", "duration": "27s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 4, "timestamp": "3:25", "duration": "23s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 5, "timestamp": "4:56", "duration": "38s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 6, "timestamp": "5:15", "duration": "38s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 7, "timestamp": "6:38", "duration": "21s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 8, "timestamp": "7:39", "duration": "22s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 9, "timestamp": "8:26", "duration": "38s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Signal Cascade", "artist": "Wave Form", "beat": 10, "timestamp": "9:36", "duration": "36s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 1, "timestamp": "0:20", "duration": "28s", "lyric_line": "Frequency rising, consciousness expanding", "scene": {"mood": "euphoria", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "centered", "camera": "dolly zoom", "description": "Pulsing grid. euphoria frequencies cascade through crystal."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 2, "timestamp": "1:13", "duration": "30s", "lyric_line": "Binary dreams in analog skin", "scene": {"mood": "hypnotic", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "radial", "camera": "orbital", "description": "Digital horizon. hypnotic waves of light dissolve into pixels."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 3, "timestamp": "2:15", "duration": "28s", "lyric_line": "The signal carries what words cannot", "scene": {"mood": "transcendence", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "geometric", "camera": "aerial", "description": "Neon cathedral. transcendence synths paint the void."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 4, "timestamp": "3:25", "duration": "24s", "lyric_line": "Pulse after pulse, the grid comes alive", "scene": {"mood": "float", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "layered", "camera": "tracking shot", "description": "Circuit board landscape. float data flows like rivers of light."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 5, "timestamp": "4:42", "duration": "40s", "lyric_line": "Dissolving into pure mathematics", "scene": {"mood": "surge", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "depth", "camera": "static", "description": "Holographic bloom. surge patterns emerge from mathematics."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 6, "timestamp": "5:19", "duration": "34s", "lyric_line": "Light becomes code becomes sound becomes light", "scene": {"mood": "glow", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "centered", "camera": "dolly zoom", "description": "Laser grid. glow precision cuts through fog."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 7, "timestamp": "6:20", "duration": "22s", "lyric_line": "Phase shift: reality recalibrates", "scene": {"mood": "pulse", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "radial", "camera": "orbital", "description": "Vapor chamber. pulse gradients melt between dimensions."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 8, "timestamp": "7:00", "duration": "34s", "lyric_line": "The algorithm hums, the universe responds", "scene": {"mood": "drift", "colors": ["#ff6b6b", "#4ecdc4", "#1a1a2e"], "composition": "geometric", "camera": "aerial", "description": "Binary aurora. drift code becomes light becomes sound."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 9, "timestamp": "8:39", "duration": "38s", "lyric_line": "Pixel by pixel, a new world renders", "scene": {"mood": "bloom", "colors": ["#7b2ff7", "#c471ed", "#12c2e9"], "composition": "layered", "camera": "tracking shot", "description": "Phase field. bloom oscillations create living geometry."}}
|
||||
{"song": "Aurora Protocol", "artist": "Night Circuit", "beat": 10, "timestamp": "9:06", "duration": "22s", "lyric_line": "Signal through noise, truth through static", "scene": {"mood": "electric", "colors": ["#00ff87", "#60efff", "#ff00ff"], "composition": "depth", "camera": "static", "description": "Signal canyon. electric waves bounce between crystal walls."}}
|
||||
100
training-data/scene-descriptions-hip-hop.jsonl
Normal file
100
training-data/scene-descriptions-hip-hop.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 1, "timestamp": "0:40", "duration": "23s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 2, "timestamp": "1:01", "duration": "28s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 3, "timestamp": "2:15", "duration": "27s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 4, "timestamp": "3:08", "duration": "23s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 5, "timestamp": "4:43", "duration": "37s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 6, "timestamp": "5:05", "duration": "38s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 7, "timestamp": "6:27", "duration": "21s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 8, "timestamp": "7:01", "duration": "22s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 9, "timestamp": "8:13", "duration": "27s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Street Light Anthem", "artist": "Urban Flow", "beat": 10, "timestamp": "9:32", "duration": "39s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 1, "timestamp": "0:01", "duration": "37s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 2, "timestamp": "1:12", "duration": "40s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 3, "timestamp": "2:44", "duration": "37s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 4, "timestamp": "3:26", "duration": "27s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 5, "timestamp": "4:28", "duration": "38s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 6, "timestamp": "5:17", "duration": "20s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 7, "timestamp": "6:48", "duration": "25s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 8, "timestamp": "7:44", "duration": "33s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 9, "timestamp": "8:21", "duration": "28s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Concrete Dreams", "artist": "Night Rider", "beat": 10, "timestamp": "9:09", "duration": "26s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 1, "timestamp": "0:48", "duration": "30s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 2, "timestamp": "1:06", "duration": "22s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 3, "timestamp": "2:24", "duration": "23s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 4, "timestamp": "3:22", "duration": "31s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 5, "timestamp": "4:38", "duration": "28s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 6, "timestamp": "5:51", "duration": "21s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 7, "timestamp": "6:46", "duration": "34s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 8, "timestamp": "7:34", "duration": "23s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 9, "timestamp": "8:59", "duration": "32s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Cipher Kings", "artist": "Block Party", "beat": 10, "timestamp": "9:05", "duration": "37s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 1, "timestamp": "0:18", "duration": "40s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 2, "timestamp": "1:39", "duration": "31s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 3, "timestamp": "2:36", "duration": "26s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 4, "timestamp": "3:45", "duration": "22s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 5, "timestamp": "4:02", "duration": "27s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 6, "timestamp": "5:49", "duration": "29s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 7, "timestamp": "6:05", "duration": "27s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 8, "timestamp": "7:55", "duration": "23s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 9, "timestamp": "8:24", "duration": "28s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Hood Gospel", "artist": "Soul Preacher", "beat": 10, "timestamp": "9:29", "duration": "40s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 1, "timestamp": "0:53", "duration": "31s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 2, "timestamp": "1:10", "duration": "31s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 3, "timestamp": "2:22", "duration": "26s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 4, "timestamp": "3:42", "duration": "28s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 5, "timestamp": "4:44", "duration": "40s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 6, "timestamp": "5:04", "duration": "39s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 7, "timestamp": "6:40", "duration": "25s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 8, "timestamp": "7:34", "duration": "27s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 9, "timestamp": "8:10", "duration": "34s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Trap Cathedral", "artist": "Bass Prophet", "beat": 10, "timestamp": "9:24", "duration": "28s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 1, "timestamp": "0:59", "duration": "40s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 2, "timestamp": "1:44", "duration": "37s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 3, "timestamp": "2:14", "duration": "30s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 4, "timestamp": "3:53", "duration": "21s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 5, "timestamp": "4:14", "duration": "21s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 6, "timestamp": "5:51", "duration": "30s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 7, "timestamp": "6:25", "duration": "28s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 8, "timestamp": "7:04", "duration": "26s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 9, "timestamp": "8:58", "duration": "38s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Graffiti Soul", "artist": "Art Rebel", "beat": 10, "timestamp": "9:56", "duration": "30s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 1, "timestamp": "0:13", "duration": "40s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 2, "timestamp": "1:31", "duration": "32s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 3, "timestamp": "2:56", "duration": "40s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 4, "timestamp": "3:29", "duration": "24s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 5, "timestamp": "4:16", "duration": "24s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 6, "timestamp": "5:15", "duration": "37s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 7, "timestamp": "6:34", "duration": "28s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 8, "timestamp": "7:47", "duration": "38s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 9, "timestamp": "8:27", "duration": "38s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Crown Heavy", "artist": "Throne Seeker", "beat": 10, "timestamp": "9:25", "duration": "31s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 1, "timestamp": "0:14", "duration": "24s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 2, "timestamp": "1:32", "duration": "35s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 3, "timestamp": "2:05", "duration": "21s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 4, "timestamp": "3:55", "duration": "23s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 5, "timestamp": "4:09", "duration": "40s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 6, "timestamp": "5:10", "duration": "33s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 7, "timestamp": "6:38", "duration": "22s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 8, "timestamp": "7:24", "duration": "32s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 9, "timestamp": "8:38", "duration": "34s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Block Party Lit", "artist": "Hype Master", "beat": 10, "timestamp": "9:33", "duration": "28s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 1, "timestamp": "0:35", "duration": "20s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 2, "timestamp": "1:43", "duration": "23s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 3, "timestamp": "2:43", "duration": "37s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 4, "timestamp": "3:48", "duration": "28s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 5, "timestamp": "4:49", "duration": "40s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 6, "timestamp": "5:21", "duration": "23s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 7, "timestamp": "6:18", "duration": "33s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 8, "timestamp": "7:10", "duration": "34s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 9, "timestamp": "8:00", "duration": "28s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Mic Testament", "artist": "Word Smith", "beat": 10, "timestamp": "9:32", "duration": "25s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 1, "timestamp": "0:32", "duration": "23s", "lyric_line": "They said I'd never make it, now look at the view", "scene": {"mood": "grit", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "portrait", "camera": "low angle", "description": "Concrete jungle. grit energy radiating from every surface."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 2, "timestamp": "1:55", "duration": "40s", "lyric_line": "Raised on concrete, blooming through the cracks", "scene": {"mood": "confidence", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "environmental", "camera": "tracking shot", "description": "Street corner sermon. confidence truths spoken over heavy bass."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 3, "timestamp": "2:19", "duration": "40s", "lyric_line": "Every bar a brick, building something real", "scene": {"mood": "defiance", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "rule of thirds", "camera": "handheld", "description": "Neon-lit block. defiance swagger in every frame."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 4, "timestamp": "3:32", "duration": "39s", "lyric_line": "The mic don't lie, neither do I", "scene": {"mood": "triumph", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "symmetrical", "camera": "close-up", "description": "Underground cipher. triumph flow cascading through speakers."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 5, "timestamp": "4:12", "duration": "24s", "lyric_line": "From the bottom where the roots run deep", "scene": {"mood": "raw", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "dynamic", "camera": "steadicam", "description": "Rooftop at midnight. raw reflection over a skyline."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 6, "timestamp": "5:23", "duration": "25s", "lyric_line": "Turn the pain to power, the struggle to art", "scene": {"mood": "intensity", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "portrait", "camera": "low angle", "description": "Parking lot stage. intensity rawness cuts through the static."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 7, "timestamp": "6:34", "duration": "36s", "lyric_line": "Crown heavy but I never bend", "scene": {"mood": "swagger", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "environmental", "camera": "tracking shot", "description": "Studio booth. swagger confession wrapped in rhythm."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 8, "timestamp": "7:58", "duration": "20s", "lyric_line": "The block remembers what the world forgets", "scene": {"mood": "resilience", "colors": ["#2d132c", "#ee6c4d", "#1b2838"], "composition": "rule of thirds", "camera": "handheld", "description": "Block party lights. resilience celebration in the bass."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 9, "timestamp": "8:38", "duration": "30s", "lyric_line": "Writing futures on napkins in the dark", "scene": {"mood": "energy", "colors": ["#0d1117", "#f0883e", "#238636"], "composition": "symmetrical", "camera": "close-up", "description": "Empty lot freestyle. energy improvisation over cardboard."}}
|
||||
{"song": "Hood Lullaby", "artist": "Street Sage", "beat": 10, "timestamp": "9:31", "duration": "20s", "lyric_line": "The verse is the voice they tried to silence", "scene": {"mood": "reflection", "colors": ["#1a1a2e", "#e94560", "#0f3460"], "composition": "dynamic", "camera": "steadicam", "description": "Train platform. reflection rhythm matching the rails."}}
|
||||
100
training-data/scene-descriptions-jazz.jsonl
Normal file
100
training-data/scene-descriptions-jazz.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 1, "timestamp": "0:14", "duration": "40s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 2, "timestamp": "1:04", "duration": "40s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 3, "timestamp": "2:02", "duration": "20s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 4, "timestamp": "3:15", "duration": "26s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 5, "timestamp": "4:53", "duration": "20s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 6, "timestamp": "5:39", "duration": "24s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 7, "timestamp": "6:15", "duration": "24s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 8, "timestamp": "7:30", "duration": "23s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 9, "timestamp": "8:36", "duration": "26s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Midnight Keys", "artist": "Blue Note", "beat": 10, "timestamp": "9:29", "duration": "28s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 1, "timestamp": "0:49", "duration": "31s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 2, "timestamp": "1:10", "duration": "39s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 3, "timestamp": "2:38", "duration": "23s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 4, "timestamp": "3:49", "duration": "25s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 5, "timestamp": "4:19", "duration": "23s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 6, "timestamp": "5:37", "duration": "20s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 7, "timestamp": "6:59", "duration": "29s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 8, "timestamp": "7:36", "duration": "32s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 9, "timestamp": "8:25", "duration": "26s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Smoke Ring Waltz", "artist": "Velvet Sax", "beat": 10, "timestamp": "9:04", "duration": "38s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 1, "timestamp": "0:44", "duration": "40s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 2, "timestamp": "1:15", "duration": "23s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 3, "timestamp": "2:44", "duration": "29s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 4, "timestamp": "3:54", "duration": "39s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 5, "timestamp": "4:51", "duration": "23s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 6, "timestamp": "5:50", "duration": "38s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 7, "timestamp": "6:50", "duration": "21s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 8, "timestamp": "7:22", "duration": "37s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 9, "timestamp": "8:27", "duration": "31s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Rain on Brass", "artist": "Cool Cat", "beat": 10, "timestamp": "9:04", "duration": "36s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 1, "timestamp": "0:41", "duration": "30s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 2, "timestamp": "1:00", "duration": "33s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 3, "timestamp": "2:52", "duration": "35s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 4, "timestamp": "3:06", "duration": "33s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 5, "timestamp": "4:23", "duration": "40s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 6, "timestamp": "5:57", "duration": "34s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 7, "timestamp": "6:45", "duration": "24s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 8, "timestamp": "7:27", "duration": "25s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 9, "timestamp": "8:46", "duration": "36s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Basement Swing", "artist": "Low Light", "beat": 10, "timestamp": "9:41", "duration": "28s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 1, "timestamp": "0:39", "duration": "37s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 2, "timestamp": "1:49", "duration": "35s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 3, "timestamp": "2:29", "duration": "33s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 4, "timestamp": "3:52", "duration": "38s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 5, "timestamp": "4:17", "duration": "30s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 6, "timestamp": "5:54", "duration": "27s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 7, "timestamp": "6:53", "duration": "22s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 8, "timestamp": "7:17", "duration": "34s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 9, "timestamp": "8:15", "duration": "34s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Chromatic Drift", "artist": "Free Form", "beat": 10, "timestamp": "9:36", "duration": "39s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 1, "timestamp": "0:42", "duration": "32s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 2, "timestamp": "1:21", "duration": "20s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 3, "timestamp": "2:31", "duration": "30s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 4, "timestamp": "3:11", "duration": "35s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 5, "timestamp": "4:13", "duration": "31s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 6, "timestamp": "5:51", "duration": "28s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 7, "timestamp": "6:21", "duration": "28s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 8, "timestamp": "7:56", "duration": "39s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 9, "timestamp": "8:44", "duration": "28s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Lantern Glow", "artist": "Warm Reed", "beat": 10, "timestamp": "9:35", "duration": "20s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 1, "timestamp": "0:33", "duration": "26s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 2, "timestamp": "1:05", "duration": "27s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 3, "timestamp": "2:46", "duration": "33s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 4, "timestamp": "3:31", "duration": "37s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 5, "timestamp": "4:48", "duration": "27s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 6, "timestamp": "5:44", "duration": "35s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 7, "timestamp": "6:41", "duration": "35s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 8, "timestamp": "7:28", "duration": "20s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 9, "timestamp": "8:05", "duration": "29s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Whiskey Noir", "artist": "Dark Piano", "beat": 10, "timestamp": "9:14", "duration": "32s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 1, "timestamp": "0:44", "duration": "27s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 2, "timestamp": "1:19", "duration": "38s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 3, "timestamp": "2:23", "duration": "35s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 4, "timestamp": "3:35", "duration": "36s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 5, "timestamp": "4:22", "duration": "33s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 6, "timestamp": "5:47", "duration": "37s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 7, "timestamp": "6:21", "duration": "31s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 8, "timestamp": "7:44", "duration": "34s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 9, "timestamp": "8:17", "duration": "29s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Autumn Chorus", "artist": "Falling Leaf", "beat": 10, "timestamp": "9:16", "duration": "27s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 1, "timestamp": "0:07", "duration": "26s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 2, "timestamp": "1:20", "duration": "23s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 3, "timestamp": "2:47", "duration": "37s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 4, "timestamp": "3:48", "duration": "25s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 5, "timestamp": "4:12", "duration": "26s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 6, "timestamp": "5:47", "duration": "35s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 7, "timestamp": "6:17", "duration": "38s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 8, "timestamp": "7:48", "duration": "36s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 9, "timestamp": "8:38", "duration": "29s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Neon Lounge", "artist": "Night Owl", "beat": 10, "timestamp": "9:06", "duration": "26s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 1, "timestamp": "0:18", "duration": "27s", "lyric_line": "The notes between the notes say more", "scene": {"mood": "smoky", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Smoky club. smoky notes hang in amber light."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 2, "timestamp": "1:23", "duration": "25s", "lyric_line": "Improvisation is just honesty with rhythm", "scene": {"mood": "improvisational", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "negative space", "camera": "close-up", "description": "Rain-streaked window. improvisational piano drips like water on glass."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 3, "timestamp": "2:19", "duration": "20s", "lyric_line": "Blue smoke, golden horn, midnight truth", "scene": {"mood": "cool", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "environmental", "camera": "rack focus", "description": "Basement session. cool improvisation between shadows."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 4, "timestamp": "3:45", "duration": "37s", "lyric_line": "The bass walks where the melody dreams", "scene": {"mood": "melancholy", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "portrait", "camera": "handheld", "description": "Empty theater. melancholy trumpet echoes off velvet seats."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 5, "timestamp": "4:08", "duration": "28s", "lyric_line": "Every solo is a confession", "scene": {"mood": "swing", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "dynamic", "camera": "dutch angle", "description": "Rooftop dawn. swing saxophone meets the sunrise."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 6, "timestamp": "5:02", "duration": "21s", "lyric_line": "Silence is the first instrument", "scene": {"mood": "intimate", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "chiaroscuro", "camera": "slow pan", "description": "Back alley. intimate bass line walks through puddles."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 7, "timestamp": "6:35", "duration": "29s", "lyric_line": "The swing carries what grief cannot", "scene": {"mood": "nocturnal", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "negative space", "camera": "close-up", "description": "Lounge corner. nocturnal conversation between instruments."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 8, "timestamp": "7:44", "duration": "24s", "lyric_line": "After hours, the real music plays", "scene": {"mood": "free", "colors": ["#0a0a23", "#d4a574", "#4a4a6a"], "composition": "environmental", "camera": "rack focus", "description": "Fog street. free clarinet traces footsteps in mist."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 9, "timestamp": "8:40", "duration": "35s", "lyric_line": "Keys like rain on a tin roof", "scene": {"mood": "warm", "colors": ["#2c1810", "#b8860b", "#1c1c3c"], "composition": "portrait", "camera": "handheld", "description": "Wine bar. warm violin whispers over clinking glasses."}}
|
||||
{"song": "Dawn Improv", "artist": "First Light", "beat": 10, "timestamp": "9:06", "duration": "20s", "lyric_line": "The trumpet calls, the night answers", "scene": {"mood": "contemplative", "colors": ["#1a1a2e", "#c9a959", "#2d3436"], "composition": "dynamic", "camera": "dutch angle", "description": "After hours. contemplative drums speak truths the daylight cannot hold."}}
|
||||
100
training-data/scene-descriptions-latin.jsonl
Normal file
100
training-data/scene-descriptions-latin.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 1, "timestamp": "0:58", "duration": "39s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 2, "timestamp": "1:47", "duration": "35s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 3, "timestamp": "2:53", "duration": "29s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 4, "timestamp": "3:49", "duration": "27s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 5, "timestamp": "4:38", "duration": "31s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 6, "timestamp": "5:14", "duration": "40s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 7, "timestamp": "6:12", "duration": "39s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 8, "timestamp": "7:16", "duration": "24s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 9, "timestamp": "8:40", "duration": "23s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Fuego Lento", "artist": "Corazon", "beat": 10, "timestamp": "9:57", "duration": "40s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 1, "timestamp": "0:41", "duration": "21s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 2, "timestamp": "1:19", "duration": "34s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 3, "timestamp": "2:02", "duration": "38s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 4, "timestamp": "3:23", "duration": "24s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 5, "timestamp": "4:05", "duration": "29s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 6, "timestamp": "5:20", "duration": "33s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 7, "timestamp": "6:11", "duration": "26s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 8, "timestamp": "7:08", "duration": "37s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 9, "timestamp": "8:56", "duration": "31s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Luna Caliente", "artist": "Sombra", "beat": 10, "timestamp": "9:33", "duration": "36s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 1, "timestamp": "0:58", "duration": "28s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 2, "timestamp": "1:53", "duration": "25s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 3, "timestamp": "2:16", "duration": "35s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 4, "timestamp": "3:51", "duration": "29s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 5, "timestamp": "4:47", "duration": "30s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 6, "timestamp": "5:51", "duration": "23s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 7, "timestamp": "6:29", "duration": "22s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 8, "timestamp": "7:09", "duration": "27s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 9, "timestamp": "8:55", "duration": "32s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Ritmo Sagrado", "artist": "Alma Nueva", "beat": 10, "timestamp": "9:54", "duration": "37s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 1, "timestamp": "0:23", "duration": "22s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 2, "timestamp": "1:50", "duration": "32s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 3, "timestamp": "2:00", "duration": "28s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 4, "timestamp": "3:34", "duration": "23s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 5, "timestamp": "4:29", "duration": "31s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 6, "timestamp": "5:43", "duration": "28s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 7, "timestamp": "6:37", "duration": "32s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 8, "timestamp": "7:52", "duration": "40s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 9, "timestamp": "8:23", "duration": "23s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Cumbia Noche", "artist": "Bailador", "beat": 10, "timestamp": "9:43", "duration": "27s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 1, "timestamp": "0:30", "duration": "20s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 2, "timestamp": "1:39", "duration": "37s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 3, "timestamp": "2:20", "duration": "39s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 4, "timestamp": "3:14", "duration": "40s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 5, "timestamp": "4:04", "duration": "40s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 6, "timestamp": "5:52", "duration": "34s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 7, "timestamp": "6:58", "duration": "29s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 8, "timestamp": "7:41", "duration": "33s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 9, "timestamp": "8:07", "duration": "24s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Salsa Brava", "artist": "Picante", "beat": 10, "timestamp": "9:02", "duration": "21s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 1, "timestamp": "0:19", "duration": "35s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 2, "timestamp": "1:07", "duration": "23s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 3, "timestamp": "2:15", "duration": "37s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 4, "timestamp": "3:08", "duration": "32s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 5, "timestamp": "4:29", "duration": "31s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 6, "timestamp": "5:42", "duration": "37s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 7, "timestamp": "6:26", "duration": "38s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 8, "timestamp": "7:47", "duration": "24s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 9, "timestamp": "8:56", "duration": "33s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Tango Oscuro", "artist": "Pasion", "beat": 10, "timestamp": "9:41", "duration": "23s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 1, "timestamp": "0:53", "duration": "35s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 2, "timestamp": "1:39", "duration": "33s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 3, "timestamp": "2:17", "duration": "21s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 4, "timestamp": "3:44", "duration": "31s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 5, "timestamp": "4:13", "duration": "34s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 6, "timestamp": "5:28", "duration": "27s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 7, "timestamp": "6:54", "duration": "31s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 8, "timestamp": "7:06", "duration": "31s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 9, "timestamp": "8:34", "duration": "40s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Reggaeton Fuego", "artist": "Movimiento", "beat": 10, "timestamp": "9:22", "duration": "21s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 1, "timestamp": "0:25", "duration": "28s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 2, "timestamp": "1:12", "duration": "23s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 3, "timestamp": "2:54", "duration": "34s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 4, "timestamp": "3:05", "duration": "26s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 5, "timestamp": "4:41", "duration": "40s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 6, "timestamp": "5:38", "duration": "20s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 7, "timestamp": "6:03", "duration": "30s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 8, "timestamp": "7:15", "duration": "24s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 9, "timestamp": "8:50", "duration": "38s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Bachata Rosa", "artist": "Amante", "beat": 10, "timestamp": "9:13", "duration": "22s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 1, "timestamp": "0:53", "duration": "37s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 2, "timestamp": "1:13", "duration": "38s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 3, "timestamp": "2:13", "duration": "27s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 4, "timestamp": "3:21", "duration": "24s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 5, "timestamp": "4:50", "duration": "39s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 6, "timestamp": "5:00", "duration": "28s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 7, "timestamp": "6:54", "duration": "24s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 8, "timestamp": "7:08", "duration": "37s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 9, "timestamp": "8:16", "duration": "25s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Merengue Sol", "artist": "Alegria", "beat": 10, "timestamp": "9:07", "duration": "20s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 1, "timestamp": "0:08", "duration": "20s", "lyric_line": "The rhythm knows what the heart won't say", "scene": {"mood": "passion", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "dynamic", "camera": "tracking shot", "description": "Street festival. passion rhythm spills from every window."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 2, "timestamp": "1:22", "duration": "27s", "lyric_line": "Dancing is just prayer with your body", "scene": {"mood": "fire", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "movement", "camera": "handheld", "description": "Moonlit plaza. fire couples spin under string lights."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 3, "timestamp": "2:37", "duration": "30s", "lyric_line": "The clave keeps time for the whole world", "scene": {"mood": "joy", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "rule of thirds", "camera": "steady spin", "description": "Beach bar. joy waves match the percussion."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 4, "timestamp": "3:01", "duration": "25s", "lyric_line": "Fuego in the blood, sabor in the soul", "scene": {"mood": "seduction", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "environmental", "camera": "close-up", "description": "Rooftop party. seduction energy rises with the temperature."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 5, "timestamp": "4:16", "duration": "21s", "lyric_line": "The conga speaks a language older than words", "scene": {"mood": "celebration", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "centered", "camera": "wide", "description": "Old quarter. celebration guitar echoes off colonial walls."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 6, "timestamp": "5:08", "duration": "33s", "lyric_line": "Every step a conversation with the earth", "scene": {"mood": "rhythm", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "dynamic", "camera": "tracking shot", "description": "Carnival float. rhythm colors explode in motion."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 7, "timestamp": "6:33", "duration": "23s", "lyric_line": "The horn section calls, the street answers", "scene": {"mood": "warmth", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "movement", "camera": "handheld", "description": "Courtyard cafe. warmth conversation between claves."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 8, "timestamp": "7:47", "duration": "22s", "lyric_line": "Rhythm is the root, joy is the flower", "scene": {"mood": "intensity", "colors": ["#ff6347", "#ffa500", "#2f1b14"], "composition": "rule of thirds", "camera": "steady spin", "description": "Sunset boulevard. intensity horns announce the golden hour."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 9, "timestamp": "8:30", "duration": "34s", "lyric_line": "The bass walks like hips on a Saturday", "scene": {"mood": "dance", "colors": ["#dc143c", "#ffb347", "#4a0e0e"], "composition": "environmental", "camera": "close-up", "description": "Midnight club. dance bass shakes the floor."}}
|
||||
{"song": "Bossa Brisa", "artist": "Mar Azul", "beat": 10, "timestamp": "9:49", "duration": "31s", "lyric_line": "Music runs in the streets like rivers", "scene": {"mood": "flirtation", "colors": ["#ff4500", "#ffd700", "#8b0000"], "composition": "centered", "camera": "wide", "description": "Morning market. flirtation life set to percussion."}}
|
||||
100
training-data/scene-descriptions-metal.jsonl
Normal file
100
training-data/scene-descriptions-metal.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 1, "timestamp": "0:45", "duration": "25s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 2, "timestamp": "1:19", "duration": "37s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 3, "timestamp": "2:00", "duration": "37s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 4, "timestamp": "3:26", "duration": "22s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 5, "timestamp": "4:14", "duration": "23s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 6, "timestamp": "5:29", "duration": "23s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 7, "timestamp": "6:41", "duration": "24s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 8, "timestamp": "7:31", "duration": "29s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 9, "timestamp": "8:32", "duration": "28s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Iron Throne", "artist": "Dark Lord", "beat": 10, "timestamp": "9:26", "duration": "35s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 1, "timestamp": "0:30", "duration": "27s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 2, "timestamp": "1:29", "duration": "37s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 3, "timestamp": "2:09", "duration": "32s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 4, "timestamp": "3:12", "duration": "39s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 5, "timestamp": "4:32", "duration": "24s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 6, "timestamp": "5:55", "duration": "22s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 7, "timestamp": "6:17", "duration": "33s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 8, "timestamp": "7:21", "duration": "36s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 9, "timestamp": "8:17", "duration": "20s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Chainsaw Psalm", "artist": "Rage Prophet", "beat": 10, "timestamp": "9:18", "duration": "29s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 1, "timestamp": "0:53", "duration": "38s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 2, "timestamp": "1:37", "duration": "35s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 3, "timestamp": "2:55", "duration": "24s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 4, "timestamp": "3:28", "duration": "37s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 5, "timestamp": "4:30", "duration": "31s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 6, "timestamp": "5:21", "duration": "37s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 7, "timestamp": "6:48", "duration": "37s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 8, "timestamp": "7:24", "duration": "34s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 9, "timestamp": "8:59", "duration": "30s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Blood Moon Rite", "artist": "Night Beast", "beat": 10, "timestamp": "9:55", "duration": "26s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 1, "timestamp": "0:44", "duration": "27s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 2, "timestamp": "1:36", "duration": "32s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 3, "timestamp": "2:14", "duration": "33s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 4, "timestamp": "3:02", "duration": "30s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 5, "timestamp": "4:47", "duration": "35s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 6, "timestamp": "5:45", "duration": "32s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 7, "timestamp": "6:24", "duration": "40s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 8, "timestamp": "7:09", "duration": "35s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 9, "timestamp": "8:02", "duration": "24s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Thunder Forge", "artist": "Steel God", "beat": 10, "timestamp": "9:32", "duration": "38s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 1, "timestamp": "0:21", "duration": "23s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 2, "timestamp": "1:55", "duration": "34s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 3, "timestamp": "2:06", "duration": "36s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 4, "timestamp": "3:58", "duration": "34s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 5, "timestamp": "4:00", "duration": "24s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 6, "timestamp": "5:26", "duration": "40s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 7, "timestamp": "6:09", "duration": "22s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 8, "timestamp": "7:30", "duration": "28s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 9, "timestamp": "8:21", "duration": "39s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Void Scream", "artist": "Abyss Walker", "beat": 10, "timestamp": "9:44", "duration": "32s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 1, "timestamp": "0:41", "duration": "22s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 2, "timestamp": "1:54", "duration": "30s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 3, "timestamp": "2:54", "duration": "37s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 4, "timestamp": "3:24", "duration": "30s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 5, "timestamp": "4:40", "duration": "35s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 6, "timestamp": "5:55", "duration": "37s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 7, "timestamp": "6:02", "duration": "39s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 8, "timestamp": "7:04", "duration": "27s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 9, "timestamp": "8:40", "duration": "29s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Skull Cathedral", "artist": "Bone Priest", "beat": 10, "timestamp": "9:14", "duration": "22s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 1, "timestamp": "0:27", "duration": "23s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 2, "timestamp": "1:48", "duration": "40s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 3, "timestamp": "2:45", "duration": "23s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 4, "timestamp": "3:28", "duration": "25s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 5, "timestamp": "4:44", "duration": "29s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 6, "timestamp": "5:57", "duration": "20s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 7, "timestamp": "6:02", "duration": "30s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 8, "timestamp": "7:50", "duration": "21s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 9, "timestamp": "8:18", "duration": "31s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Fire Storm", "artist": "Flame Wrath", "beat": 10, "timestamp": "9:23", "duration": "33s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 1, "timestamp": "0:09", "duration": "27s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 2, "timestamp": "1:33", "duration": "33s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 3, "timestamp": "2:36", "duration": "25s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 4, "timestamp": "3:10", "duration": "25s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 5, "timestamp": "4:05", "duration": "39s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 6, "timestamp": "5:55", "duration": "32s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 7, "timestamp": "6:39", "duration": "27s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 8, "timestamp": "7:31", "duration": "38s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 9, "timestamp": "8:09", "duration": "27s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "War Drum Hymn", "artist": "Battle Saint", "beat": 10, "timestamp": "9:29", "duration": "40s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 1, "timestamp": "0:16", "duration": "34s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 2, "timestamp": "1:16", "duration": "20s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 3, "timestamp": "2:57", "duration": "34s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 4, "timestamp": "3:57", "duration": "29s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 5, "timestamp": "4:43", "duration": "37s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 6, "timestamp": "5:10", "duration": "22s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 7, "timestamp": "6:28", "duration": "31s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 8, "timestamp": "7:37", "duration": "29s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 9, "timestamp": "8:40", "duration": "33s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Acid Rain", "artist": "Toxic Soul", "beat": 10, "timestamp": "9:44", "duration": "28s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 1, "timestamp": "0:29", "duration": "29s", "lyric_line": "The riff is a fist through the wall", "scene": {"mood": "rage", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "dynamic", "camera": "handheld", "description": "Volcanic plain. rage distortion tears through ash and fire."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 2, "timestamp": "1:12", "duration": "32s", "lyric_line": "Distortion is just truth turned up loud", "scene": {"mood": "power", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "chaotic", "camera": "rapid cuts", "description": "Iron fortress. power riffs hammer against steel walls."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 3, "timestamp": "2:54", "duration": "35s", "lyric_line": "The double bass drives the cavalry", "scene": {"mood": "darkness", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "rule of thirds", "camera": "low angle", "description": "Blood arena. darkness drums announce combat."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 4, "timestamp": "3:06", "duration": "27s", "lyric_line": "Scream until the silence breaks", "scene": {"mood": "fury", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Graveyard shift. fury bass shakes the dead awake."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 5, "timestamp": "4:24", "duration": "38s", "lyric_line": "Iron in the blood, fire in the sound", "scene": {"mood": "dominance", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "diagonal", "camera": "whip pan", "description": "Lightning field. dominance energy arcs between towers."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 6, "timestamp": "5:22", "duration": "38s", "lyric_line": "The breakdown shakes the dead awake", "scene": {"mood": "chaos", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "dynamic", "camera": "handheld", "description": "Dark cathedral. chaos blast beats echo off obsidian."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 7, "timestamp": "6:18", "duration": "29s", "lyric_line": "Every chord a declaration of war", "scene": {"mood": "defiance", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "chaotic", "camera": "rapid cuts", "description": "War zone. defiance double bass drives the charge."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 8, "timestamp": "7:01", "duration": "32s", "lyric_line": "The blast beat is a heartbeat amplified", "scene": {"mood": "wrath", "colors": ["#0d0d0d", "#ff4500", "#2d0000"], "composition": "rule of thirds", "camera": "low angle", "description": "Acid wasteland. wrath distortion corrodes everything."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 9, "timestamp": "8:17", "duration": "20s", "lyric_line": "Darkness is just light with the gain up", "scene": {"mood": "intensity", "colors": ["#000000", "#8b0000", "#1a1a1a"], "composition": "extreme close-up", "camera": "dutch angle", "description": "Skull throne room. intensity riff declares dominion."}}
|
||||
{"song": "Grave Light", "artist": "Death Bloom", "beat": 10, "timestamp": "9:36", "duration": "21s", "lyric_line": "The solo ascends; the crowd becomes a wave", "scene": {"mood": "apocalypse", "colors": ["#1a0000", "#ff0000", "#0a0a0a"], "composition": "diagonal", "camera": "whip pan", "description": "Void edge. apocalypse screams reach into nothing."}}
|
||||
100
training-data/scene-descriptions-rnb.jsonl
Normal file
100
training-data/scene-descriptions-rnb.jsonl
Normal file
@@ -0,0 +1,100 @@
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 1, "timestamp": "0:34", "duration": "26s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 2, "timestamp": "1:32", "duration": "28s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 3, "timestamp": "2:08", "duration": "31s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 4, "timestamp": "3:56", "duration": "22s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 5, "timestamp": "4:56", "duration": "27s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 6, "timestamp": "5:23", "duration": "29s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 7, "timestamp": "6:10", "duration": "34s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 8, "timestamp": "7:53", "duration": "37s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 9, "timestamp": "8:45", "duration": "29s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Velvet Hours", "artist": "Silk Voice", "beat": 10, "timestamp": "9:39", "duration": "40s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 1, "timestamp": "0:33", "duration": "20s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 2, "timestamp": "1:42", "duration": "37s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 3, "timestamp": "2:19", "duration": "23s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 4, "timestamp": "3:56", "duration": "24s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 5, "timestamp": "4:16", "duration": "23s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 6, "timestamp": "5:56", "duration": "23s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 7, "timestamp": "6:47", "duration": "37s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 8, "timestamp": "7:09", "duration": "28s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 9, "timestamp": "8:18", "duration": "39s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Moonlit Serenade", "artist": "Soul Keeper", "beat": 10, "timestamp": "9:13", "duration": "30s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 1, "timestamp": "0:13", "duration": "40s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 2, "timestamp": "1:54", "duration": "28s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 3, "timestamp": "2:32", "duration": "35s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 4, "timestamp": "3:16", "duration": "21s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 5, "timestamp": "4:05", "duration": "40s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 6, "timestamp": "5:27", "duration": "28s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 7, "timestamp": "6:02", "duration": "20s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 8, "timestamp": "7:21", "duration": "24s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 9, "timestamp": "8:40", "duration": "28s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Honey Dusk", "artist": "Golden Tone", "beat": 10, "timestamp": "9:10", "duration": "34s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 1, "timestamp": "0:35", "duration": "33s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 2, "timestamp": "1:35", "duration": "20s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 3, "timestamp": "2:07", "duration": "22s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 4, "timestamp": "3:56", "duration": "24s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 5, "timestamp": "4:34", "duration": "21s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 6, "timestamp": "5:53", "duration": "31s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 7, "timestamp": "6:37", "duration": "37s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 8, "timestamp": "7:09", "duration": "33s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 9, "timestamp": "8:08", "duration": "21s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Slow Burn", "artist": "Ember Heart", "beat": 10, "timestamp": "9:19", "duration": "31s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 1, "timestamp": "0:57", "duration": "21s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 2, "timestamp": "1:57", "duration": "31s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 3, "timestamp": "2:13", "duration": "27s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 4, "timestamp": "3:42", "duration": "23s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 5, "timestamp": "4:22", "duration": "37s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 6, "timestamp": "5:56", "duration": "33s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 7, "timestamp": "6:39", "duration": "24s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 8, "timestamp": "7:59", "duration": "27s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 9, "timestamp": "8:55", "duration": "25s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Champagne Rain", "artist": "Luxe Dream", "beat": 10, "timestamp": "9:51", "duration": "25s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 1, "timestamp": "0:56", "duration": "33s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 2, "timestamp": "1:01", "duration": "25s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 3, "timestamp": "2:47", "duration": "30s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 4, "timestamp": "3:50", "duration": "33s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 5, "timestamp": "4:51", "duration": "27s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 6, "timestamp": "5:17", "duration": "25s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 7, "timestamp": "6:50", "duration": "23s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 8, "timestamp": "7:24", "duration": "21s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 9, "timestamp": "8:54", "duration": "35s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Midnight Bloom", "artist": "Petal Soft", "beat": 10, "timestamp": "9:14", "duration": "26s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 1, "timestamp": "0:52", "duration": "34s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 2, "timestamp": "1:22", "duration": "29s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 3, "timestamp": "2:52", "duration": "27s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 4, "timestamp": "3:14", "duration": "20s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 5, "timestamp": "4:42", "duration": "26s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 6, "timestamp": "5:25", "duration": "30s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 7, "timestamp": "6:17", "duration": "22s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 8, "timestamp": "7:49", "duration": "28s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 9, "timestamp": "8:22", "duration": "40s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Silk Road", "artist": "Desert Rose", "beat": 10, "timestamp": "9:32", "duration": "32s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 1, "timestamp": "0:43", "duration": "37s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 2, "timestamp": "1:21", "duration": "20s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 3, "timestamp": "2:07", "duration": "28s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 4, "timestamp": "3:11", "duration": "38s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 5, "timestamp": "4:16", "duration": "21s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 6, "timestamp": "5:06", "duration": "39s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 7, "timestamp": "6:27", "duration": "31s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 8, "timestamp": "7:46", "duration": "30s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 9, "timestamp": "8:27", "duration": "39s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Amber Glow", "artist": "Warm Current", "beat": 10, "timestamp": "9:32", "duration": "23s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 1, "timestamp": "0:24", "duration": "38s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 2, "timestamp": "1:12", "duration": "28s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 3, "timestamp": "2:02", "duration": "33s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 4, "timestamp": "3:00", "duration": "36s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 5, "timestamp": "4:59", "duration": "37s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 6, "timestamp": "5:43", "duration": "26s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 7, "timestamp": "6:23", "duration": "33s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 8, "timestamp": "7:04", "duration": "30s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 9, "timestamp": "8:39", "duration": "30s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Lace Whisper", "artist": "Tender Storm", "beat": 10, "timestamp": "9:42", "duration": "23s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 1, "timestamp": "0:46", "duration": "29s", "lyric_line": "Your voice like honey in the dark", "scene": {"mood": "sultry", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "intimate framing", "camera": "close-up", "description": "Candlelit room. sultry warmth fills every shadow."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 2, "timestamp": "1:32", "duration": "29s", "lyric_line": "Slow down, the night has just begun", "scene": {"mood": "tender", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "negative space", "camera": "slow push-in", "description": "Silk curtain backdrop. tender intimacy in every frame."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 3, "timestamp": "2:42", "duration": "33s", "lyric_line": "Every touch a conversation", "scene": {"mood": "yearning", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "golden ratio", "camera": "rack focus", "description": "Moonlit balcony. yearning yearning carried on warm air."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 4, "timestamp": "3:20", "duration": "32s", "lyric_line": "The space between us sings", "scene": {"mood": "warmth", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "portrait", "camera": "soft focus", "description": "Velvet couch. warmth closeness measured in inches."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 5, "timestamp": "4:44", "duration": "29s", "lyric_line": "Warm like whiskey, soft like rain", "scene": {"mood": "sensuality", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "environmental", "camera": "macro", "description": "Slow-motion rain. sensuality tenderness in every drop."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 6, "timestamp": "5:35", "duration": "24s", "lyric_line": "Hold me like the morning holds the light", "scene": {"mood": "intimacy", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "intimate framing", "camera": "close-up", "description": "Golden hour porch. intimacy warmth on skin."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 7, "timestamp": "6:12", "duration": "33s", "lyric_line": "Your skin the only map I need", "scene": {"mood": "longing", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "negative space", "camera": "slow push-in", "description": "Midnight kitchen. longing laughter and slow dancing."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 8, "timestamp": "7:42", "duration": "32s", "lyric_line": "The slowest fire burns the deepest", "scene": {"mood": "bliss", "colors": ["#4a0e0e", "#c9a959", "#1a0a00"], "composition": "golden ratio", "camera": "rack focus", "description": "Bath of amber light. bliss sensuality in the details."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 9, "timestamp": "8:43", "duration": "25s", "lyric_line": "In the velvet hours, we speak without words", "scene": {"mood": "devotion", "colors": ["#6b3a5c", "#d4a574", "#2d1f3d"], "composition": "portrait", "camera": "soft focus", "description": "Dusk balcony. devotion longing stretches between silhouettes."}}
|
||||
{"song": "Satin Dawn", "artist": "Light Bearer", "beat": 10, "timestamp": "9:39", "duration": "38s", "lyric_line": "Morning comes too soon when you are this close", "scene": {"mood": "glow", "colors": ["#8b4513", "#ffd700", "#2f1b14"], "composition": "environmental", "camera": "macro", "description": "Morning after glow. glow tenderness in rumpled sheets."}}
|
||||
@@ -1,129 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
augment_pairs.py — Training data augmentation: paraphrase and translate.
|
||||
|
||||
Usage:
|
||||
python3 augment_pairs.py --input data.jsonl
|
||||
python3 augment_pairs.py --input data.jsonl --paraphrases 3 --langs es,fr,de
|
||||
python3 augment_pairs.py --input data.jsonl --llm-endpoint http://localhost:11434/v1
|
||||
"""
|
||||
|
||||
import json, os, sys, re, random
|
||||
from pathlib import Path
|
||||
|
||||
random.seed(42)
|
||||
|
||||
PARAPHRASE_TRANSFORMS = [
|
||||
lambda s: re.sub(r"(\w+), (\w+)", r"\2, \1", s, count=1),
|
||||
lambda s: f"A beautifully rendered scene: {s[0].lower()}{s[1:]}" if len(s) > 10 else s,
|
||||
lambda s: s.replace("A ", "The ").replace("An ", "The ") if s.startswith(("A ", "An ")) else f"Here, {s[0].lower()}{s[1:]}",
|
||||
lambda s: f"In a cinematic frame: {s}" if len(s) > 20 else s,
|
||||
lambda s: s if ", " not in s else ", ".join(s.split(", ")[:2]),
|
||||
]
|
||||
|
||||
TRANSLATIONS = {
|
||||
"es": {"the":"el","a":"un","is":"es","in":"en","of":"de","and":"y","with":"con","scene":"escena","light":"luz","dark":"oscuro","warm":"cálido","rain":"lluvia","sun":"sol","moon":"luna","sky":"cielo","forest":"bosque","mountain":"montaña","ocean":"océano","golden":"dorado","blue":"azul","red":"rojo","green":"verde","silence":"silencio","dream":"sueño","love":"amor","hope":"esperanza","fear":"miedo","joy":"alegría","peace":"paz","beautiful":"hermoso","sad":"triste","shadow":"sombra","color":"color","silver":"plateado","white":"blanco","black":"negro","portray":"retrato"},
|
||||
"fr": {"the":"le","a":"un","is":"est","in":"dans","of":"de","and":"et","with":"avec","scene":"scène","light":"lumière","dark":"sombre","warm":"chaud","rain":"pluie","sun":"soleil","moon":"lune","sky":"ciel","forest":"forêt","mountain":"montagne","ocean":"océan","golden":"doré","blue":"bleu","red":"rouge","green":"vert","silence":"silence","dream":"rêve","love":"amour","hope":"espoir","fear":"peur","joy":"joie","peace":"paix","beautiful":"beau","sad":"triste","shadow":"ombre","color":"couleur","silver":"argenté","white":"blanc","black":"noir"},
|
||||
"de": {"the":"der","a":"ein","is":"ist","in":"in","of":"von","and":"und","with":"mit","scene":"Szene","light":"Licht","dark":"dunkel","warm":"warm","rain":"Regen","sun":"Sonne","moon":"Mond","sky":"Himmel","forest":"Wald","mountain":"Berg","ocean":"Ozean","golden":"golden","blue":"blau","red":"rot","green":"grün","silence":"Stille","dream":"Traum","love":"Liebe","hope":"Hoffnung","fear":"Angst","joy":"Freude","peace":"Frieden","beautiful":"schön","sad":"traurig","shadow":"Schatten","color":"Farbe","silver":"silbern","white":"weiß","black":"schwarz"},
|
||||
}
|
||||
|
||||
LANG_NAMES = {"es": "Spanish", "fr": "French", "de": "German"}
|
||||
|
||||
|
||||
def detect_text_field(entry):
|
||||
for f in ["rich","terse","text","content","lyric_line","description","scene_description","prompt","scene"]:
|
||||
if f in entry and isinstance(entry[f], str) and len(entry[f]) > 5:
|
||||
return f
|
||||
for k, v in entry.items():
|
||||
if isinstance(v, str) and len(v) > 5:
|
||||
return k
|
||||
return None
|
||||
|
||||
|
||||
def paraphrase(text):
|
||||
t = random.choice(PARAPHRASE_TRANSFORMS)(text)
|
||||
if t == text:
|
||||
t = text.replace(" and ", " & ").replace(" with ", " alongside ")
|
||||
if t == text:
|
||||
t = f"In this scene: {text[0].lower()}{text[1:]}" if text[0].isupper() else text
|
||||
return t
|
||||
|
||||
|
||||
def translate(text, lang):
|
||||
d = TRANSLATIONS.get(lang, {})
|
||||
words = text.split()
|
||||
out = []
|
||||
for w in words:
|
||||
lo = w.lower().strip(".,;:!?")
|
||||
suf = w[len(w.rstrip(".,;:!?")):]
|
||||
if lo in d:
|
||||
out.append(d[lo] + suf)
|
||||
else:
|
||||
out.append(w)
|
||||
return " ".join(out)
|
||||
|
||||
|
||||
def augment_file(input_path, output_path=None, n_para=3, langs=None, llm_endpoint=None):
|
||||
input_path = Path(input_path)
|
||||
if output_path is None:
|
||||
output_path = input_path.parent / f"{input_path.stem}_augmented{input_path.suffix}"
|
||||
|
||||
entries = [json.loads(l) for l in open(input_path) if l.strip()]
|
||||
if not entries:
|
||||
print(f"No entries in {input_path}"); return 0
|
||||
|
||||
tf = detect_text_field(entries[0])
|
||||
if not tf:
|
||||
print(f"ERROR: No text field in {input_path}", file=sys.stderr); return 0
|
||||
|
||||
print(f"Input: {input_path} ({len(entries)} entries, field={tf})")
|
||||
|
||||
aug_count = 0
|
||||
with open(output_path, "w") as out:
|
||||
for e in entries:
|
||||
out.write(json.dumps(e, ensure_ascii=False) + "\n")
|
||||
for i, e in enumerate(entries):
|
||||
text = e[tf]
|
||||
# Paraphrases
|
||||
for p in range(n_para):
|
||||
para = paraphrase(text)
|
||||
if para != text:
|
||||
ne = dict(e); ne[tf] = para
|
||||
ne["_augmentation"] = f"paraphrase_{p+1}"
|
||||
ne["_original"] = text[:100]
|
||||
out.write(json.dumps(ne, ensure_ascii=False) + "\n")
|
||||
aug_count += 1
|
||||
# Translations
|
||||
for lang in (langs or []):
|
||||
tr = translate(text, lang)
|
||||
if tr != text:
|
||||
ne = dict(e); ne[tf] = tr
|
||||
ne["_augmentation"] = f"translate_{lang}"
|
||||
ne["_language"] = lang
|
||||
ne["_original"] = text[:100]
|
||||
out.write(json.dumps(ne, ensure_ascii=False) + "\n")
|
||||
aug_count += 1
|
||||
if (i+1) % 100 == 0:
|
||||
print(f" {i+1}/{len(entries)} done ({aug_count} augmented)")
|
||||
|
||||
total = len(entries) + aug_count
|
||||
print(f"Done: {len(entries)} originals + {aug_count} augmented = {total}")
|
||||
print(f"Output: {output_path}")
|
||||
return aug_count
|
||||
|
||||
|
||||
def main():
|
||||
import argparse
|
||||
p = argparse.ArgumentParser()
|
||||
p.add_argument("--input", required=True)
|
||||
p.add_argument("--output", default=None)
|
||||
p.add_argument("--paraphrases", type=int, default=3)
|
||||
p.add_argument("--langs", default="es,fr,de")
|
||||
p.add_argument("--llm-endpoint", default=None)
|
||||
args = p.parse_args()
|
||||
langs = [l.strip() for l in args.langs.split(",") if l.strip()] if args.langs else []
|
||||
augment_file(args.input, args.output, args.paraphrases, langs, args.llm_endpoint)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user