DEM0NHUB [ SKILLS FOR CLAUDE ]

engine-fux

BY @GLO — 14 DOWNLOADS — AUDIO

One-shot MIDI chord-loop scraper. User names a song, artist, or album — skill auto-creates a folder on their Desktop named after the target, scrapes real chord MIDIs from the wild (Online Sequencer for human transcriptions, then YouTube instrumentals → audio chord detection as fallback), auto-extracts to N-bar CHORD LOOPS ONLY (no drums, no melody leads, no full-song MIDIs in the final folder), and drops them ready for FL Studio. TRIGGER on ANY of these patterns (even if user doesn't say "scrape" or "engine-fux" explicitly) - "get me [X] midis", "scrape [X]", "pull every [artist] chord loop", "grab the whole [album]", "find midis for [song]", "download [X] chords", "[album/song/artist] midis please", "rip [X] midis", "any [artist] chord midis". Defaults - 8-bar loops, chord-only output, folder named after the target. Use this BEFORE midi-cook — only fall back to midi-cook if the user explicitly wants original/generated content, not transcriptions of real songs.

CLI INSTALL

curl -sS https://dem0n.vip/s/glo/engine-fux/SKILL.md -o ~/.claude/skills/engine-fux/SKILL.md --create-dirs

DOWNLOAD ALL gives you a single .zip containing SKILL.md + the tar.gz — drag it into Claude Code in one go.

Sign up to see the full skill

Get the source, install command, comments, and version history

GET AN INVITE

engine-fux

One-shot: user names a target, skill delivers a clean Desktop folder of chord-loop MIDIs.

The flow (follow exactly, no clarifying questions unless target is unintelligible)

USER: "scrape Luv Is Rage 2"
SKILL: → ~/Desktop/Luv Is Rage 2/
       → Track 1 [8bar chords].mid
       → Track 2 [8bar chords].mid
       → ... (chord loops only)
       → reports: "got 17/17, 3 from OS / 14 from audio detection"

1. Parse target. Extract from prompt: song name, artist name, OR album name. If album, look up the full tracklist. Pick a folder name that matches the user's phrasing — e.g. "Luv Is Rage 2", "pierre midis", "carti die lit".

2. Create folder. mkdir -p ~/Desktop/<target>/. Nothing else on disk — no tmp folders in Desktop, no _full songs/ subfolder, no raw MIDI dumps the user has to look at. Staging happens under /tmp/.

3. Pipeline A — Online Sequencer scrape (always try first, output is highest quality):

a. WebSearch site:onlinesequencer.net "<song name>" (or site:onlinesequencer.net "<artist>" for broader sweep). For albums, hit 3-5 key track names. Collect seed sequence IDs.

b. Playwright browser_navigate to ONE seed page (e.g. https://onlinesequencer.net/<id>). Must be an actual sequence page — the audio context needs to initialize or song.setBPM throws.

c. browser_evaluate running the JS from scripts/os_bfs_export.js with seedIds + titleRegexSrc (e.g. "uzi|xo\\s*tour|sauce it up"). It BFS-walks inspired chains + uploader profiles, hooks saveBlob, exports each matching sequence, returns {midis: {id: {title, b64, size}}} as a JSON file.

d. Run scripts/extract_chord_loops.py <json> <target folder> --bars <N> — decodes base64, scores tracks by polyphony+register+note-length, picks the chord track of each MIDI, extracts first N bars, dedupes by MD5. Output name format: <Song Title> [<N>bar chords].mid.

4. Pipeline B — Audio → chord triads (fallback for missing targets):

a. Figure out which target tracks Pipeline A didn't cover. For each missing one: bash yt-dlp --default-search ytsearch1 -x --audio-format mp3 \ --postprocessor-args "ffmpeg:-ss 30 -t 45" \ -o "<safe-title>.%(ext)s" \ "ytsearch1:<artist> <song> instrumental" Parallelize with & + wait — 10+ tracks in ~30-60 seconds.

b. bash scripts/setup_env.sh if venv doesn't exist (idempotent, ~90s first time, instant after).

c. /tmp/bp_env/bin/python scripts/audio_to_chord_midi.py <audio dir> <target folder> --bars <N> librosa HPSS + chroma_cqt + beat-track + 24-chord template match → root-3rd-5th triad MIDIs at detected BPM. Filename: <Song> [<bpm>bpm] (<chord progression>) <N>bar.mid.

5. Clean up. Delete any /tmp/ staging. Dedupe folder by MD5. Drop files under 150 bytes (sparse/junk). For songs with multiple OS transcriptions, keep just the biggest/richest unless user said "all versions".

6. Report honest status — X tracks, Y from OS (real transcriptions), Z from audio detection. If bulk came from audio detection, warn: "the audio-detected ones only output root-3rd-5th triads, not 7ths/extensions — treat them as starting sketches, not final chords."

Default parameters (use unless user overrides)

  • Bars: 8. User may say "4 bar", "16 bar" etc — honor it.
  • Folder location: ~/Desktop/. Only change if user specifies a different path.
  • Folder name: Derive from user's phrasing. "luv is rage 2" → Luv Is Rage 2/. "carti midis" → carti midis/. Match their casing/tone.
  • Output format: Chord MIDIs only. No drums, no full songs, no melody leads. That's the whole point.
  • Dedupe: On by default. Different transcriptions of the same song → keep just the best one.

Tools you'll need

  • WebSearch (for Google site:onlinesequencer.net dorks)
  • mcp__plugin_playwright_playwright__browser_navigate + browser_evaluate (Pipeline A)
  • Bash + yt-dlp + ffmpeg (Pipeline B audio download)
  • /tmp/bp_env/bin/python (venv from setup_env.sh, Pipeline B extraction)

Setup (only needed once per machine)

bash "$SKILL_DIR/scripts/setup_env.sh"

Idempotent. Creates /tmp/bp_env/ with librosa + basic-pitch + mido + pretty-midi. Patches the scipy.signal.gaussian deprecation in basic-pitch. After this, all future runs are instant.

Why two pipelines

Pipeline A (Online Sequencer) is gold — a human played the notes in. But OS coverage is sparse: classics like "XO Tour Llif3" have 8 variants, deep cuts have zero.

Pipeline B (audio detection) fills the gap but has hard limits worth knowing:

  • Detects major/minor triads only — no 7ths, sus, extensions
  • BPM detection flips between half/double time on trap beats (~30% wrong)
  • No key constraint — occasional out-of-key chord detections
  • Fixed C4 voicing, not the song's real voicing

Use A first. Fall back to B only for what A missed. If the user needs actual chord quality for a B-heavy result, note it honestly and offer the Demucs + key-constrained upgrade path (not implemented yet).

Key gotchas (save yourself 20 minutes of debugging)

  • The OS saveBlob hijack only works ON an actual sequence page. Navigating to /sequences?search=... doesn't init the audio context → song.setBPM throws.
  • loadDataProto accepts binary Uint8Array; decode the base64 string from the page first to avoid lib-version footguns.
  • After loadDataProto, global bpm is stale. Sync with song.setBPM(parseFloat(document.getElementById('bpm').value)) or exportMidi writes at wrong tempo.
  • Some OS exports are stubs with no chord content (pure drums or 2-note melodies) — extract_chord_loops.py filters these via score <= 0.
  • For Pipeline B, always -ss 30 into the track — intros skip the chord progression.
  • Half-tempo BPM: normalize loop while bpm < 120: bpm *= 2; while bpm > 200: bpm /= 2 is a heuristic. Tell user to retempo in FL if the beat feels off.

BADGE

downloads ![downloads](https://dem0n.vip/s/glo/engine-fux/badge.svg)

VERSIONS

  • 0.0.1776841241491 — 9.6 KB — 97acf3622a2d DIFF
  • 0.0.1776841103506 — 9.6 KB — 504cad7f2d71

COMMENTS (0)

LOGIN TO COMMENT