Communitygithub.com

VST Maker

Úsalo al diseñar, escribir, revisar, empaquetar o lanzar plugins de audio (sintetizadores, efectos, plugins controladores MIDI) en C++/JUCE para VST3 en Linux, macOS y Windows. Cubre seguridad en tiempo real, parámetros, CPU/RAM/GPU/latencia, calidad de sonido, diseño de instrumentos, filtros, efectos y presets, estándares de interfaz, instaladores y manuales offline, firma, pruebas y seguridad.

¿Qué es VST Maker?

Este skill, llamado 'VST Maker', es una habilidad comunitaria no oficial diseñada para desarrolladores que trabajan con plugins de audio en C++/JUCE. Su objetivo principal es guiar al usuario en todo el ciclo de vida de un plugin VST3, desde la configuración inicial del proyecto y la selección de licencias (como la AGPLv3 para JUCE) hasta el diseño de sonido, la optimización del rendimiento y la publicación. El skill se enfoca en estándares críticos como la seguridad en tiempo real (evitando asignaciones de memoria o E/S en el hilo de audio), la gestión de parámetros con `AudioProcessorValueTreeValue` para automatización y estado, y la calidad del sonido mediante técnicas anti-aliasing y diseño de filtros. Está pensado para usarse en plataformas como Claude Code o Cursor, proporcionando reglas claras y referencias verificadas (con etiquetas de confianza como 'V' para fuentes oficiales o 'R' para reglas generales) para evitar errores comunes y asegurar que el plugin funcione correctamente en Linux, macOS y Windows.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace VST Maker?

Skill comunitario no oficial. No está creado ni respaldado por ningún vendedor de plugins, sintetizadores o frameworks mencionado aquí.

Cómo leer las etiquetas de confianza:

  • (V: fuente) verificado contra la fuente nombrada.
  • (R) regla general o de gusto. Un valor inicial para probar midiendo y escuchando, nunca una ley.

Si un hecho no tiene etiqueta, es una práctica estándar que debes verificar antes de confiar en ella para un lanzamiento.

0. Reglas básicas

  • Pregunta antes de construir: tipo de plugin (sintetizador, efecto, controlador), SO destino (Linux, macOS, Windows), formatos (VST3 primero; CLAP o LV2 opcional), paleta de colores (nunca asumas una; ofrece un valor neutro por defecto si el usuario no tiene ninguna), licencia (ver 1).
  • Los plugins gratuitos y de código abierto deben funcionar sin conexión: sin cuenta, sin servidor de licencias, sin descarga al instalar o ejecutar. Todo lo que necesita el plugin está incluido.
  • Nunca digas que un sonido es bueno de oído. Mídelo (ver 12) y deja que los oídos del usuario tomen la decisión final.
  • Cita o prueba cada número. Di "no verificado" cuando una cifra sea una regla general.
  • Haz una cosa a la vez cuando el usuario no es programador. Primero respuestas cortas, detalles bajo petición.

1. Configuración del proyecto y licencia

  • JUCE tiene doble licencia: la licencia JUCE y AGPLv3. Sin un plan JUCE de pago, debes usarlo bajo AGPLv3, y AGPLv3 exige más que publicar el código fuente (V: foro de JUCE, respuesta del personal). Lee la licencia JUCE actual para la versión que uses antes de elegir, e informa al usuario cuál aplica. No indiques precios de niveles ni límites de ingresos de memoria.
  • Usa CMake. Mantén el código DSP libre de tipos GUI de JUCE para que pueda probarse unitariamente sin una ventana.
  • Construye VST3 primero. CLAP y LV2 son opcionales: verifica la documentación actual de JUCE y clap-juce-extensions antes de prometer cualquiera de ellos.
  • Dónde buscan los hosts VST3 (V: Portal de desarrolladores VST 3 de Steinberg, Ubicaciones de plugins):
    • Linux: $HOME/.vst3/ primero, luego /usr/lib64/vst3/, /usr/lib/vst3/, /usr/local/lib64/vst3/, /usr/local/lib/vst3/.
    • macOS: ~/Library/Audio/Plug-ins/VST3/ (usuario), /Library/Audio/Plug-ins/VST3/ (global).
    • Windows: C:\Program Files\Common Files\VST3\ (global), %LOCALAPPDATA%\Programs\Common\VST3\ (usuario, principalmente para desarrollo).
    • Los hosts usan el primer plugin encontrado para un UID de procesador dado, escaneando en orden de prioridad.

2. Seguridad en tiempo real

processBlock se ejecuta en un hilo de audio de alta prioridad con un plazo estricto. Los documentos de JUCE dicen que cualquier interacción con la interfaz de usuario allí está fuera de discusión, y el código debe manejar tamaños de bloque variables (V: documentos de AudioProcessor de JUCE).

Nunca en el hilo de audio:

  • asignar o liberar memoria (new, delete, malloc, vectores o cadenas en crecimiento, construir juce::String)
  • tomar un bloqueo que otro hilo pueda mantener (std::mutex, CriticalSection)
  • E/S de archivos, red o consola
  • llamar a la interfaz de usuario o MessageManager
  • lanzar excepciones o llamar a cualquier cosa con comportamiento en tiempo real desconocido

En su lugar:

  • Asigna en prepareToPlay (la frecuencia de muestreo permanece constante hasta que la reproducción se detiene; el tamaño del bloque es solo una sugerencia y los documentos dicen que se programe defensivamente en caso de que un host lo supere) (V: documentos de JUCE). Libera en releaseResources o el destructor.
  • Comunícate con otros hilos usando colas libres de bloqueos (juce::AbstractFifo) o atómicos. La interfaz de usuario sondea atómicos con un Temporizador; o activa AsyncUpdater desde el hilo de audio.
  • Pon juce::ScopedNoDenormals al inicio de processBlock; permanece activo hasta que la función retorna, por lo que los ayudantes no lo repiten (V: consenso del foro de JUCE, no documentación oficial). También diseña caminos de retroalimentación para que no puedan degradarse a denormales.
  • Lectura recomendada: Ross Bencina, "Real-time audio programming 101: time waits for nothing" (no citado aquí, no se pudo obtener cuando se escribió este skill).

3. Parámetros y estado

  • Usa AudioProcessorValueTreeState: la automatización del host, deshacer y guardar estado vienen incluidos.
  • Suaviza cada parámetro que llegue a una ganancia, frecuencia, mezcla o tiempo de retardo (juce::SmoothedValue), o tendrás ruido de cremallera y clics.
  • Lee los valores una vez por bloque en variables locales a menos que el valor se suavice por muestra.
  • Dale a cada parámetro un ID de cadena estable. Nunca renombres o reordenes IDs después del lanzamiento: rompe proyectos guardados y automatización. Añade nuevos parámetros con nuevos IDs y mantén un número de versión de estado.
  • Valida todo lo cargado desde estado o presets: limita rangos, ignora claves desconocidas, nunca confíes en tamaños o conteos.
  • Mantén el procesador (DSP y estado) estrictamente separado del editor (interfaz de usuario). El procesador debe funcionar perfectamente con la ventana del editor cerrada. VST3 mismo divide un plugin en un procesador y un controlador (V: tutorial de Steinberg VST 3, "Code your first plug-in").
  • Datos de VST3 que vale la pena conocer incluso cuando JUCE los envuelve (V: mismo tutorial): los parámetros siempre están normalizados de 0.0 a 1.0; establece el flag automatizable para que los hosts puedan automatizar; un bloque de procesamiento puede contener más de un cambio para el mismo parámetro, por lo que un procesador escrito a mano debe manejar la cola correctamente (el tutorial solo aplica el último cambio, lo cual es una simplificación); si la entrada está en silencio, establece y respeta los flags de silencio y limpia los buffers de salida; rechaza configuraciones de bus no soportadas en lugar de adivinar; cuando no hay entradas o muestras, aún aplica los cambios de parámetros pendientes.

Más datos de arquitectura VST3 (V: Portal de desarrolladores VST 3 de Steinberg, documentación de API):

  • El procesador debe funcionar sin controlador cargado, por lo que el estado DSP nunca depende del editor.
  • process() y setProcessing() pueden ejecutarse en el hilo de audio: sin asignación. Initialize y terminate se ejecutan en el hilo de la interfaz de usuario.
  • Las configuraciones de bus y altavoces solo pueden cambiar mientras el plugin está inactivo. Proporciona buffers para todos los buses, incluso los inactivos. Los buffers de entrada y salida pueden compartir memoria, así que no limpies ciegamente las salidas.
  • Las notas llegan como eventos en process(). Los cambios de parámetros llegan con precisión de muestra a través de colas de parámetros. El tempo y el transporte llegan en el contexto de proceso.
  • Las ediciones de GUI al host usan beginEdit, performEdit, endEdit en ese orden, solo en el hilo de la interfaz de usuario.
  • Al restaurar el estado, el procesador se restaura primero; luego el controlador recibe el estado del componente y no debe disparar callbacks de manejadores.
  • No envíes mensajes privados de procesador a controlador desde process(); usa el hilo de la interfaz de usuario o la API de Intercambio de Datos.
  • Las unidades agrupan parámetros; la interfaz de mapeo MIDI mapea CCs MIDI a parámetros.
  • Páginas del portal para leer cuando sea necesario: Parámetros y Automatización, Diagramas de Flujo de Trabajo, Múltiple IO Dinámico (sidechain), Unidades VST 3, Intercambio de Datos.

4. Rendimiento: CPU, RAM, GPU

  • Mide antes de optimizar (ver 12).
  • CPU (R): procesa en bloques, precalcula coeficientes cuando un parámetro cambia, evita bifurcaciones por muestra y llamadas virtuales en bucles internos, evita std::pow, std::exp, std::sin por muestra donde una recurrencia o tabla funcione y mida más rápido.
  • RAM: preasigna una vez, comparte tablas de ondas y tablas entre voces, libera buffers grandes en releaseResources.
  • GPU e interfaz de usuario: dibuja solo mientras el editor está visible y al frente. Pausa temporizadores, medidores y animaciones de lienzo cuando está oculto; el audio, la automatización y el MIDI siguen funcionando. Limita la tasa de repintado y repinta solo regiones sucias (R). Usa renderizado GPU solo si es claramente necesario y probado en Linux.
  • Un editor oculto o cerrado no debe mantener trabajo por cuadro en funcionamiento.

5. Latencia

  • Reporta la latencia real con setLatencySamples ("el número de muestras de retardo que introduce", V: documentos de JUCE) cuando el plugin retarde el audio: limitadores o compresores con lookahead, filtros de fase lineal, filtros de sobremuestreo. Verifica en un host que el reporte se aplique.
  • Los instrumentos añaden latencia cero desde la pulsación de nota hasta el sonido.
  • Los filtros de sobremuestreo de fase lineal añaden latencia; los de fase mínima no, pero cambian la fase. Elige a propósito y documéntalo. juce::dsp::Oversampling reporta su latencia; repórtalo.
  • Mantén getTailLengthSeconds correcto para reverberaciones y retardos para que los hosts no corten las colas.

6. Calidad de sonido

Aliasing

  • Las ondas de diente de sierra y cuadrada ingenuas tienen armónicos por encima de Nyquist que se pliegan como ruido no armónico. Soluciones: métodos de paso limitado en banda (familia BLEP), formas de onda polinómicas diferenciadas, tablas de ondas limitadas en banda por octava, o sobremuestreo.
  • Un método publicado: formas de onda polinómicas diferenciadas; la evaluación de modelo auditivo de los autores encontró que un método de cuarto orden era perceptualmente libre de alias en todo el rango de un piano de cola (V: Välimäki, Nam, Smith, Abel, IEEE TASLP vol. 18 no. 4, 2010).
  • Cualquier no linealidad (distorsión, saturación, wavefolding, recorte duro) crea nuevos armónicos que aliasean. Sobremuestrea alrededor de etapas no lineales, o usa antialiasing basado en antiderivadas. Zavalishin cubre el antialiasing de waveshaping (V: "The Art of VA Filter Design", sección 6.13).
  • Prueba el aliasing por medición (ver 12), no a ojo en el código del oscilador.

Filtros

  • Para filtros analógicos modelados usa estructuras de retroalimentación de retardo cero (transformación preservadora de topología). El libro los cubre en el capítulo 3 (sección 3.9, retroalimentación de retardo cero), el ladder estilo Moog en el capítulo 5, y la saturación en bucle de retroalimentación en el capítulo 6 (V: Zavalishin, "The Art of VA Filter Design", rev. 2.1.0, tabla de contenidos).
  • Para EQ simple y filtros de utilidad usa biquads. El Audio EQ Cookbook (R. Bristow-Johnson, W3C Working Group Note 2021) da paso bajo, paso alto, paso banda, notch, paso todo, EQ de pico y estanterías (V).
  • Suaviza cambios de corte y resonancia, limita el corte por debajo de Nyquist, mantén la resonancia estable en extremos, y compensa el nivel para que la resonancia alta no salte el volumen.

Suave en lugar de áspero (R, de la práctica de productores; prueba cada uno)

  • La aspereza generalmente proviene de aliasing, recorte duro, picos de resonancia fuertes en los medios altos y demasiado extremo superior sin filtrar.
  • Un lead con el pasabajos completamente abierto puede sonar demasiado brillante. Un corte inicial alrededor de 12 kHz para leads brillantes es un valor de gusto reportado por usuarios, no una regla.
  • La saturación dentro del bucle de retroalimentación del filtro es una razón común por la que los filtros de estilo analógico suenan suaves (V: Zavalishin cubre la saturación en bucle de retroalimentación; la afirmación perceptual es R).
  • Una modulación muy pequeña y lenta mantiene vivos los tonos estáticos, por ejemplo una deriva de tono de unos pocos cents. Convierte antes de elegir: 0.1 por ciento es aproximadamente 1.7 cents, 1 por ciento es aproximadamente 17 cents, y 17 cents es claramente audible como desafinación. Quédate en el extremo bajo a menos que la desafinación sea el objetivo.
  • Los sonidos gruesos provienen de capas, unísono con propagación de desafinación, un suboscilador y anchura estéreo. Verifica la compatibilidad mono (suma L y R, escucha sonidos huecos o de cancelación).

Gain staging y DC

  • Ejecuta la cadena interna en float con amplio margen de reserva. Nunca recortes dentro de la cadena. Pon el único recortador o limitador a la salida, a propósito.
  • Elimina DC después de no linealidades asimétricas con un pasaalto suave en el rango de unos pocos Hz a decenas de Hz (R); verifica con la medición de DC en 12.
  • Iguala el volumen de los presets (ver 9) para que al cambiar presets no salte el nivel.

7. Diseño de sintetizador

  • Voces: preasigna cada voz, nunca asignes al pulsar nota. Haz que la polifonía sea una constante o una configuración del usuario. Roba voces con un fundido corto, nunca un corte brusco.
  • Envolventes: usa un ataque y liberación mínimos de unos pocos milisegundos para evitar clics; al reactivar, comienza desde el nivel actual, no desde cero.
  • Unísono: fases iniciales aleatorias o extendidas, una curva de propagación de desafinación, propagación estéreo, y una compensación de nivel que no crezca con el número de voces.
  • Supersaw: el Roland JP-8000 Super Saw se describe como si se asemejara a siete osciladores de diente de sierra desafinados entre sí (V: Wikipedia, Roland JP-8000). Existen análisis detallados: Adam Szabo, "How to Emulate the Super Saw" (KTH, 2010) y Alex Shore (2013), ambos citados en esa página. Léelos para curvas de desafinación y mezcla en lugar de adivinar números.
  • Deriva y sensación analógica: modulación aleatoria lenta de tono y corte, por voz, pequeña y no correlacionada.
  • Ideas vistas en sintetizadores supersaw comerciales, solo para estudio; escribe tu propio código y diseño, nunca copies el código, apariencia, nombre o presets de un producto (R, verifica al oído y por medición):
    • Un LFO lento por oscilador, con frecuencias espaciadas por proporciones irracionales como la proporción áurea, para que el movimiento combinado no se repita audiblemente.
    • Un macro "deriva" que escala la desafinación y la profundidad de deriva juntas, con controles finos en una segunda página.
    • Un pasaaltos con seguimiento de teclas como control propio (el sonido supersaw estilo JP-8000 usa uno).
    • Un filtro sobremuestreado opcional 2x o 4x; reporta la latencia de sobremuestreo al host.
    • Verifica escalas de dB en medidores, propagación estéreo por voz y efectos con capacidad de sidechain: brechas que algunos productos dejan y los usuarios notan.
  • MIDI: usa la posición de muestra de cada evento MIDI dentro del bloque para que las notas comiencen con precisión de muestra. Maneja pitch bend (rango predeterminado de dos semitonos, configurable), pedal de sustain, todas las notas apagadas, y nota apagada con liberación. Ofrece mono, legato y portamento si el instrumento está orientado a lead o bajo.
  • Tablas de ondas: limita en banda por octava o por rango de tono; funde entre fotogramas para evitar ruido de cremallera; interpola (lineal es barato, orden superior consume CPU, mide el aliasing).

8. Diseño de efectos

  • Compresor y limitador: detecta en el dominio logarítmico con ataque y liberación suavizados, aplica suavizado de ganancia, añade makeup automático o manual, reporta latencia si usas lookahead. Un limitador al final de una cadena necesita un techo de pico verdadero o sobremuestreado si promete seguridad entre muestras.
  • Multibanda: divide con cruces Linkwitz-Riley para que las bandas sumen planas; procesa cada banda; recombinar. Mantén los cruces consistentes en fase y reporta cualquier latencia añadida.
  • Retardo: interpolación de retardo fraccional, filtros de amortiguación en el camino de retroalimentación, sincronización de tempo, ping-pong, ducking, y un límite de retroalimentación para que no pueda descontrolarse.
  • Reverberación: redes de retroalimentación de retardo o la topología de placa Dattorro (J. Dattorro, "Effect Design Part 1", JAES 1997); amortigua los agudos en la cola; modula ligeramente las líneas de retardo para evitar anillos metálicos; expone predelay, decay, damping, tamaño y mezcla.
  • Práctica inicial común para leads, prueba al oído (R): mantén el retorno de la reverberación fuera de los bajos con un pasaaltos alrededor de 200 a 300 Hz, corta los agudos de la cola, y usa una mezcla moderada.
  • Chorus, ensemble, fase ... [truncado para traducción]

Skills relacionados