Полное руководство по ChiptuneSynth — 4-дорожечному чиптюн-синтезатору для 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()` внутри обработчика события `click` или после взаимодействия с пользователем.Создает новый экземпляр синтезатора с 4 дорожками (Lead, Bass, Drums, FX), огибающими по умолчанию и пустыми настройками вибрато.
const synth = new ChiptuneSynth(); Инициализирует контекст Web Audio API, создает мастер-гейн, анализатор, узлы гейна для каждой дорожки и буфер шума. Должно быть вызвано один раз перед любым воспроизведением.
await synth.init(); Останавливает все ноты и закрывает AudioContext. Вызывайте, когда закончите работу с синтезатором.
Воспроизводит ноту с заданной частотой (Гц) на указанной дорожке.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| частота | число | — | Частота в Гц (например, 440 для A4) |
| trackIndex | номер | 0 | Индекс дорожки: 0=Мелодия, 1=Бас, 2=Ударные, 3=Эффекты |
| продолжительность | число | 10 | Продолжительность в секундах. Значения ≥10 создают длительные ноты |
| startTime | число | сейчас | Время начала AudioContext (для планирования) |
const noteId = synth.playNote(440, 0, 0.5); // A4, Lead, 0.5s duration = 10 или выше для длительных нот, которые вы управляете вручную с помощью stopNote(). Так работают клавиатура и MIDI.Воспроизводит ноту по ее музыкальному имени.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| note | строка | — | Название ноты: C, C#, D, D#, E, F, F#, G, G#, A, A#, B (также Db, Eb, Gb, Ab, Bb) |
| октава | число | 4 | Октава (1–7) |
| index_track | номер | 0 | Целевой трек |
| продолжительность | число | 10 | Продолжительность в секундах |
synth.playNoteByName('C', 4, 0, 0.5); // Middle C on Lead
synth.playNoteByName('Eb', 3, 1, 1.0); // Eb3 on Bass Останавливает конкретную ноту вместе с ее огибающей затухания. Используйте noteId, возвращаемый функциями playNote() или playNoteByName().
Немедленно останавливает все активные ноты на всех дорожках.
Загружает и воспроизводит встроенный пресет SFX за один вызов. Идеально подходит для звуковых эффектов в играх.
synth.playPreset('coin');
synth.playPreset('explosion');
synth.playPreset('jump'); | Название | Описание | Пример использования |
|---|---|---|
| лазер | Нисходящий луч | Стрельба, лучи |
| монета | Восходящий яркий звон | Сбор предметов |
| прыжок | Быстрое восходящее движение | Прыжок, отскок |
| взрыв | Затухание шума | Разрушение, смерть |
| усиление | Восходящая фанара | Бонусы, улучшения |
| Удар | Звук резкого удара | Урон, столкновение |
| писк | Короткий щелчок интерфейса | Выбор в меню, интерфейс |
| бас | Глубокий треугольный удар | Удары баса |
| выстрел | Быстрый выстрел | Оружие с автоматом |
| 1up | Восходящая фанфара | Дополнительные жизни, бонусы |
Загружает настройки пресета (форма волны, огибающая, эффекты) на дорожку, не воспроизводя его. Полезно для настройки дорожки перед запуском нот вручную.
Загружает полный пресет инструмента на указанный трек, настраивая форму волны, огибающую, вибрато и модуляцию.
synth.loadInstrument('violin', 0);
synth.playNoteByName('A', 4, 0, 2.0); | Название | Тип | Описание |
|---|---|---|
| фортепиано | треугольник | Яркий перкуссионный звук с быстрым затуханием |
| скрипка | пилообразный | Теплый звук смычковых струн с вибрато |
| виолончель | пилообразный | Глубокий звук смычковых, низкий регистр |
| флейта | синусоида | Мягкий, дыхательный тон с вибрато |
| орган | квадратный | Длительный звук трубного органа |
| латунь | пилообразный | Выразительный звук валторны/трубы |
| гармоника | квадратный | Тростниковый PWM-звук с тремоло |
| синтезатор-лид | квадратный | Классический чиптюн-лид |
| synthPad | пилообразный | Широкий унисонный пэд с фильтром |
| synthBass | пилообразный | Энергичный синтезаторный бас |
| маримба | синусоида | Перкуссионный звук молоточков |
| электрическая гитара | квадратный | Эмуляция перегруженной гитары |
Обновляет одно или несколько свойств дорожки. Изменения применяются в реальном времени к текущим нотам.
synth.updateTrack(0, {
type: 'sawtooth',
volume: 0.4,
unisonVoices: 4,
unisonDetune: 20
}); | Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
| тип | строка | 'квадратная' | Форма сигнала: «square», «triangle», «sawtooth», «sine», «noise» |
| громкость | число | 0,3 | Громкость трека (0–1) |
| коэффициент заполнения | число | 0,5 | Ширина импульса для прямоугольных сигналов (0–1) |
| отклонение | число | 0 | Тонкая настройка в центах (1200 = 1 октава) |
| смещение октавы | число | 0 | Сдвиг октавы (±) |
| смещение полутона | число | 0 | Сдвиг на полутон (±) |
| pitchEnv | число | 0 | Глубина огибающей высоты тона в полутонах |
| glide | число | 0 | Время портамента в секундах |
Вы также можете напрямую настроить свойства объектов дорожки:
synth.tracks[0].type = 'sawtooth';
synth.tracks[0].volume = 0.4;
synth.updateLiveNotes(0); // Apply to active notes Устанавливает огибающую амплитуды для дорожки. Управляет тем, как ноты затихают, звучат и затихают.
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
}); | Свойство | Тип | Диапазон | Описание |
|---|---|---|---|
| attack | число | 0–5 с | Время достижения полной громкости |
| затухание | число | 0–5 с | Время падения от пикового значения до уровня поддержания |
| удержание | число | 0–1 | Уровень громкости при удержании ноты (0 = выключено после затухания) |
| отпускание | число | 0–10 с | Время затухания после остановки ноты |
| Дорожка | Атака | Затухание | Поддержание | Релиз |
|---|---|---|---|---|
| 0 — Лид | 0,01 | 0,10 | 0,7 | 0,20 |
| 1 — Бас | 0,01 | 0,20 | 0,8 | 0,15 |
| 2 — Ударные | 0,001 | 0,10 | 0,0 | 0,05 |
| 3 — Эффекты | 0,005 | 0,30 | 0,0 | 0,20 |
Настраивает модуляцию высоты тона (вибрато) для дорожки.
synth.updateVibrato(0, {
rate: 5, // Speed in Hz
depth: 12 // Amount in cents
}); | Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
| rate | число | 0 | Скорость LFO в Гц (0 = выкл.) |
| глубина | число | 0 | Отклонение высоты тона в центах (0 = выкл.) |
Каждый трек имеет опциональный фильтр для формирования частотного состава звука.
synth.tracks[0].filterEnabled = true;
synth.tracks[0].filterType = 'lowpass';
synth.tracks[0].filterCutoff = 2000;
synth.tracks[0].filterQ = 5;
synth.updateLiveNotes(0); | Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
| filterEnabled | логическое | false | Включить/отключить фильтр |
| filterType | строка | 'lowpass' | 'lowpass', 'highpass', 'bandpass', 'notch' |
| частота среза | число | 20000 | Частота среза в Гц |
| filterQ | число | 0,1 | Резонанс / коэффициент Q |
| filterKeyTrack | число | 0 | Отслеживание клавиш 0–100 (частота среза зависит от высоты тона) |
| filterEnvAmount | число | 0 | Глубина огибающей фильтра (полутона) |
| filterEnvAttack | число | 0,01 | Атака огибающей фильтра (секунды) |
| filterEnvRelease | число | 0,2 | Время спада огибающей фильтра (секунды) |
Сложите несколько расстроенных генераторов для получения плотного, широкого звучания. Незаменимо для пэдов и лидов.
synth.tracks[0].unisonVoices = 8;
synth.tracks[0].unisonDetune = 25; // cents between voices
synth.tracks[0].unisonSpread = 80; // stereo spread % | Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
| unisonVoices | число | 1 | Количество генераторов (1–16) |
| unisonDetune | число | 0 | Расхождение в центах |
| unisonSpread | число | 0 | Расширение стереопанорамирования (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 | Свойство | Тип | Описание |
|---|---|---|
| tremoloRate | число | Скорость тремоло в Гц (0 = выкл.) |
| tremoloDepth | число | Интенсивность тремоло (0–100) |
| lfoFilterRate | число | Скорость LFO фильтра в Гц (0 = выкл.) |
| lfoFilterDepth | число | Диапазон LFO фильтра в Гц |
Включает ввод MIDI с подключенных контроллеров. Возвращает массив имен обнаруженных устройств ввода MIDI.
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 */ }
}); | Свойство | Тип | По умолчанию | Описание |
|---|---|---|---|
| трек | номер | 0 | Целевой трек для MIDI-нот |
| канал | номер | 0 | Фильтр MIDI-каналов (1–16, 0 = все) |
| onConnect | функция | — | Вызывается при подключении MIDI-устройства |
| onDisconnect | функция | — | Вызывается при отключении MIDI-устройства |
| onNoteOn | функция | — | Вызывается при включении ноты (нота, скорость, канал) |
| onNoteOff | функция | — | Вызывается при отключении ноты (note, channel) |
| onCC | функция | — | Вызывается при изменении параметра управления (cc, значение, канал) |
| CC | Имя | Эффект |
|---|---|---|
| 1 | Колесо модуляции | Регулирует глубину вибрато |
| 7 | Громкость | Регулирует громкость трека |
| 64 | Педаль сустейна | Поддерживает задержанные ноты |
| 120 | Отключение всех звуков | Остановка всех нот |
| 123 | Отключить все ноты | Остановить все ноты |
Отключает MIDI-вход и останавливает все удерживаемые MIDI-ноты.
Изменяет дорожку, принимающую MIDI-вход.
Устанавливает фильтр MIDI-каналов (0 = все каналы).
Возвращает, активен ли MIDI в данный момент.
Возвращает данные формы волны во временной области для рисования визуализаций в стиле осциллографа. Значения варьируются от 0 до 255 (128 = центр).
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);
} Возвращает данные в частотной области (FFT) для визуализации спектра. Значения находятся в диапазоне от 0 до 255.
Устанавливает общую громкость выхода (0–1).
Возвращает текущую громкость главного выхода.
Сбрасывает все дорожки, огибающие и вибрато к значениям по умолчанию.
Преобразует название ноты и октаву в частоту в Гц.
ChiptuneSynth.noteToFrequency('A', 4); // → 440
ChiptuneSynth.noteToFrequency('C', 4); // → 261.63 Преобразует номер MIDI-ноты (0–127) в частоту в Гц.
Преобразует частоту в ближайший номер MIDI-ноты.
Возвращает массив всех доступных имен пресетов SFX.
ChiptuneSynth.getPresetNames();
// → ['laser','coin','jump','explosion','powerup','hit','blip','bass','shoot','1up'] Возвращает массив всех доступных имен пресетов инструментов.
Возвращает объект, индексируемый по имени инструмента, каждое значение которого содержит полное определение (настройки дорожки, огибающая, вибрато, фильтр и т. д.).
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' Вы можете создавать собственные инструменты, комбинируя настройки дорожек, огибающие, вибрато и фильтры. Вот как создавать звуки с нуля.
Настройте дорожку вручную, а затем сыграйте на ней ноты:
// 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); Воспроизведите шаблон пресета — настройте дорожку, сыграйте ноту, а остальное доверьте огибающей:
// 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! Объедините несколько функций для создания выразительных инструментов:
// 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); Наслаивайте несколько дорожек для создания сложных звуков:
// 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);
} Организуйте свои пользовательские инструменты в виде объектов конфигурации:
// 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); | Трек | Индекс | Форма сигнала | Громкость |
|---|---|---|---|
| Лид | 0 | квадрат | 0,30 |
| Бас | 1 | треугольник | 0,40 |
| Ударные | 2 | шум | 0,50 |
| FX | 3 | пилообразный | 0,25 |
gainNode, настраиваемый для каждой ноты, управляет только огибающей ADSR (нормированной 0→1→sustain). Громкость трека регулируется отдельным узлом _trackGains[]. Такая архитектура позволяет изменять параметры в реальном времени, не прерывая график ADSR воспроизводимых нот.