Riferimento completo per ChiptuneSynth — Sintetizzatore chiptune a 4 tracce per l'API Web Audio
// 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()` all'interno di un gestore di clic o dopo l'interazione dell'utente.Crea una nuova istanza del sintetizzatore con 4 tracce (Lead, Bass, Drums, FX), inviluppi predefiniti e impostazioni di vibrato vuote.
const synth = new ChiptuneSynth(); Inizializza il contesto dell'API Web Audio, crea il guadagno master, l'analizzatore, i nodi di guadagno per traccia e il buffer di rumore. Deve essere chiamato una volta prima di qualsiasi riproduzione.
await synth.init(); Interrompe tutte le note e chiude l'AudioContext. Da chiamare quando hai finito con il sintetizzatore.
Riproduce una nota alla frequenza specificata (Hz) sulla traccia indicata.
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| frequenza | numero | — | Frequenza in Hz (ad es. 440 per il La4) |
| trackIndex | numero | 0 | Indice traccia: 0=Lead, 1=Basso, 2=Batteria, 3=FX |
| durata | numero | 10 | Durata in secondi. Valori ≥10 creano note sostenute |
| oraInizio | numero | ora | AudioContext ora di inizio (per la pianificazione) |
const noteId = synth.playNote(440, 0, 0.5); // A4, Lead, 0.5s duration = 10 o versioni successive per le note sostenute che controlli manualmente con stopNote(). È così che funzionano la tastiera e il MIDI.Riproduce una nota in base al suo nome musicale.
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| nota | stringa | — | Nome della nota: Do, Do#, Re, Re#, Mi, Fa, Fa#, Sol, Sol#, La, La#, Si (anche Reb, Mib, Solb, Lab, Sib) |
| ottava | numero | 4 | Ottava (1-7) |
| trackIndex | numero | 0 | Traccia di destinazione |
| durata | numero | 10 | Durata in secondi |
synth.playNoteByName('C', 4, 0, 0.5); // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass Interrompe una nota specifica con la sua inviluppo di rilascio. Utilizza il noteId restituito da playNote() o playNoteByName().
Interrompe immediatamente tutte le note attive su tutte le tracce.
Carica e riproduce un preset SFX integrato in un'unica chiamata. Perfetto per gli effetti sonori dei giochi.
synth.playPreset('coin');
synth.playPreset('explosion');
synth.playPreset('jump'); | Nome | Descrizione | Caso d'uso |
|---|---|---|
| laser | Raggio laser discendente | Tiro, raggi |
| moneta | Suono brillante ascendente | Raccolta oggetti |
| salto | Rapida scorrimento ascendente | Salto, rimbalzo |
| esplosione | Decadimento di un'esplosione sonora | Distruzione, morte |
| potenziamento | Fanfara ascendente | Potenziamenti, aggiornamenti |
| colpo | Rumore di impatto secco | Danno, collisione |
| bip | Clic breve sull'interfaccia utente | Selezione menu, interfaccia utente |
| basso | Tono profondo a forma di triangolo | Bassi in caduta, impatti |
| colpo | Colpo elettrico veloce | Armi a fuoco rapido |
| 1up | Fanfara ascendente | Vite extra, bonus |
Carica la configurazione di un preset (forma d'onda, inviluppo, effetti) su una traccia senza riprodurla. Utile per impostare una traccia prima di attivare le note manualmente.
Carica un preset completo dello strumento sulla traccia specificata, configurando forma d'onda, inviluppo, vibrato e modulazione.
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 2.0); | Nome | Tipo | Descrizione |
|---|---|---|
| piano | triangolo | Suono percussivo brillante con rapido decadimento |
| violino | a dente di sega | Corda ad arco calda con vibrato |
| violoncello | a dente di sega | Suono profondo di archi con arco, registro grave |
| flauto | sinusoidale | Tono morbido e soffice con vibrato |
| organo | quadrato | Tono sostenuto di organo a canne |
| ottoni | a dente di sega | Suono deciso di corno/tromba |
| armonica | quadrato | Tono PWM simile a quello di un'armonica con tremolo |
| synthLead | quadrato | Lead chiptune classico |
| synthPad | a dente di sega | Pad unisono ampio con filtro |
| synthBass | dente di sega | Basso sintetizzato incisivo |
| marimba | sinusoidale | Suono percussivo da martello |
| chitarra elettrica | quadrato | emulazione di chitarra overdrive |
Aggiorna una o più proprietà di una traccia. Le modifiche si applicano in tempo reale alle note attualmente in riproduzione.
synth.updateTrack(0, {
type: 'sawtooth',
volume: 0.4,
unisonVoices: 4,
unisonDetune: 20
}); | Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| tipo | stringa | 'quadrata' | Forma d'onda: 'quadrata', 'triangolare', 'a dente di sega', 'sinusoidale', 'rumore' |
| volume | numero | 0,3 | Volume traccia (0-1) |
| ciclo di lavoro | numero | 0,5 | Larghezza dell'impulso per onde quadre (0-1) |
| detune | numero | 0 | Regolazione fine in centesimi (1200 = 1 ottava) |
| offset di ottava | numero | 0 | Spostamento di ottava (±) |
| offset semitoni | numero | 0 | Spostamento di semitono (±) |
| pitchEnv | numero | 0 | Profondità dell'inviluppo di intonazione in semitoni |
| glide | numero | 0 | Tempo di portamento in secondi |
È inoltre possibile impostare direttamente le proprietà sugli oggetti della traccia:
synth.tracks[0].type = 'sawtooth';
synth.tracks[0].volume = 0.4;
synth.updateLiveNotes(0); // Apply to active notes Imposta l'inviluppo di ampiezza per una traccia. Controlla come le note entrano in scena, si mantengono e svaniscono.
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
}); | Proprietà | Tipo | Intervallo | Descrizione |
|---|---|---|---|
| attacco | numero | 0-5 s | Tempo per raggiungere il volume massimo |
| decadimento | numero | 0-5 s | Tempo di caduta dal picco al livello di sustain |
| sostenuto | numero | 0-1 | Livello del volume mentre la nota è tenuta (0 = disattivato dopo il decadimento) |
| rilascio | numero | 0-10 s | Tempo di dissolvenza in uscita dopo l'arresto della nota |
| Traccia | Attacco | Decadimento | Sostenuto | Rilascio |
|---|---|---|---|---|
| 0 - Lead | 0,01 | 0,10 | 0,7 | 0,20 |
| 1 - Basso | 0,01 | 0,20 | 0,8 | 0,15 |
| 2 - Batteria | 0,001 | 0,10 | 0,0 | 0,05 |
| 3 - Effetti | 0,005 | 0,30 | 0,0 | 0,20 |
Configura la modulazione dell'intonazione (vibrato) per una traccia.
synth.updateVibrato(0, {
rate: 5, // Speed in Hz
depth: 12 // Amount in cents
}); | Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| frequenza | numero | 0 | Velocità LFO in Hz (0 = disattivato) |
| profondità | numero | 0 | Deviazione dell'intonazione in cent (0 = disattivato) |
Ogni traccia dispone di un filtro opzionale per modellare il contenuto in frequenza del suono.
synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterType = 'lowpass';
synth.tracks[0].filterCutoff = 2000;
synth.tracks[0].filterQ = 5;
synth.updateLiveNotes(0); | Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| filterEnabled | booleano | false | Abilita/disabilita filtro |
| filterType | stringa | 'lowpass' | 'lowpass', 'highpass', 'bandpass', 'notch' |
| frequenza di taglio del filtro | numero | 20000 | Frequenza di taglio in Hz |
| Q del filtro | numero | 0,1 | Risonanza / Fattore Q |
| track chiave del filtro | numero | 0 | Tracciamento della chiave 0-100 (il cutoff segue l'intonazione) |
| quantità inviluppo filtro | numero | 0 | Profondità dell'inviluppo del filtro (semitoni) |
| filterEnvAttack | numero | 0,01 | Attacco dell'inviluppo del filtro (secondi) |
| filterEnvRelease | numero | 0,2 | Rilascio inviluppo filtro (secondi) |
Impila più oscillatori detunati per ottenere un suono corposo e ampio. Indispensabile per pad e lead.
synth.tracks[0].unisonVoices = 8;
synth.tracks[0].unisonDetune = 25; // cents between voices
synth.tracks[0].unisonSpread = 80; // stereo spread % | Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| unisonVoices | numero | 1 | Numero di oscillatori (1-16) |
| detune | numero | 0 | Dispersione di detune in cent |
| spreadUnison | numero | 0 | Diffusione del panning stereo (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 | Proprietà | Tipo | Descrizione |
|---|---|---|
| tremoloRate | numero | Velocità del tremolo in Hz (0 = disattivato) |
| tremoloDepth | numero | Quantità di tremolo (0-100) |
| frequenza del filtro LFO | numero | Velocità del LFO del filtro in Hz (0 = disattivato) |
| lfoFilterDepth | numero | Intervallo LFO del filtro in Hz |
Abilita l'input MIDI dai controller collegati. Restituisce un array dei nomi dei dispositivi di input MIDI rilevati.
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 */ }
}); | Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| traccia | numero | 0 | Traccia di destinazione per le note MIDI |
| canale | numero | 0 | Filtro canale MIDI (1-16, 0 = tutti) |
| onConnect | funzione | — | Viene chiamata quando un dispositivo MIDI si connette |
| onDisconnect | funzione | — | Viene chiamata quando un dispositivo MIDI si disconnette |
| onNoteOn | funzione | — | Chiamata all'attivazione della nota (nota, velocità, canale) |
| onNoteOff | funzione | — | Chiamata all'estinzione della nota (nota, canale) |
| onCC | funzione | — | Chiamata al cambio di controllo (cc, valore, canale) |
| CC | Nome | Effetto |
|---|---|---|
| 1 | Mod Wheel | Controlla l'intensità del vibrato |
| 7 | Volume | Controlla il volume della traccia |
| 64 | Pedale di sustain | Sostiene le note tenute |
| 120 | Disattiva tutti i suoni | Interrompe tutte le note |
| 123 | Tutte le note disattivate | Interrompe tutte le note |
Disabilita l'input MIDI e interrompe tutte le note MIDI tenute.
Cambia la traccia che riceve l'input MIDI.
Imposta il filtro del canale MIDI (0 = tutti i canali).
Restituisce se il MIDI è attualmente attivo.
Restituisce i dati della forma d'onda nel dominio del tempo per disegnare visualizzazioni in stile oscilloscopio. I valori vanno da 0 a 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);
} Restituisce i dati nel dominio della frequenza (FFT) per le visualizzazioni dello spettro. I valori vanno da 0 a 255.
Imposta il volume di uscita principale (0-1).
Restituisce il volume master corrente.
Ripristina tutti i tracciati, gli inviluppi e il vibrato ai valori predefiniti.
Converte il nome di una nota e l'ottava in frequenza in Hz.
ChiptuneSynth.noteToFrequency('A', 4); // → 440
ChiptuneSynth.noteToFrequency('C', 4); // → 261.63 Converte un numero di nota MIDI (0-127) in frequenza in Hz.
Converte una frequenza nel numero di nota MIDI più vicino.
Restituisce un array contenente tutti i nomi dei preset SFX disponibili.
ChiptuneSynth.getPresetNames();
// → ['laser','coin','jump','explosion','powerup','hit','blip','bass','shoot','1up'] Restituisce un array contenente tutti i nomi dei preset di strumenti disponibili.
Restituisce un oggetto con chiave del nome dello strumento, dove ogni valore contiene la definizione completa (impostazioni della traccia, inviluppo, vibrato, filtro, ecc.).
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' È possibile creare strumenti personalizzati combinando impostazioni della traccia, inviluppi, vibrato e filtri. Ecco come costruire suoni da zero.
Configura una traccia manualmente, quindi riproduci le note su di essa:
// 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 il pattern predefinito: configura una traccia, suona una nota e lascia che l'inviluppo si occupi 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 più funzioni per ottenere strumenti espressivi:
// 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); Sovrapponi più tracce per ottenere suoni complessi:
// 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);
} Organizza i tuoi strumenti personalizzati come oggetti di configurazione:
// 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); | Traccia | Indice | Forma d'onda | Volume |
|---|---|---|---|
| Lead | 0 | quadrato | 0,30 |
| Basso | 1 | triangolo | 0,40 |
| Batteria | 2 | rumore | 0,50 |
| Effetti | 3 | dente di sega | 0,25 |
L'gainNodee per nota gestisce solo l'inviluppo ADSR (normalizzato 0→1→sustain). Il volume della traccia è controllato da un nodo separato _trackGains[]. Questa architettura consente modifiche dei parametri in tempo reale senza interrompere la sequenza ADSR delle note in riproduzione.