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

Устройство «музыкалки» AY-3-8910 и эмулятор на Arduino

Уровень сложностиСредний
Время на прочтение25 мин
Количество просмотров12K
Всего голосов 93: ↑92 и ↓1+127
Комментарии74

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

А как же нашумевший аудио чип YM2612 от Sega?

А что с ним?

Это совершенно отдельная тема, звуковой чип с принципиально другим устройством, которое очень сложно объяснить на пальцах. Но возможно доберусь и до неё.

Тему вы затронули интересную, может знаете, чип описанный в статье может синтезировать речь?

AY способен проигрывать трехканальный 4-х битный PCM, что вполне достаточно для проигрывания речи. Синтезировать речь придется программно, разных тулов для этого есть, ищите по "text-to-speech".

Были эксперименты по синтезу без сэмплов, всеми тремя каналами с шумом, на 50 Гц. Но разобрать это можно было только зная, что там предположительно звучит. Примерно как эффект имиации человеческого голоса в чиптюне, когда очень точно подбирают изменения питча, был популярен одно время. Типа https://www.youtube.com/watch?v=LLYedwpeTfc&t=8683s

Смотрел давно уже на ардуинках с помощью библиотек TTS просто генерирует понятную речь, а тут вспомнил что Sega вполне сносно "говорила" Dune: The Battle for Arrakis
Значит YM2612 может это делать, а AY-3-8910 нет.

И на Сеге, и на AY это делается простым воспроизведением заранее записанных сэмплов.

Вот и хочется не тратить ресурсы МК на речевуху, а использовать для этого сопроцессор звуковой.
Хотя на современных МК все делается просто

https://www.youtube.com/watch?v=2rowkqnsQHU
Сэмплы речи для Sega тоже в MIDI формате получается?

AY3-8910 - не сопроцессор, а PSG.

Сопроцессором можно назвать аудио чип амиги, который аппаратно играл сэмплы.

на аигрике можно мутить фонемы сэмплами, но силами CPU

ЕМНИП все так и было, по крайней мере на синклерах. Про Сегу не могу утверждать.
Но мне пару раз попадались весьма приличный голосовые синтезаторы, работающие с AY-8910, которые не использовали сэмплы.

На сколько понимаю, все эти AY-микросхемы не совсем ЦАП?

Если можно так выразиться, то они совсем не только ЦАП)

Где то попадалось, что в атмегу заливают код и она становиться одной из AY-звуковых процессоров.

Именно про это и идёт речь в статье, в комментариях к которой мы находимся. Были ещё специализированные микросхемы, с характерным голосом робота. Самая популярная в 80-х была от той же General Instruments — SP0256. Её эмулятор тоже вполне можно запустить на Атмеге.

Честно говоря, впервые слышу о подобном. Я даже не могу навскидку назвать голосовой синтезатор, который в принципе использовал бы AY, все известные мне подобные программы работают на 48К с бипером.

Можно и без чипа. Hlasovy program pro ZX Spectrum

Спасибо за детальное описание AY.

Для интересующихся ПЛИСоводством, на просторах Github-а имеется реализация AY-3-8910 выполненная на Verilog-е по восстановленной оригинальной схеме. Там же находится "bit clock accurate" реализация рендерера звука из .PSG выполненная на основе Verilog модели которая исполняясь в симуляторе Verilog-а (modelsim) обрабатывает входные данные и выдает PCM (flac).

Забавно что ваша ссылка ровно в ту же репу на гитхабе, куда автор статьи (почти незаметно) послал за схемой ;) Впрочем, я это уже написал в соседнем коменте. Этот верилог, судя по тексту в его начале, в принципе несинтезируемый и сделан максимально близко к транзисторной схеме. Его гонять можно только в симуляторах, и как там и написано -- можно сделать рендер звука.

Verilog в том репозитории требует заточки под конкретную ПЛИС и плату. Я сейчас занимаюсь адаптацией его под свою плату "Карно" и микросхему ПЛИС Lattice серии ECP5. Как что-то получится - отпишусь.

Для нормального качества звука частота ШИМирования должна быть на порядок выше частоты дискретизации, т.е. 150кГц и выше. У аппаратных таймеров 8-ми битного МК ATmega частота PWM всего 31.2кГц (или 62.5кГц в 7-и битном режиме), что очень мало. Столкнулся с подобной же проблемой недавно - требовалось сформировать пилу частотой 10кГц на ATmega16, получилось очень криво. Но новогодний мотивчик всё равно узнается. :-)

Да, конечно, использовать PWM для звука на Arduino так себе идея. Я даже думал добавить вариант с самодельным стерео-Covox на резисторах. Но статья и так выходила слишком большая по объёму, оставил на другой раз.

Кстати не плохая идея. Если на выходе цифрового микшера готовый 4-х битный сигнал, то требуется всего 9 резисторов и 4 пина МК. Я бы попробовал. :)

Да, всё хотел спросить у Вас, кто автор этой новогодней музыкальной композиции ?

Сигнал 4-битный, но это только один канал. Если звук моно, да, можно сделать один ЦАП и мультиплексировать его, это всё равно должно звучать получше, чем PWM. А для стерео уже по любому нужно делать три отдельных ЦАПа, это 12 пинов и мешок резисторов.

Трек на видео мой собственный из 2010 года.

Можно сократить число пинов до минимума используя сдвиговые регистры. Но да, более-менее нормальный R-2R 8-битный ЦАП - это реально "кладбище резисторов" - 24 штуки на канал. 24 - потому что в таком варианте все они будут одного номинала и их можно более-менее точно подобрать). Сам "страдал" таким лет 10 назад.

В Чипдипе продаются резисторные сборки по 4, 8 и 16 однотипных подогнанных резисторов в DIP корпусе, стоят сущие копейки.

Трек очень клёвый, спасибо.

Три необязательно: достаточно двух, и таблиц для смешивания: ABC, BCA, CBA.

Мы же говорим про 4-битные ЦАП с характеристикой, схожей с оригинальной. В четыре бита вывести два раза по четыре бита трудно. Двух будет достаточно, если они будут большей разрядности.

Я когда-то (в 2006 году) делал говорящую игрушку на ATtiny85. В ПЗУ записывалось 2 секунды 4-битного звука. Но ШИМ генерировался не таймером а непосредственно микроконтроллером с выключенными прерываниями, поэтому частота ШИМ была довольно большой, около 250Кгц. Звук был намного приятнее чем у китайских говорящих игрушек тех времен.

Я во всякие поделки на pi pico пихаю какую-то https://github.com/digital-sound-antiques/emu2149 , не знаю уж насколько она точная, так как в исходники вообще не вникал если честно, но пиликает вроде бы ничего так. Pi pico кстати вывозит 4 экземляра AY ну и плюс еще обработку шины от хоста, больше не пробовал, хотя наверно можно и штук 8 одновременно AY эмулировать невозбранно, а на Pi pico 2 (есть FPU, есть память) так и вообще целый оркестр из AY забабахать можно. Это я для УКНЦ пробовал простую звуковушку сделать на Pi Pico с двумя AY, что бы проникнуться так сказать шиной МПИ =\ Ну и не так давно еще для Apple II в проект VGA видеокарточки то же впилил сбоку пару AY чтоб одновременно с VGA Mockingboard апловскую эмулировать.

Код эмулятора выглядит грамотным, там даже флаги огибающей разбираются по человечески, согласно устройству чипа. Rpi Pico раз в 15 мощнее Arduino Nano, так что всё сходится. Там действительно можно запустить много AY с нормальной передискретизацией.

Я давеча думал сделать Wild проект: взять целую кучу реальных AY, подключить к контроллеру, и написать под это дело музыку. Чтобы на один канал трека шло минимум по одному чипу, а то и по два, и таких каналов 16-32. Может ещё дойдут руки. Чисто из любопытства, как может звучать оркестр AY.

Для отработки идеи навернео можно и кучку софтовых VST синтов Ay3 попробовать

Да, именно такой был план, сочинять в Reaper на софтовом VST (вероятно сделать свой, чтобы делать сразу инструменты-пачки), потом экспорт в MIDI и конверсия в управляющий поток.

в порядке бреда предлагаю так же модифицировать vortex tracker до turbo-turbo-turbo.. sound

собственно, для эпичности такого дела неплохо бы заколабить действующих ay топ-музыкантов

Так тоже можно сделать. Но дело в том, что и трекеры, и мастерство топ-музыкантов заточены на работу с очень ограниченной полифонией, типа экстремальной оптимизации кода на ассемблере. А тут нужно совершенно противоположные навыки, когда нет ограничений, и надо придумать, куда девать лишние ресурсы. В трекере будет очень неудобно работать с пачками, с инструментами, которые играют одну ноту на 3-6 каналах одновременно: одна нота займёт почти весь экран в ширину.

ОК. этот момент наверное подтверждает и то что даже turbo sound освоили лишь только некоторые. но, скажем, mmcm однозначно умеет в куда как более широкой полифонии. я правда, никогда не видел как музыканты работают в колабе, но выглядит это именно так будто один пишет тему, другой ударники, третий - аранжировки. и даже без дирижера обходятся :)

Да, с огибающей это у вас круто прям! Хотя и неочевидно не зная внутренностей AY. У меня для AVR было вот так:

static uint8 get_env_val(uint8 envType, uint8 pos) {
	// 0,1,2,3,9
	if (envType < 4 || envType == 9)
		return pos < 32 ? 31 - pos : 0;
	// 4,5,6,7,15
	if (envType < 8 || envType == 15)
		return pos < 32 ? pos : 0;
	// 10
	if (envType == 10)
        return pos % 64 < 32 ? 31 - (pos % 32) : pos % 32;
	// 14
	if (envType == 14)
		return pos % 64 < 32 ? pos % 32 : 31 - (pos % 32);
	// 8
	if (envType == 8)
		return 31 - (pos % 32);
	// 12
	if (envType == 12)
		return pos % 32;
	// 11
	if (envType == 11)
		return pos < 32 ? 31 - pos : 31;
	// 13
	if (envType == 13)
        return pos < 32 ? pos : 31;
	return 0;
}

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

Это нормальный рабочий вариант, многие так делают.

Да, я тоже это не сам придумал, но методом проб и ошибок оказалось что именно такая расстановка if-ов привела AVRGCC к практически идеальной генерации кода, распределению переменных по регистрам и их переиспользованию. То есть на asm-е у меня вышло бы не лучше.

"К сожалению, отечественный аналог AY-3-8910 так и не был создан" - был, в БМК от фирмы "Форм" - 6008/6108, а так-же в БМК КН1854ВГ5 для Синтез 3. Так-же можно вспомнить о компьютере Sprinter 97, где в 96-м году на ПЛИС была реализована эмуляция (вероятно впервые).

Абзац про БМК переделал.

"Так, в конце 1990-х фирма «Форм» выпустила БМК КР1515ХМ1-6008" - это было начало 90-х. 92-93-й год.

Для Вектор-06Ц насколько мне известно был эмулятор AY на советской КР580ВИ53 (сильно ограниченный, но звучал +/- похоже)

Из КР580ВИ53 можно соорудить что-то подобное Texas Instruments SN76489

И даже было сделано ещё в 90-х, в компьютере ПК8002. Там два канала тона, один канал шума на LFSR на паре ИР8, и управление общей громкостью на ПА2. Ну и конечно есть мега-монстр на двух ВИ53, Ячейка Звукового Синтеза для Агата. Для которой я давеча сделал музыкальный редактор, и пора бы уже его немного допилить и написать про это текст, конечно.

раз уже заговрили о других чипах, мне вот недавно стало интересно, насколько сильно в них замарачивались на программирование регистров как это делают для AY (ну и SID, и моджет быть NES). а то как посмотреть на всякие opl так там загрузят готовый пересет и только валят ноты, (как) MIDI. есть ведь даже "аппаратные" синтезаторы на основе той же самой AY (https://www.twistedelectrons.com/ay3, https://github.com/MajenkoProjects/AYSynth - доступны исходники) - так там опять же в лучшем случае выведут все регистры крутилками и он в таком виде мало отличается от ВИ53

На SID и NES точно заморачивались не хуже, чем на AY. На FM-синтезаторах как раз началась тема с пресетами. Японцы продолжили морочиться с настройкой инструментов под каждый трек, MML-макросами, и прочим, а на западе большинство стало применять готовые драйвера с пресетами, из-за чего музыка стала звучать радикально хуже, чем могла бы.

SID - это вообще другая история. Его делали люди, которые
"Считали, что микросхемы генерации звука, представленные на рынке, включая те, что использовались Atari в их компьютерах, были примитивными и, видимо, сконструированными людьми, ничего не знающими о музыке". То есть технарями, но при этом и музыкантами. И недокументивованных и нестандартных фич в нем столько, что сделать полноценный его эмулятор - это "челлендж со звездочкой". Да к чему слова - вы сами просто послушайте. При том что проц в Commodore (6502) сильно уступал Z80.

к gpio у AY подключалась например ay mouse, еще че то пытались

На MSX к портам джойстика, которые реализовывались на YM2149F, подключали SDCard и организовывали обмен файлами

Не совсем так. 8910 — 40 выводов, два GPIO. 8912 — 28 выводов, один GPIO. Совсем без GPIO есть 8913 — 24 вывода. Но 13-ый я до сих пор вживую не встречал ни разу, в наших краях были 10-ые, реже 12-ые, чаще YM2149F (тоже два GPIO).

Как-то пытался написать свой эмулятор аигрека по найденной документации. Тоже возникали вопросы, куда считают счетчики, что будет если записать ноль в регистры, как работает генератор шума и т.п. В результате получилось не очень, и частоту я делил на 16, как положено.

История инженерного развития цифрового синтеза музыки проходила этап бипперов, AY8910 и логично дошла до сэмплеров с форматом многоголосого MIDI. На Ардуине куда звучнее и многоголосее можно MIID играть, но почему так манит юзеров полуэтап бинарного синтеза на AY? Ведь деревянные велосипеды-самокаты, или хлеб из муки собственно помола на ручных жерновах, или книги переписанные вручную - все они мало кого привлекают....

Полифонический MIDI с банком сэмплов на Ардуине тоже проиграем со временем, будет довольно интересный челлендж.

Я на каком-то stm32f407 пробовал, с 256кб SRAM, но зато двумя DAC встроенными. Просто WAV-ки играет с sd-карты хорошо, стерео 44Кгц, всё через DMA, и SD, и экран и ЦАПы. Проц вообще не загружен. Но впилить поддержку .sf2 саундбанков минимально так и не удалось, уперся сразу в отсутсвие памяти, даже если подгружать на лету с SD-карточки сами звуки по quadSPI, все равно не хватает памяти на структуры - модуляторы, 64 голосная полифония, флоаты эти везде, эхи детюны ревербы вибрато на каждый голос... В общем, нужно было либо сбоку какую-то SRAM прикручивать, либо брать другой контроллер хотя-бы с 512Кб памяти, а лучше с метром. Но на этом этапе интерес пропал и я забил -)

Да-да, вот поэтому и челлендж. А на Ардуине 32К флеша, и в него ещё должен влезть MIDI-файл. Но какой-то минимальный синт можно сделать, со звучанием типа первых полифонических мобильников. Может получиться довольно забавный проект.

Бесспорно, простой синт с маленьким вейвтейбл банком сделать можно, особенно если этот "банк" будет своего формата, а не .sf2 =\. С флешом у меня проблем не возникло, у меня возникли проблемы именно с оперативной памятью - негде было размещать структуры и массивы, которые есть в .sf2 банках. А во флеш прошивка то влезала без вопросов. А сами сэмплы из .sf2 было не обязательно хранить в оперативной памяти целиком - достаточно было "на лету" вычитывать их с SD-карты, благо у STM32 quadspi через DMA очень даже неплохие скорости дает, по чтению так и подавно. Правда не знаю что бы было при одновременном проигрывании всех 64 из возможных 64 голосов, может быть и не поспела бы SD карточка, не знаю, не дошел до этого -) Но понял из этого опыта одно - для .sf2 нужно много памяти (оперативной). Точно больше 256кб, а если еще предположить хотя-бы минимальное кеширование сэмплов то и за мегабайт легко.

А так, лично мне когда-то давным давно понравился простенький синтезатор на совсем простеньком контроллере PIC16Fчтототам, http://www.pic24.ru/doku.php/en/osa/articles/pk2_osa_piano .

А вы если готовую микросхему AY берете, то что мешает взять готовый внешний MIDI синтезатор, а из Ардуины сделать секвенсор (устройство передачи последовательности нот). И все - куча времени свободна.

Как следует из статьи, в данном проекте я не беру готовую микросхему. И подобные проекты делаются не для экономии времени. VS10x3 к МК подключали тысячи человек, творчества в этом немного, все эти проекты звучат одинаково. Сопоставимый софтовый MIDI-синт на слабом МК делали единицы, у каждого уникальный результат, и это повод рассказать про что-то более интересное, чем про подключение 9 проводков.

На Ali есть платы на STM32F407 с разводкой под SRAM микросхемы памяти, правда у меня завелась только одна из 2-х...

не очень корректные сравнения. мало того что т.н. крафт имеет определенную популярность среди "юзеров", так и здесь, скорее, месье, которые знают толк.

на балалайке сейчас немногие умеют играть, но буквально несколько человек в мире, извлекают такие звуки, что челюсть отвисает. На биперах их, в общем то тоже немного, чем дальше развитие техники - тем больше, поскольку популярнее и больше ностальгирующих и умеющих в. потому что могут. но до определенного момента миллионам ценителей взяться неоткуда.

плюс четче заметно разделение интересов. Ардуинщики в принципе своем больше паяльщики, программисты, звук обязательно напаять надо (в отличии от спектрумов). есть конечно и такие любители, и их тоже довольно немного. чисто для музыки гораздо проще взять что то готовое и полно доступных вариантов.

современная тема вообще тянет на то что берут "большой оргАн" (тоже когда то было дело массовое, хотя и очень дорогое) и начинают играть на нем чижика-пыжика (или мурку) одним пальцем. Только вот простой инcтрумент стоит все дешевле, распространнеее, при этом - качественнее. плюс музыкальные школы. талантов, хороших умельцев - не вот много, но всяко больше, чем лет 500 назад.

Тут я считаю что это битвы кита и слона (точнее понятий сложности по Колмогорову и Шеннону). С цифровыми предзаписанными сэмплами любой может. А вот такое уложить в 4 килобайта: ой как не любой:
https://www.youtube.com/watch?v=G1Q9LtnnE4w

Кстати странно, что никто в свете Андруино и AY не упомянул https://www.avray.ru/ru/ay_ym_emulator/ - эмулятор AY на атмеге (слегка разогнанной), вроде бы и платы были для реального drop-in replacement реальной AY на плате спецтрумов.

Да, я ссылался в тексте именно на этот проект (на ассемблере и 27 МГц), но забыл найти его страницу и дать ссылку.

японский аналог, YM2149F

Не единственный - еще есть как минимум JFC95101, интересно бы узнать какие там отличия.

Прикольно: тем, кто реально сделал реверс уделена в статье ровно 1 предложение с невнятной ссылкой, зато в половине статьи автор пытается своими словами и с ошибками (!) рассказать как оно там наверное работает. Другая половина статьи -- как мы теперь сделаем неправильный (ведь ниасиливаем на 200кгц синтезить, абыдно да) (N+1)'ый эмулятор на ардуине.

Исправляю (намеренную?) оплошность автора:
https://speccy.info/Deathsoft -- человек, который сделал реверс АИгрека в транзисторную схему по фоткам. Также много лет являлся мейнтейнером популярного и знакового эмулятора спектрумов unreal speccy https://speccy.info/UnrealSpeccy

https://speccy.info/LVD -- человек, который по транзисторной схеме сделал (намеренно несинтезируемую) модель на верилоге. По ней, кстати, гораздо проще разбирать как оно там внутри работает, чем по транзисторам.

Ссылка на всю репу, а не только на пдфку оттуда, как у автора: https://github.com/lvd2/ay-3-8910_reverse_engineered

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

Интересная штука. Для большей аутентичности чипу AY можно было сделать 3 пина выхода (каналы A,B,C) и микшировать их в стерео схемой на резисторах.

Подскажите пожалуйста правильный эмулятор-проигрыватель AY музыки для Windows и Android? Чтобы довольно точно эмулировал и воспроизводил. Есть такие?

Для Windows традиционной выбор AY_Emul, а более современный, в том числе и для Android — ZXTune.

тёпленькое, с лампочками... конечно у меня был спектрум, с сопроцессором )) потом была БКшка... и аишку я туда сам ставил, плату ЛУТил )) рисовал сам, еще и усилитель забабахал на 2х УН4. и динамики, два! в корпус запихал. было время (с)

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