Que fait music-skill ?
Les scripts se trouvent dans scripts/ à côté de ce fichier. Écrivez-les comme $S ci-dessous, mais utilisez le chemin absolu dans chaque commande, car les variables d'environnement ne persistent pas entre les appels Bash.
Vous ne pouvez pas entendre, donc chaque étape transforme la musique en quelque chose que vous pouvez lire : des motifs sous forme de texte, des nombres à vérifier, et une image à regarder. Créer un morceau suit le processus : graine → lire la partition → générer → look → corriger. Analyser un fichier audio : look → lire le timeline et la partition → juger. Livrer : check, pour que « c'est à la bonne loudness et ça ne clipping pas » soit un fait.
Nécessite uv et ffmpeg. Toutes les commandes s'exécutent avec
uv run --no-project --with numpy --with scipy --with pillow python -I <script> …, noté RUN ci-dessous.
Créer un morceau : banger.py
RUN $S/banger.py --seed 4242 --out <scratch>/b4242
Un morceau house ou techno de 72 mesures prend environ 10 secondes : track.wav (48 kHz stéréo, -14 LUFS), track.mid, score.txt et score.json. La même graine et les mêmes options donnent toujours le même fichier.
| Résultat voulu | Option |
|---|---|
| Un style | --style deep-house (120-124 BPM), tech-house (124-128), peak-techno (130-136), melodic-techno (122-126) |
| Un tempo, une tonalité | --bpm 124, --key A, --mode minor (ou dorian, phrygian) |
| Une durée | --bars 24 (nombre pair à partir de 8), ou --seconds 30 : il choisit le nombre de mesures et ajuste le tempo pour que la dernière mesure se termine 2,5 s plus tôt et que la réverbération s'éteigne à temps |
| Un fond pour une voix | --lufs -22 --mute lead (essayer aussi clap) |
| Pistes pour un DAW ou vérification de mix | --stems écrit stems/<couche>.wav ; track.mid est toujours écrit |
Le nombre de mesures détermine la structure : 8-10 est une boucle ; 12-22 : intro, drop, outro ; 24-46 ajoute un break et un build-up entre deux drops ; 48 et plus est la forme complète avec une section groove et des parties de 8 mesures.
Lisez la partition avant de générer plus de fichiers. Elle affiche les motifs sous forme de texte :
seed 4242 Melodic techno 122 BPM G minor swing 1% accords : 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 motifs essayés plus faible : Répartition homogène 52%, Mix clair 20%
. silence, o doux, x moyen, X fort. Basse : R fondamentale, 5 quinte, O octave, 3 tierce. Lead : degré d'échelle 0-9 sur deux mesures. fit indique à quel point la partie respecte ses règles ; plus faible nomme les règles non respectées.
Pour choisir une graine, faites d'abord une écoute textuelle : python3 $S/groove.py --seed N exécute uniquement la recherche (0,5 s, sans audio, sans dépendances). Essayez-en plusieurs, lisez les accords et le lead, générez celui que vous défendriez. Vous ne pouvez pas juger « est-ce que ça sonne bien » : dites-le, et donnez le fichier à la personne.
Comment un morceau est écrit
La méthode vient de Banger Lab. C'est une recherche, pas un modèle, et chaque règle provient d'une étude de la perception du rythme ou de la hauteur.
- Lancer. La graine choisit un style, un tempo, une tonalité, une gamme et des cibles : nombre de hats par mesure, degré de syncope, nombre d'accords différents.
- Deviner. Chaque instrument commence par un motif aléatoire de 16 pas.
- Tester. Chaque modification d'un pas (ajout, retrait, glissement, plus fort, plus doux) est notée selon les règles de cet instrument, plus quelques sauts aléatoires de deux pas. Le meilleur est conservé.
- Verrouiller. Quand aucun changement n'obtient un meilleur score, la partie est terminée et l'instrument suivant est écrit par-dessus. Ordre : kick, clap, hats, open hat, percussion, basse, accords, lead. Chaque couche bénéficie de quatre départs aléatoires et conserve le meilleur.
- Écouter.
banger.pyjoue chaque instrument seul, mesure où son énergie se situe dans six bandes, et une deuxième passe réajuste hats, percussion, basse, accords et lead pour que les parties n'occupent pas la même bande sur le même pas. - Arranger. Les parties deviennent des sections, avec des fills à la fin de chaque groupe de 4 et 8 mesures, un filtre passe-bas qui s'ouvre pendant le break, un roulement de caisse claire et un riser dans le build, un temps de silence, puis le drop.
Ce qui fait groover : les règles
Utilisez-les quand vous écrivez ou éditez de la musique par quelque moyen que ce soit : un motif à la main, MIDI, ou une invite pour un modèle de musique. score.json contient le score et la source de chaque règle pour un morceau.
| Partie | Règle | Source |
|---|---|---|
| Kick | sur chaque temps ; au maximum 0-2 extras, placés juste avant un temps ; jamais deux d'affilée | Butler 2006 |
| Clap | fort sur les temps 2 et 4, absent sur les temps 1 et 3 ; les extras sont doux et sur des doubles croches faibles | Butler 2006 ; Witek 2014 |
| Hats | sur les contretemps, entre les kicks ; répartis uniformément ; identiques dans les deux moitiés de la mesure ; fort et doux alternent | Butler 2006 ; Toussaint 2005 |
| Open hat | à mi-chemin entre deux kicks, jamais sur un kick ou un clap | Butler 2006 |
| Percussion | répartie uniformément, là où le kick et le clap sont silencieux, avec 25-50 % de ghost notes douces | Toussaint 2005 ; Witek 2014 |
| Basse | joue là où le kick ne joue pas ; fondamentale (ou son octave) 60-90 % du temps, quinte ou tierce pour la couleur | Plomp & Levelt 1965 ; Krumhansl & Kessler 1982 |
| Accords | la mesure 1 est l'accord de départ ; les fondamentales se déplacent par pas, tierce ou quarte ; chaque voix suit le chemin le plus court vers l'accord suivant | Krumhansl & Kessler 1982 ; Tymoczko 2011 |
| Lead | notes de l'accord sur les temps forts ; jamais un demi-ton au-dessus d'une note de l'accord ; petits intervalles ; mesure 1 : question (se termine hors de la note de départ), mesure 2 : réponse avec un rythme similaire (se termine sur la note de départ) ; joue dans les silences entre les frappes d'accords | Plomp & Levelt 1965 ; Huron 2001 ; Caplin 1998 |
| Tout | syncope modérée : quelques notes sur des pas faibles qui sautent un temps fort. Trop peu est rigide, trop fait perdre le rythme | Witek et al. 2014 |
| Timing | swing et avance/retard restent sous 12 ms par instrument (hats en retard, clap en avance). Des décalages plus importants réduisent les scores de groove | Davies et al. 2013 |
| Mix | deux parties dans la même bande sur le même pas se brouillent mutuellement ; pas plus de 4 parties sur un même pas | Plomp & Levelt 1965 |
| Structure | break, build-up et drop : retirez le kick et la basse, augmentez la tension, ramenez-les | Solberg & Dibben 2019 ; Butler 2006 |
Chaque note provient d'une seule gamme et le kick est accordé sur la note de départ, ce qui fait que toute graine reste dans la tonalité. Les poids entre les règles sont une simplification, pas calibrés sur des données d'écoute, donc fit classe les motifs au sein d'un même morceau ; ce n'est pas un score de qualité entre morceaux.
Écouter : look
RUN $S/listen.py look PISTE --sheet <scratch>/sheet.png
Fonctionne sur tout ce que ffmpeg peut décoder, y compris le son d'une vidéo et la musique d'un modèle génératif. Il affiche le tempo, la tonalité, la loudness, le true peak, l'équilibre, la largeur stéréo, les avertissements et un timeline :
track.wav 2:24.1 122.0 BPM (force 7.9) G minor (score 1.62 ; suivant Eb major 1.61)
loudness -14.0 LUFS true peak -1.3 dBTP plage 9.3 LU peak-to-loudness 12.7 dB
équilibre, dB sous la bande la plus forte sub -2 bass 0 low mid -8 mid -17 high -24 air -27
timeline, fenêtres de 15,7 s (8 mesures) : loudness, puis chaque bande en dB par rapport à son niveau sur l'ensemble du morceau
début 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
Lisez la structure à partir du timeline. Sub et bass à -20-30 dB sont un break (le kick et la basse sont absents). High et air qui montent tandis que sub reste absent, c'est un build. Tout revient en même temps, c'est le drop. Lisez ensuite le sheet (forme d'onde, spectrogramme, six bandes de fréquences, courbe de loudness) : un riser est une ligne diagonale, un kick est une colonne de points lumineux en bas, un bloc de couleur plat sans trous est un mix sans dynamique. Donnez les heures à partir de l'axe du sheet quand vous décrivez un moment.
Fiabilité, mesurée sur 24 morceaux générés avec des réponses connues :
- Tempo : à moins de 0,2 BPM sur 24/24. Il préfère 70-190 BPM, donc la moitié ou le double du tempo est possible sur d'autres sources. Une force inférieure à 2 signifie qu'il n'y a pas de rythme stable : dites que le BPM est une estimation.
- Tonalité : la note de départ était correcte sur 19/24, et c'est moins fiable sur un audio court ou peu dense. Majeur vs mineur est une indication plus faible, et il ne peut pas distinguer les modes. Quand les deux meilleurs scores sont proches, il le signale ; rapporter les deux.
- Loudness et true peak : les mêmes chiffres que
ffmpeg -af ebur128=peak=trueà 0,1 près.
Stems les uns par rapport aux autres : mix
RUN $S/listen.py mix <scratch>/b4242/stems
Par stem : loudness et localisation de son énergie. Ensuite, les paires qui se chevauchent le plus (même bande, même instant), et les stems très silencieux par rapport au plus fort. Un couple à plus de 60 % indique deux parties qui se disputent le même espace : déplacez l'une d'elles dans le temps, la hauteur ou le niveau.
Nombres à atteindre et vérification
| Cible | Valeur |
|---|---|
| Un morceau seul (le streaming normalise vers cette valeur) | -14 LUFS intégré |
| Le mix final d'une vidéo web ou d'un podcast | -16 LUFS |
| Un fond pour une voix | environ -22 LUFS |
| True peak, toujours | -1 dBTP ou moins : le codage avec perte dépasse |
| Peak-to-loudness en dessous de 7 dB | trop limité : plat et fatiguant |
| Corrélation stéréo sous 120 Hz en dessous de 0,6 | les basses peuvent disparaître en mono (téléphones, clubs) |
RUN $S/listen.py check PISTE --lufs -14 --peak -1 --seconds 30 --bpm 124
check doit réussir avant de remettre un fichier ; il se termine avec le code 1 en cas d'échec. Il détecte aussi le clipping et le silence au début. La musique issue d'un modèle a le plus besoin de cette vérification : un fond généré mesurait +3,2 dBTP avec 2 121 échantillons écrêtés. Corrigez avec ffmpeg (loudnorm=I=-14:TP=-1.5:LRA=11), puis vérifiez à nouveau.
Livraison
- Petite copie :
ffmpeg -i track.wav -c:a aac -b:a 160k track.m4a(ou-c:a libmp3lame -q:a 2). Lancezchecksur la copie : le codage déplace le true peak. - Sous un film : générez avec
--seconds <durée du film>et--lufs -22, puis passez à video-skill, qui vérifie le mix final. - Une boucle :
--bars 8, puis coupez la queue de 2,5 s (-t <8 mesures en secondes>) pour qu'elle se répète proprement. - Conservez
score.txtavec le fichier : sa dernière ligne est la commande exacte qui l'a créé.
Quand ce n'est pas le bon outil
banger.py crée de la musique électronique à quatre temps sur le sol à partir d'oscillateurs et de bruit. Il n'a pas d'échantillons, pas de voix et pas d'autres genres, et son mix est plus sombre et plus étroit qu'un mastering professionnel (les médiums de la démo sont à -17 dB sous la basse). Pour des instruments acoustiques, une chanson ou une ambiance nommée, utilisez un modèle de musique ou une piste de bibliothèque, puis lancez look et check sur le résultat. Ce que cet outil vous offre en échange : tempo, tonalité et durée exactes, résultat identique pour une même graine, stems, MIDI, rien à licencier, et une raison pour chaque note.
Erreurs courantes
| Erreur | Correction |
|---|---|
| Dire qu'un morceau « sonne super » | Vous ne l'avez pas entendu. Rapportez les chiffres et ce que montre le sheet ; la personne juge le son |
| Générer 20 graines pour en choisir une | groove.py --seed N affiche le score en 0,5 s ; générez celle choisie |
Comparer fit entre morceaux | Il classe les motifs à l'intérieur d'un seul morceau uniquement |
| Se fier à la tonalité sur un extrait de 10 secondes | Donnez les deux meilleures candidates |
Livrer le WAV sans check | Lancez check, et vérifiez aussi la copie encodée |
| Musique d'un modèle utilisée telle quelle | Faites d'abord look : le clipping et les pics +dBTP sont courants |
| Un fond qui lutte avec la voix | --lufs -22 --mute lead, et gardez les 1-4 kHz libres |