Référence complète pour ChiptuneSynth — Synthétiseur chiptune 4 pistes pour 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()` à l'intérieur d'un gestionnaire de clic ou après une interaction de l'utilisateur.Crée une nouvelle instance de synthétiseur avec 4 pistes (Lead, Bass, Drums, FX), des enveloppes par défaut et des paramètres de vibrato vides.
const synth = new ChiptuneSynth(); Initialise le contexte de l'API Web Audio, crée le gain principal, l'analyseur, les nœuds de gain par piste et le tampon de bruit. Doit être appelé une fois avant toute lecture.
await synth.init(); Arrête toutes les notes et ferme l'AudioContext. À appeler lorsque vous avez terminé d'utiliser le synthétiseur.
Joue une note à la fréquence donnée (Hz) sur la piste spécifiée.
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
| fréquence | nombre | — | Fréquence en Hz (par exemple 440 pour le La4) |
| trackIndex | nombre | 0 | Index de piste : 0 = mélodie, 1 = basse, 2 = batterie, 3 = effets |
| durée | nombre | 10 | Durée en secondes. Les valeurs ≥10 créent des notes tenues |
| startTime | nombre | maintenant | Heure de début de l'AudioContext (pour la planification) |
const noteId = synth.playNote(440, 0, 0.5); // A4, Lead, 0.5s duration = 10 ou supérieure pour les notes tenues que vous contrôlez manuellement avec stopNote(). C'est ainsi que fonctionnent le clavier et le MIDI.Joue une note par son nom musical.
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
| note | chaîne | — | Nom de la note : Do, Do dièse, Ré, Ré dièse, Mi, Fa, Fa dièse, Sol, Sol dièse, La, La dièse, Si (également Ré bémol, Mi bémol, Sol bémol, La bémol, Si bémol) |
| octave | nombre | 4 | Octave (1-7) |
| pisteIndex | numéro | 0 | Piste cible |
| durée | nombre | 10 | Durée en secondes |
synth.playNoteByName('C', 4, 0, 0.5); // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass Arrête une note spécifique avec son enveloppe de relâchement. Utilisez l'identifiant de note renvoyé par playNote() ou playNoteByName().
Arrête immédiatement toutes les notes actives sur toutes les pistes.
Charge et lit un préréglage SFX intégré en un seul appel. Idéal pour les effets sonores de jeux.
synth.playPreset('coin');
synth.playPreset('explosion');
synth.playPreset('jump'); | Nom | Description | Cas d'utilisation |
|---|---|---|
| laser | Faisceau descendant | Tir, faisceaux |
| pièce | Ding lumineux ascendant | Collecte d'objets |
| saut | Balayage ascendant rapide | Sauter, rebondir |
| Explosion | Atténuation d'une rafale sonore | Destruction, mort |
| bonification | Fanfare ascendante | Bonus, améliorations |
| Coup | Bruit d'impact sec | Dégâts, collision |
| bip | Clic court sur l'interface utilisateur | Sélection de menu, interface utilisateur |
| grave | Coup de triangle grave | Chutes de basse, impacts |
| tir | Tir rapide | Armes à tir rapide |
| 1up | Fanfare ascendante | Vies supplémentaires, bonus |
Charge la configuration d'un préréglage (forme d'onde, enveloppe, effets) sur une piste sans la lire. Utile pour configurer une piste avant de déclencher manuellement des notes.
Charge un préréglage d'instrument complet sur la piste spécifiée, en configurant la forme d'onde, l'enveloppe, le vibrato et la modulation.
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 2.0); | Nom | Type | Description |
|---|---|---|
| piano | triangle | Son percussif brillant avec une atténuation rapide |
| violon | dent de scie | Corde à archet chaleureuse avec vibrato |
| violoncelle | dent de scie | Corde jouée à l'archet, son grave |
| flûte | sinusoïdale | Son doux et soufflé avec vibrato |
| orgue | carré | Son d'orgue à tuyaux soutenu |
| cuivres | dent de scie | Son de cor/trompette puissant |
| harmonica | carré | Son PWM aigre avec trémolo |
| synthLead | carré | Lead chiptune classique |
| synthPad | dent de scie | Pad large en unisson avec filtre |
| synthBass | dent de scie | Basse synthé percutante |
| marimba | sinusoïdal | Son de maillet percussif |
| guitare électrique | carré | Émulation de guitare saturée |
Met à jour une ou plusieurs propriétés d'une piste. Les modifications s'appliquent en temps réel aux notes en cours de lecture.
synth.updateTrack(0, {
type: 'sawtooth',
volume: 0.4,
unisonVoices: 4,
unisonDetune: 20
}); | Propriété | Type | Valeur par défaut | Description |
|---|---|---|---|
| type | chaîne | « carré » | Forme d'onde : « square », « triangle », « sawtooth », « sine », « noise » |
| volume | nombre | 0,3 | Volume de la piste (0-1) |
| cycle de service | nombre | 0,5 | Largeur d'impulsion pour les ondes carrées (0-1) |
| décalage | nombre | 0 | Réglage fin en cents (1200 = 1 octave) |
| décalage d'octave | nombre | 0 | Décalage d'octave (±) |
| décalage de demi-ton | nombre | 0 | Décalage de demi-ton (±) |
| Enveloppe de hauteur | nombre | 0 | Profondeur de l'enveloppe de hauteur en demi-tons |
| glide | nombre | 0 | Durée du portamento en secondes |
Vous pouvez également définir directement les propriétés des objets de la piste :
synth.tracks[0].type = 'sawtooth';
synth.tracks[0].volume = 0.4;
synth.updateLiveNotes(0); // Apply to active notes Définit l'enveloppe d'amplitude d'une piste. Contrôle la façon dont les notes apparaissent, sont maintenues et s'éteignent.
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
}); | Propriété | Type | Plage | Description |
|---|---|---|---|
| attaque | Nombre | 0 à 5 s | Temps nécessaire pour atteindre le volume maximal |
| décroissance | nombre | 0-5 s | Temps nécessaire pour passer du pic au niveau de sustain |
| niveau de maintien | nombre | 0-1 | Niveau de volume pendant que la note est tenue (0 = désactivé après la décroissance) |
| relâchement | nombre | 0-10 s | Temps de fondu après l'arrêt de la note |
| Piste | Attaque | Décroissance | Maintien | Relâchement |
|---|---|---|---|---|
| 0 - Lead | 0,01 | 0,10 | 0,7 | 0,20 |
| 1 - Basse | 0,01 | 0,20 | 0,8 | 0,15 |
| 2 - Batterie | 0,001 | 0,10 | 0,0 | 0,05 |
| 3 - Effets | 0,005 | 0,30 | 0,0 | 0,20 |
Configure la modulation de hauteur (vibrato) pour une piste.
synth.updateVibrato(0, {
rate: 5, // Speed in Hz
depth: 12 // Amount in cents
}); | Propriété | Type | Par défaut | Description |
|---|---|---|---|
| rate | nombre | 0 | Vitesse du LFO en Hz (0 = désactivé) |
| profondeur | nombre | 0 | Déviation de hauteur en cents (0 = désactivé) |
Chaque piste dispose d'un filtre optionnel permettant de modeler le spectre de fréquences du son.
synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterType = 'lowpass';
synth.tracks[0].filterCutoff = 2000;
synth.tracks[0].filterQ = 5;
synth.updateLiveNotes(0); | Propriété | Type | Par défaut | Description |
|---|---|---|---|
| filterEnabled | booléen | false | Activer/désactiver le filtre |
| typeDeFiltre | chaîne | « lowpass » | « lowpass », « highpass », « bandpass », « notch » |
| fréquence de coupure | nombre | 20000 | Fréquence de coupure en Hz |
| Q du filtre | nombre | 0,1 | Résonance / facteur Q |
| filtreKeyTrack | nombre | 0 | Suivi de touche 0-100 (la fréquence de coupure suit la hauteur) |
| filterEnvAmount | nombre | 0 | Profondeur de l'enveloppe du filtre (demi-tons) |
| filterEnvAttack | nombre | 0,01 | Attaque de l'enveloppe du filtre (secondes) |
| filterEnvRelease | nombre | 0,2 | Relâchement de l'enveloppe du filtre (secondes) |
Empilez plusieurs oscillateurs désaccordés pour obtenir un son riche et ample. Indispensable pour les pads et les leads.
synth.tracks[0].unisonVoices = 8;
synth.tracks[0].unisonDetune = 25; // cents between voices
synth.tracks[0].unisonSpread = 80; // stereo spread % | Propriété | Type | Par défaut | Description |
|---|---|---|---|
| unisonVoices | nombre | 1 | Nombre d'oscillateurs (1-16) |
| détonation en unisson | nombre | 0 | Écart de désaccord en cents |
| unisonSpread | nombre | 0 | Écart de panoramique stéréo (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 | Propriété | Type | Description |
|---|---|---|
| tremoloRate | nombre | Vitesse du trémolo en Hz (0 = désactivé) |
| tremoloDepth | nombre | Amplitude du trémolo (0-100) |
| lfoFilterRate | nombre | Vitesse du LFO du filtre en Hz (0 = désactivé) |
| lfoFilterDepth | nombre | Plage du LFO du filtre en Hz |
Active l'entrée MIDI à partir des contrôleurs connectés. Renvoie un tableau contenant les noms des périphériques d'entrée MIDI détectés.
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 */ }
}); | Propriété | Type | Par défaut | Description |
|---|---|---|---|
| piste | numéro | 0 | Piste cible pour les notes MIDI |
| canal | numéro | 0 | Filtre de canal MIDI (1-16, 0 = tous) |
| onConnect | fonction | — | Appelée lorsqu'un périphérique MIDI se connecte |
| onDisconnect | fonction | — | Appelée lorsqu'un périphérique MIDI se déconnecte |
| onNoteOn | fonction | — | Appelée lors d'une note activée (note, vélocité, canal) |
| onNoteOff | fonction | — | Appelée lors de la fin de la note (note, canal) |
| onCC | fonction | — | Appelée lors d'un changement de contrôle (cc, valeur, canal) |
| CC | Nom | Effet |
|---|---|---|
| 1 | Roue de modulation | Contrôle l'intensité du vibrato |
| 7 | Volume | Règle le volume de la piste |
| 64 | Pédale de sustain | Prolonge les notes tenues |
| 120 | Tout couper | Arrête toutes les notes |
| 123 | Toutes les notes désactivées | Arrête toutes les notes |
Désactive l'entrée MIDI et arrête toutes les notes MIDI maintenues.
Modifie la piste qui reçoit l'entrée MIDI.
Définit le filtre de canal MIDI (0 = tous les canaux).
Indique si le MIDI est actuellement actif.
Renvoie les données de forme d'onde dans le domaine temporel pour dessiner des visualisations de type oscilloscope. Les valeurs vont de 0 à 255 (128 = centre).
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);
} Renvoie les données du domaine fréquentiel (FFT) pour les visualisations de spectre. Les valeurs vont de 0 à 255.
Définit le volume de sortie principal (0-1).
Renvoie le volume principal actuel.
Réinitialise toutes les pistes, les enveloppes et le vibrato à leurs valeurs par défaut.
Convertit un nom de note et une octave en fréquence en Hz.
ChiptuneSynth.noteToFrequency('A', 4); // → 440
ChiptuneSynth.noteToFrequency('C', 4); // → 261.63 Convertit un numéro de note MIDI (0-127) en fréquence en Hz.
Convertit une fréquence en numéro de note MIDI le plus proche.
Renvoie un tableau contenant tous les noms de préréglages SFX disponibles.
ChiptuneSynth.getPresetNames();
// → ['laser','coin','jump','explosion','powerup','hit','blip','bass','shoot','1up'] Renvoie un tableau contenant tous les noms de préréglages d'instruments disponibles.
Renvoie un objet indexé par nom d'instrument, chaque valeur contenant la définition complète (paramètres de piste, enveloppe, vibrato, filtre, 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' Vous pouvez créer vos propres instruments en combinant les paramètres de piste, les enveloppes, le vibrato et les filtres. Voici comment créer des sons à partir de zéro.
Configurez une piste manuellement, puis jouez des notes dessus :
// 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); Reproduisez le motif prédéfini : configurez une piste, jouez une note et laissez l'enveloppe s'occuper du reste :
// 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! Combinez plusieurs fonctionnalités pour créer des instruments expressifs :
// 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); Superposez plusieurs pistes pour créer des sons complexes :
// 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);
} Organisez vos instruments personnalisés sous forme d'objets de configuration :
// 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); | Piste | Index | Forme d'onde | Volume |
|---|---|---|---|
| Lead | 0 | carré | 0,30 |
| Basse | 1 | triangle | 0,40 |
| Batterie | 2 | bruit | 0,50 |
| Effets | 3 | dent de scie | 0,25 |
L'gainNodee par note ne gère que l'enveloppe ADSR (normalisée 0→1→sustain). Le volume de la piste est contrôlé par un nœud d'_trackGains[] distinct. Cette architecture permet de modifier les paramètres en temps réel sans interrompre le déroulement ADSR des notes jouées.