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ünscht | Option |
|---|---|
| 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.
- 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.
- Raten. Jedes Instrument beginnt als zufälliges 16-Schritt-Muster.
- 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.
- 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.
- Hören.
banger.pyrendert 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. - 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.
| Teil | Regel | Quelle |
|---|---|---|
| Kick | auf jedem Schlag; höchstens 0-2 Extras, platziert knapp vor einem Schlag; niemals zwei hintereinander | Butler 2006 |
| Clap | laut auf den Zählzeiten 2 und 4, aus auf 1 und 3; Extras sind leise und auf schwachen Sechzehnteln | Butler 2006; Witek 2014 |
| Hihats | auf den Off-Beats, zwischen den Kicks; gleichmäßig verteilt; in beiden Hälften des Takts gleich; laut und leise wechseln sich ab | Butler 2006; Toussaint 2005 |
| Open Hihat | auf halbem Weg zwischen zwei Kicks, niemals auf einem Kick oder Clap | Butler 2006 |
| Percussion | gleichmäßig verteilt, wo Kick und Clap still sind, mit 25-50 % leisen Geisternoten | Toussaint 2005; Witek 2014 |
| Bass | spielt dort, wo der Kick nicht spielt; Grundton (oder dessen Oktave) 60-90 % der Zeit, Quinte oder Terz für Farbe | Plomp & Levelt 1965; Krumhansl & Kessler 1982 |
| Akkorde | Takt 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 Akkord | Krumhansl & Kessler 1982; Tymoczko 2011 |
| Lead | Akkordtö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ägen | Plomp & Levelt 1965; Huron 2001; Caplin 1998 |
| Alles | mittlere Synkopierung: einige Noten auf schwachen Schritten, die einen starken überspringen. Zu wenig ist steif, zu viel verliert den Takt | Witek et al. 2014 |
| Timing | Swing und Push/Pull bleiben unter 12 ms pro Instrument (Hihats zu spät, Clap zu früh). Größere Verschiebungen verschlechterten die Groove-Bewertungen | Davies et al. 2013 |
| Mix | Zwei Teile im selben Band auf demselben Schritt verschwimmen; nicht mehr als 4 Teile, die auf einem Schritt einsetzen | Plomp & Levelt 1965 |
| Form | Breakdown, Build-up und Drop: Kick und Bass herausnehmen, Spannung aufbauen, sie wieder hereinbringen | Solberg & 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=trueauf 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
| Ziel | Wert |
|---|---|
| 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 Stimme | etwa -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,6 | Bass 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ührecheckauf 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.txtbei 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
| Fehler | Korrektur |
|---|---|
| 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ählen | groove.py --seed N gibt den Score in 0,5 s aus; rendere die Auswahl |
fit über verschiedene Tracks vergleichen | Es ordnet Muster nur innerhalb eines Tracks |
| Der Tonart eines 10-Sekunden-Clips vertrauen | Gib beide Top-Kandidaten an |
Die WAV ohne check übergeben | check sie, und überprüfe auch die kodierte Kopie |
| Musik von einem Modell unverändert verwenden | look zuerst: Clipping und +dBTP-Peaks sind häufig |
| Hintergrundmusik kämpft mit der Stimme | --lufs -22 --mute lead, und halte 1-4 kHz frei |