music-skill

Musik erstellen, überprüfen und verstehen – direkt vom Terminal aus, für einen Agenten, der nichts hören kann. Verwende diese Fähigkeit für die Erstellung von House- oder Techno-Tracks, Beats, Loops, Hintergrundmusik, Stem-Ausgabe oder MIDI, sowie für die Analyse von Audiomaterial (BPM, Tonart, Mix-Probleme) und die Prüfung vor der Auslieferung (Lautstärke, True Peak, Clipping).

Was ist music-skill?

Das music-skill ist ein professionelles Terminal-Tool für KI-Agenten (z.B. Claude Code), das die Erstellung, Analyse und Qualitätssicherung von elektronischer Tanzmusik (House/Techno) komplett ohne Hörvermögen ermöglicht. Es basiert auf dem Banger Lab-Verfahren – einem regelbasierten Suchalgorithmus, der mit Zufallsstartwerten (Seeds) arbeitet und reproduzierbare Ergebnisse liefert. Der Skill erzeugt vollständige Tracks mit genauen Tempo-, Tonart- und Längenangaben inklusive Score, MIDI und optionalen Stems. Für die Analyse dient das `listen.py`-Tool, das visuelle und numerische Ausgaben wie Wellenformen, Spektrogramme, Timeline-Ansichten und Metriken (LUFS, True Peak, BPM, Tonart) liefert. Die Qualitätssicherung erfolgt über die `check`-Funktion, die sicherstellt, dass die Ausgabe den technischen Anforderungen (Lautstärke, Headroom, kein Clipping) entspricht. Der Skill benötigt uv und ffmpeg und ist besonders für Entwickler und KI-Agenten nützlich, die Musikproduktion automatisieren oder generative Modelle validieren möchten.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/kylefritz/music-skill/tree/HEAD

Installed? Explore more Produktivität & Zusammenarbeit skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht music-skill?

Die Skripte liegen in scripts/ neben dieser Datei; im Folgenden als $S abgekürzt, aber in jedem Befehl muss der absolute Pfad ausgeschrieben werden, da Shell-Variablen zwischen Bash-Aufrufen nicht erhalten bleiben.

Du kannst nichts hören, daher wird bei jedem Schritt Musik in etwas verwandelt, das du lesen kannst: Muster als Text, Zahlen, die du überprüfst, und ein Bild, das du dir ansiehst. Einen Track zu erstellen bedeutet: Seed → Score lesen → Rendern → look → korrigieren. Audio zu verstehen bedeutet: look → Timeline und Blatt lesen → beurteilen. Ausliefern bedeutet check, sodass „es hat die richtige Lautstärke und wird nicht clippen“ eine Tatsache ist.

Erfordert uv und ffmpeg. Jeder Befehl wird ausgeführt als uv run --no-project --with numpy --with scipy --with pillow python -I <script> … , im Folgenden als RUN abgekürzt.

Einen Track erstellen: banger.py

RUN $S/banger.py --seed 4242 --out <scratch>/b4242

Ein 72-taktiger House- oder Techno-Track dauert etwa 10 Sekunden: track.wav (48 kHz Stereo, -14 LUFS), track.mid, score.txt und score.json. Derselbe Seed und dieselben Optionen erzeugen immer dieselbe Datei.

GewünschtOption
Ein Stil--style deep-house (120-124 BPM), tech-house (124-128), peak-techno (130-136), melodic-techno (122-126)
Ein Tempo, eine Tonart--bpm 124, --key A, --mode minor (oder dorian, phrygian)
Eine Länge--bars 24 (jede gerade Zahl ab 8), oder --seconds 30: es wählt die Takte und passt das Tempo so an, dass der letzte Takt 2,5 s früher endet und der Hall rechtzeitig ausklingt
Hintergrundmusik für eine Stimme--lufs -22 --mute lead (auch clap stumm schalten)
Spuren für eine DAW oder Mix-Prüfung--stems schreibt stems/<layer>.wav; track.mid wird immer geschrieben

Die Taktzahl bestimmt die Struktur: 8-10 ist ein Loop; 12-22 ist Intro, Drop, Outro; 24-46 fügt einen Breakdown und einen Build-up zwischen zwei Drops hinzu; 48 und mehr ist die vollständige Form mit einem Groove-Abschnitt und 8-taktigen Teilen.

Lies den Score, bevor du mehr renderst. Er gibt die Muster als Text aus:

seed 4242  Melodic techno  122 BPM  G minor  swing 1%  chords: pluck
       1...2...3...4...
kick   X...X...X.X.X...
clap   .o..X.......X...
hat    x.X...X.x.X...X.
bass   .....ORO.O.O3RRR
chords ...X............  i7 Gm7 | bVII7 F7 | bVI7 Ebmaj7 | iv7 Cm7
lead   47244.42.22..442 .3315.553.5.3557
perc   fit  74%   1293 patterns tried   weakest: Evenly spread 52%, Clear mix 20%

. Pause, o leise, x mittel, X laut. Bass: R Grundton, 5 Quinte, O Oktave, 3 Terz. Lead: Skalengrad 0-9 über zwei Takte. fit gibt an, wie gut die Stimme ihren Regeln entspricht; weakest nennt die nicht erfüllten Regeln.

Um einen Seed auszuwählen, höre zuerst als Text: python3 $S/groove.py --seed N führt nur die Suche aus (0,5 s, kein Audio, keine Abhängigkeiten). Probiere ein paar aus, lies die Akkorde und das Lead, rendere den, den du verteidigen würdest. Du kannst nicht beurteilen, „ob es gut klingt“: sag das, und gib der Person die Datei.

Wie ein Track geschrieben wird

Die Methode stammt von Banger Lab. Es ist eine Suche, kein Modell, und jede Regel stammt aus einer Studie zur Rhythmus- oder Tonhöhenwahrnehmung.

  1. Roll. Der Seed wählt einen Stil, ein Tempo, eine Tonart, eine Skala und Ziele: Hihats pro Takt, wie viel Synkopierung, wie viele verschiedene Akkorde.
  2. Raten. Jedes Instrument beginnt als zufälliges 16-Schritt-Muster.
  3. Testen. Jede Ein-Schritt-Änderung (hinzufügen, entfernen, verschieben, lauter, leiser) wird gegen die Regeln dieses Instruments bewertet, plus ein paar zufällige Zwei-Schritt-Sprünge. Die beste wird behalten.
  4. Fixieren. Wenn keine Änderung höher bewertet wird, ist die Stimme fertig und das nächste Instrument wird darüber geschrieben. Reihenfolge: Kick, Clap, Hihat, Open Hihat, Percussion, Bass, Akkorde, Lead. Jede Ebene bekommt vier zufällige Starts und behält den besten.
  5. Hören. banger.py rendert jedes Instrument einzeln, misst, wo seine Energie in sechs Bändern sitzt, und ein zweiter Durchgang stimmt Hihats, Percussion, Bass, Akkorde und Lead neu ab, damit Teile nicht dasselbe Band auf demselben Schritt füllen.
  6. Arrangieren. Die Teile werden zu Abschnitten, mit Fills am Ende jedes 4. und 8. Taktes, einem Tiefpass, der sich durch den Breakdown öffnet, einer Snare-Rolle und einem Riser im Build-up, einem Beat Stille, dann dem Drop.

Was es grooven lässt: die Regeln

Verwende diese, wenn du Musik auf irgendeine Weise schreibst oder bearbeitest: von Hand, als MIDI oder als Prompt für ein Musikmodell. score.json enthält die Bewertung jeder Regel und ihre Quelle für einen Track.

TeilRegelQuelle
Kickauf jedem Schlag; höchstens 0-2 Extras, platziert knapp vor einem Schlag; niemals zwei hintereinanderButler 2006
Claplaut auf den Zählzeiten 2 und 4, aus auf 1 und 3; Extras sind leise und auf schwachen SechzehntelnButler 2006; Witek 2014
Hihatsauf den Off-Beats, zwischen den Kicks; gleichmäßig verteilt; in beiden Hälften des Takts gleich; laut und leise wechseln sich abButler 2006; Toussaint 2005
Open Hihatauf halbem Weg zwischen zwei Kicks, niemals auf einem Kick oder ClapButler 2006
Percussiongleichmäßig verteilt, wo Kick und Clap still sind, mit 25-50 % leisen GeisternotenToussaint 2005; Witek 2014
Bassspielt dort, wo der Kick nicht spielt; Grundton (oder dessen Oktave) 60-90 % der Zeit, Quinte oder Terz für FarbePlomp & Levelt 1965; Krumhansl & Kessler 1982
AkkordeTakt 1 ist der Grundakkord; Grundtöne bewegen sich schrittweise, in Terzen oder Quarten; jede Stimme bewegt sich auf dem kürzesten Weg zum nächsten AkkordKrumhansl & Kessler 1982; Tymoczko 2011
LeadAkkordtöne auf starken Zählzeiten; niemals einen Halbton über einem Akkordton; kleine Schritte; Takt 1 fragt (endet außerhalb des Grundtons), Takt 2 antwortet mit einem ähnlichen Rhythmus (endet auf ihm); spielt in den Lücken zwischen den AkkordanschlägenPlomp & Levelt 1965; Huron 2001; Caplin 1998
Allesmittlere Synkopierung: einige Noten auf schwachen Schritten, die einen starken überspringen. Zu wenig ist steif, zu viel verliert den TaktWitek et al. 2014
TimingSwing und Push/Pull bleiben unter 12 ms pro Instrument (Hihats zu spät, Clap zu früh). Größere Verschiebungen verschlechterten die Groove-BewertungenDavies et al. 2013
MixZwei Teile im selben Band auf demselben Schritt verschwimmen; nicht mehr als 4 Teile, die auf einem Schritt einsetzenPlomp & Levelt 1965
FormBreakdown, Build-up und Drop: Kick und Bass herausnehmen, Spannung aufbauen, sie wieder hereinbringenSolberg & Dibben 2019; Butler 2006

Jede Note stammt aus einer Tonleiter und der Kick ist auf den Grundton gestimmt, weshalb jeder Seed in der Tonart bleibt. Die Gewichtung zwischen den Regeln ist eine Vereinfachung, nicht an Hördaten angepasst, daher ordnet fit Muster innerhalb eines Tracks; es ist kein Qualitätswert über verschiedene Tracks hinweg.

Hören: look

RUN $S/listen.py look TRACK --sheet <scratch>/sheet.png

Funktioniert mit allem, was ffmpeg dekodieren kann, einschließlich des Tons eines Videos und Musik eines generativen Modells. Es gibt Tempo, Tonart, Lautstärke, True Peak, Balance, Stereobreite, Warnungen und eine Zeitleiste aus:

track.wav  2:24.1  122.0 BPM (strength 7.9)  G minor (score 1.62; next Eb major 1.61)
  loudness -14.0 LUFS  true peak -1.3 dBTP  range 9.3 LU  peak-to-loudness 12.7 dB
  balance, dB under the loudest band  sub -2  bass 0  low mid -8  mid -17  high -24  air -27
  timeline, 15.7 s windows (8 bars): loudness, then each band in dB against its level over the whole track
    start     LUFS        sub    bass low mid     mid    high     air
     0:47.2   -12.6         +2      +2      +1      +2      +1      -2
     1:03.0   -21.1        -29     -12      +1      -7      -7      -6
     1:18.7   -20.5        -33     -12      +1      -1      +3      +6
     1:34.4   -12.6         +2      +2      +1      +2      +1      -0

Lies die Struktur aus der Zeitleiste ab. Sub und Bass 20-30 dB leiser ist ein Breakdown (Kick und Bass sind raus). High und Air steigen, während Sub draußen bleibt, ist ein Build. Alles gleichzeitig wieder da ist der Drop. Dann lies das Blatt (Wellenform, Spektrogramm, sechs Bänder, Lautheitskurve): ein Riser ist eine diagonale Linie, ein Kick ist eine Säule aus hellen Punkten am unteren Rand, ein flacher Farbblock ohne Lücken ist ein Mix ohne Dynamik. Gib die Zeiten von der Achse des Blattes an, wenn du einen Moment beschreibst.

Wie genau es ist, gemessen an 24 Tracks mit bekannten Antworten:

  • Tempo: innerhalb von 0,2 BPM bei 24 von 24. Es bevorzugt 70-190 BPM, daher ist bei anderem Material eine halbe oder doppelte Zeit möglich. Stärke unter 2 bedeutet keinen gleichmäßigen Takt: sag, dass das BPM eine Schätzung ist.
  • Tonart: Der Grundton war bei 19 von 24 richtig, und es ist bei kurzem oder dünnem Audiomaterial weniger zuverlässig. Dur vs. Moll ist eine schwächere Aussage, und es kann Modi nicht unterscheiden. Wenn die beiden besten Werte nahe beieinander liegen, wird das angezeigt; gib beide an.
  • Lautstärke und True Peak: dieselben Zahlen wie ffmpeg -af ebur128=peak=true auf 0,1 genau.

Stems gegeneinander: mix

RUN $S/listen.py mix <scratch>/b4242/stems

Pro Stem: Lautstärke und wo seine Energie sitzt. Dann die Paare, die sich am meisten überlappen (gleiches Band, gleicher Moment), und Stems, die im Vergleich zum lautesten sehr leise sind. Ein Paar über 60 % bedeutet, dass zwei Teile um denselben Raum kämpfen: verschiebe einen in Zeit, Tonhöhe oder Pegel.

Zielwerte und Prüfung

ZielWert
Ein Track allein (Streaming normalisiert in der Nähe)-14 LUFS integriert
Der fertige Mix eines Web-Videos oder Podcasts-16 LUFS
Hintergrundmusik für eine Stimmeetwa -22 LUFS
True Peak, immer-1 dBTP oder darunter: verlustbehaftete Kodierung überschwingt
Peak-to-Loudness unter 7 dBüberbegrenzt: flach und ermüdend
Stereo-Korrelation unter 120 Hz unter 0,6Bass kann in Mono verschwinden (Telefone, Clubs)
RUN $S/listen.py check TRACK --lufs -14 --peak -1 --seconds 30 --bpm 124

check muss bestanden sein, bevor du eine Datei übergibst; es beendet sich mit Exit-Code 1 bei einem Fehler. Es erkennt auch Clipping und Stille am Anfang. Musik von einem Modell braucht das am dringendsten: Eine generierte Hintergrundmusik maß +3,2 dBTP mit 2.121 geclippten Samples. Korrigiere mit ffmpeg (loudnorm=I=-14:TP=-1.5:LRA=11), dann überprüfe erneut.

Ausliefern

  • Kleine Kopie: ffmpeg -i track.wav -c:a aac -b:a 160k track.m4a (oder -c:a libmp3lame -q:a 2). Führe check auf der Kopie aus: Die Kodierung verschiebt den True Peak.
  • Unter einem Film: rendere mit --seconds <Filmlänge> und --lufs -22, und übergib es an video-skill, das den endgültigen Mix prüft.
  • Ein Loop: --bars 8, dann schneide das 2,5 s lange Ende ab (-t <8 Takte in Sekunden>), damit es sauber wiederholt wird.
  • Behalte score.txt bei der Datei: Seine letzte Zeile ist der genaue Befehl, der sie erstellt hat.

Wann dies das falsche Werkzeug ist

banger.py erstellt elektronische Vier-Viertel-Musik aus Oszillatoren und Rauschen. Es hat keine Samples, keinen Gesang und keine anderen Genres, und sein Mix ist dunkler und schmaler als ein gemastertes Release (die Mitten des Demos liegen 17 dB unter seinem Bass). Für akustische Instrumente, einen Song oder eine bestimmte Stimmung verwende ein Musikmodell oder einen Bibliothekstrack, führe dann look und check auf dem Ergebnis aus. Was dir stattdessen geboten wird: exaktes Tempo, Tonart und Länge, dasselbe Ergebnis aus demselben Seed, Stems, MIDI, nichts zum Lizenzieren und ein Grund für jede Note.

Häufige Fehler

FehlerKorrektur
Sagen, ein Track „klingt großartig“Du hast ihn nicht gehört. Berichte die Zahlen und was das Blatt zeigt; die Person beurteilt den Klang
20 Seeds rendern, um einen auszuwählengroove.py --seed N gibt den Score in 0,5 s aus; rendere die Auswahl
fit über verschiedene Tracks vergleichenEs ordnet Muster nur innerhalb eines Tracks
Der Tonart eines 10-Sekunden-Clips vertrauenGib beide Top-Kandidaten an
Die WAV ohne check übergebencheck sie, und überprüfe auch die kodierte Kopie
Musik von einem Modell unverändert verwendenlook zuerst: Clipping und +dBTP-Peaks sind häufig
Hintergrundmusik kämpft mit der Stimme--lufs -22 --mute lead, und halte 1-4 kHz frei

Verwandte Skills