К вопросу о некоторых проблемах эмуляции SAA1099

Чтобы было понятно, о чем вообще идёт речь в данном топике, начну издалека.
На одном из профильных форумов весьма деятельный камрад desUBIKado оставил около месяца назад пост следующего содержания:

He estado probando este core con soporte del chip de sonido SAA1099 y para ello me he bajado diferentes archivos con música SAA desde estas 2 páginas:

https://velesoft.speccy.cz/saa1099-cz.htm
http://micklab.ru/My%20Soundcard/ZXMSoundCard.htm
]El caso es que el sonido del SAA1099 no me suena muy bien. He buscado por YouTube algún video donde escuchar música del SAA y he encontrado este donde sobre el minuto 3 prueba el archivo etunes-3.trd

https://www.youtube.com/watch?v=AFjONQQ2N6c&feature=youtu.be&t=2m55s

Comparando el sonido del vídeo (que tampoco es que sea muy bueno) y el que sale por el ZX-Uno, veo que en este último suena peor. Creo que donde más se nota es en MELODY 14.

¿podéis probarlo alguno más a ver que no sea yo el que sea duro de oído? :D
(зы — нравяЦЦа мне у них вопросительные знаки в начале предложения:) Догадайтесь — зачемъ)
… что в вольном переводе на великий и могучий звучит как «ЭТО я плохо слышу или у всех НЕ очень хорошо играет сие?»
Восприятие музыки(звуков) процесс достаточно субъективный, не даром в пословице лучше один разВидеть, чем семь раз услышать же. Подумалось, а как же в таком случАе можно утвердительно ответить на вопрос, “Проверить алгеброй гармонию“© как сказал (бы) Великий ас Пушкин.

                                            Фарш невозможно провернуть назад
                                            И мясо из котлет не восстановишь...
                                            (из какой-то песни?)

Выше была присказка, теперь суть вопроса. Я не вхожу в сотню самых богатых
счастливых обладателей ZXM-SoundCard с микросхемой SAA1099 на борту или владельцев Sam Coupe, поэтому у меня единственная(почти:) возможность услышать музыкальные произведения на нем — это эмуулятор, софтовый ли, хардварный, но эмулятор оной.
Начну с железных эмулей, они ближе да и затеивалось вообще-то ради них :-)
Кратко по истории вопроса. Для ФПГА/ПЛИС сУществует несколько моделей, разной степени достоверности. Первоначальный модуль на verilog от Miguel Angel Rodriguez Jodar ака mcleod_ideafix, созданный для компьютера Sam Coupe на базе ZX Uno, доделанный и допИленный модуль на system verilog от Sorgelig-a для MiST/MiSTer и этот же модуль, но перетранслированный из некоторых соображений обратно на verilog, это уже для AEON-a. К слову сказать, вышеприведенная цитата от камрада из солнечной Испании относится к модулю маклеода, он наименеее достоверно звучит. Добавлю — субъективно и в некоторых композициях. И в сравнении с реализацией от Sorgelig-a.
Что касается незаконченных предложений чисто софтовых реализаций. Наиболее релевантная, йящитайю, модель звучания этой psg в эмуляторе SimCoupe, потом идет старинная версия эмулятора Unreal с модулем от Молодцова. В нем и с ним в основном и сравнивал. Истины ради надо добавить, что есть как бы «улучшенная» версия модуля в последних Анрилах, в т.ч. от TS Labs, но автор(-ы?) сказал(и), что, цитируйю, «Тестировать не пойми как эмулятором — не дело». Ну не дело — так не дело. Вычеркиваем. И последняя(крайняя) реализация сего — в эмуле Xpeccy. Проблемы в звучании такие же, как в версии от маклеуда, могу сделать предположение, что что-то не так с миксером каналов, ну и огибающей. Как у всех.
Теперь про котлеты из песТни и собственно «не-пойми-как-прости-господи» сам тест. Из теории суперструн краткого мануала на SAA1099 известно, что это 6-ти канальный PSG, каждый из каналов может быть запрограммирован как на стерео звук, так же и моно, так и на разный уровень в каждом из стереоканалов. Плюс в каждом из каналов может быть включен шум (noise) в четырех режимах, плюс в третьем\шестом канале огибающая (envelope) то жи в некотором количестве вариаций и сочетаний. В итоге получается приличный микс из отдельных звуков, которые в целом мы и называем музыкой?
И когда в этой какафонии, кпримеру, косячит какой то канал\эффект, то на слух наверное трудно догадаться где и что не так звучит, а тем более в каком из шести каналов, не так ли? ПользовАтели трекеров могут пользоваться возможностью отключать любой\все каналы и слушать что звучит в одном. «Я прав или прав или прав?»©Д.С.
Так вот моя под(д)елка работает аналогичным образом. Принцип сепаратора.
Разделяет все каналы. Можно включить\отключить практически ВСЁ! Амплитуду в каждом канале, шумы, огибающую. Каналы отключаются поштучно, шумы — все сразу и огибающие — в обоих каналах. Так же и включаются. Можно слушать только шумы, или чистый синус, или огибающие, или комплексно. Ну и все это наглядно смотреть глазкамЕ, не только слушать :) Впрочем смотрите то жи, ибо вряд ли кто то захочет в трезвом уме и здравой памяти ЭТО запускать\повторять) Для реального чипа этот тест не нужен априори, для эмулей — он не нужен писателям, похоже они сами себе все знают, остаеЦЦа для меня — ну нужен конечно для оконЧАТельной отладки FPGA, для собственных нужд :) Тем более, по полседним тенденциям релизить бинарники уже не модно же, ю-туб — наше фсиё??


Некоторые технические аспекты. Первый вариант теста был на чистом бейсике, десятка два-три строк с OUT-ами в порты. Окончательный(?) вариант — чистый асм, даже без бейсика :( Видео захватывалось с Анрила, вариант Молодцова. По секундам можно расписать, но вроде и так ясно. Первый тест — синтетический, ка и три следующих. Сперва в каждый канал загоняем частоту с различной амплитудой. Во втором — наоборот, амплитуда постоянна, но частота меняется от второй октавы до седьмой. Третий — шумы по каналам. Четвертый хотел сделать синтетический с огибающими, но может потом как, в итоге четвертый — это реальный song с ETracker-a, немножко разбирался как с ним работать, наощупь. Чуть позже cпсихнул, нашел ман 92 года к нему, сканами в PDF, сделал из него приличный OSR в .DOC, с исправлениями и вычиткой, который уже можно переводить с ненашего на великий, что то жи поЧти сделал, ну процентов на 69%, когда нибудь добью. Занятная вещь, эти ваши трекеры…
Так, отвлекся. Повторю — четвертый тест — это реальный song, он же последний, почти)
Тест управляется кнопочками, на экране в нижней части я их расписал. Пробелом можно сразу перейти или к следующему тесту 1-4, или после четвертого — переключаться на три реальных song-а. Пятый тест — это тот самый пример из из верхней цитаты
тема называется Solitaire (Game Music), вот тут можно услышать оригинальное звучание
Solitaire
Для этого теста я отключал все каналы, кроме третьего, и оставлял там только огибающую, ну когда проверял, даже не 100пицот раз, а гораздо более. Уж точно звучит по разномуу во всех эмулях, а где то и не звучит со всемъ.
Следующая мелодия (шестая?) — просто приятная мелодия, кстати абсолютно без огибающих, вот поэтому она будет звучать одинаково хорошо на любом эмуле. Что меня кстати и сбивало с толку ранее, до вопроса из цитаты. Какие то мелодии звучали то и так вполне прилично. Таких, без огибающих, встречал не одну и не две, в процессе отладки сего непотребства.
Ну и последняя — очень известная мелодия :), надейюсь. Там в некоторых, других хороших:), эмулях плохо нестандартно звучит последний шестой канал, с огибающими вестимо.
Вполне допускаю, что я не прав, и все и всюду звучит идеально, а иногда и лучше идеального. Пусть так.
Ах да, по бордюру пару словов. Ну во вторых — с Наступающим Днем России!!! :) В третьих — что бы не ваял, все какой то бордер-креатив получается. Тяжелое прошлое.
В четвертых — удобно отслеживать оставшиеся\текущие такты во фрейме.
Синяя полоса — это подпрограмма анимации стрелок(не кардиограммы!). Многожручая.
Красная полоса — оочень прожорливая подпрограмма заполнения\показа регистров SAA
Показываются шесть основных регистров. Но! на 4-5 регистров еще хватает one-frame, и то на пятом регистре звук как бы уже подтормаживает, что странно. Поэтому показ регистров переделал под half-frame, по три регистра на прерывание. А так бы красная полоса почти в два раза ширее была бы. Все отсальное — флеш, время, кардиограмма — занимает значительно меньше времени.
По кнопкам еще — выключенное состояние кнопок\регистров отображается красными атрибутами в соответствующих местах, а включенные\выкл>ченные каналы еще и текстом в правом верхнем углу (отсылка к трекеру Etracker)
З.Ы. при написании оной поделки использованы фрагменты исходников Mick-a, в частности модуль графического амплитудного анализатора, несколько уменьшенный в размерах, ну и само собой модуль проигрывателя ETracker, вынутый видимо им из компилятора трекера.
p.s.p.s. Программа написана в ужасм-е, в котором в процессе нашел еще несколько неприятных и занятных багов, но а5 же — комуу это интересно :)
Для ZX Spectrum 48 как минимум и для Sam Coupe. Обе реализации идиентичны в части работы, в части кода есть некоторые отличия само собой.

Обновлено.
.DSK, .TAP, .SNA — вдруг комуу пригодиЦЦа. .TRD не делал, ибо в ESXDOS тап-ки и снапшоты и так вполне прилично работают. Но при желании загрузчик изобрести можно.

upd.:
Итак, техно-демо.
Добавил 4-й тест envelope. Пока там два примера.
rgho.st/8mjKWdTDl
То же самое для Sam Coupe
rgho.st/7R2tzw8J6

хы… Прикольно работает автозамена. Слово «upd.:» просто так вверх не перетащить:)

>

18 комментариев

avatar
А в финале-то удалось разобраться с проблемами эмуляции? Может записать тесты с эмуляторов и посравнивать форму сигнала, потому что не факт, что то, что эмулятор репортит о состоянии портов, совпадает с тем, что он реально воспроизводит.

В каком эмуляторе сейчас самый точный звук? Как с этим обстоят дела у ZXTune?
avatar
В сухом остатке так сказать и по итогам?
По ФПГА- реализации — безусловно корка от Sorgelig-a. Единственное, что меня там смущает — уровень громкости каналов чистых и с огибающей. С огибающей звучат заметно тише, может так и должно быть, а может надо поднять. Но для этого надо дорисовать синтетический тест с envelope и сравнить с реальным SAA1099, но у меня его нет, все мои Спектрумы без nemo-bus, а колхозить на монтажке не очень хочется. Обхожусь дев-бордами.
Вариант корки от МакЛеода вполне можно починить. У него те же проблемы с envelope, который звучит даже в выключеном состоянии. Что то видимо с миксером итоговым. Та же проблема в эмуле Xpeccy присутствует.
в тс-анриле я бы тоже сказал, что каналы с огибающей работают несколько, хмм, необычненько. Но доказать то я этого не могу, а там просят пальцем показать, где именно подправить :(
Я равняюсь или на старый Анрил, ну или для надежности на SimCoupe, там то надеюсь эти проблемы давно выкопали.
По портам тоже. Порты больше для наглядности процесса. Особенно смущают порты noise, во всех мануалах написано, что задействованы биты 0,1 и 4,5 в 16 канале, а судя по индикатору там и 6,7 биты меняются. Вариантов как минимум джва — или косячит проигрыватель, не то показывает\заносит, ну или действительно эти биты реально в музыке используются. Да, и третий вариант — косяк ETracker-a. Но к шумам у меня как то меньше претензий.
Ну а с ZXTune — елси там есть возможность отключать каналы, то вот можно и сравнивать, а так то только по общему впеЧАТленийю — насколько режет слух та или иная композиция.
avatar
но автор(-ы?) сказал(и), что, цитируйю, «Тестировать не пойми как эмулятором — не дело»
Автор/ы сказал/и, что ключевые слова «не пойми как», а не «тестировать эмулятором». Дословно, авторы сказали: выковыряй либу, напиши несколько тестовых посылок в порт и протестируй их на либе и на этом ихнем верилоге. Авторы имели в виду — тестировать не на слух, а при помощи юнит тестов.
  • tsl
  • 0
avatar
Как-то сложно говорить о точности эмуляции, если исходить из предположения, что SAA1099 играет чистый синус.
avatar
Под чистым синусом я имел в виду, что программим один канал например на 440 Гц или 1кГц для ровного счета, без шумов и огибающих. Выводим, на осциллограф\спектроанализатор\wav файл. А там уж смотрим что, получилось — частоту и формуу, насколько близко экстраполировалось к идеалу. До аналоговых генераторов типа Г3-36 думаю будет далеко. Но и такая точность не требуется же?? Или AY может идеальный синус генерить? кпримеру. Из меандра
avatar
Из любого теста (С++/верилог) ты можешь получить выхлоп в виде файла, содержащего вейвформы и сравнивать их.
Любые другие варианты сравнения «точности эмуляции» годятся только для передачи «Битва экстрасенсов».
avatar
Простые чипы типа AY или SAA генерируют только меандр с заполнением 0.5, то есть квадратную волну. Это так и задумано, и на выходе должен быть именно меандр. Мысли о синусах в этом случае отношения к делу и к точности эмуляции не имеют. Синус (когда-то было) относительно сложно генерировать в цифровой технике, а универсальность его в музыкальных целях низка за отсутствием гармоник, поэтому он встречается только в более поздних, более сложных чипах, и обычно как дополнение к прочим возможностям (SID, SCC, N106, FM-чипы).
avatar
Можно слушать только шумы, или чистый синус, или огибающие, или комплексно.
Все же в моей фразе ключевое слово «чистый», а не 'синус'? в смысле без примесей огибающих и шумов. Ну да, ошибся, надо было сказать — чистый меандр, или «сигнал, наиболее приближенный к прямоугольному импульсу»? Схоластика.
Сгенерировал тестовый паттерн? простенький, и прогнал через джва эмуля. Если вы считаете, что звучЯт совершенно идиентично — ну что ж, тогда я испанский летчик Сент Экзюпери и мне пора на битву экстрасенсов.
rgho.st/8gBbsDLPQ
avatar
Нужен кто-то с реальным SAA.
avatar
На сайте Мика заявлено не меньше ста экземмпляров плат. Не для себя же он их делал столько. Ну а реально можно попросить Velesoft-a зачинщика всего. Хотелось бы увидеть и услышать, как на реальном Купе это проигрывается. Да и эмулю тоже есть вопросы))))
Добавил пару ссылок вверху. Как всегда пятидневок.
avatar
Нужно сделать хороший разнообразный тест, который можно писать с реала и сравнивать с эмуляторами. Как был в допотопные времена ACID TEST для браузеров.
avatar
У меня нашёлся реальный SAA. Но только сам чип, без компьютера, куда он был бы воткнут. Но есть Arduino, логика и какие-то кварцы, могу собрать тестовое устройство и прогнать тесты. Но для этого нужны сами тесты, и вообше кто-то, заинтересованный в выяснении конкретных моментов и проведении тестов, и прочего. т.к. мне самому заниматься эмуляцией с нуля или доработкой эмуляторов SAA пока некогда и не очень интересно.
avatar
у меня SAA нет реальной, но кЕтайцы рублей 250 минимум хотят за 5 чипов, да и долго. Ардуинки есть, и находил в сети инфу, что пытались подключить, не помню с каким результатом. Наверное с отрицательным, видимо проигрыватель хотели построить, и на прерываниях застряли. Если будет хоть минимальный скетч — тогда можно китайцев потрясти, пусть шлют. А так то к реалу меньше всего хочется цеплять на монтажке.
avatar
Подключить SAA или любой звуковой чип к Arduino и сделать минимальный плеер дампов или данных с COM-порта — совершенно никаких проблем. Если надо, то могу. Схема аналогично AY-LPT — сам чип, 7404, 7493 (опционально) и кварц, куча проводов. В общем-то точно та же схема и для AY, и для много чего, и подобные схемы в сети точно есть.
avatar
Я про то, что для дискуссии о точности эмуляции желательно представлять, что мы, собственно, эмулируем. Т.е. хорошо знать устройство чипа и процесс эмуляции. И когда такое понимание есть, подобные оговорки просто не возникают, им неоткуда придти в голову.

Касательно точности эмуляции есть всего два основных момента. Первый — точность эмуляции внутренней логики чипа. Действие битов микшера, предельные моменты типа нулевого делителя. Ошибки в логике чипа ведут к неправильному звучанию музыки, в большинстве случаев это проявляется очень явно. Пока они присутствуют, дальше углубляться в точность нет смысла. Для начала чип должен просто правильно работать. Второй момент — точность параметров типа характеристик ЦАП и алгоритма генератора шума. На мой взгляд, это наименее значительная из всех проблем эмуляции, т.к. слабо заметна ухом и не так уж сильно влияет на звук (разница между AY/YM в основном не в характеристике ЦАП, а в логике огибающей, имеющей двойное разрешение).

Но самый главный фактор, что всегда выдаёт эмуляцию и вносит заметную разницу в звучание — проблема передискретизации, т.е. ресэмплинга. Она принципиально неразрешима (у чипа нет частоты дискретизации, у звуковых карт есть) и всегда даёт те или иные артефакты, хорошо заметные уху. Есть разные способы приблизить звучание к правильному — апсэмплинг, фильтры, band-limited синтез или трюки для приближения к нему (типа приклеивания кусочков транзиентов). Но всё это не имеет отношения к собственно эмуляции чипов, один и тот же ресемплер можно использовать с разными эмулируемыми чипами, и наоборот.
avatar
Соглашусь с каждым словом. Особенно со словами о точности эмуляции внутренней логики чипа. Вот для того, чтобы эти неточности были более и явно заметны, я и изобретал чисто для себя машину времени велосипед генератор тестовых сигналов звуковой частоты :) Инструмент для проверки правильности постройки данного чипа в отдельно взятом ФПГА. Камертон. А вот то, что этот «камертон» по разномуу звучит на конкретном рояле и трех, хороших, пианинах — это проблемы инструмента?? Сойдемся на том, что это просто-напросто мини-демо, воспроизводящееся на разных машинах со своими, неповторимыми нюансами. Не более. Для моих целей эта подделка вполне подходит *взял с полки пирожок, без спроса*. А других то и нету, чтобы явно сказать «Баа!!! Да у тебя же 5 бит в envelope вообще лажает и не задействован!» Я прав или прав или прав?©
avatar
Кстатида, пользуясь случаем, хочу поблагодарить Shiru за цикл тестов о точности эмуляции Радио 86РК, и в частности ВГ75 и конечно за исходники этих тестов. В том числе и с помощью этих тестов отлаживалась verilog модель ВГ75. Все познаеЦЦа в сравнении. Спасибо.
avatar
После слова «синус» читать не стал.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.