Тема: Копия по мотивам ЯЗС на IBM PC и вопросы по MIDI
Доброго всем,
Оговорюсь сразу, что с Агатом я не знаком, никогда его не видел ни внутри, ни снаружи, так же как и не видел процессора 6502. Однако, привела меня к вам на сайт, и затем вот, на форум "музыкальная ячейка". Далее наверное нужно предисловие, но оно длинное, поэтому суть вопросов про MIDI ближе к концу текста (выделено жирным "вопросы").
Когда-то давно меня очень привлекла видео-демонстрация работы ЯЗС на ютубе, и особенно понравился звук, издаваемый этим устройством, что у меня в голове засела мысль повторить девайс, только на более доступную для меня (да наверное, и не только для меня) шину ISA-8 от компьютеров IBM PC - благо на барахолках купить любую плату с ISA шиной пока еще представляется возможным. И вот, год за годом, я иногда так и натыкался на это демонстрационное видео, с прекрасным звуком и в итоге в начале 2022 созрел до создания платы. Схему я конечно взял с вашего сайта, хочу сказать спасибо за нее всем причастным, как я понял это Mick, а так же все те, кто задонатил проект и предоставил живую железку.
Конечно, концепция при переносе на ISA8 немного поменялась. Основные отличия от оригинальной муз ячейки:
я не стал делать на плате внешний 8-битный порт. Подключать у меня к нему, естественно, нечего. Плюс в IBM PC (если мы говорим о эре плат с ISA шиной) и так есть хороший 8-битный порт - называется LPT -)
я не делал IRQ от таймера одной из ВИ53 и управления IRQ. На IBM PC и так таймер есть, даже не один - если нужны прецизионные задержки никто не мешает повесить свой обработчик прерывания прямо на таймер в DOS;
зато за счет этого высвободился один канал ВИ53, который использовал как еще один тональный канал. У оригинала было 5 тональных каналов, здесь стало 6 тональных канала;
появилась возможность чтения регистров обоих ВИ53. В оригинале такой возможности не было. Зачем - пока не очень понятно, но оно не сложно, сейчас используется для авто-детекта карты и номера основного порта.
За счет появления дополнительного 6-ого тонального канала немного поменялось расположение портов, хотя и осталось близкое к оригиналу - сдвинулись порты управления ударными каналами. Перемычка выбора портов на адреса 300,310,320,330,380,390,3A0,3B0, чтоб никому не помешать если что. Распределение портов такое:
3n0..3n3 - регистры первой ви53 (тональные каналы 1-3).
3n4..3n7 - регистры второй ви53 (тональные каналы 4-6).
Порты 3n0-3n7 доступны как на запись, так и на чтение;
3n8..3nD - управление блоками коммутации тональных каналов.
3nE..3nF - управление ударными каналами.
Порты 3n8-3nF доступны только на запись.
Так же, решил все-таки GATE'ы у ВИ53 завести через триггер, линия сброса которого связана с сигналом RESET, примерно так же как и в оригинале, что бы после включения компьютера устанавливать запрет счета на ВИ53, и соответственно, тишину на выходах OUT обоих ВИ53. Единственное, так все порты уже заняты, пришлось разрешающий бит управления GATE'ами впихнуть в порт управление ударным каналом 8 (последним). Поэтому распределение его битов стало такое:
Генератор ударных, канал 8:
D0 - частота 1.
D1 - частота 2.
D3 - длительность.
D4 - пуск.
D7 - = 1 - запрет работы всех таймеров/счётчиков.
Это не особо мешает, просто при инициализации нужно дернуть бит D7 у ударного канала 8, что бы включить GATE'ы. Далее работать по обычной "Агатовской" схеме с каналом ударных.
Схема, естественно, так же претерпела изменения, но все они коснулись лишь цифровой части - полностью переделан декодер адресов для работы с портами ISA шины, делитель частот, заменена трудно-доставаемая в наше время 555ТМ7 на более распространенную 555ИР23, возможно что-то еще. Аналоговая же часть осталась неизменной и полностью повторяет оригинал.
Размеры платы получились солидные- 118x275,25 мм, хотя я старался не "жать" компоненты друг к другу вплотную, под все микросхемы предусмотрел возможность установки панелек. Но вот с разводкой платы пришлось помучиться конкретно.
После недели мучений, верчения компонентов и так и сяк, кое-как, но ячейка развелась наконец. Аналог - ручками, а вот цифру руками не осилил, хотя честно пробовал неоднократно. Уже все шло к тому, что бы делать 4 слоя, но все-таки вывел на двух слоях полу-руками, полу-автороутером. Аналоговую часть по возможности перерисовал вручную с P-CAD платы оригинальной ячейки. Закинул еще в аналоговую часть огромный GND полигон и сверху и снизу, прошив все via. Заказал у китайцев платки.
Пока платы были в производстве, я время зря не терял, и написал тест на турбопаскакале для данной железки:
Интерфейс в наглую срисовал с оригинального Агатовского теста авторства "Ravodin" aka "tmptmp15" aka "Voldemar0", прямо с видео из ютуба. Потому что очень лаконично, простенько и со вкусом, мне нравится.
И вот, первый образец был собран:
Как бы удивительно это не было, но плата заработала сразу после пайки и сборки, без всяких порезанных дорожек и кучи МГТФа.
Проверил схему генераторов частот на 555ИЕ2, 555ИЕ5 и 555ТМ2 - всё отлично работает, выдает необходимые 1,021 МГц на тактирование ВИ53 с шириной импульсов близкой к 50%, и 63.8 КГц для генератора шума. Выходы ВИ53 управляются из тестовой утилиты, частота полностью соответствует расчетной из программы управления. Проверил генератор шума и ударные, микшеры и тональные каналы - все работает штатно. На этом предисловие заканчиваю, простите что оно такое длинное получилось.
Ну и теперь осталось самое сложное - софт, которого конечно-же на IBM PC и в помине не существует для этой платы.
Начал я с проекта с открытым исходным кодом DOSMID - это не сложный проигрыватель MIDI для DOS. Я скачал его последние исходники, понемногу добавил тональные каналы и один канал ударных на пробу. Получилось с "наскока" как то примерно так:
https://soundcloud.com/tronix286/l014mp3 (можно послушать онлайн)
Далее, я попытался сделать проигрыватель оригинальных .MUS файлов с Агата. Сначала хотел переписать его начисто, а потом подумал - а что если взять уже имеющийся плеер под Агат, благо стараниями avivanov76 он дизассемблирован и хорошо комментирован (хотя я и не бум-бум в 6502 ассемблере). Ну и взял я бинарный файл плеера PLAYERR.O в машинных кодах 6502 процессора, взял ядро эмулятора M6502 от Marat Fayzullin, ну и собрал как мог все во-едино. То есть запускается эмулятор CPU 6502, в нем крутиться оригинальный PLAYERR.O с Агата, а когда он обращается к адресам в памяти, в которых в Агате сидит муз ячейка, я делаю перенаправление уже на PC-шные порты воода-вывода. Ну и таймер используется от PC, а не на плате муз ячейки (потому что в PC версии на плате его нет). И вроде бы даже что-то получилось:
https://soundcloud.com/tronix286/ottawan-2nd-try - тут можно послушать что получилось.
На слух еще вроде-бы ощущаю некоторую проблему с таймингами выполнения 6502 кода плеера в эмуляторе, надо будет попробовать доразобраться...
Затем меня понесло и я встроил в программу SoftMPU сэквенсор MIDI для музячейки. Это позволило запускать почти любые игры, в которых в настройках звука можно выбрать "General MIDI / MPU401" в качестве звуковой карты. Например, вполне успешно поиграл со звуком в Heroes 2, Warcraft 2, The Increditable Machines 1-2, Lotus, Stunts, Monkey Island, Prince of Persia и тд. Небольшое видео, снятое на балтику девятку (прошу понять и простить): https://youtu.be/OT60Vs25MK4
И теперь плавно подхожу к сути вопросов:
Сэквенсор, который сейчас реализован и в DOSMID, и теперь вот в SoftMPU - очень примитивный. Фактически, я просто играю с нужной частотой ноты, без всяких эффектов, типа там экспрессии, вибрато, детюна и прочего прочего, чего бы можно было бы сделать. Единственное, что сейчас реализовано из "фишек" - так это pitch band'ы. Барабаны расставлены кое-как, можно сказать "от балды", без всякого соответствия General MIDI - регистры управления каналами ударных муз ячейки. Громкость никак не управляется, хотя наверное ей можно управлять через полосовые фильтры и бит громкости в каждом микшере каналов. Бит "атаки" так же никак не используется, а он есть в муз ячейки. И тд и тп.
Поэтому, если кто-то знает, как, например, правильно использовать полосовые фильтры в тональных каналах - прошу дать наводку. Сейчас у меня сделано так - в зависимости от частоты ноты просто включается бит либо НЧ либо СЧ либо ВЧ. Когда поступает команда MIDI NOTE ON для низкой частоты вместе с ENABLE канала включается фильтр НЧ, для средних частот включается бит СЧ и для высоких частот бит ВЧ. То есть просто тупо что бы нота зазвучала. Но я чувствую, что с этим можно здорово поиграться и сделать на основе этих полосовых фильтров какую-нибудь там огибающую в зависимости от типа инструмента или что-то подобное, но ума не хватает.
Так же не могу придумать, как оперировать битом SA (плавная атака). Как и при каких событиях его можно было бы задействовать.
Как правильно использовать бит LP (low pass filter, усиление +6dB) - сейчас он у меня вроде всегда включен, и поэтому все ноты звучат громко, в не зависимости от громкости MIDI.
Как правильно соопоставить ударные каналы и их биты управления реальным MIDI инструментам ударных...
Вообщем, если честно, то я даже не могу сейчас правильно сформировать свои вопросы, поэтому буду рад каким-нибудь наводящим вопросам или любым идеям, как улучшить звучание MIDI чуть больше, чем просто включать/выключать ноты с одни и теми же фильтрами.
Спасибо, если кто-то дочитал до сюда -)
PS: Ах, да, чуть не забыл, страничка моего проекта на гитхабе: https://github.com/Tronix286/MuzCell . Там все схемы, плата, герберы, фотографии собранной платы в хорошем разрешении, весь софт, который я на данный момент адаптировал.