Vollständige Referenz für ChiptuneSynth – 4-Spur-Chiptune-Synthesizer für die Web Audio API
// 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()“ immer innerhalb eines Klick-Handlers oder nach einer Benutzerinteraktion auf.Erstellt eine neue Synthesizer-Instanz mit 4 Spuren (Lead, Bass, Drums, FX), Standard-Hüllkurven und leeren Vibrato-Einstellungen.
const synth = new ChiptuneSynth(); Initialisiert den Web-Audio-API-Kontext, erstellt Master-Gain, Analysator, Gain-Knoten pro Spur und einen Rauschpuffer. Muss einmal vor jeder Wiedergabe aufgerufen werden.
await synth.init(); Stoppt alle Noten und schließt den AudioContext. Rufen Sie diese Methode auf, wenn Sie mit dem Synthesizer fertig sind.
Spielt eine Note mit der angegebenen Frequenz (Hz) auf der angegebenen Spur ab.
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
| Frequenz | Zahl | — | Frequenz in Hz (z. B. 440 für A4) |
| Track-Index | Nummer | 0 | Spurindex: 0=Lead, 1=Bass, 2=Schlagzeug, 3=FX |
| Dauer | Zahl | 10 | Dauer in Sekunden. Werte ≥10 erzeugen lang anhaltende Noten |
| startTime | Zahl | jetzt | AudioContext-Startzeitpunkt (für die Zeitplanung) |
const noteId = synth.playNote(440, 0, 0.5); // A4, Lead, 0.5s duration = 10“ oder höher für lang anhaltende Noten, die Sie manuell mit „stopNote()“ steuern. So funktionieren Tastatur und MIDI.Spielt eine Note anhand ihres musikalischen Namens ab.
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
| note | Zeichenkette | — | Notenname: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (auch Db, Eb, Gb, Ab, Bb) |
| Oktave | Zahl | 4 | Oktave (1–7) |
| Track-Index | Nummer | 0 | Ziel-Track |
| Dauer | Anzahl | 10 | Dauer in Sekunden |
synth.playNoteByName('C', 4, 0, 0.5); // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass Stoppt eine bestimmte Note mit ihrer Release-Hüllkurve. Verwende die von `playNote()` oder `playNoteByName()` zurückgegebene `noteId`.
Stoppt sofort alle aktiven Noten in allen Spuren.
Lädt und spielt ein integriertes SFX-Preset in einem Aufruf ab. Perfekt für Soundeffekte in Spielen.
synth.playPreset('coin');
synth.playPreset('explosion');
synth.playPreset('jump'); | Name | Beschreibung | Anwendungsfall |
|---|---|---|
| Laser | Absteigender Zap-Strahl | Schießen, Strahlen |
| Münze | Aufsteigendes helles Klingeln | Gegenstände sammeln |
| Sprung | Schneller Aufwärtsschwung | Springen, hüpfen |
| Explosion | Geräuschausbruch, Abklingen | Zerstörung, Tod |
| Power-Up | Ansteigende Fanfare | Power-Ups, Upgrades |
| Treffer | Scharfes Aufprallgeräusch | Schaden, Kollision |
| Piep | Kurzer UI-Klick | Menüauswahl, Benutzeroberfläche |
| Bass | Tiefer, dreikantiger Schlag | Bass-Drops, Schläge |
| Schuss | Schneller Zap-Schuss | Schnellfeuerwaffen |
| 1up | Aufsteigende Fanfare | Extra-Leben, Boni |
Lädt die Konfiguration eines Presets (Wellenform, Hüllkurve, Effekte) auf eine Spur, ohne sie abzuspielen. Nützlich zum Einrichten einer Spur, bevor Noten manuell ausgelöst werden.
Lädt ein vollständiges Instrumenten-Preset auf die angegebene Spur und konfiguriert Wellenform, Hüllkurve, Vibrato und Modulation.
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 2.0); | Name | Typ | Beschreibung |
|---|---|---|
| Klavier | Triangel | Heller, perkussiver Klang mit schnellem Ausklingen |
| Violine | Sägezahn | Warme Streichklänge mit Vibrato |
| Cello | Sägezahn | Tiefer Streichklang, tiefes Register |
| Flöte | Sinus | Sanfter, hauchiger Ton mit Vibrato |
| Orgel | quadratisch | Nachhallender Pfeifenorgelklang |
| Blechbläser | Sägezahn | Kräftiger Horn-/Trompetenklang |
| Mundharmonika | Rechteck | Schilfartiger PWM-Klang mit Tremolo |
| Synth-Lead | Square | Klassischer Chiptune-Lead |
| Synth-Pad | Sägezahn | Breites Unison-Pad mit Filter |
| SynthBass | Sägezahn | Druckvoller Synth-Bass |
| Marimba | Sinus | Perkussiver Mallet-Klang |
| E-Gitarre | Sägezahn | Overdrive-Gitarrenemulation |
Aktualisiert eine oder mehrere Eigenschaften einer Spur. Änderungen werden in Echtzeit auf die aktuell gespielten Noten angewendet.
synth.updateTrack(0, {
type: 'sawtooth',
volume: 0.4,
unisonVoices: 4,
unisonDetune: 20
}); | Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
| Typ | Zeichenkette | 'Rechteck' | Wellenform: 'Rechteck', 'Dreieck', 'Sägezahn', 'Sinus', 'Rauschen' |
| Lautstärke | Zahl | 0,3 | Spurlautstärke (0–1) |
| Tastverhältnis | Zahl | 0,5 | Impulsbreite für Rechteckwellen (0–1) |
| detune | Zahl | 0 | Feinstimmung in Cent (1200 = 1 Oktave) |
| Oktavversatz | Zahl | 0 | Oktavverschiebung (±) |
| Halbton-Offset | Zahl | 0 | Halbtonverschiebung (±) |
| Tonhöhenhüllkurve | Zahl | 0 | Tiefenbereich der Tonhöhenhüllkurve in Halbtönen |
| Glide | Zahl | 0 | Portamento-Zeit in Sekunden |
Du kannst die Eigenschaften auch direkt an den Track-Objekten einstellen:
synth.tracks[0].type = 'sawtooth';
synth.tracks[0].volume = 0.4;
synth.updateLiveNotes(0); // Apply to active notes Legt die Amplituden-Hüllkurve für eine Spur fest. Steuert, wie Noten einblenden, gehalten werden und ausblenden.
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
}); | Eigenschaft | Typ | Bereich | Beschreibung |
|---|---|---|---|
| attack | Anzahl | 0–5 s | Zeit bis zum Erreichen der vollen Lautstärke |
| Ausklang | Zahl | 0–5 s | Zeit, bis der Pegel vom Spitzenwert auf das Sustain-Niveau abfällt |
| Sustain | Zahl | 0–1 | Lautstärkepegel, während die Note gehalten wird (0 = ausgeschaltet nach dem Ausklingen) |
| Release | Zahl | 0–10 s | Ausblendzeit nach dem Ende der Note |
| Spur | Anstieg | Abklingen | Sustain | Release |
|---|---|---|---|---|
| 0 – Lead | 0,01 | 0,10 | 0,7 | 0,20 |
| 1 – Bass | 0,01 | 0,20 | 0,8 | 0,15 |
| 2 – Schlagzeug | 0,001 | 0,10 | 0,0 | 0,05 |
| 3 – Effekte | 0,005 | 0,30 | 0,0 | 0,20 |
Konfiguriert die Tonhöhenmodulation (Vibrato) für eine Spur.
synth.updateVibrato(0, {
rate: 5, // Speed in Hz
depth: 12 // Amount in cents
}); | Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
| rate | Zahl | 0 | LFO-Geschwindigkeit in Hz (0 = aus) |
| Tiefe | Zahl | 0 | Tonhöhenabweichung in Cent (0 = aus) |
Jede Spur verfügt über einen optionalen Filter zur Gestaltung des Frequenzspektrums des Klangs.
synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterType = 'lowpass';
synth.tracks[0].filterCutoff = 2000;
synth.tracks[0].filterQ = 5;
synth.updateLiveNotes(0); | Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
| filterEnabled | bool | false | Filter aktivieren/deaktivieren |
| filterType | Zeichenkette | 'lowpass' | 'lowpass', 'highpass', 'bandpass', 'notch' |
| filterCutoff | Zahl | 20000 | Grenzfrequenz in Hz |
| filterQ | Zahl | 0,1 | Resonanz / Q-Faktor |
| filterKeyTrack | Zahl | 0 | Key-Tracking 0–100 (Cutoff folgt der Tonhöhe) |
| filterEnvAmount | Zahl | 0 | Tiefe der Filterhüllkurve (Halbtöne) |
| filterEnvAttack | Zahl | 0,01 | Filter-Hüllkurven-Attack (Sekunden) |
| filterEnvRelease | Zahl | 0,2 | Filter-Hüllkurve Release (Sekunden) |
Stapeln Sie mehrere verstimmte Oszillatoren für einen dichten, breiten Klang. Unverzichtbar für Pads und Leads.
synth.tracks[0].unisonVoices = 8;
synth.tracks[0].unisonDetune = 25; // cents between voices
synth.tracks[0].unisonSpread = 80; // stereo spread % | Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
| unisonVoices | Zahl | 1 | Anzahl der Oszillatoren (1–16) |
| unisonDetune | Zahl | 0 | Detune-Spreizung in Cent |
| Unison-Spreizung | Zahl | 0 | Stereo-Panning-Spread (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 | Eigenschaft | Typ | Beschreibung |
|---|---|---|
| tremoloRate | Zahl | Tremolo-Geschwindigkeit in Hz (0 = aus) |
| Tremolo-Tiefe | Zahl | Tremolo-Intensität (0–100) |
| lfoFilterRate | Zahl | Filter-LFO-Geschwindigkeit in Hz (0 = aus) |
| lfoFilterDepth | Zahl | Filter-LFO-Bereich in Hz |
Aktiviert den MIDI-Eingang von angeschlossenen Controllern. Gibt ein Array mit den Namen der erkannten MIDI-Eingabegeräte zurück.
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 */ }
}); | Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
| track | Nummer | 0 | Ziel-Track für MIDI-Noten |
| Kanal | Nummer | 0 | MIDI-Kanalfilter (1–16, 0 = alle) |
| onConnect | Funktion | — | Wird aufgerufen, wenn ein MIDI-Gerät eine Verbindung herstellt |
| onDisconnect | Funktion | — | Wird aufgerufen, wenn ein MIDI-Gerät die Verbindung trennt |
| onNoteOn | Funktion | — | Wird bei Note On aufgerufen (Note, Anschlagstärke, Kanal) |
| onNoteOff | Funktion | — | Wird bei Note-Off aufgerufen (Note, Kanal) |
| onCC | Funktion | — | Wird bei einer Control-Change-Änderung aufgerufen (cc, Wert, Kanal) |
| CC | Name | Effekt |
|---|---|---|
| 1 | Modulationsrad | Steuert die Vibrato-Intensität |
| 7 | Lautstärke | Regelt die Lautstärke des Tracks |
| 64 | Sustain-Pedal | Hält gehaltene Noten |
| 120 | Alle Töne ausschalten | Hält alle Töne an |
| 123 | Alle Töne aus | Alle Noten stoppen |
Deaktiviert den MIDI-Eingang und stoppt alle gehaltenen MIDI-Noten.
Ändert, welcher Track MIDI-Eingaben empfängt.
Legt den MIDI-Kanalfilter fest (0 = alle Kanäle).
Gibt zurück, ob MIDI derzeit aktiv ist.
Gibt Zeitbereichs-Wellenformdaten für die Darstellung von Visualisierungen im Oszilloskop-Stil zurück. Die Werte reichen von 0 bis 255 (128 = Mitte).
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);
} Gibt Frequenzbereichsdaten (FFT) für Spektrumvisualisierungen zurück. Die Werte liegen im Bereich von 0 bis 255.
Stellt die Master-Ausgangslautstärke ein (0–1).
Gibt die aktuelle Master-Lautstärke zurück.
Setzt alle Spuren, Hüllkurven und das Vibrato auf ihre Standardwerte zurück.
Konvertiert einen Notennamen und eine Oktave in eine Frequenz in Hz.
ChiptuneSynth.noteToFrequency('A', 4); // → 440
ChiptuneSynth.noteToFrequency('C', 4); // → 261.63 Konvertiert eine MIDI-Notennummer (0–127) in eine Frequenz in Hz.
Konvertiert eine Frequenz in die nächstgelegene MIDI-Notennummer.
Gibt ein Array mit allen verfügbaren SFX-Preset-Namen zurück.
ChiptuneSynth.getPresetNames();
// → ['laser','coin','jump','explosion','powerup','hit','blip','bass','shoot','1up'] Gibt ein Array aller verfügbaren Instrumenten-Preset-Namen zurück.
Gibt ein Objekt zurück, das nach Instrumentennamen sortiert ist, wobei jeder Wert die vollständige Definition enthält (Spureinstellungen, Hüllkurve, Vibrato, Filter usw.).
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' Sie können Ihre eigenen Instrumente erstellen, indem Sie Track-Einstellungen, Hüllkurven, Vibrato und Filter kombinieren. So erstellen Sie Sounds von Grund auf neu.
Konfigurieren Sie eine Spur manuell und spielen Sie dann Noten darauf:
// 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); Das Preset-Muster nachbilden – eine Spur konfigurieren, eine Note spielen und den Rest der Hüllkurve überlassen:
// 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! Kombiniere mehrere Funktionen für ausdrucksstarke Instrumente:
// 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); Schichten Sie mehrere Spuren für komplexe Klänge:
// 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);
} Organisieren Sie Ihre benutzerdefinierten Instrumente als Konfigurationsobjekte:
// 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); | Spur | Index | Wellenform | Lautstärke |
|---|---|---|---|
| Lead | 0 | Quadrat | 0,30 |
| Bass | 1 | Triangel | 0,40 |
| Schlagzeug | 2 | Geräusch | 0,50 |
| FX | 3 | Sägezahn | 0,25 |
Die „Per-note-gainNode“ steuert ausschließlich die ADSR-Hüllkurve (normalisiert 0→1→Sustain). Die Lautstärke der Spur wird über einen separaten „_trackGains[]“-Knoten geregelt. Diese Architektur ermöglicht Parameteränderungen in Echtzeit, ohne den ADSR-Ablauf der gespielten Noten zu unterbrechen.