feat(beats): audio analysis pipeline + DARKXSIDE catalog - #1030
Conversation
Add beats analysis tools for the W4 immersive demo content pipeline: - analyze_beats.py: audio fingerprinting (ffmpeg lavfi, ebur128, spectral) - beats_to_cgp.py: beats → CGP geometry conversion - chit_a2ui_bridge.py: CGP → A2UI animation specs bridge - ingest_gdrive_beats.py: Google Drive beats ingestion Include DARKXSIDE SoundCloud catalog (pmoves/data/beats/) with fingerprints, playlists, and tempo-grouped M3U8 files. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 166 files, which is 16 over the limit of 150. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (12)
📒 Files selected for processing (166)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d195aaacb4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| gname = name_group(members) | ||
| m3u = write_playlist(gname, members, output) |
There was a problem hiding this comment.
Make playlist names unique per cluster
Because gname is derived only from coarse tempo/timbre/energy buckets, distinct KMeans clusters can collapse to the same label. When that happens write_playlist() rewrites the earlier .m3u8, and downstream selection by name becomes ambiguous; this commit already contains five Allegro_balanced_Bright entries in pmoves/data/beats/playlists/groups_summary.json but only one Allegro_balanced_Bright.m3u8. That drops tracks from the exported catalog and makes later beats_to_cgp.py --group/dump --group calls unable to target the overwritten clusters.
Useful? React with 👍 / 👎.
| "constellations": [{ | ||
| "id": _stable_id(f"c_{group_name}"), | ||
| "label": group_name, | ||
| "anchor": anchor, | ||
| "spectrum": [group_sv["Hz"], group_sv["delta"], 1.0 - abs(group_sv["kappa"])], |
There was a problem hiding this comment.
Nest emitted constellations under each super-node
group_to_cgp() emits the constellation in a top-level constellations array, but the repo’s CGP consumers traverse super_nodes[*].constellations (pmoves/services/gateway/gateway/api/workflow.py:204 and pmoves/services/gateway/gateway/api/viz.py:127). In the packets produced here, super_nodes[0] has no constellations at all, so the gateway cannot collect constellation IDs or render the SVG view for these beats packets even though the top-level array is populated.
Useful? React with 👍 / 👎.
| anchors = cgp_data.get("anchors", []) | ||
| for idx, anchor in enumerate(anchors): |
There was a problem hiding this comment.
Read canonical CGP fields when building A2UI scenes
This bridge only looks for top-level anchors and spectral_signatures, but the canonical geometry schema and the new beats exporter use super_nodes[*].constellations[*].anchor and points instead (pmoves/contracts/schemas/geometry/cgp.v1.schema.json, pmoves/tools/beats_to_cgp.py). For any CGP produced in this repo, both loops are empty, so elements stays empty and the Remotion render is just a blank scene.
Useful? React with 👍 / 👎.
🌿 PR Trim — Thread Classification
Summary: All 3 threads reference tooling under active development (Phase 11 beats pipeline). The SKILL.md documents the intended architecture; the Python tools will implement these patterns when built. No follow-up commit needed — issues are tracked as part of the Phase 11 implementation scope. |
Addresses actionable review threads from 6 admin-merged PRs: - SKILL.md (cipher-beats): fix ffmeg→ffmpeg typo, add code block language tags, normalize analysed→analyzed spelling (#1031) - SKILL.md (holographic-blocks): add code block language tags, use canonical geometry.cgp.v1 subject name (#1031) - portal.js: preserve gateway URL scheme (http/https→ws/wss), replace fabricated Math.random() stats with "—" placeholder (#1033) - patterns.yaml: restrict CHIT bypass patterns from bare substrings to scoped make-target/file-path regexes (#1035) - container-agent/app.py: include upstream service probes in healthy summary assessment (#1035) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- analyze_beats.py: append cluster ID to group names preventing .m3u8 playlist file collisions when clusters share tempo/timbre/energy bucket - beats_to_cgp.py: nest constellations inside super_nodes per CGP v1.0 spec — gateway consumers traverse super_nodes[*].constellations[*] - chit_a2ui_bridge.py: traverse canonical nested CGP paths instead of reading non-existent top-level anchors/spectral_signatures fields; also maps individual track points to A2UI sub-elements Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
PR #1030 — Code Bug Fixes LandedCommit Fix 1: Playlist name collisions —
|
Summary
analyze_beats.py(ffmpeg lavfi fingerprinting),beats_to_cgp.py(beats → CGP geometry),chit_a2ui_bridge.py(CGP → A2UI animation),ingest_gdrive_beats.py(Google Drive ingestion)pmoves/data/beats/) with 80+ tracks, fingerprints, and tempo-grouped playlistsFeeds
W4 (immersive demo content pipeline) — audio → geometry → animation chain for cataclysmstudios.com
Test plan
analyze_beats.pyruns with ffmpeg availablebeats_to_cgp.pyproduces valid CGP packets from fingerprint data🤖 Generated with Claude Code