Просмотр полной версии : Копия по мотивам "музыкальной ячейки Агат" для IBM PC
Вообщем, давно зрела мысль перенести музыкальную ячейку Агат (http://agatcomp.ru/agat/Hardware/SoundNCL/jzs52.shtml) на шину ISA8 для PC, так как звук этого девайса очень нравится.
UPD: Первая версия собрана, протестирована, и работает:
https://i.ibb.co/CH0yvH3/P1140073.jpg (https://ibb.co/tJC6cJT)
Страница проекта: https://github.com/Tronix286/MuzCell
Первоначальное сообщение:
Вот тут демо:
https://youtu.be/Pyzk-iZwCPE?t=66
Единственное, что все время останавливало, так это полное отсутствие софта на PC для этой звуковой карты. Но немного погуглив, прикинув что к чему, в принципе появилась небольшая уверенность, что я смогу для этой муз карты сделать поддержку в плеере DOSMID, в драйверах AIL2 (как это уже было сделано для Creative Music System), так же можно попробовать перенести один из плееров AY-музыки с вектора или Агат, что бы играть тюны AY, так же можно поиграться с ШИМ, что бы просто воспроизводить WAVE файлы.
Начал рисовать схему, и решил, что будут следующие отличия от оригинальной муз ячейки:
- не буду делать внешний 8-битный порт. Один фиг к нему никто на ПЦ ничего цеплять не будет;
- не будет IRQ от таймера одной из ВИ53 и управления IRQ. На ПЦ и так таймер есть, даже не один - если нужны прецизионные задержки никто не мешает повесить свой обработчик прерывания прямо на таймер в DOS;
- за счет этого высвобождается один канал ВИ53, который заюзаю как еще один тональный канал. У оригинала было 5 тональных каналов, здесь будет 6 тональных канала;
- будет возможность чтения регистров обоих ВИ53. В оригинале такой возможности не было. Нафига - пока не понятно, но оно не сложно, возможно для авто-детекта карты.
В связи с этим немного меняется расположение портов, хотя и остается близкое к оригиналу - за счет появления шестого тонального канала сдвинулись порты управления ударными каналами. Перемычка выбора портов на адреса 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 доступны только на запись.
Нарисовал декодер адресов, немного потупил над системой клоков: плате нужно две основные частоты - 1МГц на счетчики ВИ53 и 64КГц на генератор шума. В оригинале у Агата есть 2МГц на системном разъеме, поэтому они берут две штуки ИЕ5 и на них все делают как надо. В ПЦ 2МГц нету, зато есть 14МГц, которые хорошо бы сразу поколоть на 14, что бы получить 1 МГц, но я не придумал как изящно это сделать не нагородив кучу счетчиков и AND'ов вместе с XOR'ами. Поэтому не долго думая поставил 555ИЕ2 с одним лог элементом И, которая 14МГц делит на 7, давая 2МГц точно такой же скважности как и в Агате. В Агате, кстати, они 2МГц на системном разъеме получают из тех же 14,3МГц с помощью 155ИР3 и NOT, но такую лютую дичь я не решился повторять. В общем, наверное не оптимально, но работать должно я думаю:
https://i.ibb.co/7N1zk22/clocks.png (https://ibb.co/cXrvYDD)
Так же небольшая затупка случилась в подключении GATE0,1,2 у обоих ВИ53. Где-то я краем уха слышал, что после подачи питания ВИ53 начинает считать и из-за этого динамики в каких-то компах пищат после включения. В оригинальной плате GATE'ы управлялись через тригер на порту nF, у меня же в связи с появлением шестого дополнительного канала этот порт занят, и вообще все порты от 0 до F заняты. С другой стороны, если начальное состояние триггеров 555ТМ7 будет 0, то аналоговые коммутаторы должны быть выключены, и звук не должен идти на выход. Поэтому даже не знаю, просто GATE тупо что-ли на +5В повесить и не городить огород?
Значит решил все-таки GATE'ы у ВИ53 завести через триггер, линия сброса которого связана с сигналом RESET, примерно так же как и в оригинале, что должно нам дать после включения запрет счета, и соответственно, тишину на выходах OUT обоих ВИ53:
https://i.ibb.co/f1Vp9zx/gate.png (https://imgbb.com/)
Единственное, так все порты уже заняты, пришлось разрешающий бит управления GATE'ами впихнуть в порт управление ударным каналом 8.
Генератор ударных, канал 8:
D0 - частота 1.
D1 - частота 2.
D3 - длительность.
D4 - пуск.
D7 - = 1 - запрет работы всех таймеров/счётчиков.
Думаю не особо помешает, просто при инициализации нужно будет дернуть бит D7 у ударного канала 8, что бы включить GATE. Дальше можно будет работать по классической схеме Агат'овской ячейки. Ну и раз поставили сюда триггер 555ТМ2, то и клоки немного переделались - убралась одна ИЕ5, вместо нее поставилась вторая половинка триггера ТМ2:
https://i.ibb.co/2KVfHfS/clocks2.png (https://ibb.co/7yM6L6Q)
В принципе, с цифровой частью схемы вроде по большому счету всё, теперь просто нудное перерисовывание аналоговой части.
Вроде бы закончил расстановку компонентов.. Наверное приблизительный вид такой и кардинально меняться уже не будет:
https://i.ibb.co/cKqQFtW/render.png (https://ibb.co/kVZX80L)
Доска получается, конечно, солидная по размеру - 118x275,25 . Но ужимал как мог, и так монтаж очень плотный, компоненты будут впритык друг к другу стоять.
После недели мучений, верчения компонентов, кое-как, но ячейка вроде развелась наконец. Аналог - ручками, а вот цифру руками не осилил, хотя честно пробовал неоднократно. Уже все шло к тому, что бы делать 4 слоя, но все-таки вывел на двух полу-руками, полу-автороутером. В любом случае, версия первая, пробная, и скорее всего найдутся косяки в схеме, поэтому хотя бы так для начала:
https://i.ibb.co/TTmcZyM/render2.png (https://ibb.co/W3gnQCv)
Теперь не могу загрузить герберы на jlcpcb - у них бага какая-то на сайте - загрузка файла происходит, индикатор загрузки бежит, а потом - всё, файл не появляется в проектах. Может новый год, может быть завтра аклемаются и починят. Ради интереса грузанул в резонит - 1 штука примерно пять с копейками тысяч.
Я только что на jlcpcb загрузил и оформил заказ - всё прошло нормально. Видимо, починили. Кстати, у меня при работе с jlcpcb нередко бывают сильные тормоза, скорее всего, из-за провайдера. Включаю работу через прокси - всё начинает работать нормально.
Видимо, починили.
Да, сегодня удалось заказать 5 штук. Видимо глюк какой-то был...
Пока платы едут из китая, написал тест на турбопаскакале для данной железки:
https://i.ibb.co/kxPS8Np/muz-test-001.png (https://ibb.co/PNV6hqR)
Интерфейс в наглую срисовал с оригинального Агатовского теста авторства "Ravodin" aka "tmptmp15" aka "Voldemar0", прямо с видео из ютуба. Потому что очень лаконично, простенько и со вкусом, мне нравится. Саму прогу накидал на Turbo Pascal. Так что теперь будет удобно "потыкать в нее палочкой" после сборки ))
Переместил проект сюда: https://github.com/Tronix286/MuzCell
Доехали наконец платы. Доска получилась конечно внушительных размеров:
https://i.ibb.co/W5jrQfH/photo-2022-02-28-11-03-27.jpg (https://ibb.co/qjVHzpD)
Начал потихоньку собирать:
https://i.ibb.co/1vnhDQg/photo-2022-02-28-12-42-11.jpg (https://ibb.co/5M9tN40)
Собрал основную цифровую часть, проверил схему генераторов частот на 555ИЕ2, 555ИЕ5 и 555ТМ2 - всё отлично работает, выдает необходимые 1,021 МГц на тактирование ВИ53 с шириной импульсов близкой к 50%, и 63.8 КГц для генератора шума. А самое главное, работает управление обоими ВИ53, значит я даже не накосячил в схеме декодера адреса.
https://i.ibb.co/CKw6sWD/photo-2022-02-28-14-01-48.jpg (https://ibb.co/B2fGKwF)
Регистры ВИ53 доступны как на запись, так и на чтение. Выходы ВИ53 управляются из тестовой утилиты, частота полностью соответствует расчетной из программы управления. Что же, далее буду собирать один тональный канал с его микшером и делать выходную часть.
Фух, допаял ячейку. Выводных деталей здесь конечно различных номиналов, я вам доложу.... Я столько не помню когда последний раз паял. Но что поделаешь, аналог-с... Вот, с пылу с жару, не отмывал еще:
https://i.ibb.co/CH0yvH3/P1140073.jpg (https://ibb.co/tJC6cJT)
https://i.ibb.co/0GdSG8b/P1140075.jpg (https://ibb.co/VqPZqr4)
https://i.ibb.co/kcHBmXN/P1140076.jpg (https://ibb.co/ysfP4qH)
Я переживал, что монтаж будет очень плотным, но опасения не оправдались - все компоненты очень хорошо разнесены друг от друга, ничто не жмется впритык к соседке. Для всех микросхем тоже можно установить панельки, и они не будут ничему мешать (но я не стал ввиду отсутствия панелек).
https://i.ibb.co/qyKgcv9/P1140081.jpg (https://ibb.co/r7YpzVM)
https://i.ibb.co/yq9Y8Q4/P1140082.jpg (https://ibb.co/VT1Qvqw)
Сегодня протестировал генератор шума, ударные каналы - работают. То есть фактически, получается что все работает. Удивительно, но плата без косяков развелась, и схема тоже.
Небольшая errata (список замеченных ошибок) по итогам сборки платы v1_0_0:
- На схеме, и как следствие, шелке не правильно обозначена полярность C43, C47, C58;
- На схеме неверная маркировка U12 - U19. Указано 74LS373, должно быть - 74LS374;
- На схеме неверная маркировка U22. Указано 176ИЕ10, должно быть - 176ИР10.
Ну теперь самое трудное - софт....
Фух, допаял ячейку. Выводных деталей здесь конечно различных номиналов, я вам доложу.... Я столько не помню когда последний раз паял. Но что поделаешь, аналог-с...
Я, когда собирал ЯЗС, весь выматерился. Ещё два или три комплекта лежат, не могу заставить себя взяться за паяльник :)
Теперь дело за малым - написать софт. Какой-нибудь трекер в текстовом режиме.
Какой-нибудь трекер в текстовом режиме.
Не, я боюсь не вывезу, к сожалению. Пока решил начать с малого, а именно поиграть MIDI плеером DOSMID (http://dosmid.sourceforge.net/) - скачал его последние исходники, понемногу добавил тональные каналы и один канал ударных на пробу. Пока получилось как то так:
https://soundcloud.com/tronix286/l014mp3
В тональных каналах попытался использовать полосовые фильтры. Для каждой ноты:
вычисляю по MIDI ноте ее октаву (всего 12);
пересчет диапазона 1..12 в 1..7; map(octave,1,12,1,7);
Устанавливаю биты D0..D2 микшера канала как 7 - map(octave,1,12,1,7); Значение задом на перед, потому что младший бит D0 в микшере - это высокие частоты, а бит D2 - низкие. Нам надо перевернуть, поэтому от 7 отнимаю значении, получается значение для записи в порт микшера канала.
Бит D3 (усиление +6dB) сейчас всегда включен. Не знаю, в зависимости от каких условий его можно менять. От громкости, наверное, получается у нас два уровня громкости на канал. Может прикручу чуть позже, щаз на максимум :)
Бит D4 (плавная атака и плавное затухание) - не знаю как использовать. Щаз выключен постоянно.
Ну и канал ударных. Сейчас использую только седьмой (в агате шестой) канал ударных, сделал тоже по аналогии с обычными нотами -
вычисляю октаву, которая идет в MIDI-сообщении для MIDI канала 10 (percussion), так же пересчитываю диапазон из 1..12 в 1..7, так же отнимаю от 7 получившееся значение, что бы перевернуть биты, так как там частота так же идет с бита D2 к D0, и пишу в микшер канала семь (в агате 6).
Бит D3 (продолжительность) - не знаю как использовать, пока в нуле всегда.
Ну и пока не знаю как использовать еще один канал ударных, там наверное MIDI посылает sys-ex для смены инструмента на канале 10 (percussion), их надо отлавливать и в зависимости от тогда уже переключаться на каналы ударных на муз ячейке... Попробую потом..
Вообщем, по поводу DOSMID немного разобрался с ударными. На 10 контроллере прилетают MIDI сообщения, где нота - это тип ударных, в соответствии с General Midi 1:
Key# Note Drum Sound Key# Note Drum Sound
35 B0 Acoustic Bass Drum 59 B2 Ride Cymbal 2
36 C1 Bass Drum 1 60 C3 Hi Bongo
37 C#1 Side Stick 61 C#3 Low Bongo
38 D1 Acoustic Snare 62 D3 Mute Hi Conga
39 Eb1 Hand Clap 63 Eb3 Open Hi Conga
40 E1 Electric Snare 64 E3 Low Conga
41 F1 Low Floor Tom 65 F3 High Timbale
42 F#1 Closed Hi Hat 66 F#3 Low Timbale
43 G1 High Floor Tom 67 G3 High Agogo
44 Ab1 Pedal Hi-Hat 68 Ab3 Low Agogo
45 A1 Low Tom 69 A3 Cabasa
46 Bb1 Open Hi-Hat 70 Bb3 Maracas
47 B1 Low-Mid Tom 71 B3 Short Whistle
48 C2 Hi Mid Tom 72 C4 Long Whistle
49 C#2 Crash Cymbal 1 73 C#4 Short Guiro
50 D2 High Tom 74 D4 Long Guiro
51 Eb2 Ride Cymbal 1 75 Eb4 Claves
52 E2 Chinese Cymbal 76 E4 Hi Wood Block
53 F2 Ride Bell 77 F4 Low Wood Block
54 F#2 Tambourine 78 F#4 Mute Cuica
55 G2 Splash Cymbal 79 G4 Open Cuica
56 Ab2 Cowbell 80 Ab4 Mute Triangle
57 A2 Crash Cymbal 2 81 A4 Open Triangle
58 Bb2 Vibraslap
Понятно, что все типы ударных воспроизвести не получится, но основные, типа бочки, тарелок - нужно подобрать по приблизительному звучанию двух имеющихся каналов муз ячейки и их битами управления и сделать сопоставление. Пока сделал кое-как, по-времянке, не совсем в соответствие с инструментами. Скоро выложу этот DOSMID с поддержкой музыкальной ячейки на страницу проекта, как есть. Возможно, в дальнейшем потихоньку буду править.
Зато, попытался сделать проигрыватель оригинальных .MUS файлов с Агата. Сначала хотел переписать его начисто, а потом подумал - а что если взять уже имеющийся плеер под Агат, благо стараниями avivanov76 он дизассемблирован и хорошо комментирован (http://forum.agatcomp.ru//viewtopic.php?pid=1286#p1286). Ну и взял я бинарный файл плеера PLAYERR.O в машинных кодах 6502 процессора, взял ядро эмулятора M6502 от Marat Fayzullin, ну и собрал как мог все во-едино. То есть запускается эмулятор CPU 6502, в нем крутиться оригинальный PLAYERR.O с Агата, а когда он обращается к адресам в памяти, в которых в Агате сидит муз ячейка, я делаю перенаправление уже на PC-шные порты воода-вывода. Ну и таймер используется от PC, а не на плате муз ячейки (потому что в PC версии на плате его нет). И вроде бы даже что-то получилось:
https://soundcloud.com/tronix286/ottawanmus - пример звучания мелодии через этот проигрыватель
Возможно есть еще косяки в таймингах, но попробую немного с ними поиграться в ближайшее время. Еще как-то мне не очень нравится последний ударный канал, который типа "тарелки", в Агате немного по-другому звучит. Может номинал какой-то не правильно впаял, буду перепроверять на плате.
Этот плеер так же скоро выложу как есть на страницу проекта.
Зато, попытался сделать проигрыватель оригинальных .MUS файлов с Агата. Сначала хотел переписать его начисто, а потом подумал - а что если взять уже имеющийся плеер под Агат, благо стараниями avivanov76 он дизассемблирован и хорошо комментирован (http://forum.agatcomp.ru//viewtopic.php?pid=1286#p1286). Ну и взял я бинарный файл плеера PLAYERR.O в машинных кодах 6502 процессора, взял ядро эмулятора M6502 от Marat Fayzullin, ну и собрал как мог все во-едино. То есть запускается эмулятор CPU 6502, в нем крутиться оригинальный PLAYERR.O с Агата, а когда он обращается к адресам в памяти, в которых в Агате сидит муз ячейка, я делаю перенаправление уже на PC-шные порты воода-вывода. Ну и таймер используется от PC, а не на плате муз ячейки (потому что в PC версии на плате его нет). И вроде бы даже что-то получилось:
Класс!!!
Все-таки беспокоил меня, как уже писал ранее, второй канал ударных (тарелки) - уж очень он у меня "паровоз" напоминал. Решил сверить номиналы впаянных деталей, и точно - нашел 3 своих ошибки, три конденсатора были не тех номиналов запаяны. Наверное спешил, да еще плюс ко всему этот канал последним паял и видать совсем притомился. Перепаял в соответствии со схемой. Стало вроде получше, более похоже на оригинал из Агата.
https://soundcloud.com/tronix286/ottawan-2nd-try - тут можно послушать что получилось.
На слух еще вроде-бы ощущаю некоторую проблему с таймингами выполнения 6502 кода плеера в эмуляторе, надо будет попробовать доразобраться...
Потихоньку МузЯчейка начинает обрастать софтом:
https://github.com/Tronix286/MuzCell/tree/main/software
Встроил в программу 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 - регистры управления каналами ударных муз ячейки. Громкость никак не управляется, хотя ей можно управлять через полосовые фильтры и бит громкости в каждом микшере каналов. Бит "атаки" так же никак не используется, а он есть в муз ячейки. И тд и тп.
Вообщем, весь потенциал муз ячейки этот софт не раскрывает. Но, пока только так, увы, я не волшебник...
А тем временем shiru8bit запилил первую версию трекера с интересным названием Yach*PMS для МузЯчейки:
https://i.ibb.co/M5mhmSK/photo-2022-05-13-09-30-23.jpg (https://ibb.co/Z10J0Xv)
https://shiru.untergrund.net/software.shtml
Есть вендовая версия со встроенной эмуляцией, есть DOS-версия для реальной железяки, есть сорцы.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot