Commit 3f2863d4 by PLN (Algolia)

feat(corpus-viz): hover tooltips + all-dots collab view + copy de-slop

PLN review pass:
- tooltip layer: hover any mark for the tracks/examples behind it. cloud dots
  (track + bpm + date), tempo line dots (median + what it means), histogram
  bands, gig/sample columns, family segments (count + % + example members),
  idiom bars (plain-language gloss of each phrase), staple bars, collab dots
- collab story now plots EVERY track as a dot; tracks at the same BPM pile into
  one larger dot (radius ~ count); median drawn as a tick; sample-tell chips get
  lift tooltips. needs tide_eda collab_fingerprint to emit per-track {name,bpm}
- copy: removed cheap 'not X, Y' contrasts + em dashes per impeccable clarify;
  added 'hover anything' affordance hints
parent 33d49591
......@@ -932,6 +932,16 @@
"bpm_median": 150,
"bpm_min": 140.0,
"bpm_max": 160.0,
"tracks": [
{
"name": "Blue Gold",
"bpm": 140.0
},
{
"name": "Ghosts in the T01l3ts",
"bpm": 160.0
}
],
"distinctive_samples": [
{
"sound": "moog",
......@@ -950,14 +960,24 @@
"bpm_median": 131,
"bpm_min": 120.0,
"bpm_max": 142.0,
"tracks": [
{
"name": "Love First",
"bpm": 120.0
},
{
"name": "So Good",
"bpm": 142.0
}
],
"distinctive_samples": [
{
"sound": "risers",
"sound": "moogBass",
"lift": 4.6,
"n": 2
},
{
"sound": "moogBass",
"sound": "risers",
"lift": 4.6,
"n": 2
},
......@@ -973,6 +993,56 @@
"bpm_median": 138,
"bpm_min": 102.0,
"bpm_max": 170.0,
"tracks": [
{
"name": "Long Way",
"bpm": 102.0
},
{
"name": "Des Efforts",
"bpm": 120.0
},
{
"name": "Piment Bresilien",
"bpm": 124.0
},
{
"name": "Biscuit Acide",
"bpm": 128.0
},
{
"name": "Desire",
"bpm": 129.0
},
{
"name": "Acidule",
"bpm": 135.0
},
{
"name": "Esperluette",
"bpm": 140.0
},
{
"name": "Jeudi Drill",
"bpm": 140.0
},
{
"name": "Permanence",
"bpm": 150.0
},
{
"name": "Nouveau Punk",
"bpm": 155.0
},
{
"name": "Aria Sans Serif",
"bpm": 160.0
},
{
"name": "PunkAChien",
"bpm": 170.0
}
],
"distinctive_samples": [
{
"sound": "clubkick",
......@@ -1011,6 +1081,188 @@
"bpm_median": 117,
"bpm_min": 80.0,
"bpm_max": 165.0,
"tracks": [
{
"name": "Sessions Break",
"bpm": 80.0
},
{
"name": "Green Land",
"bpm": 80.0
},
{
"name": "Paris",
"bpm": 80.0
},
{
"name": "'Plosive",
"bpm": 80.0
},
{
"name": "Premiere Grillade",
"bpm": 80.0
},
{
"name": "Reboot",
"bpm": 80.0
},
{
"name": "Venons Ensemble",
"bpm": 85.0
},
{
"name": "Contre visite",
"bpm": 90.0
},
{
"name": "Fabuleux",
"bpm": 93.0
},
{
"name": "L'Or Bleu",
"bpm": 94.0
},
{
"name": "Lendemain Divin",
"bpm": 95.0
},
{
"name": "Ton Numero",
"bpm": 99.0
},
{
"name": "CBOW",
"bpm": 100.0
},
{
"name": "Orage",
"bpm": 104.0
},
{
"name": "Empreinte du numerique",
"bpm": 110.0
},
{
"name": "It's About Time",
"bpm": 110.0
},
{
"name": "Lunar",
"bpm": 110.0
},
{
"name": "Solar",
"bpm": 110.0
},
{
"name": "Nouveau Soleil",
"bpm": 110.0
},
{
"name": "Ere de Jeu",
"bpm": 110.0
},
{
"name": "La Révolution Sera Samplée",
"bpm": 114.0
},
{
"name": "Invoque l'ete",
"bpm": 115.0
},
{
"name": "Oct4 Glitch Sauvages",
"bpm": 117.0
},
{
"name": "Quand on Décolle",
"bpm": 120.0
},
{
"name": "RAISE",
"bpm": 120.0
},
{
"name": "La fin de l'insouciance",
"bpm": 120.0
},
{
"name": "Michael",
"bpm": 120.0
},
{
"name": "Sunny Side Up",
"bpm": 120.0
},
{
"name": "Café Bouillant",
"bpm": 120.0
},
{
"name": "Café Glacé",
"bpm": 120.0
},
{
"name": "Salut Nu",
"bpm": 120.0
},
{
"name": "L'été à Mauerpark",
"bpm": 120.0
},
{
"name": "Take 5 Drops",
"bpm": 124.0
},
{
"name": "Force Motrice",
"bpm": 125.0
},
{
"name": "Café Tiède",
"bpm": 125.0
},
{
"name": "Bain électrique",
"bpm": 128.0
},
{
"name": "WAP",
"bpm": 133.0
},
{
"name": "Prestance",
"bpm": 134.0
},
{
"name": "Lady Perplexity",
"bpm": 138.0
},
{
"name": "You My Sunshine",
"bpm": 144.0
},
{
"name": "Nuit Agitée",
"bpm": 160.0
},
{
"name": "Alerte Verte",
"bpm": 160.0
},
{
"name": "Something about Drums",
"bpm": 160.0
},
{
"name": "VelociTeuf",
"bpm": 165.0
},
{
"name": "Break the Loop",
"bpm": 165.0
}
],
"distinctive_samples": [
{
"sound": "electro1",
......
......@@ -181,6 +181,9 @@ def collab_fingerprint(T, tempo):
"bpm_median": round(st.median(bpms)) if bpms else None,
"bpm_min": min(bpms) if bpms else None,
"bpm_max": max(bpms) if bpms else None,
"tracks": sorted(({"name": t["name"], "bpm": tempo[t["track"]]["bpm"]}
for t in tracks if t["track"] in tempo),
key=lambda x: x["bpm"]),
"distinctive_samples": [{"sound": s, "lift": round(l, 1), "n": c}
for s, l, c in distinctive],
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment