Вообще есть исходники vgm для msx. Оно там уже давно есть и работает. Исходники на асме.
Си для z80 есть с 80х годов. Из последних гугли sdcc.
https://bitbucket.org/grauw/vgmplay-msx
Вид для печати
Вообще есть исходники vgm для msx. Оно там уже давно есть и работает. Исходники на асме.
Си для z80 есть с 80х годов. Из последних гугли sdcc.
https://bitbucket.org/grauw/vgmplay-msx
В исходники не заглядывал ,спасибо за ссылку , а так да, прочитал , что есть , но это не особо поможет , они не поддерживают YM2612 , и тем более формат сеги YM2612+DAC+SN76489 , хотя если застряну то буду подсматривать как для других FM чипов реализовали код.
Уже параллельно с текущим SMPS ,начал писать VGM плеер с ноля , вчера доки поизучал , в общем более менее все понятно.
В 90-х и не слышал об этом , потом перерыв долгий , вчера нашел откомпилированный код VGM с Си на Z80 , и ужаснулся ,то что должно весить байт 500 ,весит 4 кб.
никакой оптимизации.
- - - Добавлено - - -
Так понимаю это чисто компилятор без IDE ?
Sayman, YM2612 драйвера там нет , есть OPN2 в разделе эмуляция.
- - - Добавлено - - -
Mick, а какой то эмуль поддерживает SAA1099 твоей ZXM-SoundCard ?
Unreal точно. Один патчил Молодцов Алекс - http://micklab.ru/file/zxm_soundcard...73_mod_saa.rar
Второй вариант добавлял deathsoft (версии конкретно не помню - см. последние версии Unreal, там по идее он должен быть).
Вопрос кто в курсе какие мнемоники в последних версиях Alasm для половинок индексных регистров ?
И еще баг , в последней версии perfect commander ,которая на VRTD и которая вшита в глюк ПЗУ , при переименовании расширения файла грохается адрес его начала по которому он грузится.
Я по привычке всем старым пользовался ,что осталось с 90-х , и вот переходя на новые версии софта нахожу одни глюки ,причем весьма жесткие ,и подозрение что это не авторы их наделали ,а те кто их проги "улучшал"
- - - Добавлено - - -
https://c.radikal.ru/c19/1804/63/a339e7674565t.jpg
Лучше поздно чем никогда , при переименования расширения файла ,после буквы расширения могут быть ,а могут и не быть символы ,по практике мы жмем пробелы ,
и это затирает/меняет адрес загрузки файла.
Вот ,где курсорчик стоит , жесткий глюк , запорол так несколько файлов.
https://d.radikal.ru/d27/1804/ce/b750b5b8108ct.jpg
Как то он не правильно сделано , вероятность при переименовании запороть 99.9% , надо тогда было делать по признакам расширений , если оно действительно трехзначное ,разрешать переименовывать все три символа , если признака нет , только один символ давать переименовывать.
Ибо телепатов очень мало , а логики для обычного пользователя нет.
goodboy,
Офф
Что то переход на новый софт вообще пошел комом , значит решил написать загрузчик человеческий для плеера , взял за основы свой простенький цифровой редактор
, код в текстовом формате Alasm весит около 11кб , при загрузке текста в версии Alasm 4.44 , 5.05 , 5.07 и при выходе в STS потом невозможно вернутся в alasm или виснет
или сбрасывается , на Alasm 2.8 все отлично , с чем такое может быть связано ?
- - - Добавлено - - -
PS Alone Coder тут бывает ?
Понемногу пишу плеер ,стал интересный вопрос , как нам грузить файлы музыки ,они ведь более 64кб часто бывают.
Вариант первый ,использовать формат дискет MS-DOS.
Вариант второй , файлы бьются по 64кб , первый главный файл имеет расширение ".V" (от VGM) ,остальные ".C" , что бы пользователь случайно не загрузил мелодию с "середины" , саму длину я найду где закодировать.
Это самое логичное как по мне решение для рядового пользователя.
Плеер точно должен грузить разные мелодии , делать несколько демок с мелодиями не хочу , иначе народ быстро к такому потеряет интерес , если он конечно будет )))
Или будут еще какие то мысли ?
Вот уже написал для этого загрузчик
https://d.radikal.ru/d35/1804/ca/2faab293945dt.jpg
Хотя можем и MS-DOS :)
Вопрос кодерам ,ну или критикам , собрал загрузчик , загрузчик VGM + процедура печати шрифта 8X4 + процедурка печати HEX чисел , код весит ровно 1кб (без шрифта), и вот думаю это много/мало ,или нормально ? Давненько не писал,как то все слегка топорно :)
главное чтоб работало ) - по тактам там успевало, а оптимизировать всегда успеется - якщо у пана є час і натхнення )
Оно то так ,но потом как всегда не будет времени, прикинул ,весь плеер (пока под TR-DOS ,без винта) с оформлением должен весить примерно до 15кб.
- - - Добавлено - - -
Хочется инфу о мелодии и семплах выводить компактно ,HEX еще пригодится при отладке плеера , будет мне в экран писать чем плюется в ямаху.
По итогу 8x8 может будет правильнее если впишется в мою задумку.
Еще добавлю , вот написал поддержку тегов , при 8x8 это займет много места , при 8x4 как то компактнее.
https://b.radikal.ru/b24/1804/d8/18540751eb98t.jpg
@Mick ,когда допилю VGM к YM2612 , можно попробовать в плеер добавить поддержку твоего Moon Sound.
- - - Добавлено - - -
А потом бы с автором Wild Player договорится ,и было бы отлично впихнуть это туда.
HardWareMan, вопрос а YM2612 переваривает команды DAC если их ставить не после конфигурирования FM регистров ,а между , то есть так -
fm reg,data ; конфигурирование FM регистра
#2A,data ;вывести байт в ЦАП
fm reg,data
#2A,data
fm reg,data
#2A,data
Регистр адреса регистра общий. Так что, нельзя. Но, если каждый раз перегружать его - то можно, но с учетом BUSY флага. А зачем?
VGM формат оказался не так прост.
Суть такова ,идут себе данные для FM , а между ними приходит команда играть PCM семпл , мы начинаем испольнять команду по проигрыванию PCM ,настраиваем нужный PCM семпл, его частоту выборки , и начинаем играть выкидывая это в DAC естественно очень часто это надо делать и иногда долго если это например труба какая нибудь в цифре , но в VGM поток непрерывный и нам в это же время надо дальше записывать данные в FM регистры ,в то время как мы между ними шлем что то в DAC :v2_wacko:
Хотел попробовал проанализировать это дело на VGM плеере для MSX , но как подсказали к MSX не цепляли YM2126 и вижу что в коде плеера стоят вроде как заглушки где он PCM для YM2612 должен обрабатывать.
Все в общем движется , сейчас разбираюсь с таймингами ,так как оказалось ,что прерывания нам в этом плеере вообще не нужны , там все надо делать на отсчетах и таймерах.
Вот гитара небольшая ,это уже чисто VGM :)
https://www.youtube.com/watch?v=uBHXsiyKuCs&feature=youtu.be
На данный момент написан полный человечески загрузчик вплоть до одной мелодии на целую дискету , построитель таблиц PCM семплов , частичный обработчик команд ,и частично плеер.
- - - Добавлено - - -
PS вот чувак через эмуляцию на MSX сделал ,но сам пишет что очень сыро - https://www.youtube.com/watch?v=2jiSclQJ-2s
Ну ничего , MOD плеер написали на 3.5мГц , это подумаю и тоже напишу :)
- - - Добавлено - - -
Вот еще один кусочек VGM
Очень интересно , анализ кода показал ,что MSX плеер и Teensy 3.5 не обрабатывают PCM команды #90-#95 которые управляют потоками ,частотой и настройками PCM , непонятно ,из за сложности реализации или еще по какой то причине. Но во всех файлах с PCM что я просматривал команды #90-#95 используются постоянно. Выходит вышеприведенные плееры просто не играют определенные звуки.
Подумал на досуге о таймере , вопрос может кто то подобное реализовывал ,что бы велосипед не изобретать.
Хочется сделать как можно более точный плеер , основная структура такова ,нам надо читать команды и исполнять их со скоростью 44.100 кГц , но на исполнение разных команд уходит разное время ,и поэтому нельзя в общем цикле поставить задержку с одинаковым временем , так как частота выборки станет плавать.
В виду этого пишу такой таймер в который после исполнения каждой команды будет заноситься число отсчета до чтения следующей команды.
Ни кто ни писал никогда подобную синхронизацию для получения четких равных "прерываний" когда между ними исполняются код с разным количеством тактов ?
в DMA Ultrasound стояла 8253 - как раз для этих целей
Ну и последнее на сегодня , подсчеты такие -
что бы написать корректный и полноценный парсер VGM нам надо в 79 тактов уложить -
выборка команды из озу
проверка на окончание банка памяти
обработка команды ,самое логичное умножение кода команды на 3 для получения вектора на таблицу jump-ов исполнения команд
исполнение команды - запись регистров FM или DAC иногда с чередованием.
если в это время играет DAC ,то все делать надо параллельно
Все это каждый раз и за 79 тактов как то сложновато ,если не сказать больше ...:v2_conf2:
Что скажут господа программисты светлые головы ?
- - - Добавлено - - -
не ,подсчеты показали что таймер мне уже не нужен , почитай выше , 79 тактов ...
Остальные нужные задержки я уже просчитал и реализовал.
- - - Добавлено - - -
PS расчет прост ,требование VGM выбирать и исполнять команды с частотой 44.100кгц
3.5мГЦ (Z80) / 44100 = 79.3 такта на все.
44.100 выбрано видимо чтобы играть на ПЦ онли - для 8-бит это избыточно имхо - на ГС 37.500 вроде даже, но и это много.
Есть некоторые идеи , и как минимум треть плеера написана , VGM нам хорош по той причине что много музыки.
на счет нативных драйверов тоже будет , но это проект больше зимний ,для долгих вечеров , там каждую мелодию надо править и пересобирать вручную , или писать "исправитель"
А пока VGM , спортивное программирование )
- - - Добавлено - - -
видимо да , под PC точили
У GS хоть 320 тактов в прерывании )))
Хотя на нашем прекрасном пентагоне с КЕШ в турбо есть 158 тактов при 44100 , а это уже не мало :) И напрашивается плеер как с поддержкой обычного ZX и нашего пентагона.
:v2_tong2:
Переписал по новой FM часть плеера ,и это прошу заметить еще без 4 каналов SN (в пути в Эстонии застряли:biggrin:)
https://www.youtube.com/watch?v=BqfazaAWOVc&feature=youtu.be
- - - Добавлено - - -
PS на экране это не глюки , атрибуты и полоски ,что бы понимать что парсер делает.
- - - Добавлено - - -
PPS на данный момент плеер весит 5 кб со всеми делами, думаю в изначально намеченные 16 кб уложусь.
Пофилософствую немного на тему DAC+PCM , проанализировал некоторое количество VGM треков и максимальная частота PCM в них 32 кгц.
Это радует , у меня как раз выходит в плеере такая частота под DAC , но стал остро вопрос о том что PCM у нас может быть разной частоты от 8 до 32кГц.
и нам в реальном времени надо делать resampling , и делать очень быстро , и делать так ,что бы воспроизведение семпла с любой частотой не изменяло время задержек ,
Сначала попробовал строить таблицы ,но из этого ничего не вышло , медленно.
Потом через деление частот семплирования и семпла попробовал пропускать ненужную инфу PCM ,тоже огород.
И сегодня изобрел (я наверно не первый, скажите если было)
И так самый быстрый resampling в realtime , получаем коэффициент для ресамплинга делением частоты (22050) семпла на частоты вывода (32000)
пример 22050 / 32000 = 0,69
Далее делаем наш адрес выборки не 16 битным ,а 24 битным hl=xxxx,xx
Это ресамплинг без потери данных ,с одинаковым временем и частотой вывода и очень очень быстрый :)Код:LD HL,#C000 ;начало PCM семпла
LD A,#9C ; 255-99 для счета до 100 что бы не морочится с десятичной арифметикой
LD E,#45 ; коэффициент ресамплинга 0,69
resampl
OUT (port),(HL) ;macros вывод в цикле идет с частотой 32000 гц
ADD A,E ; наш дополнительный десятичный адрес после запятой ,XX
JP NC,resampl ;дополнительный десятичный адрес указывает когда извлечь следующее значение для DAC , иначе выводится текущее
ADD A,#9C ;не теряем результат переполнения нашего десятичного (0-99) значения после запятой
INC HL ; собственно заветный момент ресамплинга
JP resampl
Или уже было такое и я не молодец :biggrin: ?
- - - Добавлено - - -
PS на данный момент парсер главных команд FM+PSG работает с частотой до 40кгц ! так что Z80 не так уж плох :)
мне кажется что нужно сделать чтобы кол-во тактов в процедуре было одинаковым независимо от условного перехода.
и вроде бы ты сделал семплер с аккумулятором фазы - в журнале Радио за 91-ый год чтото похожее описывалосб.
да это не проблема ,семо собой в плеере допилю
Честно три вечера просидел , чуть моск не лопнул. Обязательно подниму журнал, почитаю.Код:LD HL,#C000 ;начало PCM семпла
LD A,#9C ; 255-99 для счета до 100 что бы не морочится с десятичной арифметикой
LD E,#45 ; коэффициент ресамплинга 0,69
resampl
wait 7+6+10 takt
resampl_1
OUT (port),(HL) ;macros вывод в цикле идет с частотой 32000 гц
ADD A,E ; наш дополнительный десятичный адрес после запятой ,XX
JP NC,resampl ;дополнительный десятичный адрес указывает когда извлечь следующее значение для DAC , иначе выводится текущее
ADD A,#9C ;не теряем результат переполнения нашего десятичного (0-99) значения после запятой
INC HL ; собственно заветный момент ресамплинга
JP resampl_1
Быстрее по моему уже не выйдет ,или есть мысли ?
- - - Добавлено - - -
shurik-ua, а какой номер журнала если помнишь ,а то все листать долго будет )
ошибся немного - 1992 №№11-12
в 1991 №5 - теория