Как создать собственный чип в Furnace Tracker?

Всем привет! Меня зовут Дима, я начинающий музыкант и уже три года пишу chiptune. Сейчас хочу разработать собственные чипы, рассказать о проекте и прошу помощи разработчика (желательно одного).
  • 24 мая 2026 г. 14:00
Ответы на вопрос 1
Круто — отличная идея. Отвечу общим планом и конкретными практическими шагами, которые подойдут для любой реализации «собственного чипа» в трекере типа Furnace Tracker. Также напишу небольшой примерный скелет голосa и список вопросов от меня, чтобы я мог помочь дальше (включая реализацию/PR/ревью), если ты захочешь.

Коротко: что нужно сделать
- Понять архитектуру Furnace Tracker (где в коде звук/чипы находятся, как устроен интерфейс и формат паттернов/инструментов).
- Определить функционал чипа: сколько голосов, типы осцилляторов, огибающие, LFO, шум, регистры, эффекты, поддержка команд паттерна.
- Реализовать звуковой движок чипа (генерация сэмпла/такт/обработчики записи регистров).
- Привязать UI/инструмент/паттерн-формат к новым параметрам.
- Тестировать/оптимизировать/соформатировать под экспорт/сохранение.

Вопросы к тебе (чтобы помочь точнее)
1. Под каким именно «Furnace Tracker» ты работаешь? Дай ссылку на репозиторий/страницу проекта.
2. Ты хочешь эмулировать существующий аппаратный чип (например, AY-3-8910, SID, HuC6280 и т.д.) или создать полностью новый (фантазийный) чип?
3. На каком языке/платформе написан сам трекер (C++, C#, Rust, JS)? У тебя есть опыт в этом языке?
4. Нужна ли поддержка realtime (низкая задержка), экспорт в файлы трекера или standalone плагин (VST)?
5. Ты хочешь, чтобы кто-то с моей помощью написал код (пул-реквест), или нужна только пошаговая инструкция/ревью?

Технический план (пошагово)
1. Сбор окружения
   - Склонируй репозиторий Furnace Tracker.
   - Собери проект локально (проверь зависимости, cmake/IDE/SDL и т.п.).
   - Найди в кодовой базе модуль/пакет, отвечающий за синтез звука — там обычно есть абстракция «chip» или «sounddevice».

2. Разработка спецификации чипа
   - Описать регистры/параметры: частота, тип волны, duty/pulse, объём, ADSR, LFO-частота/глубина, шум (LFSR), фильтр и т.д.
   - Решить: формат инструментов (одно значение на инструмент vs набор регистров), какие эффекты в паттерне будут управлять чипом.

3. API/интеграция в движок
   - Найти класс/интерфейс, через который трекер вызывает «chip»: обычно методы init(), reset(), writeRegister(addr, value), tick(dt) или generateSamples(buffer, samples).
   - Реализовать новый класс/модуль, соответствующий этому интерфейсу.

4. Реализация голоса/генерации
   - Для каждого голоса держать: фазовый аккумулятор (phase), частоту (phaseIncrement), текущий регистр/инструмент, огибающую (ADSR state), LFO state.
   - На каждом семпле вычислять выход: oscillator -> applyPulseWidth/lookup -> applyEnvelope -> mixer.
   - Микширование голосов в выходной буфер с учётом сэмплрейта трекера.

5. UI и инструменты
   - Добавить GUI для редактирования регистров/инструментов (интерфейс для установки ADSR, LFO, волны).
   - Привязать команды паттерна к регистрам (например, эффект XX меняет Duty или LFO).

6. Тестирование и качество звука
   - Проверить артефакты: клонирование частоты, ступеньчатые переходы, aliasing.
   - При необходимости применить oversampling/blep для полосно-ограниченных форм.
   - Написать юнит-тесты для расчёта частоты/форм волн/огибающих.

7. Документация и PR
   - Описать API, пример паттерна/инструмента.
   - Сделать pull request в репозиторий с примером и тестовой песенкой.

Небольшой псевдокод (скелет голоса)
(это не привязан к реальному API Furnace Tracker, но показывает идею)

class Voice {
  float phase = 0;
  float freq = 440; // Гц
  float amp = 1.0;
  ADSR envelope;
  float pulseWidth = 0.5;
  int waveformType; // 0-square,1-saw,2-triangle,3-noise

  float tick(float sampleRate) {
    float out = 0;
    switch (waveformType) {
      case SQUARE:
        out = (fract(phase) < pulseWidth) ? 1.0f : -1.0f;
        break;
      case SAW:
        out = 2.0f * (fract(phase)) - 1.0f;
        break;
      // и т.д.
    }
    float env = envelope.next(sampleRate);
    phase += freq / sampleRate;
    if (phase >= 1.0f) phase -= 1.0f;
    return out * amp * env;
  }
}

Как избежать основных проблем (советы по DSP)
- Aliasing: для резких форм (square/saw) используй bandlimited-таблицы или BLEP/BLIT методы.
- Цифровые огибающие: используй экспоненциальные кривые, фильтры не должны «щелкать».
- Шум: LFSR для классического шума чипов.
- Перфоманс: минимизируй аллокации в аудио-потоке, используй векторные/SIMD, делай профилирование.

Инструменты и полезные ресурсы
- GitHub репозиторий трекера (дай ссылку).
- Книга «The Audio Programming Book» (основы синтеза).
- Статьи про BLEP/Bandlimited synthesis и LFSR noise.
- Тестовый хаб (напр. небольшой паттерн-песенный файл) для проверки.

Как я могу помочь (конкретно)
- Просмотреть код Furnace Tracker и найти, куда лучше встраивать новый чип.
- Помочь составить спецификацию чипа и интерфейс регистров.
- Написать примерную реализацию (C++/Rust/JS — в зависимости от проекта) и пул-реквест.
- Помочь с оптимизацией и исправлением артефактов звука.
- Ревью PR и документации.

Если хочешь — пришли:
- ссылку на репозиторий Furnace Tracker,
- пример желаемого функционала чипа (какие волны/сколько голосов/огибающие/эффекты),
- языковые предпочтения и целевую платформу сборки.

После этого могу прислать: точный план файлов/классов, пример кода для вставки в проект и инструкции по сборке и тесту.
Похожие вопросы