Referencia completa de ChiptuneSynth — Sintetizador chiptune de 4 pistas para la API de audio web
// 1. Include the library
<script src="chiptune-synth.js"></script>
// 2. Create and initialize
const synth = new ChiptuneSynth();
await synth.init();
// 3. Play a note
synth.playNoteByName('C', 4, 0, 0.5);
// 4. Or play a sound effect
synth.playPreset('coin');
// 5. Load an instrument
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 1.0); init()` dentro de un controlador de clic o tras la interacción del usuario.Crea una nueva instancia del sintetizador con 4 pistas (Lead, Bass, Drums, FX), envolventes predeterminadas y ajustes de vibrato vacíos.
const synth = new ChiptuneSynth(); Inicializa el contexto de la API de Web Audio, crea la ganancia maestra, el analizador, los nodos de ganancia por pista y el búfer de ruido. Debe llamarse una vez antes de cualquier reproducción.
await synth.init(); Detiene todas las notas y cierra el AudioContext. Llámalo cuando hayas terminado de usar el sintetizador.
Reproduce una nota a la frecuencia dada (Hz) en la pista especificada.
| Parámetro | Tipo | Valor predeterminado | Descripción |
|---|---|---|---|
| frecuencia | número | — | Frecuencia en Hz (por ejemplo, 440 para el La4) |
| índice de pista | número | 0 | Índice de pista: 0=Melodía, 1=Bajo, 2=Batería, 3=Efectos |
| duración | número | 10 | Duración en segundos. Los valores ≥10 crean notas sostenidas |
| hora de inicio | número | ahora | AudioContext hora de inicio (para programación) |
const noteId = synth.playNote(440, 0, 0.5); // A4, Lead, 0.5s duration = 10 o superior para notas sostenidas que controles manualmente con stopNote(). Así es como funcionan el teclado y el MIDI.Reproduce una nota por su nombre musical.
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| note | cadena | — | Nombre de la nota: Do, Do sostenido, Re, Re sostenido, Mi, Fa, Fa sostenido, Sol, Sol sostenido, La, La sostenido, Si (también Re bemol, Mi bemol, Sol bemol, La bemol, Si bemol) |
| octava | número | 4 | Octava (1-7) |
| índice de pista | número | 0 | Pista de destino |
| duración | número | 10 | Duración en segundos |
synth.playNoteByName('C', 4, 0, 0.5); // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass Detiene una nota específica con su envolvente de liberación. Utiliza el noteId devuelto por playNote() o playNoteByName().
Detiene inmediatamente todas las notas activas en todas las pistas.
Carga y reproduce un preset SFX integrado en una sola llamada. Perfecto para efectos de sonido de juegos.
synth.playPreset('coin');
synth.playPreset('explosion');
synth.playPreset('jump'); | Nombre | Descripción | Caso de uso |
|---|---|---|
| láser | Rayo descendente | Disparos, rayos |
| moneda | Tintineo brillante ascendente | Recoger objetos |
| salto | Barreo ascendente rápido | Salto, rebote |
| Explosión | Decaimiento de la ráfaga de ruido | Destrucción, muerte |
| potenciador | Fanfarria ascendente | Potenciadores, mejoras |
| golpe | Ruido de impacto seco | Daño, colisión |
| pitido | Clic breve en la interfaz de usuario | Selección de menú, interfaz de usuario |
| graves | Golpe profundo de triángulo | Caídas de bajo, impactos |
| disparo | Disparo rápido | Armas de fuego rápido |
| 1up | Fanfarria ascendente | Vidas extra, bonificaciones |
Carga la configuración de un preset (forma de onda, envolvente, efectos) en una pista sin reproducirlo. Útil para configurar una pista antes de activar las notas manualmente.
Carga un preset de instrumento completo en la pista especificada, configurando la forma de onda, la envolvente, el vibrato y la modulación.
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 2.0); | Nombre | Tipo | Descripción |
|---|---|---|
| piano | triángulo | Tono percusivo brillante con rápida caída |
| violín | diente de sierra | Cálida cuerda frotada con vibrato |
| violonchelo | diente de sierra | Cuerda de arco grave, registro bajo |
| flauta | seno | Tono suave y susurrante con vibrato |
| Órgano | cuadrado | Tono sostenido de órgano de tubos |
| metales | diente de sierra | Sonido potente de trompa/trompeta |
| armónica | cuadrado | Tono PWM con vibrato |
| Sintetizador principal | cuadrado | Lead clásico de chiptune |
| synthPad | diente de sierra | Pad de unísono amplio con filtro |
| synthBass | Diente de sierra | Bajo sintético con pegada |
| marimba | senoidal | Sonido percusivo de mazo |
| guitarra eléctrica | cuadrado | Emulación de guitarra con overdrive |
Actualiza una o más propiedades de una pista. Los cambios se aplican en tiempo real a las notas que se están reproduciendo actualmente.
synth.updateTrack(0, {
type: 'sawtooth',
volume: 0.4,
unisonVoices: 4,
unisonDetune: 20
}); | Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| tipo | cadena | 'cuadrada' | Forma de onda: «cuadrada», «triangular», «diente de sierra», «senoidal», «ruido» |
| volumen | número | 0,3 | Volumen de la pista (0-1) |
| ciclo de trabajo | número | 0,5 | Ancho de pulso para ondas cuadradas (0-1) |
| desintonización | número | 0 | Afinación fina en centésimas (1200 = 1 octava) |
| desplazamiento de octava | número | 0 | Desplazamiento de octava (±) |
| desplazamiento de semitono | número | 0 | Desplazamiento de semitono (±) |
| Envolvente de tono | número | 0 | Profundidad de la envolvente de tono en semitonos |
| glide | número | 0 | Tiempo de portamento en segundos |
También puedes configurar directamente las propiedades de los objetos de la pista:
synth.tracks[0].type = 'sawtooth';
synth.tracks[0].volume = 0.4;
synth.updateLiveNotes(0); // Apply to active notes Establece la envolvente de amplitud de una pista. Controla cómo las notas aparecen, se mantienen y desaparecen.
synth.updateEnvelope(0, {
attack: 0.1, // Fade-in time (seconds)
decay: 0.2, // Decay to sustain level
sustain: 0.6, // Held level (0-1)
release: 0.5 // Fade-out after note stops
}); | Propiedad | Tipo | Rango | Descripción |
|---|---|---|---|
| ataque | número | 0-5 s | Tiempo para alcanzar el volumen máximo |
| decaimiento | número | 0-5 s | Tiempo para caer desde el pico hasta el nivel de sustain |
| sostenido | número | 0-1 | Nivel de volumen mientras se mantiene la nota (0 = apagado tras el decaimiento) |
| suelta | número | 0-10 s | Tiempo de desvanecimiento tras el cese de la nota |
| Pista | Ataque | Decaimiento | Sostenido | Release |
|---|---|---|---|---|
| 0 - Lead | 0,01 | 0,10 | 0,7 | 0,20 |
| 1 - Bajo | 0,01 | 0,20 | 0,8 | 0,15 |
| 2 - Batería | 0,001 | 0,10 | 0,0 | 0,05 |
| 3 - Efectos | 0,005 | 0,30 | 0,0 | 0,20 |
Configura la modulación de tono (vibrato) para una pista.
synth.updateVibrato(0, {
rate: 5, // Speed in Hz
depth: 12 // Amount in cents
}); | Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| frecuencia | número | 0 | Velocidad del LFO en Hz (0 = desactivado) |
| profundidad | número | 0 | Desviación de tono en cents (0 = desactivado) |
Cada pista cuenta con un filtro opcional para modelar el contenido de frecuencia del sonido.
synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterType = 'lowpass';
synth.tracks[0].filterCutoff = 2000;
synth.tracks[0].filterQ = 5;
synth.updateLiveNotes(0); | Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| filterEnabled | booleano | false | Habilitar/deshabilitar el filtro |
| filterType | cadena | 'lowpass' | 'paso bajo', 'paso alto', 'paso banda', 'notch' |
| filterCutoff | número | 20000 | Frecuencia de corte en Hz |
| Q del filtro | número | 0,1 | Resonancia / Factor Q |
| filtroKeyTrack | número | 0 | Seguimiento de teclas 0-100 (el corte sigue al tono) |
| filterEnvAmount | número | 0 | Profundidad de la envolvente del filtro (semitonos) |
| ataque del envolvente del filtro | número | 0,01 | Ataque de la envolvente del filtro (segundos) |
| filterEnvRelease | número | 0,2 | Relevo de la envolvente del filtro (segundos) |
Apila varios osciladores desafinados para obtener un sonido denso y amplio. Imprescindible para pads y leads.
synth.tracks[0].unisonVoices = 8;
synth.tracks[0].unisonDetune = 25; // cents between voices
synth.tracks[0].unisonSpread = 80; // stereo spread % | Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| unisonVoices | número | 1 | Número de osciladores (1-16) |
| desintonización de unísono | número | 0 | Diferencia de afinación en centésimas |
| unisonSpread | número | 0 | Diferencia de panoramización estéreo (0-100 %) |
synth.tracks[0].tremoloRate = 6; // Hz
synth.tracks[0].tremoloDepth = 50; // 0-100 synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterCutoff = 1000;
synth.tracks[0].lfoFilterRate = 3; // Hz
synth.tracks[0].lfoFilterDepth = 2000; // Hz range | Propiedad | Tipo | Descripción |
|---|---|---|
| tremoloRate | número | Velocidad del trémolo en Hz (0 = desactivado) |
| tremoloDepth | número | Intensidad del trémolo (0-100) |
| frecuencia del filtro LFO | número | Velocidad del LFO del filtro en Hz (0 = desactivado) |
| lfoFilterDepth | número | Rango del LFO del filtro en Hz |
Habilita la entrada MIDI desde controladores conectados. Devuelve una matriz con los nombres de los dispositivos de entrada MIDI detectados.
const inputs = await synth.enableMIDI({
track: 0,
channel: 0, // 0 = all channels
onConnect: (name) => console.log('Connected:', name),
onDisconnect: (name) => console.log('Disconnected:', name),
onNoteOn: (note, vel, ch) => { /* MIDI note 0-127 */ },
onNoteOff: (note, ch) => { /* ... */ },
onCC: (cc, value, ch) => { /* CC 0-127 */ }
}); | Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| track | número | 0 | Pista de destino para las notas MIDI |
| canal | número | 0 | Filtro de canal MIDI (1-16, 0 = todos) |
| onConnect | función | — | Se invoca cuando se conecta un dispositivo MIDI |
| onDisconnect | función | — | Se invoca cuando un dispositivo MIDI se desconecta |
| onNoteOn | función | — | Se invoca al activarse una nota (nota, velocidad, canal) |
| onNoteOff | función | — | Se invoca al desactivarse la nota (nota, canal) |
| onCC | función | — | Se invoca al producirse un cambio de control (cc, valor, canal) |
| CC | Nombre | Efecto |
|---|---|---|
| 1 | Rueda de modulación | Controla la intensidad del vibrato |
| 7 | Volumen | Controla el volumen de la pista |
| 64 | Pedal de sustain | Mantiene las notas sostenidas |
| 120 | Silenciar todo | Detiene todas las notas |
| 123 | Apagar todas las notas | Detiene todas las notas |
Desactiva la entrada MIDI y detiene todas las notas MIDI activas.
Cambia la pista que recibe la entrada MIDI.
Establece el filtro de canal MIDI (0 = todos los canales).
Devuelve si MIDI está activo actualmente.
Devuelve datos de forma de onda en el dominio del tiempo para dibujar visualizaciones de tipo osciloscopio. Los valores oscilan entre 0 y 255 (128 = centro).
function draw() {
const data = synth.getWaveformData();
// Draw on canvas...
ctx.beginPath();
data.forEach((v, i) => {
const x = (i / data.length) * width;
const y = (v / 255) * height;
i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);
});
ctx.stroke();
requestAnimationFrame(draw);
} Devuelve datos del dominio de la frecuencia (FFT) para visualizaciones del espectro. Los valores oscilan entre 0 y 255.
Establece el volumen de salida principal (0-1).
Devuelve el volumen maestro actual.
Restablece todas las pistas, envolventes y vibrato a sus valores predeterminados.
Convierte el nombre de una nota y la octava en frecuencia en Hz.
ChiptuneSynth.noteToFrequency('A', 4); // → 440
ChiptuneSynth.noteToFrequency('C', 4); // → 261.63 Convierte un número de nota MIDI (0-127) en frecuencia en Hz.
Convierte una frecuencia en el número de nota MIDI más cercano.
Devuelve una matriz con todos los nombres de presets de efectos de sonido disponibles.
ChiptuneSynth.getPresetNames();
// → ['laser','coin','jump','explosion','powerup','hit','blip','bass','shoot','1up'] Devuelve una matriz con todos los nombres de presets de instrumentos disponibles.
Devuelve un objeto indexado por nombre de instrumento, donde cada valor contiene la definición completa (ajustes de pista, envolvente, vibrato, filtro, etc.).
const instruments = ChiptuneSynth.getInstruments();
// { piano: { name, label, icon, type, volume, ... }, violin: { ... }, ... }
// Access a specific instrument definition
const piano = instruments.piano;
console.log(piano.type); // 'triangle'
console.log(piano.label); // 'Piano' Puedes crear tus propios instrumentos combinando ajustes de pista, envolventes, vibrato y filtros. A continuación te explicamos cómo crear sonidos desde cero.
Configura una pista manualmente y, a continuación, toca notas en ella:
// Create a retro pluck bass
synth.updateTrack(1, {
type: 'sawtooth',
volume: 0.5,
octaveOffset: -1
});
synth.updateEnvelope(1, {
attack: 0.005,
decay: 0.3,
sustain: 0.0,
release: 0.1
});
synth.playNoteByName('E', 2, 1, 0.4); Replica el patrón preestablecido: configura una pista, toca una nota y deja que la envolvente se encargue del resto:
// Custom "warp" SFX on FX track (3)
function playWarp() {
synth.updateTrack(3, {
type: 'square',
volume: 0.3,
dutyCycle: 0.25,
pitchEnv: -24 // pitch drops 2 octaves
});
synth.updateEnvelope(3, {
attack: 0.01,
decay: 0.4,
sustain: 0.0,
release: 0.1
});
synth.playNote(880, 3, 0.5);
}
// Now call playWarp() anytime! Combina múltiples funciones para crear instrumentos expresivos:
// Dreamy synth pad with filter sweep
function setupDreamPad(track) {
synth.updateTrack(track, {
type: 'square',
volume: 0.25,
dutyCycle: 0.3,
unisonVoices: 6,
unisonDetune: 18,
unisonSpread: 70
});
synth.updateEnvelope(track, {
attack: 0.8,
decay: 0.5,
sustain: 0.6,
release: 2.0
});
synth.updateVibrato(track, {
rate: 4,
depth: 8
});
// Add filter with LFO modulation
synth.tracks[track].filterEnabled = true;
synth.tracks[track].filterType = 'lowpass';
synth.tracks[track].filterCutoff = 1200;
synth.tracks[track].filterQ = 3;
synth.tracks[track].lfoFilterRate = 0.3;
synth.tracks[track].lfoFilterDepth = 800;
}
setupDreamPad(0);
synth.playNoteByName('C', 4, 0, 3.0); Superpón varias pistas para crear sonidos complejos:
// Layered "epic hit" — noise + bass + lead
function playEpicHit() {
// Layer 1: noise crash
synth.updateTrack(2, { type: 'noise', volume: 0.4 });
synth.updateEnvelope(2, { attack:0.001, decay:0.3, sustain:0, release:0.1 });
synth.playNote(200, 2, 0.4);
// Layer 2: sub bass thump
synth.updateTrack(1, { type: 'sine', volume: 0.6, pitchEnv: 12 });
synth.updateEnvelope(1, { attack:0.001, decay:0.25, sustain:0, release:0.1 });
synth.playNote(60, 1, 0.3);
// Layer 3: bright accent
synth.updateTrack(0, { type: 'square', volume: 0.2 });
synth.updateEnvelope(0, { attack:0.001, decay:0.1, sustain:0, release:0.2 });
synth.playNote(440, 0, 0.15);
} Organiza tus instrumentos personalizados como objetos de configuración:
// Define instrument configs
const myInstruments = {
retroLead: {
track: { type: 'square', dutyCycle: 0.25, volume: 0.3 },
env: { attack: 0.02, decay: 0.15, sustain: 0.5, release: 0.3 },
vib: { rate: 5.5, depth: 10 }
},
fatBass: {
track: { type: 'sawtooth', volume: 0.5, unisonVoices: 3, unisonDetune: 10 },
env: { attack: 0.01, decay: 0.2, sustain: 0.7, release: 0.1 },
vib: { rate: 0, depth: 0 }
}
};
// Apply an instrument to a track
function applyInstrument(name, trackIndex) {
const inst = myInstruments[name];
synth.updateTrack(trackIndex, inst.track);
synth.updateEnvelope(trackIndex, inst.env);
synth.updateVibrato(trackIndex, inst.vib);
}
applyInstrument('retroLead', 0);
synth.playNoteByName('C', 5, 0, 0.5); | Pista | Índice | Forma de onda | Volumen |
|---|---|---|---|
| Canal principal | 0 | cuadrado | 0,30 |
| Bajo | 1 | triángulo | 0,40 |
| Batería | 2 | ruido | 0,50 |
| Efectos | 3 | diente de sierra | 0,25 |
El «gainNode» por nota solo gestiona la envolvente ADSR (normalizada 0→1→sostenido). El volumen de la pista se controla mediante un nodo independiente de «_trackGains[]». Esta arquitectura permite cambios de parámetros en tiempo real sin interrumpir la secuencia ADSR de las notas que se están reproduciendo.