Communitygithub.com

VST Maker

Utilisé pour concevoir, écrire, réviser, empaqueter ou publier des plugins audio (synths, effets, plugins contrôleurs MIDI) en C++/JUCE pour VST3 sur Linux, macOS et Windows. Couvre la sécurité temps réel, les paramètres, la latence CPU/RAM/GPU, la qualité sonore, la conception d'instruments, filtres, effets et presets, les normes d'interface, les installateurs hors ligne et manuels, la signature, les tests et la sécurité.

Qu'est-ce que VST Maker ?

Ce skill, intitulé **VST Maker**, est un guide communautaire non officiel destiné aux développeurs créant des plugins audio (synthétiseurs, effets, contrôleurs MIDI) en C++ avec le framework JUCE, ciblant principalement le format VST3 sur Linux, macOS et Windows. Il couvre l'ensemble du cycle de vie d'un plugin, de la configuration initiale du projet et de la licence à la publication, en passant par la conception, le développement et les tests. Le skill met un fort accent sur la sécurité temps réel, fournissant des listes strictes d'opérations interdites sur le thread audio et des alternatives sûres. Il détaille également les normes de performance (CPU, RAM, GPU), la gestion des paramètres et de l'état via `AudioProcessorValueTreeState`, et les meilleures pratiques de qualité sonore pour éviter le crénelage, concevoir des filtres analogiques convaincants, et assurer un gain staging et une absence de composante continue (DC) corrects. Le skill inclut des directives spécifiques pour la conception de synthétiseurs (voix, enveloppes, supersaw, wavetables) et d'effets (compresseurs, réverbes, delays), ainsi que des sections sur les presets, l'emballage, le déploiement et les tests. Il se distingue par ses balises de confiance, indiquant si les informations proviennent de sources vérifiées (V), de règles empiriques (R) ou de pratiques standard, encourageant ainsi une vérification autonome des faits critiques.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SpeakingColors/claude-skills/tree/HEAD/skills/vst-maker

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 VST Maker ?

Skill communautaire non officiel. Ni fabriqué ni approuvé par aucun vendeur de plugin, synthé ou framework nommé ici.

Comment lire les balises de confiance :

  • (V : source) vérifié par rapport à la source nommée.
  • (R) règle empirique ou goût. Une valeur de départ à tester en mesurant et en écoutant, jamais une loi.

Si un fait n'a pas de balise, il s'agit d'une pratique standard que vous devez tout de même vérifier avant de vous y fier pour une publication.

0. Règles de base

  • Demander avant de construire : type de plugin (synthé, effet, contrôleur), OS cible (Linux, macOS, Windows), formats (VST3 en premier ; CLAP ou LV2 en option), palette de couleurs (ne jamais en supposer une ; proposer un défaut neutre si l'utilisateur n'en a pas), licence (voir 1).
  • Les plugins gratuits et open source doivent fonctionner hors ligne : pas de compte, pas de serveur de licence, pas de téléchargement à l'installation ou à l'exécution. Tout ce dont le plugin a besoin est fourni.
  • Ne jamais prétendre qu'un son est bon à l'oreille. Le mesurer (voir 12) et laisser l'oreille de l'utilisateur juger.
  • Citer ou tester chaque nombre. Dire « non vérifié » lorsqu'un chiffre est une règle empirique.
  • Faire une chose à la fois lorsque l'utilisateur n'est pas un programmeur. Réponses courtes d'abord, détails sur demande.

1. Configuration du projet et licence

  • JUCE est sous double licence : la licence JUCE et l'AGPLv3. Sans plan JUCE payant, vous devez l'utiliser sous AGPLv3, et l'AGPLv3 demande plus que la simple publication du code source (V : forum JUCE, réponse du personnel). Lisez la licence JUCE actuelle pour la version que vous utilisez avant de choisir, et dites à l'utilisateur laquelle s'applique. Ne citez pas de mémoire les prix des niveaux ou les limites de revenus.
  • Utilisez CMake. Gardez le code DSP exempt de types GUI JUCE afin de pouvoir le tester unitairement sans fenêtre.
  • Construisez d'abord le VST3. CLAP et LV2 sont optionnels : vérifiez la documentation JUCE actuelle et clap-juce-extensions avant de promettre l'un ou l'autre.
  • Là où les hôtes recherchent les VST3 (V : Steinberg VST 3 Developer Portal, Plug-in Locations) :
    • Linux : $HOME/.vst3/ en premier, puis /usr/lib64/vst3/, /usr/lib/vst3/, /usr/local/lib64/vst3/, /usr/local/lib/vst3/.
    • macOS : ~/Library/Audio/Plug-ins/VST3/ (utilisateur), /Library/Audio/Plug-ins/VST3/ (global).
    • Windows : C:\Program Files\Common Files\VST3\ (global), %LOCALAPPDATA%\Programs\Common\VST3\ (utilisateur, principalement pour le développement).
    • Les hôtes utilisent le premier plugin trouvé pour un UID de processeur donné, en scannant par ordre de priorité.

2. Sécurité temps réel

processBlock s'exécute sur un thread audio haute priorité avec une échéance stricte. La documentation JUCE indique que toute interaction avec l'interface utilisateur y est exclue, et le code doit gérer des tailles de bloc variables (V : doc JUCE AudioProcessor).

Jamais sur le thread audio :

  • allouer ou libérer de la mémoire (new, delete, malloc, vecteurs ou chaînes en croissance, construction de juce::String)
  • prendre un verrou qu'un autre thread peut détenir (std::mutex, CriticalSection)
  • E/S fichier, réseau ou console
  • appeler l'interface utilisateur ou le MessageManager
  • lancer des exceptions ou appeler quoi que ce soit ayant un comportement temps réel inconnu

À la place :

  • Allouer dans prepareToPlay (la fréquence d'échantillonnage reste constante jusqu'à l'arrêt de la lecture ; la taille de bloc n'est qu'une indication et la documentation dit de programmer de manière défensive au cas où un hôte la dépasse) (V : doc JUCE). Libérer dans releaseResources ou le destructeur.
  • Communiquer avec d'autres threads via des files d'attente sans verrou (juce::AbstractFifo) ou des atomiques. L'interface utilisateur interroge les atomiques avec un Timer ; ou déclencher AsyncUpdater depuis le thread audio.
  • Mettre juce::ScopedNoDenormals en haut de processBlock ; il reste actif jusqu'au retour de la fonction, donc les fonctions auxiliaires ne le répètent pas (V : consensus du forum JUCE, pas de documentation officielle). Concevoir également les chemins de rétroaction pour qu'ils ne puissent pas dégénérer en dénormaux.
  • Lecture recommandée : Ross Bencina, « Real-time audio programming 101 : time waits for nothing » (non cité ici, n'a pas pu être récupéré lors de la rédaction de ce skill).

3. Paramètres et état

  • Utiliser AudioProcessorValueTreeState : l'automatisation de l'hôte, l'annulation et la sauvegarde d'état sont incluses.
  • Lisser chaque paramètre qui atteint un gain, une fréquence, un mix ou un temps de retard (juce::SmoothedValue), sinon vous obtenez du bruit de zipper et des clics.
  • Lire les valeurs une fois par bloc dans des variables locales sauf si la valeur est lissée par échantillon.
  • Donner à chaque paramètre un ID de chaîne stable. Ne jamais renommer ou réordonner les ID après la publication : cela casse les projets sauvegardés et l'automatisation. Ajouter de nouveaux paramètres avec de nouveaux ID et conserver un numéro de version d'état.
  • Valider tout ce qui est chargé depuis l'état ou les presets : limiter les plages, ignorer les clés inconnues, ne jamais faire confiance aux tailles ou aux comptes.
  • Garder le processeur (DSP et état) strictement séparé de l'éditeur (interface utilisateur). Le processeur doit fonctionner parfaitement avec la fenêtre de l'éditeur fermée. VST3 lui-même divise un plugin en un processeur et un contrôleur (V : tutoriel Steinberg VST 3, « Code your first plug-in »).
  • Faits VST3 à connaître même lorsque JUCE les encapsule (V : même tutoriel) : les paramètres sont toujours normalisés de 0,0 à 1,0 ; définir le drapeau automatable pour que les hôtes puissent automatiser ; un bloc de traitement peut contenir plus d'un changement pour le même paramètre, donc un processeur écrit à la main doit gérer la file d'attente correctement (le tutoriel n'applique que le dernier changement, ce qui est une simplification) ; si l'entrée est silencieuse, définir et honorer les drapeaux de silence et effacer les tampons de sortie ; rejeter les configurations de bus non prises en charge plutôt que de deviner ; lorsqu'il n'y a ni entrées ni échantillons, toujours appliquer les changements de paramètres en attente.

Plus de faits sur l'architecture VST3 (V : Steinberg VST 3 Developer Portal, documentation de l'API) :

  • Le processeur doit fonctionner sans contrôleur chargé, donc l'état DSP ne dépend jamais de l'éditeur.
  • process() et setProcessing() peuvent s'exécuter sur le thread audio : pas d'allocation. Initialize et terminate s'exécutent sur le thread de l'interface utilisateur.
  • Les configurations de bus et de haut-parleurs ne peuvent changer que lorsque le plugin est inactif. Fournir des tampons pour tous les bus, même inactifs. Les tampons d'entrée et de sortie peuvent partager la mémoire, donc ne pas effacer aveuglément les sorties.
  • Les notes arrivent sous forme d'événements dans process(). Les changements de paramètres arrivent avec une précision d'échantillon via des files d'attente de paramètres. Le tempo et le transport arrivent dans le contexte du processus.
  • Les modifications de l'interface utilisateur vers l'hôte utilisent beginEdit, performEdit, endEdit dans cet ordre, uniquement sur le thread de l'interface utilisateur.
  • Lors de la restauration de l'état, le processeur est restauré en premier ; le contrôleur reçoit ensuite l'état du composant et ne doit pas déclencher de callbacks de gestionnaire.
  • N'envoyez pas de messages privés processeur-à-contrôleur depuis process() ; utilisez le thread de l'interface utilisateur ou l'API Data Exchange.
  • Les unités regroupent les paramètres ; l'interface de mappage MIDI mappe les CC MIDI aux paramètres.
  • Pages du portail à lire si nécessaire : Paramètres et Automatisation, Diagrammes de flux de travail, Entrées/Sorties dynamiques multiples (sidechain), Unités VST 3, Échange de données.

4. Performance : CPU, RAM, GPU

  • Mesurer avant d'optimiser (voir 12).
  • CPU (R) : traiter par blocs, précalculer les coefficients lorsqu'un paramètre change, éviter les branches par échantillon et les appels virtuels dans les boucles internes, éviter std::pow, std::exp, std::sin par échantillon là où une récurrence ou une table fonctionne et mesure plus rapidement.
  • RAM : préallouer une fois, partager les tables d'ondes et les tables entre les voix, libérer les gros tampons dans releaseResources.
  • GPU et interface utilisateur : dessiner uniquement lorsque l'éditeur est visible et au premier plan. Mettre en pause les timers, les compteurs et l'animation du canevas lorsque caché ; l'audio, l'automatisation et le MIDI continuent de fonctionner. Limiter le taux de rafraîchissement et ne rafraîchir que les régions modifiées (R). Utiliser le rendu GPU uniquement si clairement nécessaire et testé sur Linux.
  • Un éditeur caché ou fermé ne doit pas continuer à exécuter un travail par image.

5. Latence

  • Signaler la latence réelle avec setLatencySamples (« le nombre d'échantillons de retard qu'il introduit », V : doc JUCE) chaque fois que le plugin retarde l'audio : limiteurs ou compresseurs à anticipation, filtres à phase linéaire, filtres de suréchantillonnage. Vérifier dans un hôte que le rapport est appliqué.
  • Les instruments ajoutent une latence nulle de la note-on au son.
  • Les filtres de suréchantillonnage à phase linéaire ajoutent de la latence ; ceux à phase minimale n'en ajoutent pas mais changent la phase. Choisir intentionnellement et le documenter. juce::dsp::Oversampling signale sa latence ; la signaler.
  • Garder getTailLengthSeconds correct pour les réverbes et les délais afin que les hôtes ne coupent pas les queues.

6. Qualité sonore

Crénelage

  • Les ondes en dents de scie et carrées naïves ont des harmoniques au-dessus de Nyquist qui se replient sous forme de bruit non harmonique. Correctifs : méthodes de pas à bande limitée (famille BLEP), formes d'onde polynomiales différenciées, tables d'ondes à bande limitée par octave, ou suréchantillonnage.
  • Une méthode publiée : formes d'onde polynomiales différenciées ; l'évaluation par modèle d'écoute des auteurs a trouvé une méthode du quatrième ordre perceptuellement sans crénelage sur toute la gamme d'un piano à queue (V : Välimäki, Nam, Smith, Abel, IEEE TASLP vol. 18 n° 4, 2010).
  • Toute non-linéarité (distorsion, saturation, wavefolding, écrêtage dur) crée de nouvelles harmoniques qui crénellent. Suréchantillonner autour des étages non linéaires, ou utiliser un anti-crénelage basé sur les antidérivées. Zavalishin couvre l'anti-crénelage du waveshaping (V : « The Art of VA Filter Design », section 6.13).
  • Tester le crénelage par mesure (voir 12), pas à l'œil sur le code de l'oscillateur.

Filtres

  • Pour les filtres analogiques modélisés, utiliser des structures à retour nul (topology-preserving transform). Le livre les couvre au chapitre 3 (section 3.9, retour nul), le ladder style Moog au chapitre 5, et la saturation dans la boucle de rétroaction au chapitre 6 (V : Zavalishin, « The Art of VA Filter Design », rév. 2.1.0, table des matières).
  • Pour les EQ simples et les filtres utilitaires, utiliser des biquads. L'Audio EQ Cookbook (R. Bristow-Johnson, W3C Working Group Note 2021) donne les passe-bas, passe-haut, passe-bande, notch, tout-passe, EQ en cloche et shelfs (V).
  • Lisser les changements de coupure et de résonance, limiter la coupure en dessous de Nyquist, maintenir la résonance stable aux extrêmes, et compenser le niveau pour qu'une résonance élevée ne fasse pas sauter le volume.

Lisse plutôt que dur (R, d'après la pratique des producteurs ; tester chaque)

  • La dureté vient généralement du crénelage, de l'écrêtage dur, des pics de résonance forts dans les médiums aigus, et d'un haut trop non filtré.
  • Un lead avec le passe-bas complètement ouvert peut sembler trop brillant. Une coupure de départ autour de 12 kHz pour les leads brillants est une valeur de goût rapportée par les utilisateurs, pas une règle.
  • La saturation dans la boucle de rétroaction du filtre est une raison courante pour laquelle les filtres de style analogique sonnent lisses (V : Zavalishin couvre la saturation de la boucle de rétroaction ; l'affirmation perceptuelle est R).
  • Une modulation très faible et lente maintient les sons statiques en vie, par exemple une dérive de hauteur de quelques cents. Convertir avant de choisir : 0,1 pour cent correspond à environ 1,7 cents, 1 pour cent à environ 17 cents, et 17 cents est clairement audible comme un désaccordage. Rester à l'extrémité inférieure sauf si le désaccordage est le but.
  • Les sons épais proviennent du calque, de l'unisson avec un spread de désaccordage, d'un sous-oscillateur et de la largeur stéréo. Vérifier la compatibilité mono (sommer L et R, écouter les sons creux ou annulés).

Gain staging et composante continue (DC)

  • Exécuter la chaîne interne en float avec une marge généreuse. Ne jamais écrêter à l'intérieur de la chaîne. Placer le seul clipper ou limiteur à la sortie, intentionnellement.
  • Supprimer la DC après les non-linéarités asymétriques avec un passe-haut doux dans la plage de quelques Hz à quelques dizaines de Hz (R) ; vérifier avec la mesure DC en 12.
  • Adapter le volume des presets (voir 9) afin que le changement de presets ne fasse pas sauter le niveau.

7. Conception de synthétiseur

  • Voix : préallouer chaque voix, ne jamais allouer au moment de note-on. Faire de la polyphonie une constante ou un paramètre utilisateur. Voler les voix avec un fondu court, jamais une coupure brutale.
  • Enveloppes : utiliser une attaque et un relâchement minimaux de quelques millisecondes pour éviter les clics ; lors du redéclenchement, démarrer depuis le niveau actuel, pas depuis zéro.
  • Unisson : phases de départ aléatoires ou étalées, une courbe de désaccordage, une largeur stéréo, et une compensation de niveau qui ne croît pas avec le nombre de voix.
  • Supersaw : le Super Saw du Roland JP-8000 est décrit comme ressemblant à sept oscillateurs en dents de scie désaccordés les uns contre les autres (V : Wikipédia, Roland JP-8000). Des analyses détaillées existent : Adam Szabo, « How to Emulate the Super Saw » (KTH, 2010) et Alex Shore (2013), tous deux cités sur cette page. Les lire pour les courbes de désaccordage et le mixage au lieu de deviner les nombres.
  • Dérive et sensation analogique : modulation aléatoire lente de la hauteur et de la coupure, par voix, petite et non corrélée.
  • Idées vues dans les supersaw synthés commerciaux, pour étude uniquement ; écrivez votre propre code et conception, ne copiez jamais le code, l'apparence, le nom ou les presets d'un produit (R, vérifier à l'oreille et par mesure) :
    • Un LFO lent par oscillateur, avec des fréquences espacées par des rapports irrationnels comme le nombre d'or, afin que le mouvement combiné ne se répète pas de manière audible.
    • Une macro « drift » qui met à l'échelle le désaccordage et la profondeur de la dérive ensemble, avec des réglages fins sur une deuxième page.
    • Un passe-haut keytracked comme contrôle propre (le son supersaw de style JP-8000 en utilise un).
    • Un filtre suréchantillonné 2x ou 4x en option ; signaler la latence du suréchantillonnage à l'hôte.
    • Vérifier les échelles en dB sur les compteurs, la largeur stéréo par voix, et les effets compatibles sidechain : des lacunes que certains produits laissent et que les utilisateurs remarquent.
  • MIDI : utiliser la position d'échantillon de chaque événement MIDI dans le bloc pour que les notes commencent avec une précision d'échantillon. Gérer le pitch bend (plage par défaut de deux demi-tons, configurable), la pédale de sustain, all-notes-off, et le note-off avec relâchement. Proposer mono, legato et portamento si l'instrument est orienté lead ou basse.
  • Tables d'ondes : limiter la bande par octave ou par plage de hauteur ; interpoler entre les trames pour éviter le bruit de zipper ; interpoler (linéaire est bon marché, un ordre plus élevé coûte du CPU, mesurer le crénelage).

8. Conception d'effets

  • Compresseur et limiteur : détecter dans le domaine logarithmique avec attaque et relâchement lissés, appliquer un lissage de gain, ajouter un gain de compensation automatique ou manuel, signaler la latence si vous utilisez l'anticipation. Un limiteur à la fin d'une chaîne a besoin d'un plafond true-peak ou suréchantillonné s'il promet une sécurité inter-échantillon.
  • Multibande : diviser avec des filtres croisés Linkwitz-Riley pour que les bandes se recombinent à plat ; traiter chaque bande ; recombiner. Garder les filtres croisés cohérents en phase et signaler toute latence ajoutée.
  • Delay : interpolation de retard fractionnaire, filtres d'amortissement dans le chemin de rétroaction, synchronisation tempo, ping-pong, ducking, et une limite de rétroaction pour qu'il ne puisse pas s'emballer.
  • Réverbération : réseaux de délais à rétroaction ou la topologie de plaque Dattorro (J. Dattorro, « Effect Design Part 1 », JAES 1997) ; amortir les aigus dans la queue ; moduler légèrement les lignes à retard pour éviter les sonorités métalliques ; exposer le pré-delai, le decay, l'amortissement, la taille et le mix.
  • Pratique de départ courante pour les leads, tester à l'oreille (R) : garder le retour de réverbération hors des graves avec un passe-haut autour de 200 à 300 Hz, atténuer les aigus de la queue, et utiliser un mix modéré.
  • Chorus, ensemble, phase

…

[tronqué pour la traduction]

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés