music-skill

Créez, analysez et vérifiez de la musique depuis un terminal, pour un agent qui ne peut pas l'entendre.

Qu'est-ce que music-skill ?

Ce skill permet à un agent d'interagir avec la musique de manière entièrement textuelle et quantitative, sans avoir besoin d'écouter. Il comprend un générateur de morceaux électroniques (house, techno) avec contrôle précis du tempo, de la tonalité, de la durée et du volume, produisant fichiers audio, MIDI, partitions textuelles et stems. Un analyseur extrait des informations objectives comme le BPM, la tonalité, la loudness (LUFS), le true peak, la stéréo, et génère un timeline détaillé et un spectrogramme visuel. Le vérificateur valide que le fichier respecte des cibles précises (loudness, crête) avant livraison, et l'outil d'analyse de mix détecte les conflits entre stems. Fonctionne sur toute plateforme avec uv et ffmpeg, utilisable avec Claude Code, Cursor, Codex ou tout agent en ligne de commande.

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

Installed? Explore more Productivité et collaboration skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

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 vouluOption
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.

  1. 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.
  2. Deviner. Chaque instrument commence par un motif aléatoire de 16 pas.
  3. 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é.
  4. 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.
  5. Écouter. banger.py joue 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.
  6. 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.

PartieRègleSource
Kicksur chaque temps ; au maximum 0-2 extras, placés juste avant un temps ; jamais deux d'affiléeButler 2006
Clapfort sur les temps 2 et 4, absent sur les temps 1 et 3 ; les extras sont doux et sur des doubles croches faiblesButler 2006 ; Witek 2014
Hatssur les contretemps, entre les kicks ; répartis uniformément ; identiques dans les deux moitiés de la mesure ; fort et doux alternentButler 2006 ; Toussaint 2005
Open hatà mi-chemin entre deux kicks, jamais sur un kick ou un clapButler 2006
Percussionrépartie uniformément, là où le kick et le clap sont silencieux, avec 25-50 % de ghost notes doucesToussaint 2005 ; Witek 2014
Bassejoue là où le kick ne joue pas ; fondamentale (ou son octave) 60-90 % du temps, quinte ou tierce pour la couleurPlomp & Levelt 1965 ; Krumhansl & Kessler 1982
Accordsla 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 suivantKrumhansl & Kessler 1982 ; Tymoczko 2011
Leadnotes 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'accordsPlomp & Levelt 1965 ; Huron 2001 ; Caplin 1998
Toutsyncope modérée : quelques notes sur des pas faibles qui sautent un temps fort. Trop peu est rigide, trop fait perdre le rythmeWitek et al. 2014
Timingswing 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 grooveDavies et al. 2013
Mixdeux parties dans la même bande sur le même pas se brouillent mutuellement ; pas plus de 4 parties sur un même pasPlomp & Levelt 1965
Structurebreak, build-up et drop : retirez le kick et la basse, augmentez la tension, ramenez-lesSolberg & 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

CibleValeur
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 voixenviron -22 LUFS
True peak, toujours-1 dBTP ou moins : le codage avec perte dépasse
Peak-to-loudness en dessous de 7 dBtrop limité : plat et fatiguant
Corrélation stéréo sous 120 Hz en dessous de 0,6les 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). Lancez check sur 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.txt avec 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

ErreurCorrection
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 unegroove.py --seed N affiche le score en 0,5 s ; générez celle choisie
Comparer fit entre morceauxIl classe les motifs à l'intérieur d'un seul morceau uniquement
Se fier à la tonalité sur un extrait de 10 secondesDonnez les deux meilleures candidates
Livrer le WAV sans checkLancez check, et vérifiez aussi la copie encodée
Musique d'un modèle utilisée telle quelleFaites 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

Skills associés