
От редакции: представляем статью Евгения Соболева — автора нового AY-плеера для ZX Spectrum под названием deNextPlayer.
Пользователи Спектрума, конечно, помнят многочисленные проигрыватели AY.
Однако таких, чтобы поддерживали все основные форматы трекеров ZX Spectrum и TurboSound, существует всего три: всеядный The Viewer, ориентированный на расширенные интерфейсы WildPlayer и морально устаревший TSMP. Все они написаны для TR-DOS, и именно ими приходится проигрывать ≈500 модулей в форматах TS (число постоянно растёт) на реальном железе.
На смежных системах выбор невелик: <gp.com> в NedoOS и Modplay в +3DOS (не поддерживает TS). Для GDOS/G+DOS/UNI-DOS проигрывателей не существует.
Неудивительно, что появление NextPlayer с поддержкой TurboSound для NextZXOS от Мирослава Бурсы (Shrek) из Чехии вызвало, с одной стороны, энтузиазм (кроме pt3play для Next ничего подобного нет), а с другой — раздражение.
Многие не понимали: что в нём задействует специфическое железо Next? Плеер использует экран обычного ZX Spectrum, не проигрывает на трёх AY, не интегрирован в NextZXOS, а поддержанная esxDOS доступна любым пользователям DivMMC, DivIDE и FPGA-клонов вроде ZX-Uno. И при этом намертво «прибит гвоздями» к Next.
Масла в огонь подлил и сам Мирослав, выложивший исходники на GitHub. Они на две трети состоят из открытого кода российских разработчиков: Сергея Бульбы (Хабаровск), Дмитрия Быстрова (Рязань), Ивана Рощина (Москва) и Александра Семёнова (Москва). Они не удостоились упоминания или благодарности, а авторство проигрывателей AY приписано Мартину Борику из Словакии (возможно, он внёс вклад плеером SQ Tracker, но это неточно). Сам Мирослав выступает как автор интерфейса.
Забегая вперёд, скажем, что это было исправлено в deNextPlayer.


Код интерфейса тоже вызвал вопросы и перманентные обсуждения: одни считают его нейросетевым творчеством (особенно в свете активности Shrek), другие — что нейросети столько ошибок не сделают, на это способен только человек.
Например, данные о том, где и что печатать, засылаются не в те регистры, затем регистры меняются местами, и после этого вызывается печать. Печать чисел получает аргументы через стек (крах при его перемещении). Модули PT2 и PT3 в NextPlayer проигрывает VTPL — только он умеет TurboSound, но помимо него в код включён ещё один проигрыватель PT2 и PT3: он собирается и хранится в памяти, но не используется. Таких проблем в коде интерфейса NextPlayer десятки: неиспользуемые ветки, дублирующийся код, мёртвые структуры и переменные.
Недовольство пользователей побудило автора избавить NextPlayer от привязки к Next, и начиная с версии 0.72 он ориентирован на esxDOS и обычный ZX Spectrum 128. Фирменный стиль Shrek просматривается в отсутствии проверок, поэтому при неуспешном обращении к esxDOS программа сбрасывается. С этим первыми столкнулись пользователи эмуляторов, загружающих предлагаемый TAP-файл.
Причин вернуть проигрыватель пользователям накопилось достаточно. Тем более сам автор признаётся в блоге, что долго ждал, когда «кто-нибудь его исправит», но «все будут лучше критиковать». Ссылаясь на это, Мирослав больше не выкладывает исходники.
Проект deNextPlayer растянулся на 2 недели вычитки кода и компиляций. Хотя начался он с перевода комментариев оригинального кода с чешского на русский, затем добавился перевод меток, затем выбрасывались регистры Next, начиная с хлопания 3,5/28 МГц (по мысли Мирослава, это ускоряет вывод текста). И постепенно программа стала приобретать очертания, типичные для ПО под TR-DOS.
Так или иначе, 49 664 байта кода NextPlayer (плюс 176–192 Кб в зависимости от размера каталога и динамических банков для LFN) превратились в 17 862 байта deNextPlayer (13 Кб в запакованном релизе на диске), запускаемых на любом отечественном клоне с TR-DOS и AY (или TurboSound) и хотя бы 48 Кб памяти. При полном сохранении и даже расширении функционала.


Есть такая проблема с TurboSound на реальном железе: один AY на пике даёт ≈15 «единиц» амплитуды, два AY в сумме — до 30, а вход усилителя рассчитан на ≈15. Поэтому если при проигрывании Monday (TS extended) на реальном железе вы слышите треск (характерно для наушников), то это аналоговый клиппинг. При прослушивании в Vortex Tracker или ZXTune на PC вы его не услышите, но на реальном железе (исключая ZX Evolution Baseconf, где сигналы аппаратно согласованы) или в эмуляторе Unreal — добро пожаловать в «прекрасный» мир клиппинга.
Для борьбы с этой бедой в deNextPlayer был добавлен амплитудный фильтр (по умолчанию выключен). Он заменяет переключение между AY и YM в оригинальном NextPlayer, т.к. на железе, в отличие от эмулятора, переключать нечего: таблицы проигрывателя рассчитаны на тактовую частоту ≈1.75 МГц / 16 и одинаковы для AY-3-8910 и YM2149, а разница в том, что аппаратно YM имеет несколько другую форму кривой громкости.
Помимо этого, deNextPlayer способен определить по заголовку файла редактор, в котором был создан трек, определить формат TurboSound, а также программно переключать стереорежим между ABC и ACB (актуально для модулей Sound Tracker и SQ Tracker).
💾 Финальный релиз с набором треков, использованных для теста, можно скачать с «Идеального пикселя». Исходники выложены на GitFlic.


Если у кого-то возникнет желание дополнительно оптимизировать код (есть ещё что поделать), адаптировать его к Z-Controller или NedoOS — добро пожаловать. По общему правилу предлагается добавлять в таких редакциях название модификации, например 0.75.z или 0.75.nedoos. Свой копирайт в этом случае удобно добавить после строчки «Preparated:».
Улучшения и изменения deNextPlayer 0.75.trdos
Оставлять комментарии могут только авторизованные пользователи.