VGMPLAY.WMF — VGM Player for TSConfig / Wild Commander

VGM/VGZ player plugin for Wild Commander (WC) on ZX Spectrum TSConfig with MultiSound FPGA sound card. Written in C (SDCC) + Z80 assembly.

Version: v0.9-beta

Исходный проект плагина: demyanenko-d/VGMPLAY.WMF. Автор исходного кода — GitHub-пользователь demyanenko-d.

Supported Sound Chips

Chip VGM cmd Notes
OPL1 (YM3526) 0x5A/0x5B Через MultiSound OPL3 (compat mode)
OPL2 (YM3812) 0x5A/0x5B Через MultiSound OPL3 (compat mode)
OPL3 (YMF262) 0x5E/0x5F NEW=1, стерео L/R через C0-C8
YMF278B (OPL4) 0xD0 FM (порты 0/1) через OPL3 #C4-#C7; wave-часть (порт 2) через #7E/#7F (ZXM-MoonSound)
AY-3-8910 / YM2149 0xA0 Single + dual chip
YM2203 (OPN) 0x55/0xA0 SSG-часть через AY
SAA1099 0xBD Single + dual chip (bit7 chip select)

Форматы: VGM (raw), VGZ (gzip — распаковка через inline inflate).

Features

  • GD3 metadata — отображение названия трека, игры, автора, системы
  • Двойная буферизация — ISR 683 Hz проигрывает команды, main loop наполняет буферы
  • Спектроанализатор — 16-полосный в реальном времени с плавным затуханием
  • OPL4 — воспроизведение FM- и wave-частей YMF278B на ZXM-MoonSound
  • Progress bar — текущее время / общая длительность + счётчик loop
  • VGZ inflate — распаковка gzip прямо в память с progress bar
  • Dual chip — поддержка двухчиповых VGM (AY×2, SAA×2, YM2203×2)
  • SAA chip select — переключение chip0/chip1 клавишами 1/2
  • Cmdblocks — предрассчитанные блоки инициализации/silence в SRAM
  • PS/2 клавиатура — прямой доступ через CMOS FIFO TSConfig (без WC API)
  • Варианты сборки — build_variants.ps1 генерирует множество WMF с разными ISR freq / budget

OPL4 и спектроанализатор

Для OPL4 анализатор отслеживает KeyOn/KeyOff 24 wave-каналов. Каналы 0–15 соответствуют 16 полосам, а каналы 16–23 объединяются с полосами 0–7. При новом KeyOn полоса поднимается до максимума, затем плавно опускается до уровня 3, пока канал активен; после KeyOff она затухает до нуля. Это индикатор активности каналов, а не измеритель фактической амплитуды PCM-сэмплов.

Управление (PS/2 клавиатура)

Клавиша Действие
Space Следующий трек
P Предыдущий трек
Esc Выход из плагина
1 SAA режим 1 — chip0 (левый SAA1099)
2 SAA режим 2 — chip1 (правый SAA1099)

Клавиши 1/2 активны только для dual-SAA музыки на одночиповой плате (saa_chips=1). На двухчиповой плате (saa_chips=2) режим выбирается автоматически.

Настройки (wc.ini)

Параметры задаются в конфигурации WC:

VGMPLAY.WMF -min_dur=10 -max_dur=4 -loops=1 -saa=1 -saa_chips=1
# Параметр Default Описание
0 min_dur 10 Минимальная длительность трека (секунды)
1 max_dur 4 Максимальная длительность (минуты)
2 loops 1 Количество проигрываний loop-секции
3 saa 1 SAA режим: 1 = chip0, 2 = chip1
4 saa_chips 1 Конфигурация платы: 1 = один SAA (default), 2 = два SAA

Логика SAA режимов

  • saa_chips=1 (одночиповая плата, default):
    • Single-SAA музыка → всегда играет на chip0
    • Dual-SAA музыка → по умолчанию chip0; переключение клавишами 1/2
  • saa_chips=2 (двухчиповая плата):
    • Single-SAA музыка → только chip0
    • Dual-SAA музыка → turbo mode (оба чипа одновременно), переключение недоступно

Сборка

Требования

  • SDCC — компилятор C для Z80 (sdcc, sdasz80, sdld)
  • sjasmplus — ассемблер для cmdblocks и inflate
  • Node.js — скрипты генерации (pos_table, freq_tables, ihx2wmf)

Основная сборка

cd src_sdcc
build.bat

Результат: VGMPLAY.WMF в корне проекта + tsconf.img (образ диска).

Варианты сборки

cd src_sdcc
.\build_variants.ps1

Генерирует все комбинации ISR freq / budget / no-short-waits в папку variants/.

Параметры варианта задаёт единственный файл inc/variant_cfg.h:

Параметр Описание
ISR_FREQ Частота ISR (683 / 1367 / 2734 Hz)
VGM_FILL_CMD_BUDGET Макс. VGM-команд между yield (8..64)
VARIANT_DATA_LOC Адрес начала сегмента _DATA (hex)
VGM_NO_SHORT_WAITS Отключить обработку пауз 0x70-0x7F

Структура проекта

src_sdcc/           Исходный код (C + ASM)
  main.c            Главный модуль: UI, playback loop, INI
  lib/vgm.c         VGM парсер, fill_buffer, emit handlers
  lib/keys.c        PS/2 клавиатура (FSM, CMOS FIFO)
  asm/isr.s         ISR: двойная буферизация, pos_table
  asm/spectrum.s    Спектроанализатор (рендер + decay)
  asm/cmdblocks.asm Блоки init/silence для всех чипов
  asm/inflate_call.s Обёртка inflate для VGZ
  inc/              Заголовочные файлы
  scripts/          Node.js утилиты сборки
  build/            Временные артефакты
variants/           Предсобранные WMF для A/B тестирования
DiskRef/            Эталонные файлы диска, тестовая музыка
Ref/                Документация чипов, SDK, FPGA reference
doc/                Описание WC Plugin API, VGM формата
SamFlate/           Z80 inflate (распаковка gzip)
tools/              sjasm, Unreal emulator

Аппаратные требования

  • ZX Spectrum TSConfig (ZX Evolution с TSConf FPGA)
  • Wild Commander (ОС/файловый менеджер)
  • MultiSound FPGA — звуковая карта (OPL3 + AY + SAA1099)
  • ZXM-MoonSound (YMF278B) — требуется для воспроизведения OPL4 wave-части
  • CPU 14 MHz (turbo mode, автоматически включается плагином)
  • PS/2 клавиатура

Лицензия

Проект предназначен для использования с аппаратной платформой TSConfig.

S
Description
VGMPLAY.WMF
Readme
6.4 MiB
Languages
C 23.7%
Assembly 23.2%
C# 22.8%
HTML 18.8%
JavaScript 8.1%
Other 3.4%