Как стать автором
Обновить

Комментарии 38

По тональности похоже на музыкальный плеер из игры Savage 2 ))

Местами даже не верится, что это бипер на Z80.
Я слушал много диджейских миксов AY, где база играется на AY, но дальше доводится в аудиоредакторе так, что где-то тише-громче, где-то эхо, где-то другие эффекты. В этом альбоме тоже есть такие места, которые сыграны немного тише или немного громче, чем основная тема.

Да, биперной музыке не свойственна большая динамика по громкости, и это один из ключевых моментов, который я пытался развить. Тут совмещены все известные техники в одном флаконе. Какие-то методы синтеза просто дают более громкий (по восприятию) звук, чем другие. В ряде мест вместо громкости используется скважность, что также создаёт иллюзию громче-тише (тон со скважностью 50% ощущается громче, чем 12.5%, т.к. энергии действительно разное кол-во). И несколько движков на основе чередования каналов имеют намеренный действительный разбаланс по громкости каналов. Т.е. одному каналу отдаётся больше времени, чем другому, получается такой очень грубый PWM с несущей на ~14 кГц. Все эти возможности переключаются при необходимости каждую ноту.

Да, я разбирался с этим принципом, он встречался в Chronos или в Golden Axe.
Но тут совершенно дикое смешение всех принципов, которые только были на Spectrum: тут есть что-то и от Wham! Music box, и от Savage, и от Chronos.

ещё в стародавние времена, была игра на спектруме - Marauder.

У неё тоже была весьма неплохая музыка на бипере (именно на нём, а не AY), на заставке. Возможно, сделано на похожем принципе.

Проверить, к сожалению, уже не на чем.

НЛО прилетело и опубликовало эту надпись здесь

в мародере никогда не было биперной музыки.

Да, биперная версия музыки из Midnight Resistance - один из главных кирпичиков в развитии моего интереса к биперу даже во времена AY. Аркадная и Сеговская версии этого трека конечно очень эпичны, но биперная версия прекрасно передаёт мелодию самыми минимальными средствами.

О, а мелодию из Ramparts я в детстве слышал в заставке какой-то игры на IBM PC, по-моему игра называлась Myth, но могу ошибаться. Игралась через PC speaker. Это была моя любимая мелодия из игр тогда, я мог слушать её буквально часами, поэтому узнал её с первых же нот сейчас. До сих пор завораживает!


Так вот её, оказывается, откуда стянули. А я думал что оригинальная мелодия в той игре была.

Оно?



Есть, кстати, в современном исполнении. И весьма отличном.

Да, оно! Knightmare, точно! :) Так это порт со спектрума, получается? Или стянули только мелодию?

Вроде как только мелодию.

НЛО прилетело и опубликовало эту надпись здесь

Такой цикл — 40 тактов, т.е. около 87кГц.
А можно убрать переход (развернуть цикл), и сэкономить 10 тактов.
Или вместо EX AF, AF' выводить в порт значения из разных регистров, командами


OUT (C), D
OUT (C), E

Так получится 160кГц.
Наверное, это максимум.

НЛО прилетело и опубликовало эту надпись здесь

На Z80 есть команды out (c),r. Ими можно отправлять любой регистр в порт, адрес которого в паре BC, за 12 тактов. В общем да, предложенный вариант самый быстрый, но всё же 3500000/24=145833 гц.

НЛО прилетело и опубликовало эту надпись здесь
Перейти на строку "4" (Безусловный переход к адресу, указанному в регистре HL) — 4 такта

О, я уже и забыл про такое. Считал только JP / JR с непосредственно заданным адресом.

Максимальную частоту чисто теоретически можно получить так:

  ld a,0
  ld b,16
loop:
  out (#fe),a ;11
  xor b ;4
  jp loop ;10

Получится 11+4+10=25 тактов на цикл, цикл даёт полупериод квадратной волны, итоговая частота 3500000/25/2=70000 герц. Ну или развернуть часть out/xor на сколько-то отсчётов, тогда в среднем 3500000/15/2=116000 герц.

Но со всеми этими синтетическими тестами есть подвох: в оригинальном ZX порт бордюра/бипера подвержен торможению, с довольно сложным паттерном, и подобные циклы будут давать не просто квадратную волну, а сложный сигнал, зависящий от торможения. Чтобы минимизировать эту проблему, частоту вывода в порт нужно делать кратной 8 тактам. Т.е. 15 и 25 плохая идея, нужно 16 (никак не получить) или 32.

Разумеется, с реально полезными циклами, в которых есть счётчики-делители для получения разных частот, параметры сильно ниже. В описываемом в статье звуковом движке внутренний цикл синтеза занимает 120 тактов (два канала тона), это хороший результат для такой сложности звука, получается частота сэмплирования 29 кГц, предельная генерируемая частота соответственно 14.5 кГц (и движки с чередованием каналов имеют такую частоту несущей, тот самый свист).

Это очень круто! Запускал на реальном железе 48к.

Спасибо за релиз, давно слежу за вашим творчеством и оно интересно нестандартным мышлением, что в демо, что в музыке. Есть пара технических вопросов:

1) Пока ещё ни разу не попадался эмулятор, который бы корректно выводил биперный звук. Главный нюанс в том, что в реальном железе динамик выполняет роль низкочастотного фильтра, поэтому звук мягче и чище. Второстепенный нюанс — корпус телевизора выступает в роли резонатора, что поднимает уровень низких частот и добавляет реверберации, подобно гитарному кабинету. Всё это можно реализовать в цифре вполне достоверно, проблема в отсутствии эмулятора, в который это было бы легко внедрить и поддерживать со стороны автора.

2) все эти известные техники по генерации 1-битного звука — они описаны где-то в одном месте или просто хорошо известны в рамках спектрумовской тусовки на zx-pk.ru?

3) конкретно ваш движок — существует только на спектруме или есть реализация на более высокоуровневых яп и современных платформах?

Да, с нормальной фильтрацией в эмуляторах всё ещё есть проблемы. И не только с ФНЧ, но и с ресемплингом, свист с алиасингом довольно частая проблема. Реверберация кое-где есть (в SPIN, если не ошибаюсь), но сделана плохо, без неё звук адекватнее. Всё это определённо решается, но пока никто не озаботился.

Основные техники описаны здесь, более современные идеи в других темах на том же форуме. На zx-pk, насколько мне известно, биперная музыка с технической стороны почти не обсуждалась.

Именно этот движок на данный момент есть только для Z80 и Спектрума. Другие, более простые движки, есть также в версиях для 6502. Я также делал несколько портов для Arduino, где логика на C, а нужные задержки выдерживаются местными таймерами. Чисто под рендер потока сэмплов я портов не делал, но это, конечно, возможно.

Спасибо. Я просто вспомнил по случаю, что для меандра с произвольной скважностью известно точное разложение в ряд Фурье, поэтому по идее можно построить мат.модель для более сложных вариантов синтеза и более осознанно подбирать параметры для подавления конкретных гармоник для конкретных интервалов, а возможно даже и трезвучие получится воспроизвести.

биперная музыка по разному звучит если вывести на


  • аудиовход телевизора
  • пьезодинамик
  • динамическую головку

Да, есть такое дело. Для ZX Spectrum 48K классикой считается динамическая головка, т.к. в оригинальных моделях таковая стояла внутри корпуса. Также были дополнения со внешним динамиком. В 128K звук уже шёл в телевизор. В отечественных заводских 48K клонах часто ставили пьезодинамик, что сильно портило звучание некоторых мелодий того же Фоллина, в кооперативно-самодельных звук шёл наружу на отдельный контакт, и там уже кто куда подключит.

В Электроника/ Парус ВИ-201 был и пьезо и аудиовыход к телевизору.

Попробовал запустить 1tracker, выдал "Can`t find the name of Intel ICD OpenGL driver", вероятно от SDL. Сталкивались с таким, можно ли по-быстрому исправить без перекомпиляции? И я правильно понял, что в него встроены эмуляторы для всех поддерживаемых платформ?

UPD: частично вопрос решён, нужно прописать переменную среды SDL_VIDEODRIVER=directx, а в коде явно выбрать движокscreenRenderer = SDL_CreateRenderer(screenWindow, "software", 0); (только этот заработал). Теперь другая проблема — звука нет (не вызывается callback-функция), хотя драйвер инициализируется нормально.

UPD: проблема решилась перекомпиляцией с более ранней версией SDL (2.0.20) но на этот раз переменную среды SDL_VIDEODRIVER наоборот пришлось убрать, иначе другая ошибка при инициализации вылезала. В общем, не очень мне понравилась SDL) А программа понравилась, особенно интерфейс.

UPD: покопался в исходниках других самых разных эмуляторах и нашёл, в чём проблема. Проблема в том, что стандартные драйвера для Windows не поддерживают интерфейс OpenGL выше 1.1, даже если видеокарта может в пиксель-шейдеры и прочее. Для обхода этого используют библиотеку glew, когда нужно вместо opengl.h включать glew.h. Вот где-то на этом этапе и происходят нестыковки в идеологиях. На мой взгляд использовать opengl для эмуляторов это вообще лютый перебор, а в кросс-платформенных 2D-библиотеках так и тем более, поскольку там для него родное даже не DirectX, а SetDIBitsToDevice. А идея хранить глобальные настройки в переменных среды — на это никаких цензурных слов не найти. Со звуком схожая история — какой смысл в кроссплатформенности, если нельзя выбрать конкретный аудио-драйвер. Нельзя именно в идеологическом плане, в SDL отсутствует дополнительный слой абстракции для этого. Это особо критично в 64-битных windows, когда драйверы для 32-х и 64-х платформ отдельные и не обязательно присутствуют и там, и там. Ну хоть с++ вспомнил по случаю)

какой смысл в кроссплатформенности, если нельзя выбрать конкретный аудио-драйвер

В данном случае смысл простой: я пользуюсь программой только под Windows, ещё пара человек только под Linux. Если бы не SDL - пользовался бы только я. Надо бы уже написать историю создания 1tracker, повод есть - десять лет было в прошлом году. Там много интересных моментов по архитектуре. Краеугольным камнем в нём были минимализм и модульность, то есть фронт-енд был разработан настолько, насколько минимально достаточно для его использования, чтобы потратить как можно меньше времени на этот проект. Но при этом можно написать любой другой фронт, кросс или нативный, сохраняя совместимость с движками и треками.

Так это не к вам претензия, а к создателям библиотеки — ведь несмотря на кроссплатформенность, ваша программа у меня не запустилась. Ладно это я заморочился и не пожалел полдня на борьбу с чужими багами, а кто-то другой вероятнее всего просто прошёл бы мимо.


Выбор SDL понятен, это известная и распиаренная библиотека, но вовсе не единственная для кроссплатформенной графики и музыки. Познакомившись с ней поближе, теперь это совершенно точно не мой выбор. И не из-за самого бага, а из-за её архитектуры, которая позволяет таким багам множится и прятаться в самых неожиданных местах.


К примеру, у меня есть хобби-проект для модульного синтеза и обработки звука. И в нём устройство вывода звука — это полностью самостоятельный и независимый модуль для конкретного аудио-драйвера. Поэтому моя программа может работать даже без звуковой карты, а для вывода звука одним щелчком пальца можно использовать хоть PC-спикер, хоть матричный принтер, хоть по HTTP или блютуз отправлять (при условии конечно если такие модули написать). А для менее продвинутых пользователей их также просто объединить в один модуль и дополнительно прописать логику для выбора драйвера/устройства по умолчанию.


GUI тоже максимально абстрагирован, и при желании его можно хоть на ASCII графике написать или вообще без него обойтись. Поэтому в далекой перспективе добавить кроссплатформенности проблем не доставит, если кто-нибудь за это захочет взяться.


P.S. А про 1tracker было бы очень интересно почитать.

Там встроена библиотека Game_Music_Emu, проигрывающая разнообразные эмуляторные форматы для рипов музыки, типа AY, NSF, SAP, VGM, а плагины-движки в трекере на выходе формируют таковые файлы.

Спасибо за альбом! Уже несколько раз послушал его на яндекс музыке, нравится! Поймал на мысли, что в голове некоторые мелодии оттуда уже крутятся. Реально следующий шаг в биперной музыке на спектруме!

Помимо того, что эта игра замечательна сама по себе

Моей семилетней дочке очень понравилась (с бесконечными жизнями и времене).

Синий Ленинград внутри.

Кстати, окошко ПЗУ не заклеено изолентой. На фото рабочий экземпляр компьютера?

Да, экземпляр рабочий. Окошко не было заклеено изначально, при покупке, неизвестно сколько лет. ПЗУ от этого не сотрётся - это не фотоплёнка, которую можно засветить. Для стирания нужно жёсткое УФ излучение с определённой длиной волны, которого в домашних условиях просто не бывает, иначе в помещении нельзя было бы жить.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории