Documentación de la API

Referencia completa de ChiptuneSynth — Sintetizador chiptune de 4 pistas para la API de audio web

Inicio rápido

// 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);
AudioContext requiere una acción del usuario (clic o toque) para iniciarse. Llame siempre a `init()` dentro de un controlador de clic o tras la interacción del usuario.

Constructor e inicialización

new ChiptuneSynth()

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();

synth.init() async

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();

synth.dispose()

Detiene todas las notas y cierra el AudioContext. Llámalo cuando hayas terminado de usar el sintetizador.

Métodos de reproducción

synth.playNote(frecuencia, índiceDePista, duración, horaDeInicio) → idDeNota

Reproduce una nota a la frecuencia dada (Hz) en la pista especificada.

ParámetroTipoValor predeterminadoDescripción
frecuencianúmeroFrecuencia en Hz (por ejemplo, 440 para el La4)
índice de pistanúmero0Índice de pista: 0=Melodía, 1=Bajo, 2=Batería, 3=Efectos
duraciónnúmero10Duración en segundos. Los valores ≥10 crean notas sostenidas
hora de inicionúmeroahoraAudioContext hora de inicio (para programación)
const noteId = synth.playNote(440, 0, 0.5);  // A4, Lead, 0.5s
Utiliza duration = 10 o superior para notas sostenidas que controles manualmente con stopNote(). Así es como funcionan el teclado y el MIDI.

synth.playNoteByName(note, octave, trackIndex, duration) → noteId

Reproduce una nota por su nombre musical.

ParámetroTipoPredeterminadoDescripción
notecadenaNombre 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)
octavanúmero4Octava (1-7)
índice de pistanúmero0Pista de destino
duraciónnúmero10Duración en segundos
synth.playNoteByName('C', 4, 0, 0.5);  // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass

synth.stopNote(noteId)

Detiene una nota específica con su envolvente de liberación. Utiliza el noteId devuelto por playNote() o playNoteByName().

synth.stopAllNotes()

Detiene inmediatamente todas las notas activas en todas las pistas.

Presets e instrumentos

synth.playPreset(name)

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');

Presets de SFX disponibles (10)

NombreDescripciónCaso de uso
láserRayo descendenteDisparos, rayos
monedaTintineo brillante ascendenteRecoger objetos
saltoBarreo ascendente rápidoSalto, rebote
ExplosiónDecaimiento de la ráfaga de ruidoDestrucción, muerte
potenciadorFanfarria ascendentePotenciadores, mejoras
golpeRuido de impacto secoDaño, colisión
pitidoClic breve en la interfaz de usuarioSelección de menú, interfaz de usuario
gravesGolpe profundo de triánguloCaídas de bajo, impactos
disparoDisparo rápidoArmas de fuego rápido
1upFanfarria ascendenteVidas extra, bonificaciones

synth.loadPreset(nombre)

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.

synth.loadInstrument(nombre, índiceDePista) → booleano

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);

Instrumentos disponibles (12)

NombreTipoDescripción
pianotriánguloTono percusivo brillante con rápida caída
violíndiente de sierraCálida cuerda frotada con vibrato
violonchelodiente de sierraCuerda de arco grave, registro bajo
flautasenoTono suave y susurrante con vibrato
ÓrganocuadradoTono sostenido de órgano de tubos
metalesdiente de sierraSonido potente de trompa/trompeta
armónicacuadradoTono PWM con vibrato
Sintetizador principalcuadradoLead clásico de chiptune
synthPaddiente de sierraPad de unísono amplio con filtro
synthBassDiente de sierraBajo sintético con pegada
marimbasenoidalSonido percusivo de mazo
guitarra eléctricacuadradoEmulación de guitarra con overdrive

Configuración de pista

synth.updateTrack(trackIndex, settings)

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
});

Propiedades de la pista

PropiedadTipoPredeterminadoDescripción
tipocadena'cuadrada'Forma de onda: «cuadrada», «triangular», «diente de sierra», «senoidal», «ruido»
volumennúmero0,3Volumen de la pista (0-1)
ciclo de trabajonúmero0,5Ancho de pulso para ondas cuadradas (0-1)
desintonizaciónnúmero0Afinación fina en centésimas (1200 = 1 octava)
desplazamiento de octavanúmero0Desplazamiento de octava (±)
desplazamiento de semitononúmero0Desplazamiento de semitono (±)
Envolvente de tononúmero0Profundidad de la envolvente de tono en semitonos
glidenúmero0Tiempo 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

Envolventes (ADSR)

synth.updateEnvelope(trackIndex, settings)

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
});
PropiedadTipoRangoDescripción
ataquenúmero0-5 sTiempo para alcanzar el volumen máximo
decaimientonúmero0-5 sTiempo para caer desde el pico hasta el nivel de sustain
sostenidonúmero0-1Nivel de volumen mientras se mantiene la nota (0 = apagado tras el decaimiento)
sueltanúmero0-10 sTiempo de desvanecimiento tras el cese de la nota

Envolventes predeterminadas

PistaAtaqueDecaimientoSostenidoRelease
0 - Lead0,010,100,70,20
1 - Bajo0,010,200,80,15
2 - Batería0,0010,100,00,05
3 - Efectos0,0050,300,00,20

Vibrato

synth.updateVibrato(trackIndex, settings)

Configura la modulación de tono (vibrato) para una pista.

synth.updateVibrato(0, {
  rate:  5,   // Speed in Hz
  depth: 12   // Amount in cents
});
PropiedadTipoPredeterminadoDescripción
frecuencianúmero0Velocidad del LFO en Hz (0 = desactivado)
profundidadnúmero0Desviación de tono en cents (0 = desactivado)

Filtro

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);
PropiedadTipoPredeterminadoDescripción
filterEnabledbooleanofalseHabilitar/deshabilitar el filtro
filterTypecadena'lowpass''paso bajo', 'paso alto', 'paso banda', 'notch'
filterCutoffnúmero20000Frecuencia de corte en Hz
Q del filtronúmero0,1Resonancia / Factor Q
filtroKeyTracknúmero0Seguimiento de teclas 0-100 (el corte sigue al tono)
filterEnvAmountnúmero0Profundidad de la envolvente del filtro (semitonos)
ataque del envolvente del filtronúmero0,01Ataque de la envolvente del filtro (segundos)
filterEnvReleasenúmero0,2Relevo de la envolvente del filtro (segundos)

Unison y Desintonización

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 %
PropiedadTipoPredeterminadoDescripción
unisonVoicesnúmero1Número de osciladores (1-16)
desintonización de unísononúmero0Diferencia de afinación en centésimas
unisonSpreadnúmero0Diferencia de panoramización estéreo (0-100 %)

LFO (trémolo y modulación de filtro)

Tremolo (LFO de amplitud)

synth.tracks[0].tremoloRate = 6;    // Hz
synth.tracks[0].tremoloDepth = 50;   // 0-100

LFO de filtro

synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterCutoff = 1000;
synth.tracks[0].lfoFilterRate = 3;     // Hz
synth.tracks[0].lfoFilterDepth = 2000;  // Hz range
PropiedadTipoDescripción
tremoloRatenúmeroVelocidad del trémolo en Hz (0 = desactivado)
tremoloDepthnúmeroIntensidad del trémolo (0-100)
frecuencia del filtro LFOnúmeroVelocidad del LFO del filtro en Hz (0 = desactivado)
lfoFilterDepthnúmeroRango del LFO del filtro en Hz
ChiptuneSynth tiene 3 LFO independientes por pista: vibrato (tono), trémolo (volumen) y modulación de filtro.

Compatibilidad con MIDI

synth.enableMIDI(options) async→ inputNames[]

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 */ }
});

Opciones

PropiedadTipoPredeterminadoDescripción
tracknúmero0Pista de destino para las notas MIDI
canalnúmero0Filtro de canal MIDI (1-16, 0 = todos)
onConnectfunciónSe invoca cuando se conecta un dispositivo MIDI
onDisconnectfunciónSe invoca cuando un dispositivo MIDI se desconecta
onNoteOnfunciónSe invoca al activarse una nota (nota, velocidad, canal)
onNoteOfffunciónSe invoca al desactivarse la nota (nota, canal)
onCCfunciónSe invoca al producirse un cambio de control (cc, valor, canal)

CC MIDI compatible

CCNombreEfecto
1Rueda de modulaciónControla la intensidad del vibrato
7VolumenControla el volumen de la pista
64Pedal de sustainMantiene las notas sostenidas
120Silenciar todoDetiene todas las notas
123Apagar todas las notasDetiene todas las notas

synth.disableMIDI()

Desactiva la entrada MIDI y detiene todas las notas MIDI activas.

synth.setMIDITrack(trackIndex)

Cambia la pista que recibe la entrada MIDI.

synth.setMIDIChannel(ch)

Establece el filtro de canal MIDI (0 = todos los canales).

synth.isMIDIEnabled() → booleano

Devuelve si MIDI está activo actualmente.

Datos del visualizador

synth.getWaveformData() → Uint8Array

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);
}

synth.getFrequencyData() → Uint8Array

Devuelve datos del dominio de la frecuencia (FFT) para visualizaciones del espectro. Los valores oscilan entre 0 y 255.

synth.setMasterVolume(valor)

Establece el volumen de salida principal (0-1).

synth.getMasterVolume() → número

Devuelve el volumen maestro actual.

synth.resetToDefaults()

Restablece todas las pistas, envolventes y vibrato a sus valores predeterminados.

Métodos estáticos

ChiptuneSynth.noteToFrequency(note, octave) estático→ número

Convierte el nombre de una nota y la octava en frecuencia en Hz.

ChiptuneSynth.noteToFrequency('A', 4);  // → 440
ChiptuneSynth.noteToFrequency('C', 4);  // → 261.63

ChiptuneSynth.midiToFrequency(midi) estático→ número

Convierte un número de nota MIDI (0-127) en frecuencia en Hz.

ChiptuneSynth.frequencyToMidi(freq) estático→ número

Convierte una frecuencia en el número de nota MIDI más cercano.

ChiptuneSynth.getPresetNames() estático→ string[]

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']

ChiptuneSynth.getInstrumentNames() estático→ string[]

Devuelve una matriz con todos los nombres de presets de instrumentos disponibles.

ChiptuneSynth.getInstruments() estático→ objeto

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'

Creación de instrumentos personalizados

Puedes crear tus propios instrumentos combinando ajustes de pista, envolventes, vibrato y filtros. A continuación te explicamos cómo crear sonidos desde cero.

Sonido personalizado básico

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);

Efectos de sonido personalizados (estilo preajuste)

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!

Instrumento rico con efectos

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);

Sonido en capas multipista

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);
}

Patrón de objeto de instrumento reutilizable

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);
El patrón de objeto de instrumento reutilizable es el enfoque recomendado para gestionar instrumentos personalizados en tu juego o aplicación. Mantiene tu diseño de sonido limpio y fácil de ajustar.
Descubre 8BitForge, una aplicación creativa creada con ChiptuneSynth que incluye un editor visual de instrumentos, 8 pistas, un mezclador completo con ecualizador y compresor, 3 LFO por pista y más de 50 instrumentos integrados. Más información

Valores predeterminados

Valores predeterminados de pista

PistaÍndiceForma de ondaVolumen
Canal principal0cuadrado0,30
Bajo1triángulo0,40
Batería2ruido0,50
Efectos3diente de sierra0,25

Nota sobre la arquitectura

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.