Просмотр полной версии : Играем мелодии на ВИ53
Попробовал перенести несколько музыкальных тем на Апогей. Пока только изучаю теорию, поэтому сделал "в лоб" - три канала square-wave - звучит "как из бочки", но вполне узнаваемо.
Запустить файл можно на эмуляторах или на реале. Могу портировать под РК86 (или другие копмы), если скажите под какие порты (ВИ53).
Если есть какие советы как улучшить звучание - готов выслушать и применить =))
- - - Добавлено - - -
Все исходники прилагаются. Звучит уже не совсем "как из бочки" = ))
Мелодии из игр послушать в mp3 (звучит ВИ53 - записано с реального Апогея) (https://cloud.mail.ru/public/97Uz/hToiLra1q)
Если есть какие советы как улучшить звучание - готов выслушать и применить =))
Я так понимаю, именно с этой целью был создан AY :)
на Специалист музычку плз портируйте
ви53 вот по этой схемке
http://www.spetsialist-mx.ru/schemes/SP580.png
для емулятора конфиг в самом низу страницы
http://www.spetsialist-mx.ru/index6.html
SegaBoy, здОрово звучит! Спасибо!
на Специалист музычку плз портируйте
ви53 вот по этой схемке
Есть небольшая разница. У апогея для звука доступны все 3 канала ВИ53 (и в представленной программе они все используются), а у MXа один канал.
это SP580 доработка , не МХ
Схему Апогея давно хотел глянуть, чет не нашел
но никто нам не мешает ВИ53 припаять как надо, строгой схемы всеравно нет
это SP580 доработка , не МХ
У этой (SP580) доработки для звука 1 канал. У MX (http://www.spetsialist-mx.ru/index8.html) в принципе тоже 1, но сделан несколько иначе. Пусть меня железячники поправят, но у MXа идеологически похоже на схему для РК86 (хотя для РК86 вроде было больше одного варианта), где условно один выход ВИ53 задает тон, а другой - длительность (хотя я не понял, почему нельзя наоборот, и вобще зачем было так делать, если длительность может выдерживать процессор).
У кого еще вспомнил ВИ53 навскидку: корвет и башкирия-2м - 1 канал, вектор и ПК8002 - 3. Речь про "исторические" варианты, не из нового времени.
но никто нам не мешает ВИ53 припаять как надо, строгой схемы всеравно нет
? Схемы есть. Причем их реализовали на практике. Хотя при желании можно подключить ВИ53 (или AY) к чему угодно, но это имхо уже другая история.
- - - Добавлено - - -
Кстати адреса таймера у SP580 и MX пересекаются, для звука и там и там канал 0, может даже специально так сделали.
это таки так
музыку с апогея можно перенести только на вектор и ПК8002
ишь ты (с)
У кого еще вспомнил ВИ53 навскидку
Забыл Микрошу (1 канал), наверняка еще есть забытые компы или про которые не знаю.
У кого еще вспомнил ВИ53 навскидку:
"Партнер" (с МЦПГ) - 3 канала
Наверное следовало сразу пояснить. В Апогее на звук работают сразу три канала ВИ53 и в данной реализации все три и задействованы. Если в РК86 схема с использованием только одного канала, то ничего вменяемого слышно не будет. Но были варианты подключения ВИ53 к РК, где предлагалось задействовать для звука все три канала - вот это я и имел в виду. Так же у меня используется кадровая синхронизация от ВГ75, плюс работа напрямую с контроллером клавиатуры - поэтому не знаю как это реализовать для Специалиста.
Сейчас причешу исходник и выложу - кто захочет сможет переделать под себя.
- - - Добавлено - - -
Добавил исходник в архив (см. первый пост)
а схемка есть, чтобы и три канала и один работали? универсальный модуль ВИ53
Уважаемый ivagor. Не могли бы Вы дать комментарий вот к этому моменту из древней темы Музыка Сергея Новикова, из раздела по Вектору:
1. Частота звука в каналах модулируется по треугольному закону (/\/\/\), такое частотное вибрато.
2. Девиация частоты в каналах 0 и 2 больше, чем в канале 1 (хотя период модуляции одинаковый, просто шаг больше). При воспроизведении одинаковых или отличающихся на целое число октав нот это приводит к небольшим биениям, что также придает особую окраску звуку.
Что это за треугольный закон такой? По какому алгоритму нужно изменять изначальную частоту ноты и насколько, на тон-полутон или намного меньше? И как часто?
Есть желание применить нечто подобное для улучшения звучания и, соответственно, восприятия = ))
Для разных каналов в разных игрушках Новиков делал ЧМ (или частотное вибрато, раз говорим о музыке) немного по разному, например так: период ЧМ 16 прерываний (которые с частотой 50 Гц), 8 прерываний меняем делитель частоты канала (частота ВИ53 вектора 1,5 МГц) на +1, 8 прерываний на -1.
Насчет применения - для уже готовой музыки, которая откуда-то (например с AY) конвертируется? Мне кажется не стоит, это скорее испортит авторский замысел. Там где автор хотел, он уже вставил вибрато (или даже глиссандо) и ВИ53 без проблем это воспроизведет. Проблема с громкостью и шумом. На ПК8002 громкость ВИ53 регулируется и есть шумовой канал, на других компах с ВИ53 вроде такого нет.
- - - Добавлено - - -
Нашел пример вибрато и глиссандо - dizzy (https://instaud.io/24tp). Вибрато примерно на 1.52, его можно и на спектрограмме в звуковом редакторе увидеть. Глиссандо там много раз встречается. "Старая" (2009 год) запись с реального вектора, ВИ53+бипер эмулируют AY.
- - - Добавлено - - -
Уточню - там и вибрато много, но фрагмент в районе 1.52 мне кажется самым четко выраженным.
Насчет применения - для уже готовой музыки, которая откуда-то (например с AY) конвертируется? Мне кажется не стоит, это скорее испортит авторский замысел. Там где автор хотел, он уже вставил вибрато (или даже глиссандо) и ВИ53 без проблем это воспроизведет.
Я пока что "руками" конвертирую из миди-файлов, что в сети нашёл. Там же в оригинале указано какими инструментами играть и с какой громкостью, а у нас нету никаких инструментов кроме square-wave и громкость одна. Поэтому вот и пытаюсь освоить "трюки" с ВИ53.
Забыл Микрошу (1 канал), наверняка еще есть забытые компы или про которые не знаю.
В компьютере "Байт" был сделан звук на ВИ53. Когда-то набирал на Бейсике музыкальные програмки, звучало очень недурственно. Листинги програм брал из родного мануала.
b2m, Pyk, в ваших эмуляторах частота ВИ53 для партнера с МЦПГ 2 МГц. Смотрю таблицу (http://arendatr.chat.ru/MODULES/r0161.htm#q4) и в ней делители соответствуют частоте ВИ53 1 МГц. Ошибка в таблице?
Ошибка в таблице?
Скорее в эмуляторе. Лично я не задумывался о тактовой ВИ53, схемы то не было (у меня). А на делители не догадался посмотерть.
А теперь схема МЦПГ доступна? В этом альбоме схем (http://www.emuverse.ru/downloads/computers/Partner/docs/Partner_Schematics_Album.djvu) МЦПГ не увидел.
наверняка еще есть забытые компы или про которые не знаю.
Дык Вектор жеж лучший был, вроде...
https://www.youtube.com/watch?v=9Lxo2NIVpiQ
P.S. А свой 6128ц я так и не проверил в играх...
Байт тоже был бы интересен - я так помню, на него кроме встроенной демки ничего и не было.
ivagor, увы, схему МЦПГ до сих пор не удалось найти :(
Видимо, действительно тактовая частота делилась на 2...
Досадно, что схемы МЦПГ нет. Но я все же склонен считать, что ошибка именно в таблице - все ноты сдвинуты на октаву. Это я сужу по демонстрационной программе, которая играет полонез Огинского. Первая нота мелодии (самого высокого голоса) д.б. ми второй октавы и при 2 МГц получается ми второй октавы (а если следовать таблице, то процедуре передается ми первой октавы, нота номер 41).
Если короче, то для проверки схема не обязательна, может у кого то есть живой партнер с МЦПГ? Достаточно послушать полонез на реале и в эмуляторах.
Ох, боюсь, что и живой МЦПГ не найдется :(
Надо будет ещё вызовы Монитора для генерации звука посмотреть - какие коэффициенты там используются...
Надо будет ещё вызовы Монитора для генерации звука посмотреть - какие коэффициенты там используются...
Зачем, там же бипер? Или может я не понял про какие вызовы речь. В пзу МЦПГ для ВИ53 используются коэффициенты из таблицы, т.е. коэффициенты деления из таблицы соответствуют номерам нот, но не соответствуют заявленным номерам октав.
Вариант музыкального проигрывателя SegaBoyя для Партнера с МЦПГ. Рассчитан под текущие конфигурации эмуляторов (ВИ53 2 МГц). Если вдруг выяснится, что частота другая - можно будет поправить.
Выложил music_box_2 (см. первый пост)
В пзу МЦПГ для ВИ53 используются коэффициенты из таблицы
Да, я ПЗУ МЦПГ имел в виду, в которое перенаправляет вызовы Монитор. Значит, там коэффициенты соответствуют таблице...
Кстати, о какой демонстрационной программе, играющей полонез Огинского, идет речь? Не нашел что-то такой в своих архивах...
В этом архиве (http://www.emuverse.ru/downloads/computers/Partner/software/Partner_software.zip)
arendatr.chat.ru\color\mus_synt.rkp
Duck Tales на ВИ53 (Апогей). (https://cloud.mail.ru/public/3CXb/YN5gVof58)
HardWareMan
29.08.2018, 14:02
А в записи есть? Для тех, у кого нет РКшки с ВИшкой.
А у кого нет, могут воспользоваться моим эмулятором (Апогея).
HardWareMan
29.08.2018, 15:54
А он работает на мобиле? Нет? Так и расхочется слушать.
А в записи есть? Для тех, у кого нет РКшки с ВИшкой.
Сейчас придумаю как это сделать (запись) и обязательно выложу.
- - - Добавлено - - -
Записал звук с Апогея в mp3 и выложил в облако.
Duck Tales на ВИ53 (Апогей) в mp3 (https://cloud.mail.ru/public/3CXb/YN5gVof58)
- - - Добавлено - - -
Для заинтересованных добавил исходники в архив. Файл продублировал в первый пост.
Конвертировал ещё один трек. Предлагаю послушать что получилось.
Tim Follin на ВИ53 (Апогей) (https://cloud.mail.ru/public/Hsbx/gni2Bwh7T)
глянул схему апогея , вот елки, три канала ви53 смиксованы через три резистора и все
глянул схему апогея , вот елки, три канала ви53 смиксованы через три резистора и все
Именно. Непонятно зачем в других схемах два канала пускали неизвестно на что. Какой толк отмерять таймером время, если он не сообщит прерыванием что что-то отсчиталось и наступило. Ну а задавать длительность звука одним из каналов тот ещё бред. Если проигрывать музыку, то по-любому придётся выдавать новые звуки пока она играет, а значит всё равно туда соваться - заодно можно и вручную выключить.
- - - Добавлено - - -
Перевыложил первую Кастельванию с "новым" звучанием (надеюсь отличается от первой "пробной" версии). Исходники прилагаются. Послушать так же можно по ссылке. См. первый пост.
Какой толк отмерять таймером время, если он не сообщит прерыванием что что-то отсчиталось и наступило.
Таймер можно и опрашивать, так что толк все-таки есть. Например, на Векторе игра Exolon так делает. Таймер настроен синхронно с разверткой и по значению счетчика определяется текущий номер строки.
Таймер можно и опрашивать, так что толк все-таки есть. Например, на Векторе игра Exolon так делает. Таймер настроен синхронно с разверткой и по значению счетчика определяется текущий номер строки.
Я имел в виду рк-клоны, где на звук идёт один канал из трёх.
Shumadan
30.08.2018, 12:28
Здорово! Ничуть не уступает Ямахе
Переделал вторую Каслу и исправил Уток. Причины переделок/исправлений следующие.
Обе Каслвании были портированы из миди-файлов найденных на просторах интернета. К тому же они работали на ранней версии плеера, который поддерживал не более 64-х нот на канал. Плюс я не обрабатывал команды миди "Pb" (Pitch bend). Отсюда такое "странное" звучание. В новой версии плеера теперь до 256-и нот на канал и эффекты Pitch bend в этот раз отчётливо слышны. Сейчас для конверсии используются nsf-файлы.
Первая версия Уток уже работала на новом плеере, но в таблице нот содержалась ошибка и эффекты Pitch Bend звучали не на той частоте. Для сравнения я оставил пару старых mp3 с самыми узнаваемыми мелодиями (можно проверить на слух что изменилось).
Все rka-файлы, а так же исходники (старые и новые) можно скачать в первом сообщении.
Прослушать в mp3 мелодии из игр (звучит ВИ53 - записано с реального Апогея) (https://cloud.mail.ru/public/97Uz/hToiLra1q)
Музыка из игры Target Renegade (Tim Follin) на ВИ53 (Апогей-БК01) (https://cloud.mail.ru/public/Hsbx/gni2Bwh7T)
Файл rka и исходники в первом сообщении.
Добавил управление громкостью для каждого канала ВИ53 в Апогее. Первый и второй по восемь уровней, третий - четыре.
Ниже по ссылки тесты в mp3, где звучат каналы по отдельности и вместе, в обычном варианте и с режимом управления громкостью. Надеюсь что кто-нибудь сможет различить на слух = ))
Если данное "улучшение" заинтересует кого-либо, набросаю схему (пока всё в голове и на макете) и могу выложить здесь или создать отдельную тему.
тесты мелодий с режимом управления громкостью и без (https://cloud.mail.ru/public/3e1q/fXMxtQrBV)
SegaBoy, прикольно! Конечно интересно посмотреть как это было сделано. Выходы ВИ53 через мультиплексоры подключаются на разные точки сумматора, или как?
SegaBoy, вдруг эта доработка станет в некотором роде "стандартом продвинутых ВИ53", не хотелось бы сразу закладки такого перекоса по числу уровней. Пожелание сделать хотя бы по 16 для каждого канала.
SegaBoy, прикольно! Конечно интересно посмотреть как это было сделано. Выходы ВИ53 через мультиплексоры подключаются на разные точки сумматора, или как?
Пока не добрался до нормального редактора, покажу рисунки типа "от руки".
На Апогее изначально три выхода ВИ53 соединяются вместе через три резистора по 91К:
66144
Основная идея такая. Ставим регистр (74хх174). Старшие три бита - громкость первого канала, средние три - второго, младшие два - третьего. Выходы регистра через элементы ИЛИ и резисторы подмешиваем к общей точке, где соединяются все каналы. Вот картинка для одного канала:
66145
Если в регистре нули, то амплитуда канала максимальная. Увеличивая значение (0-7) мы уменьшаем громкость на 1/8. На самом деле получается даже 9 уровней громкости, так как выключение канала получает уровень "ниже самого тихого".
На плате ничего перерезать (а так же выпаивать или выкусывать не надо). Обязательно покажу полную схему как нарисую в чём-нибудь нормальном (к вечеру скорее всего).
Надеюсь идея хоть немного понятна - не меняя изначальную схему компьютера, добавив дополнительные элементы (навесным монтажом), через резисторы соединяем в одну точку n-ное количество выходов и тем самым "мешаем" каналам проседать до нуля, обеспечивая тем самым "эффект понижения громкости" (от изначально максимальной).
- - - Добавлено - - -
SegaBoy, вдруг эта доработка станет в некотором роде "стандартом продвинутых ВИ53", не хотелось бы сразу закладки такого перекоса по числу уровней. Пожелание сделать хотя бы по 16 для каждого канала.
Само-собой. Этот "перекос" был выбран только из-за возможности решения "по-быстрому" с помощью только одного регистра. Нужно было собрать решение в макете и начать тестировать. Это предварительная "тестовая" версия. Добавив второй регистр, можно на каждый канал дать по 16(+1) уровней, а ещё четыре бита оставить зарезервированными.
Добавив второй регистр, можно на каждый канал дать по 16(+1) уровень, а ещё четыре бита оставить зарезервированными.
Тогда из 4 бит есть смысл собрать лесенку R2R. Причем я практически уверен, что если собрать логарифмическую лесенку, пользы будет сильно больше, чем от линейной. Линейные 4 бита это вообще ни о чем.
Тогда из 4 бит есть смысл собрать лесенку R2R. Причем я практически уверен, что если собрать логарифмическую лесенку, пользы будет сильно больше, чем от линейной. Линейные 4 бита это вообще ни о чем.
Вот тут я ничего не понял, про лесенку = )) Можно по подробней?
Если делать нелинейную регулировку громкости, то предлагаю выбрать ступени как у AY8910. Можно взять значения уровней например отсюда (https://github.com/mamedev/mame/blob/master/src/devices/sound/ay8910.cpp) (там несколько вариантов).
- - - Добавлено - - -
Может лучше было бы взять из даташита (http://f.rdw.se/AY-3-8910-datasheet.pdf) (Fig.9), но у меня есть подозрение, что на картинке есть пара ошибок и в любом случае надо досчитывать, т.к. там не все 16 значений.
SegaBoy, то, что ты делаешь, это фактически перемножающий ЦАП. На регистр подается громкость - это один аргумент, а выход ВИ53 - второй. На ЦАП-е, то есть на регистре, задается амплитуда, а ВИ53 нарезает из нее меандр. А если ВИ53 будет выдавать перманентную 1, то выводя в регистр разные значения, можно на выходе получать произвольную волновую форму.
Если есть хотя бы 8-бит, то это получается "Ковокс", то есть 8-битный линейный ЦАП. Один из способов построения ЦАП: R-2R резисторная матрица (https://en.wikipedia.org/wiki/Resistor_ladder). Но ухо воспринимает громкость нелинейно, поэтому от 4 линейных бит толку будет мало (будет как регулятор громкости в некоторых программах - ничего ничего ничего.... ГРОМКО ГРОМКО ГРОМКО). Надо рассчитать резисторную матрицу так, чтобы 16 выходных уровней в зависимости от входного значения распределялись не линейно, а как у "обратно логарифмического" потенциометра в регуляторе громкости (график B, ссылка на источник по клику):
https://i.imgur.com/tU8ysVq.gif (http://go-radio.ru/parametri-peremennix-rezistorov.html)
Вот как именно ее рассчитать я не подскажу, надо подумать, или поискать литературу.
А если ВИ53 будет выдавать перманентную 1, то выводя в регистр разные значения, можно на выходе получать произвольную волновую форму.
Если ВИ53 будет постоянно выдавать 1, то зачем она тогда нужна?
- - - Добавлено - - -
Если есть хотя бы 8-бит, то это получается "Ковокс", то есть 8-битный линейный ЦАП..
Тоже самое с Ковоксом. Просто добавляем один регистр и его выходы, например этой самой лесенкой, соединяем с общим выходом звука. ВИ53 отдельно (хоть с громкостью, хоть без), а Ковокс отдельно - хотят вместе поют, не хотят - по-одиночке.
Если ВИ53 будет постоянно выдавать 1, то зачем она тогда нужна?
Это я просто издалека начал. Случай умножения на 1. Но это же вполне себе фича.
Как я понимаю, мы хотим сэкономить биты. 16 уровней громкости, -- это очень неплохо для огибающей. Но упаковка всего динамического диапазона в 16 возможных значений требует нелинейности, иначе слишком много из этих значений будут звучать практически идентично. То есть получится, что 4 бита, а толку как от двух.
Нарисовал по-быстрому. Вроде ничего не забыл.
Если что непонятно - спрашивайте.
Искал как это называется, похоже это "ЦАП со взвешенными резисторами".
Kakos_nonos
06.09.2018, 21:08
Очень круто!
SegaBoy крутяк!
Немного изменил схему. Теперь на первый и второй канал по 16 уровней громкости, в третьем канале громкость не изменяется.
Jeroen Tel - Robocop 3 (https://cloud.mail.ru/public/NDbD/qNWu48qcA)
Круто, но мне кажется, что стало как-то шумновато что ли? Не понимаю. А можно просто сделать одну медленно затухающую нотку, чтобы услышать 16 громкостей?
А можно просто сделать одну медленно затухающую нотку, чтобы услышать 16 громкостей?
Сделал
Здесь (https://cloud.mail.ru/public/ALRE/3aQvbm4eS)
- - - Добавлено - - -
Круто, но мне кажется, что стало как-то шумновато что ли? Не понимаю.
Возможно шум связан с тем, что я хотел выделить третий канал, где самые низкие частоты и в качестве эксперимента понизил в этом канале номинал сопротивления. А возможно и нет = ))
По ссылке Jeroen Tel - Robocop 3 (https://cloud.mail.ru/public/NDbD/qNWu48qcA) я выложил все результаты тестов с робокопом. Там даже есть запись с отключенным управлением громкостью. Можно услышать моменты где оно явно работало в плюс.
- - - Добавлено - - -
Так же думал как сделать не линейную, а логарифмическую лесенку, но с ходу пока не получается. Похоже это потребует дополнительных элементов. В любом случае поделюсь результатами, как только они будут.
Добавил в схему Ковокс, для наглядности.
схема (https://cloud.mail.ru/public/J3fo/VetgQ5iif)
DMA в схеме это приговор для лишенцев , специалистов и прочих орионов
DMA в схеме это приговор для лишенцев , специалистов и прочих орионов
Это не совсем так.
В работе данной схемы контроллер ПДП не выполняет вообще никаких функций. Можно заменить обозначение в схеме с DMA/CS на ROM2/CS, если есть вероятность кого-то отпугнуть = ))
Контроллер ПДП выполняет тут некую "троянскую" миссию. Так как в Апогее нет незанятых портов/окон в памяти, то чтобы вкорячить дополнительное устройство пришлось бы что-то перерезать, ставить дешифратор, ну или делать что-либо подобное. А тут как раз у нас есть контроллер ПДП и мы знаем что он использует пространство адресов A3..A0 для обращения к своим внутренним регистрам. Но адресов задействовано 16, а портов внутри контроллера ПДП всего 9. Вот один (два, три и тд) из "неиспользуемых" портов эта схема и использует. То есть мы пишем якобы в контроллер ПДП, но не по адресу его регистров и попадаем в наше устройство ;)
Так что в другом компьютере просто "выбираем" любой доступный/свободный адрес/порт и вешаем на него регистр управления громкостью (если кто-то захочет это сделать).
нуу без регистра управления громкости был шанс переносимости, такой призрачный, но был-)
SegaBoy, спасибо! Вот интересно про второй файл, там громкость не затухает до нуля в паузах. Может быть из-за этого немного похоже на игру с постоянно нажатой правой педалью?
С увеличением резистора уменьшается эффект перегруза, звук становится попружинистей и в общем отчетливей и веселей.
Ухо быстро замыливается. Я по паре раз послушал первые 1:40 ото всех, но надо будет потом еще повторить.
Вот интересно про второй файл, там громкость не затухает до нуля в паузах. Может быть из-за этого немного похоже на игру с постоянно нажатой правой педалью?
Первый тест - начинает с максимальной громкости, включает ноту, ждёт 1 сек, уменьшает громкость на единицу, ждёт 1 сек и так далее пока не дойдёт до конца. В конце выключается сам канал - это та самая 16+1 громкость.
Второй тест - начинает с максимальной громкости, включает ноту, ждёт 0,8 сек, уменьшает громкость до нуля, ждёт 0,2 сек, уменьшает громкость от предыдущей (той что была до нуля) на единицу и так далее. Получаются такие паузы между нотами, где уровень громкости в регистре нулевой, но сама громкость равна единице. Если в эти паузы выключать канал, то будет "полноценная" тишина.
Таким образом градаций громкости всего 17 - доступных значений в регистре 16 + "выключено".
Ага. Это экономно и практично. А плеер, когда снижает громкость до нуля, он хочет, чтобы это был эквивалент NoteOff, или он имеет ввиду тихий остаточный сустейн?
Ага. Это экономно и практично. А плеер, когда снижает громкость до нуля, он хочет, чтобы это был эквивалент NoteOff, или он имеет ввиду тихий остаточный сустейн?
NoteOff только если поступила команда "выключить канал". А без этого будет не нулевой уровень громкости.
Вот может быть тут есть разночтение между тем, как был сделан трек и как он исполняется. Или это при конвертации учитывается?
Конечно разночтения могут быть, так как пришлось самому "догадываться" как надо = ))
Вот пример из миди-файла:
1972 On ch=1 n=63 v=127
1972 Pb ch=1 v=8192
1972 Par ch=1 c=11 v=92
1973 Par ch=1 c=11 v=86
1974 Off ch=1 n=63 v=0
1974 On ch=1 n=63 v=127
1974 Pb ch=1 v=8192
1974 Par ch=1 c=11 v=86
1975 Off ch=1 n=63 v=0
Команду Off здесь я трактую как "выключить канал" - то есть в этот момент наступает тишина, независимо от того какой выставлен уровень громкости.
Я намекаю на то, что хорошо было бы послушать и сравнить вариант, когда громкость == 0 соответствует NoteOff. Когда будет время, конечно.
Так и я о том же = )) Просто Винда тормозит несусветно, Опера жрёт память тоннами, и Калк перестал открываться - не дают мне нормально ответить - сговорились = ))
В предыдущем примере команда Off однозначно трактуется как "выключить канал", но новое событие (включение) наступает сразу же за этим. Поэтому получается такой "бульк" между двумя нотами. Если не выключать канал, то две ноты сольются в одну.
В следующем примере есть отдельно команда "выключение" и команда "выставить громкость на 0".
83 On ch=1 n=69 v=127
83 Pb ch=1 v=8099
83 Par ch=1 c=11 v=65
84 Par ch=1 c=11 v=56
85 Par ch=1 c=11 v=46
86 Par ch=1 c=11 v=32
87 Par ch=1 c=11 v=0
97 Off ch=1 n=69 v=0
Тут я выключаю канал по по команде Par, иначе 10 кадров нота ещё звучала бы (особенно в версии плеера, который не умел в громкость - это слышно было на ранних кастельваниях). Вот это уже спорный момент. Стоит так делать сейчас или нет, пока не придумал.
Обновил Каслванию по "последнему слову". Звучать стало намного лучше и интереснее.
Музыка из игры Castlevania (https://cloud.mail.ru/public/EiFC/SjVkJJcm1)
- - - Добавлено - - -
Обновил и вторую Каслванию. Ей тоже пошло на пользу.
Музыка из игры Castlevania 2 (https://cloud.mail.ru/public/Fwi2/NRkegRq6T)
- - - Добавлено - - -
Обновил Утиные Истории.
Музыка из игры Duck Tales (https://cloud.mail.ru/public/3CXb/YN5gVof58)
Вот тут каденция в 0:33, отчетливо ноты заглушаются тада-та-там! (пш пш тстстстс) тада-та-там!:
https://youtu.be/eFWEwHmJkvw
В версии ви53+громкость там продолжает зудеть. По-моему не должно зудеть. Причем в версии (old) там ноты глушатся.
svofski, Сенкью! Действительно это бага. Сейчас будем исправлять.
Это как раз тот самый момент из последнего примера:
83 On ch=1 n=69 v=127
83 Pb ch=1 v=8099
83 Par ch=1 c=11 v=65
84 Par ch=1 c=11 v=56
85 Par ch=1 c=11 v=46
86 Par ch=1 c=11 v=32
87 Par ch=1 c=11 v=0
97 Off ch=1 n=69 v=0
Когда событие 87 опустило громкость до нуля, а канал выключился только через 10 кадров. Вот это и было слышно как гул.
Исправлено - castlevania (https://cloud.mail.ru/public/EiFC/SjVkJJcm1), castlevania 2 (https://cloud.mail.ru/public/Fwi2/NRkegRq6T) и duck tales (https://cloud.mail.ru/public/3CXb/YN5gVof58) перезалиты, уже без бага.
Во! Вот теперь зазвучало бодро и позитивно.
Моя очередь привередничать. Послушал один трек (vampire killer) и заметил в паре мест (0:39-0:40 и 1:09-1:10) некие глитчи. В версии без регулировки громкости таких "рывков" нет.
В Wicked Child где-то между 1:10 и 1:13 тоже. Вообще похоже на выпадение буфера, может
дефект записи?
Это случайно не места склейки, где фрагменты зацикливаются?
По моему нет. И явно встречаются повторяющиеся фрагменты в остальном идентичные, где глич только один раз, остальные ок.
- - - Добавлено - - -
P.S. не поленился завести громко на больших колонках. Балдежно звучит.
Следующий шаг это банк переключаемых фильтров :D
ivagor, Да, это оказался баг. Он сожрал последнюю команду, поэтому переход к точке повтора происходил на 9 кадров (150 мсек) раньше чем нужно.
Пофикшено - перезалил Vampire Killer.
- - - Добавлено - - -
svofski, сейчас в Wicked Child посмотрю этот же момент.
- - - Добавлено - - -
Вообще похоже на выпадение буфера, может
дефект записи?
Действительно, этот момент тоже имеет место. Пришлось повторно перезаписать исправленный Vimpire Killer. Баг я устранил и в этом месте уже не было слышно глитча, но обнаружился другой незадолго перед этим. И ничем другим, кроме как проблемами у диктофона при записи я это объяснить не могу. Тяжело ему наверное на лету в мп3 писать. Перезаписал ещё раз - больше никаких аномалий не слышно.
обнаружился другой незадолго перед этим
В районе 0:30? В (new) на этом месте уже нормально, что радует.
Теперь про wicked child. В новых версиях с регулировкой громкости и без регулировки громкости кое где пропали ноты (сравниваю со "старой" версией, проигрываемой в эмуляторе). Например в районе 0:52-0:54 (высокий голос играет что-то вроде C# - D - E). В "старой" версии здесь слышны два голоса для всех трех нот, а в новых - первые 2 ноты - 2 голоса, третья - один голос. Такой фрагмент встречается несколько раз и везде так.
(сравниваю со "старой" версией, проигрываемой в эмуляторе)
Если это которая на Вектор портирована, то с тех пор произошли кое-какие изменения.
Вот этот фрагмент (https://youtu.be/E7PFm7mrdVY?t=52), слышу два голоса для всех трех нот.
Выложил подправленный Wicked Child.
По поводу двух/трёх нот я честно говоря не очень понял. Мне трудно на слух понять что искать в файле с данными ((
- - - Добавлено - - -
ivagor, если я дам миди-редактор и файл, сможете ткнуть пальцем в это место?
Пусть меня поправят музыканты или просто люди с хорошим слухом, но вроде в этом фрагменте высокий голос играет до# - ре - ми, низкий ля - си - до#.
- - - Добавлено - - -
ivagor, если я дам миди-редактор и файл, сможете ткнуть пальцем в это место?
попробую
попробую
Ок. Кинул туда же миди-файл из которого я делаю конвертацию. Можно его послушать и сказать - там как надо звучит или уже нет? Редактор кинул туда же - в нём можно визуально увидеть это место (и ткнуть меня туда носом).
Заранее спасибо!
- - - Добавлено - - -
Я так понимаю речь идёт приблизительно об этом фрагменте (52-54) на скриншоте
- - - Добавлено - - -
Скриншот в нормальном качестве кинул туда же
- - - Добавлено - - -
В Wicked Child где-то между 1:10 и 1:13 тоже.
В новом варианте эта проблема осталась?
В midi две длинные ноты (с 54.25) слышны, в mp3 с ВИ53 нижнюю ноту не слышу (я не про бас, а про два солирующих голоса).
- - - Добавлено - - -
Смотрю на этот midi-файл и закрадывается подозрение, что он был получен каким-то автоматическим (или полуавтоматическим) конвертером из wavа.
54,25с =54*60+15 = 3255 время события
Вот его миди-описание:
3226 Off ch=1 n=57 v=0
3226 On ch=1 n=59 v=127
3226 Pb ch=1 v=8113
3226 Par ch=1 c=11 v=65
3226 Off ch=2 n=77 v=0
3226 On ch=2 n=74 v=127
3226 Pb ch=2 v=8129
3226 Par ch=2 c=11 v=73
3227 Par ch=1 c=11 v=56
3227 Par ch=2 c=11 v=65
3228 Par ch=1 c=11 v=46
3228 Par ch=2 c=11 v=56
3252 Par ch=1 c=11 v=32
3252 Par ch=2 c=11 v=46
3253 Par ch=1 c=11 v=0
3253 Par ch=2 c=11 v=32
3254 Par ch=2 c=11 v=0
3256 Pb ch=1 v=9489
3256 Par ch=1 c=11 v=46
3256 Off ch=2 n=74 v=0
3256 On ch=2 n=76 v=127
3256 Pb ch=2 v=8122
3256 Par ch=2 c=11 v=56
3276 Par ch=1 c=11 v=56
3276 Par ch=2 c=11 v=65
В 3226 включаются нота 59(8113) в первом канале и нота 74(8129) во втором. Далее идут манипуляции с громкостью и в 3253 она выключается для первого канала и в 3254 для второго. В 3256 просыпается первый канал с той же нотой, но со смещением 9489 (это примерно соответствует ноте 61), а во втором включается нота 76(8122). Нота во втором канале звучит ещё 100 кадров до 3356, а в первом она в это же время меняет тональность на 10149 (примерно нота 62). Всё это время (100 кадров) в этих каналах меняется громкость туда-сюда, но незначительно.
Это пока то что я увидел в миди. Сейчас посмотрю свой сгенерированный файл, что там происходит.
- - - Добавлено - - -
Смотрю на этот midi-файл и закрадывается подозрение, что он был получен каким-то автоматическим (или полуавтоматическим) конвертером из wavа.
Так тут секрета никакого нет - я же портирую музыку из nsf-файлов с помощью nsf2midi. Что он насоздавал, то я и играю = ))
Первую версию я делал из найденых на просторах интернета миди-файлов. Но там было более десятка голосов и приходилось ломать голову какие убирать. Из некоторых приходилось складывать два голоса в один. И вообще там была отсебятина какого-то пианиста-энтузиаста - наигранные им на синтезаторе композиции. В итоге я решил работать с nsf.
Только собирался написать, что увидел в файле nsf2midi, но не успел.
Оффтоплю:
Накопал простенький VCF:
http://electro-music.com/forum/topic-45231.html
Смоделировал в Фальстаде, немного поменял то да сё:
http://tinyurl.com/y9ks578u
Чтобы послушать как звучит, надо подождать пока не накопится аудиобуфер (довольно медленно он копится), потом нажать Play. Я для оценки сначала делаю Voltage на максимум (это получается самое открытое положение), коплю до конца свипа, потом нажимаю стоп, меняю Voltage до нуля, запускаю дальше. В буфере оседает два свипа -- полностью открытый фильтр и полностью закрытый.
Я без особых надежд услышать, но вдруг зацепит идея ;)
- - - Добавлено - - -
В новом варианте эта проблема осталась?
Специально проблему не искал, просто послушал версию (fix) и ничего плохого не заметил.
ivagor, подтверждаю - баг есть. С 3253 по 3356 первый канал не звучит. В 3256 он по какой-то причине не "просыпается". Будем дальше исправлять.
Переписал код. Теперь в этом месте первый канал включается, как и должно быть. Но на слух я сам не могу понять.
ivagor, сможете посмотреть/послушать? Добавил два файла с громкостью и без - в обоих вариантах теперь как надо?
- - - Добавлено - - -
В принципе, все глюки сводятся к человеческому фактору - ошибки в портировании, ошибки в программе/плеере и тд, не те исходные файлы или ещё что. Кроме тех, где диктофон вносил свои какие-то дополнительные искажения. Сама идея - играть на ВИ53 музыку, чуток "помогая" каналам убавить амплитуду - тут не при чём. При желании можно применить подобное и на Векторе.
На Векторе второй и третий каналы таймера не смотрят наружу по отдельности. Чтобы повторить такую схему, надо подпаяться перед резисторами R55, R56, R58 (и даже можно R57, то есть PC0, пищалка). Только не забыть вставить буферные усилители, какие-нибудь 2ИЛИ, а то сумматор замесит себя в ЦАП-ы регуляторов громкости. В качестве же регистра громкости можно взять порт ПУ (хоть все три восьмибитных).
На Векторе второй и третий каналы таймера не смотрят наружу по отдельности.
В смысле? Так и на Апогее тоже ведь не смотрят. Или мы о разном?!..
- - - Добавлено - - -
Может ткнёте носом в схему, а то "поиск в интернете" выдаёт всё что угодно )))
- - - Добавлено - - -
Ага, нашёл в картотеке. Три канала таймера сводятся в одну точку через резисторы по 3,3к. На Апогее тоже самое, только номинал 91к.
Послушал test_fix_new и test_fix_old - все ноты вернулись, ура!
Версии с регулировкой громкости звучат несколько интереснее, но и версии без регулировки звучат здорово. Примеров качественной музыки для ВИ53 очень мало и выложенные варианты на уровне лучших образцов.
На вектор вариант с регулировкой громкости можно портировать на AY.
Послушал test_fix_new и test_fix_old - все ноты вернулись, ура!
Раз такое дело, то пожалуй перенесу схему с макета на плату. Если потом придумаю как сделать логарифмическую лесенку или ещё какие хотелки, то просто добавлю их к существующей схеме.
SegaBoy, конечно мы об одном и том же. Просто со схемой Апогея я взаимно незнаком =)
Вот релевантный фрагмент из схемы Вектора. Вряд ли здесь можно увидеть что-то неожиданное.
https://i.imgur.com/t9J5Fkj.png
Ну тогда в этом плане они с Апогеем совершенно одинаковы и отличаются только номиналами сопротивлений.
- - - Добавлено - - -
svofski, построил в симуляторе логарифмическую лесенку. Простого (и элегантного) способа не нашёл. На один канал нужно два декодера 74хх138, 16 диодов и столько же резисторов.
Попробую собрать на макете и протестировать. Как будут результаты, сообщу.
SegaBoy, интересно будет посмотреть. Я бегло поискал в интернетах, но ничего такого, от чего зажглась бы лампочка над черепом, не нашел. Нашел вот этот калькулятор:
http://www.vaneijndhoven.net/jos/attenuator-calculator/index.html
Но чего-то не могу понять, то это, или не то.
Вот я тоже на это смотрел и ничего не понял - сделал в лоб.
Когда на выходе ви53 единица - декодер отключен и на его выходах тоже все единицы. Когда на выходе ви53 ноль, декодер включается, смотрит что у нас в регистре громкости и сбрасывает один из выходов в ноль. На все выходы я поставил по диоду (так как не нашёл другой более простой способ) и по резистору. Все резисторы разных номиналов. Вот их номиналы я и подбирал, чтобы результирующее напряжение соответствовало не линейному, а логарифмическому, чему там, падению ))
Приблизительно вот так:
Решил посимулировать:
http://sensi.org/~svo/sounds/decay/
Клавиши на клавиатуре играют ноты. Батоны переключают затухание: линейное и exp(-x/5). Громкость квантуется на 16 линейных значений 0..15.
На мой личный вкус затухание по экспоненте звучит более осмысленно, при этом 4-битного линейного ЦАП-а вполне хватает для терпимого звучания.
Вывод: наверное не стоит мудрить с непонятным логарифмическим ЦАП-ом, вместо этого есть смысл помудрить с конвертером. Например, добавить таблицу для перекодирования уровней громкости. В этой демке таблица такая:
15 15
14 12
13 10
12 8
11 6
10 5
9 4
8 3
7 3
6 2
5 2
4 1
3 1
2 1
1 0
0 0
svofski, попробовал так сделать. Не могу только понять лучше стало или нет.
ссылка (https://cloud.mail.ru/public/EiFC/SjVkJJcm1)
Плюс:
- появилась более выраженная динамика, но это не везде хорошо заметно:
- стаккато в Vampire Killer стало прям звенеть, по хорошему
- около 1:30 в Heart of Fire, там же в районе 2:10 (где перекликаются голоса высокий и низкий)
- начало Out of Time, там же мелодия около 0:25
Минус:
- нерегулируемый канал стал долбить жестче относительно двух других
По-моему изменение в целом положительное. Может быть сделать нерегулируемый канал потише, чтобы он в среднем не слишком выделялся? Круче всего, конечно, было бы сделать его тоже регулируемым.
Может быть сделать нерегулируемый канал потише, чтобы он в среднем не слишком выделялся? Круче всего, конечно, было бы сделать его тоже регулируемым.
Исправил громкость третьего канала.
Во всех мелодиях она одинаковая, на уровне 90 (из диапазона 127 макс - 0 мин), что в 4-х битах получается 90/8 = 11. После конвертации по таблице получается 6.
Одинаковая она не потому что я её не меняю - так изначально в миди-файлах прописано. Это последствия "треугольного" канала в Famicom/NES, в котором громкость нельзя изменять.
В дальнейшем я тоже добавлю этому каналу изменение громкости, но в данный момент это не нужно - я просто выставил её эквивалент.
А я добавил в симуляцию квантование для 2,3,4 и 8-битных ЦАП-ов. Наверное в некоторых случаях имел бы смысл компромисс типа 3-3-2, но вообще меньше 4 бит звучит не фонтан.
Послушал (exp_fix). Хорошо, но правда ли лучше, чем просто (exp) -- мое ухо уже замылено совсем.
Послушал (exp_fix). Хорошо, но правда ли лучше, чем просто (exp) -- мое ухо уже замылено совсем.
Когда добавлю регулятор на третий канал он и будет звучать как раз как (exp_fix) версия, так как программа сама выставит значение громкости. Иначе надо править уже в самой программе, что мол для каналов 1 и 2 одни значения, а для 3 другие.
Грубо говоря версия (exp) изначально была с ошибкой, так как я неверно рассчитал значение громкости для третьего канала. Теперь всё приведено в норму.
В очередной раз перезалиты для прослушивания castlevania (https://cloud.mail.ru/public/EiFC/SjVkJJcm1), castlevania 2 (https://cloud.mail.ru/public/Fwi2/NRkegRq6T) и duck tales (https://cloud.mail.ru/public/3CXb/YN5gVof58).
Доступны по три версии - без изменения громкости, с линейным изменением и с изменением по экспоненте, предложенное svofski. Во всех трёх версиях исправлена ошибка воспроизведения, которую обнаружил ivagor. В версиях с изменением громкости исправлен уровень третьего канала.
Версии (lin) звучат, как хмм, ви53 так может? Версии (exp) звучат как омфг что это за звуковуха?
Придумал как сделать треугольный сигнал. Пока поставлю его на третий канал, всё равно тот не управляется - будет такой же как на Денди.
- - - Добавлено - - -
Версии (lin) звучат, как хмм, ви53 так может? Версии (exp) звучат как омфг что это за звуковуха?
Ага, ВИ-бластер = ))
народ а схема из ПК8002 лучше или хуже той что в этой ветке обкатывается?
Они разные. В ПК8002 есть генератор шума. А громкость регулируется для всех каналов сразу, по отдельности нет.
Я не очень понимаю третий канал. Если на U32.15 "1", U30.2 не пропускает сигнал OUT2 таймера к U30.3. Получаем чистый шум с генератора на LFSR. Это хорошо. А если на U32.15 "0", U30.2 уже пропускает таймер напрямую, но шум никто не отключает. И получается в итоге шум, умноженный на клок, которым тактируется тот же самый шум. Как-то бестолково, нет?
народ а схема из ПК8002 лучше или хуже той что в этой ветке обкатывается?
Не могу сказать лучше или хуже - не совсем разобрался как она работает. Не увидел в этой схеме раздельной регулировки громкости каждого канала. В моей реализации это возможно (но пока используется только для двух).
А если на U32.15 "0", U30.2 уже пропускает таймер напрямую, но шум никто не отключает. И получается в итоге шум, умноженный на клок, которым тактируется тот же самый шум. Как-то бестолково, нет?
Так ИР8 же при U32.15="0" обнуляются, и оттуда должна идти константа вместо шума, разве нет?
Так ИР8 же при U32.15="0" обнуляются, и оттуда должна идти константа вместо шума, разве нет?
Точно, тогда все ок.
svofski, вот что подумал - по этой табличке у нас никогда не будет звучать громкость 14, 13, 11, 9 и 7.
15 15
14 12
13 10
12 8
11 6
10 5
9 4
8 3
7 3
6 2
5 2
4 1
3 1
2 1
1 0
0 0
В итоге сделал в программе пересчёт по такой формуле:
new_volume = round ( exp ( volume / 45.4 ) - 1 )
Получаются следующие значения:
127 15
126 15
125 15
124 14
123 14
122 14
121 13
120 13
119 13
118 12
117 12
116 12
115 12
114 11
113 11
112 11
111 11
110 10
109 10
108 10
107 10
106 9
105 9
104 9
103 9
102 8
101 8
100 8
99 8
98 8
97 7
96 7
95 7
94 7
93 7
92 7
91 6
90 6
89 6
88 6
87 6
86 6
85 6
84 5
83 5
82 5
81 5
80 5
79 5
78 5
77 4
76 4
75 4
74 4
73 4
72 4
71 4
70 4
69 4
68 3
67 3
66 3
65 3
64 3
63 3
62 3
61 3
60 3
59 3
58 3
57 3
56 2
55 2
54 2
53 2
52 2
51 2
50 2
49 2
48 2
47 2
46 2
45 2
44 2
43 2
42 2
41 1
40 1
39 1
38 1
37 1
36 1
35 1
34 1
33 1
32 1
31 1
30 1
29 1
28 1
27 1
26 1
25 1
24 1
23 1
22 1
21 1
20 1
19 1
18 0
17 0
16 0
15 0
14 0
13 0
12 0
11 0
10 0
9 0
8 0
7 0
6 0
5 0
4 0
3 0
2 0
1 0
0 0
Они соответствуют значениям из предыдущей таблицы, но только теперь нет "выпадений" на всём диапазоне от 0 до 127.
Выложил записи с "новым" звучанием.
ссылка (https://cloud.mail.ru/public/EiFC/SjVkJJcm1)
SegaBoy, действительно. Я исходил из того, что уровней изначально 16, а их же и правда 128. В Wicked Child стало хорошо в местах, где начинают рвать баян.
svofski, значит на том и порешим? Аппаратная громкость линейная, а программная - по экспоненте. Оставляем простое схемное решение?
SegaBoy, на мой вкус в ретро-панке чем проще схема, тем лучше.
Вот генератор шума в ПК8002 меня впечатлил.
Вот генератор шума в ПК8002 меня впечатлил.
Можно по-подробней рассказать как он работает? А то я из схемы не совсем понял что там да как.
SegaBoy, основные идеи описаны здесь [занудная статья на википедии (https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80_%D1%81% D0%B4%D0%B2%D0%B8%D0%B3%D0%B0_%D1%81_%D0%BB%D0%B8% D0%BD%D0%B5%D0%B9%D0%BD%D0%BE%D0%B9_%D0%BE%D0%B1%D 1%80%D0%B0%D1%82%D0%BD%D0%BE%D0%B9_%D1%81%D0%B2%D1 %8F%D0%B7%D1%8C%D1%8E)]
tl;dr это способ получить псевдослучайную последовательность из сдвигового регистра и нескольких неполных сумматоров (исключающих или). В лучшем случае последовательность повторяется с периодом 2^n-1, то есть например для 16-битного регистра это 65535. В случае этой конкретной схемы я не уверен, что это так.
svofski, вроде всё понятно - щас сделаем = ))
У меня получился период 32766, что объяснимо, старший бит вообще не задействован. Первые 2048 значений разбрасываются так:
https://i.imgur.com/AP9jlX8.png
- - - Добавлено - - -
Звучит у меня так:
https://instaud.io/2Gbp
Терпеть можно, но слышно какие-то ворчливые нотки. Не знаю, как звучат более правильные полиномы.
слышно какие-то ворчливые нотки
Наверно ты про (сравнительно) длинные последовательности нулей, которые звучат как клики. Это не очень здорово. Но не знаю, какую частоту тактирования ты моделировал, возможно при более высокой тактовой "клики" не будут различимы. Хотя в идеале (при хорошем полиноме) и при низкой тактовой все должно быть гладко.
Наверно ты про (сравнительно) длинные последовательности нулей, которые звучат как клики. Это не очень здорово. Но не знаю, какую частоту тактирования ты моделировал, возможно при более высокой тактовой "клики" не будут различимы. Хотя в идеале (при хорошем полиноме) и при низкой тактовой все должно быть гладко.
Я пожалуй неправильно записываю данные. Там же каждый бит идет, а я беру только один бит из байта. Сейчас переделаю...
Записал по 15 бит и ускорил "на 400%" в Аудасити.
https://instaud.io/2GbL
Этот мне еще меньше нравится. Я думаю SegaBoy быстрее сделает уже и запишет, как это звучит.
Прежде чем паять лучше сначала прикинуть - что это даст. Генератор шума при соответствующей огибающей мог бы дать ударные, но дискретность изменения громкости в 20 мс грубовата для имитации огибающей ударных.
Смотря каких. Пш-пш и тс тс тс тс вполне будут терпимы, по-моему.
- - - Добавлено - - -
Очередной вариант симуляции: https://instaud.io/2GcK
В этот раз похоже на то, как сделано в эмуляторе vector06js: фактически преобразование PDM в PCM. Считаю количество единиц за 8 отсчетов, записываю это число как значение семпла.
svofski, похоже что я поторопился и зашёл в тупик. С какой частотой надо выдвигать биты? Нужна именно 15 бит последовательность, то есть одним 8-битным сдвиговым регистром не обойтись?
- - - Добавлено - - -
Пока у меня вместо шума получаются эффекты похожие на выстрелы\взрывы и тд с восьмибитных Атари =))
Тоже своего рода "шум", но для музыки совсем не подходящий.
- - - Добавлено - - -
Ха, получилось. Послушать можно здесь (https://cloud.mail.ru/public/582t/wE6h3DCwx)
8 бит очень маленький период повторения, будет именно что тарахтеть. Схема как в пк8002 это разумный минимум. Частота таймера должна быть высокой, десятки килогерц.
Схема как в пк8002 это разумный минимум. Частота таймера должна быть высокой, десятки килогерц.
Так я же говорю - не понял что там в этой схеме отвечает за шум. Какие элементы надо перенести в свою схему и тд ((
Это, то что получилось, это сколько бит?
А то что у меня получилось, не тот шум что надо??
- - - Добавлено - - -
Это, то что получилось, это сколько бит?
Это один регистр 74хх595 и один набор ксорок 74хх86. Ксорю биты 3, 4, 5 и 7 с ногой процессора А8 и заталкиваю в регистр. В качестве клока LC0 от ВГ75.
Схема, которая генерит шум, это два сдвиговых регистра, у которых в обратной связи исключающее или + инвертер.
- - - Добавлено - - -
Креативно. Шумит шумно. Но не понятно, как менять характеристику шума, что для музыки было бы полезно. В схеме как в пк8002, меняя частоту таймера можно менять шипучесть. По-моему в AY тоже есть что-то подобное.
На LC0 частота половина от HSYNC, то есть в районе 7 с копейками КГц - с такой скоростью происходит заталкивание\выталкивание. Если брать в качестве "вспомогательного" бита не ноги процессора, то получаются как раз разные "атаривые" звуки.
Мысль SegaBoya пошла своим путем, а я хотел пару слов про LFSR ПК8002 написать - он "правильный", генерирует 32767 разных значений. Генератор шума в AY 17 битный, можно здесь (https://github.com/vgmrips/vgmplay/blob/master/VGMPlay/chips/ay8910.c) посмотреть.
Мысль SegaBoya пошла своим путем, а я хотел пару слов про LFSR ПК8002 написать - он "правильный", генерирует 32767 разных значений. Генератор шума в AY 17 битный, можно здесь (https://github.com/vgmrips/vgmplay/blob/master/VGMPlay/chips/ay8910.c) посмотреть.
Так я же просто экспериментирую - это же не окончательные варианты. Готов послушать про LFSR.
- - - Добавлено - - -
В схеме как в пк8002, меняя частоту таймера можно менять шипучесть. По-моему в AY тоже есть что-то подобное.
Если я правильно понимаю, в ПК8002 третий канал только шумит? Или он может и шуметь и музыку играть?
У меня все три канала играют музыку, я изначально хотел добавить четвёртый с шумом - как в Денди. Или что, можно сделать как в АУ, добавить шум в каждый музыкальный канал? Но на такое моего мозга не хватает ((
Про LFSR ссылку в вики svofski давал, могу обратить внимание на коллекцию примитивных полиномов (http://users.ece.cmu.edu/~koopman/lfsr/index.html). Для разумных длин LFSR там уже все посчитано, только надо обратить внимание, в какую сторону сдвигать и что при конфигурации Фибоначчи полиномы нужно развернуть (если сдвигать в ту же сторону). Про LFSR все известно, полиномы есть, можно промоделировать и получить повторяемые результаты.
Оригинальные разработки - это тоже хорошо в качестве творчества, но их характеристики и точность эмуляции под вопросом.
- - - Добавлено - - -
Третий канал в ПК8002 может и шуметь и музыку играть.
Третий канал в ПК8002 может и шуметь и музыку играть.
Его придётся "отрезать" от остальных, чтобы применить схему как в ПК8002?
В Апогее схема как в Векторе - три канала через три резистора. В ПК8002 два канала соединены через два резистора, третий уходит погулять и потом уже возвращается в общую точку.
Схемы ВИ53 в векторе, апогее и ПК8002 я видел, но по схемотехнике лучше помолчу, совсем не железячник.
Продолжаю пропагандировать идею, что в любом случае сначала лучше прикинуть, как будет использоваться внедряемая возможность, хотя бы умозрительно.
ivagor, а ты понял, какой из полиномов в пк8002?
какой из полиномов в пк8002?
6000h (здесь (http://users.ece.cmu.edu/~koopman/lfsr/15.dat.gz) он есть), только там еще инверсия после xor (чтобы тональный сигнал проходил при выбранном способе отключении шума, как я понимаю). Для разминки реализовал конфигурацию Галуа (без инверсии, просто 6000h). Для конфигурации Фибоначчи я его развернул и проверил оба варианта - с инверсией после xor и без. Везде получилось 32767 уникальных значений (+ нулевое). Всего этого можно было не делать, но я давно не трогал кодирование и получил немного funа.
ivagor, я тоже так делал. И тоже с полиномом 6000, просто по схеме. Но я его не нашел в других местах, поэтому удивлялся, как это так. Инверсия там предотвращает залипание нуля после сброса. Интуитивно понятно, но не знаю, какое у нее математическое основание.
- - - Добавлено - - -
SegaBoy, в ПК8002 третий канал переключается между шумовым и тональным режимами. Пару страниц назад, мы тут обсуждали это.
Без креатива конвертировать мелодии, где три мелодических канала + перкуссионный, не выйдет.
В AY похоже полином 12000h
Я заглянул в три сорца и везде разные, думаю наугад. Без микроскопа не узнаешь.
Извините за оффтоп по AY
Тоже посмотрел 3 исходника. В двух одинаковая конфигурация Фибоначчи реализована по разному. В третьем конфигурация Галуа с полиномом 10004 (а если развернуть Фибоначчи из первых двух, то у меня получается 12000).
Посмотрел 4й (твой vector06js). Там (если учесть деление на 2) тоже 12000.
Пока мне не даются "треугольный" и "шумовой" каналы, решил обновить забойные рокенрольные композиции Тима Фолина.
Target Renegade (https://cloud.mail.ru/public/Hsbx/gni2Bwh7T)
Кроме добавления громкости сделаны следующие изменения\нововведения - увеличено количество нот для каждой композиции (раньше было ограничение 256 нот всего).
было стало
01 244 317
02 251 284
03 248 440
04 233 519
05 242 429
06 245 394
07 163 285
Надеюсь, звучать стало лучше.
- - - Добавлено - - -
Йерун Тель - Robocop 3 - Title theme (https://cloud.mail.ru/public/AkG2/5PMtfnXSC)
Так же добавлена громкость и увеличено количество нот с 250 до 384.
А что значит увеличено количество нот?
В самой первой версии плеер умел только 64 ноты из миди-диапазона от 0 до 127. Этого поначалу было вполне достаточно - кастельвании использовали в среднем 35-40 нот.
Затем я освоил pitch_bend, который может быть от -8192 до +8191 к основной ноте. Это минус\плюс октава, то есть -12 от ноты если значение pitch_bend = 0 и +12 от ноты, если pitch_bend = 16383. Я приводил примеры из текста миди - там после включения каждой ноты указывается с каким смещением от основной частоты она играет. Ну вот если посчитать эти смещения как отдельные ноты, то они и будут дополнительными. Тогда я расширил значение до 256 - кастельвании с утками зазвучали лучше, появились эти самые ууииии-ууиии, уаауу-уааууу, ну и тд. А когда стал конвертировать ренегата и робокопа, оказалось что им 256 нот уже мало. Пришлось делить 16384 значения pitch_bend, что приводило к потере некоторых частот.
Для эксперимента я создал три отдельные таблицы нот для каждого канала. Получается (в теории) можно играть независимо 768 разных частот. На практике это не так - многие каналы пересекаются. Но всё равно это позволило расширить диапазон, не вылезая при этом из значения байта (256).
- - - Добавлено - - -
Вот пример из робокопа:
79 On ch=1 n=104 v=127
79 Pb ch=1 v=7839
79 Par ch=1 c=11 v=46
84 Pb ch=1 v=7163
91 Pb ch=1 v=4526
98 Pb ch=1 v=2371
105 Pb ch=1 v=7163
112 Pb ch=1 v=4526
119 Pb ch=1 v=2371
126 Pb ch=1 v=1126
133 Pb ch=1 v=4526
140 Pb ch=1 v=2371
147 Pb ch=1 v=1126
154 Pb ch=1 v=0
161 Pb ch=1 v=2371
168 Pb ch=1 v=0
175 Off ch=1 n=104 v=0
В начале включается нота 104 (3322,44 КГц), но тут же её частота понижается (v=7839) на 8192-7839=353 от изначальной (это примерно на четверть тона ниже). А дальше её частота вообще скачет вниз в паре мест до нуля - это уже равно ноте 104-12=92 (1661,22 КГц). Ну и тд и тп. Соответственно между существующими миди-нотами (0..127) у меня появляются дополнительные (заранее неизвестно сколько их будет).
А что если не пытаться на общую шкалу все переводить, а оставить ноту нотой, а бенд бендом? Или сложный очень плеер получается?
Конечно так можно. Я изначально так и хотел. 128 значений для ноты и ... 16384 для pitch_bend - а это два дополнительных байта. Получится при включении ноты надо получить три байта данных (против одного сейчас). И самое главное - кто и как вычислит это значение - на 8080 я не умею быстро делить\умножать и вычислять новое значение частоты. Поэтому выбрал табличный вариант в самой программе конвертере.
- - - Добавлено - - -
Но если мне покажут пример как делать, попробую применить = ))
Ага, понимаю.
А что если при конверсии пересчитать экспрессию этих забубенных бендов по модулю полутона, чтобы смещение не могло быть больше полутона. Тогда бенд всегда будет начинаться с целой ноты + смещение по модулю, а не за условно октаву от указанной ноты. Дальше писать только дельту, изменение бенда. Так и полбайта хватит на канал. И просчитать их можно заранее, чтобы ничего не делить не умножать на 8080. Но это наверное значительная переделка плеера будет.
Но это наверное значительная переделка плеера будет.
Вот это меня никогда не останавливало - конечно не каждый день, но довольно часто что-то меняю\переписываю свой код в Прекрасном = )) Наоборот это очень удобно - поправил где-то пару байт, нажал Play, через десяток-другой секунд посмотрел\послушал результат на реальном Апогее и давай опять писать в Прекрасном. Так что плеер можно переписать как нужно - тем более после введения дополнительных возможностей это всё-равно придётся сделать.
Другой вопрос что я не совсем (в который раз) понял следующий момент:
А что если при конверсии пересчитать экспрессию этих забубенных бендов по модулю полутона, чтобы смещение не могло быть больше полутона. Тогда бенд всегда будет начинаться с целой ноты + смещение по модулю, а не за условно октаву от указанной ноты. Дальше писать только дельту, изменение бенда.
Речь о том, что поделить 16384 на константу (или как-то хитро высчитать) и в дальнейшем вместо +/-8192 использовать +/-12 или нет?
Хотелось бы пример или какое-то развёрнутое пояснение.
- - - Добавлено - - -
Выложил несколько разных шумов получаемых по моей схеме.
Послушать здесь (https://cloud.mail.ru/public/Fv7F/BtG3E5BDs)
Вариант svofski я отчасти понял. Последовательность 1) нота 2) бенд (оба пункта относятся к одному моменту времени) можно заменить на 1) ноту ближайшую к бенду 2) бенд в пределах полутона. Но если сохранять исходную точность, то бенд даже в пределах полутона в байт не влезает.
Вот эту часть применительно к общему случаю я не понял
Дальше писать только дельту, изменение бенда. Так и полбайта хватит на канал.
Имхо это применимо только в частных случаях (когда дельта бенда влезет в полбайта), надо смотреть реальные файлы, насколько часто это будет востребовано и даст ли общий положительный эффект.
Возможен следующий тупой и рыхлый но "всеобъемлющий" формат. По аналогии с другими подобными форматами достаточно в файле для реала хранить
1) Относительное время события
2) Номер изменяемого канала
3) Готовый делитель для ВИ53. Это 2 байта, не 3 (когда нота + бенд)
Можно результат сжать с использованием megalz или exomizera. Или попробовать ДИКМ, как предлагал svofski.
3) Готовый делитель для ВИ53. Это 2 байта, не 3 (когда нота + бенд)
Этот вариант я как раз оставил как запасной - если не хватит одного байта, тогда просто использовать константу делитель занимающую два байта, одновременно избавившись от таблицы нот. Но так как разных частот в произведении всё равно на порядки меньше чем 65536, то я ещё рассматривал старый вариант с таблицей, где в старших битах слова можно хранить например громкость.
Думал про "классические" ВИ53, громкость упустил.
Классический вариант тоже останется - он не будет использовать "навороты" и его данные будут занимать меньше места. Две версии будет - для базовой ВИ и для "проапгрейженой".
- - - Добавлено - - -
Можно результат сжать с использованием megalz или exomizera.
Это что такое? Где можно почитать\ознакомиться?
Это что такое? Где можно почитать\ознакомиться?
Оригинальную страницу с бинарником упаковщика не нашел, но есть спековский обзор (http://hypr.ru/blog/dev/740.html). И там есть архив (http://introspec.retroscene.org/hype/compression2017.7z) с megalz.exe (там много всего)
Распаковщик megalz b2ma для 8080 (http://zx-pk.ru/threads/17316-apogej-bk01-i-apogej-bk01ts-vneshnij-rom-disk.html?p=436647&viewfull=1#post436647). Обращаю внимание, что он там распределение исходных данных (откуда и куда) по регистрам поменял по сравнению с распаковщиком для z80.
- - - Добавлено - - -
Две версии будет - для базовой ВИ и для "проапгрейженой".
Лучше не стоит, на классике данные о громкости будут просто игнорироваться, а разных файлов будет в 2 раза меньше.
Вот эту часть применительно к общему случаю я не понял
Дальше писать только дельту, изменение бенда. Так и полбайта хватит на канал.
Имхо это применимо только в частных случаях (когда дельта бенда влезет в полбайта), надо смотреть реальные файлы, насколько часто это будет востребовано и даст ли общий положительный эффект.
Ты именно про полбайтовую дельту? Потому что с целобайтовой я вообще не вижу проблем, это по-моему очень большая редкость должна быть, чтобы за один тик плеер занесло больше, чем на полтона именно бендом. И чего тогда просто другую ноту не указать, какой толк в таком бенде?
На сколько хватит полбайта будет зависеть от дискретности квантования центов. На полбайтности я вообще не настаиваю, просто привел как экстремальный пример.
это по-моему очень большая редкость должна быть, чтобы за один тик плеер занесло больше, чем на полтона именно бендом.
Т.к. midi файл сгенерирован автоматом, то там очень странные вещи делаются и кое-где бендами ноты меняются вместо "нормального" изменения нот.
ivagor, понятно, но это же можно учесть и просто начинать новую ноту там где бенд до нее дотягивает.
Если принять твое исходное предложение, то конечно бендов больше чем на полтона не будет.
Я не понял, сколько в итоге частот должно быть между двумя рядом стоящими нотами (полутонами)? Сейчас это 16384/24.
- - - Добавлено - - -
Я могу сгенерить того же робокопа как Вы скажете и можем сравнить на слух с тем что раньше выложен. Если никакой разницы не будет, то так и будем конвертировать в дальнейшем.
А, ну и кастельвании конечно.
сколько в итоге частот должно быть между двумя рядом стоящими нотами (полутонами)? Сейчас это 16384/24.
Судя по вики, люди даже с самым развитым слухом не слышат разницы в 1 цент, т.е. с практической точки зрения делить полутон более чем на 100 интервалов нет смысла, и мидивские 682-683 явно избыточны. Т.е. в байт бенд в пределах полутона можно уложить без слышимых потерь.
Судя по вики, люди даже с самым развитым слухом не слышат разницы в 1 цент, т.е. с практической точки зрения делить полутон более чем на 100 интервалов нет смысла
Ритм vs временной интвервал: никто не может точно отмерить например 521мс, но разъезд в ритме в 10-20 мс почти все замечают, а с небольшой тренировкой могут даже повторить ритм точно и без разъезда (на геймбое есть обалденная игра Rhythm Tengoku, которая безжалостно это демонстрирует). С высотой то же самое, 1 цент никакой Моцарт не услышит, но взаимные биения с другим центом даже я, медведем на ухо наступленный, легко услышу. Это просто к тому, что слышать можно опосредованно, не призываю дробить полутона на тысячные.
Я правда чуть чуть потерял нить. Если сейчас есть и так уже 16384/24 градаций между полутонами, то зачем мы вообще это все обсуждаем? Я-то подумал было, что наоборот, градаций очень мало, поэтому и начал про все это говорить.
- - - Добавлено - - -
Еще в копилку безумных идей: а может быть можно для экспериментов сгенерить предельно тупой, но бескомпромиссный вариант, который будет содержать в себе все значения регистров с максимальной детализацией, сколько их поместится в память? Не для практического применения, а для создания ground truth эталона, с которым сравнивать более эффективные, но компромиссные варианты.
Биения различимы и при мидивской точности. И можно по частоте пульсаций отличить биения при разном расхождении частот. Интересно, использовался ли такой экстрим на практике (в реальных мухыкальных midi-файлах).
Мне вообще интересен вопрос: реальны ли midi-файлы :) Вся мидишность придумана чтобы максимально оградить музыканта от технических проблем и лежит где-то на противоположном конце спектра от чиптюнов, ви53 и трекеров, где нетрадиционность традиционно используется и приветствуются (идея использовать миди для конверсии чиптюнов для меня относительно нова). midi файл вообще не может диктовать, как именно должен звучать тот или иной тембр. В своей работе каждый музыкант назначает инструменты так, как ему нужно. Но вот GM-файлы, которые гуляют по интернетам, они как-то совсем непонятно, что это такое. Мне представляется, что это какие-то побочные продукты чьей-то профессиональной деятельности. Изготовленные преимущественно как коммерческие демы, серьезными музыкантами, совсем не хакерами, на заказ или в свободное время. Ну откуда в них взяться тщательно спланированным биениям? Если покопаться в дискетах Трента Резнора и Афекс Твина, там наверное найдется. А в passport.mid и ему подобным, вряд ли.
Еще в копилку безумных идей: а может быть можно для экспериментов сгенерить предельно тупой, но бескомпромиссный вариант, который будет содержать в себе все значения регистров с максимальной детализацией, сколько их поместится в память? Не для практического применения, а для создания ground truth эталона, с которым сравнивать более эффективные, но компромиссные варианты.
О каких регистрах идёт речь?
В итоге уже 3 участника ветки высказали в той или иной форме идею о варианте представления музыкальных данных в виде значений регистров ВИ53.
Получается один байт значение таймера, плюс три байта громкость каждому каналу и ещё шесть байт, по слову на канал - 10 байт данных на кадр, 600 байт на секунду звучания в самом тяжёлом случае. Такой формат сделать?
Я бы чуть скорректировал:
1) 1 байт - признаки изменения громкости и частоты каждого канала, всего 6 бит. Еще 2 бита в запасе.
2) Каждый канал: по 1 байту громкость и по 2 байта частота. Если громкость или частота не меняются, то и соответствующих данных нет.
Получается 50*(1+3*(1+2))=500 байт в секунду в худшем случае.
- - - Добавлено - - -
и по 2 байта частота
в смысле делитель
Добавил новые мелодии для прослушивания.
Chōjin Sentai Jetman (https://cloud.mail.ru/public/A753/LAKwqeh1Q)
Как всегда у Natsume очень мелодично и с интересными проигрышами.
SegaBoy, я предлагаю такой формат только для оценки предела возможностей. Чтобы возможные недостатки плеера и нехватка вычислительной мощности 8080 не мешали оценить потенциал крутой звуковухи.
Как насчет того, чтобы перейти на схему звукового генератора из ПК11/16:
66286
Относительно простая доработка (ставим дополнительный таймер втором этажом), но можно весьма интересные эффекты за счет скважности получать, типа таких: http://hypr.ru/blog/809.html
Другая крайность (в плане сложности): аналоговые синтезаторы, вроде ячейки звукового синтеза 5/2 (http://agatcomp.ru/Hard/jzs52.shtml) для Агатов на двух ВИ53.
Пример звучания данной схемы из ПК11/16: https://youtu.be/cP6gJM3OF70
В принципе можно вытащить все мелодии из доступных дисков и разобраться с их форматом.
Мелодий там не много оказалось. Вот сконвертировал и выложил описание штатного драйвера этого звукового генератора в ПК11/16: https://github.com/troosh/pk11-16/blob/master/Snd/VPSNC1.DOC.txt (там же все найденные мелодии и конвертор из текстового вида в бинарный).
Забавно там сделано, просто копируется файл с мелодией в специальный файл, а далее уже в фоне драйвер воспроизводит музыку.
- - - Добавлено - - -
Все исходники прилагаются. Звучит уже не совсем "как из бочки" = ))
Привет! большое спасибо за отличную работу с 3х канальным генератором)))
звучит классно =)
Можно дать пояснение, как происходит синхронизация с кадровой частотой?
как часто приходит кадровая? 50Гц или 25? и как долго длится импульс кадровой,
что бы его не пропустить, сколько множно ставить опереций в цикле ожидания?
wait_vsync:
lda crt_cmd_port
lda crt_cmd_port
ani crt_ir_flag
jz wait_vsync+3
------------
Ещё такой момент, касаемый Pitch bend (я просто не музыкант вообще =)
При разборе Midi мне вообще показалось, что существует только момент нажатия клавиши,
Если смотреть только на вариант пианино, то по идее длительность звучания каждой ноты
одинаковое, если это не пианино, то нота да - тянется...
Как это кодируется в midi? и как в вашем плеере? То есть длительность звучания ноты? =)
------------
Если вы не против, то возму некоторые кусочки кода вашего плеера в свои поделки =)
Можно дать пояснение, как происходит синхронизация с кадровой частотой?
как часто приходит кадровая? 50Гц или 25? и как долго длится импульс кадровой,
что бы его не пропустить, сколько множно ставить опереций в цикле ожидания?
Синхронизация происходит просто - начинаем в цикле опрашивать бит IR у ВГ75 пока он не будет установлен. После этого выполняем свою процедуру делающую что угодно и по окончании снова возвращаемся к опросу IR. Таким образом все наши телодвижения происходят не чаще чем раз в кадр.
Если оставить настройки ВГ75 по-умолчанию, то кадровая 50 Гц. У меня есть примеры где выставлен режим 60 Гц. Импульс кадровой длится 645 мкс - сколько выставлено строк для VRTC и сколько линий в строке. Изначально это одна строка в 10 линий. Чтобы его не пропустить нужно чтобы основная процедура "уместилась" в один кадр.
Про операции в цикле ожидания не понял. Ожидание синхроимпульса это просто зацикленное чтение регистра ВГ75, затем сравнение с константой и прыжок назад на чтение если бит не установлен.
- - - Добавлено - - -
Ещё такой момент, касаемый Pitch bend (я просто не музыкант вообще =)
При разборе Midi мне вообще показалось, что существует только момент нажатия клавиши,
Если смотреть только на вариант пианино, то по идее длительность звучания каждой ноты
одинаковое, если это не пианино, то нота да - тянется...
Как это кодируется в midi? и как в вашем плеере? То есть длительность звучания ноты? =)
"Звуковысотное колесо (Pitch Wheel) используется для плавного изменения высоты тона звучащей ноты. Процесс изменения высоты называется питч-бендом (Pitch Bend), а соответствующее MIDI-сообщение — Pitch Wheel Change (его часто и называют Pitch Bend)."
"Pitch Wheel Change — сообщение высокого разрешения, то есть позволяет использовать 16384 значений изменения высоты, и относится к контроллерам непрерывного типа. При движении колеса высота ноты скачкообразно изменяется во времени, но благодаря маленьким шагам (равным 1/16384 диапазона изменения) эти скачки обычно незаметны, и создается ощущение плавного изменения высоты."
Кодируется в midi примерно так:
91 Pb ch=1 v=4526
98 Pb ch=1 v=2371
105 Pb ch=1 v=7163
112 Pb ch=1 v=4526
119 Pb ch=1 v=2371
Временная метка, команда Pitch Bend, номер канала и значение (от 1 до 16384).
Значение можно рассматривать как знаковое от -8192 до +8192, что для конкретной ноты равно понижению или понижению на одну октаву. Ну и промежуточные значения это гуляние где-то в диапазоне. В моём плеере я никак это не выделяю, просто проигрываю новую "ноту" с заранее просчитанным значением. На длительности это никак не сказывается - когда приходит команда выключить канал, тогда я и отключаю звук в нём.
Круто! большое спасибо за подробный ответ!
Про операции в цикле ожидания не понял. Ожидание синхроимпульса это просто зацикленное чтение регистра ВГ75, затем сравнение с константой и прыжок назад на чтение если бит не установлен.
Я так понимаю, что сигнал длится долго, более 10 линий кадровой синхронизации и в принципе его сложно проморгать, а вопрос был в том, можно ли успеть
в ожидании этого импульса что-то посчитать? например, складывать 32битное число и класть в память (для оценки запаса производительности между кадрами, например). Мне так кажется, что за 600мкс, можно успеть считать из памяти и положить в память число ) проверю)
Ещё такой вопрос, а есть ли программы, которые преобразуют MIDI в удобный текстовый формат с сообщениями? просто ну уж очень не хочется самому
в ручную сырой MIDI разбирать =)))
Если что-то посоветуете, буду очень признателен =)
Спасибо!
Как это кодируется в midi? и как в вашем плеере? То есть длительность звучания ноты? =)
Вот попробую объяснить на примере:
123 On ch=1 n=48 v=127
123 Pb ch=1 v=8192
129 Off ch=1 n=48 v=0
В кадре 123 получаем команду включить ноту с номером 48 (130,81 Гц). Затем следующая команда выставляет pitch 8192, то есть смещение 0 относительно частоты ноты. Через шесть кадров приходит команда выключить данный канал.
Для условного плеера это превратится в следующие команды:
123 - послать в канал 1 значение 13590 (константа для частоты 130,81 Гц)
129 - выключить канал 1
Другой пример:
235 On ch=1 n=53 v=127
235 Pb ch=1 v=8192
240 Pb ch=1 v=9540
241 Off ch=1 n=53 v=0
В кадре 235 получаем команду включить ноту с номером 53 (174,61 Гц). Затем следует смещение равное нулю как и в предыдущем примере. Через пять кадров получаем новую команду изменить pitch bend. Берём частоту 174,61 умножаем на значение pitch bend (9540) и делим на 8192 (174,61*9540/8192=203,34). Частоту ноты 174,61 делим на 2 и умножаем на 2 в степени значения pitch bend делённое на 8192 (174,61/2 * 2^(9540/8192) = 195,71). На следующем кадре приходит команда выключить канал.
Для условного плеера это превратится в следующие команды:
235 - послать в канал 1 значение 10181 (константа для частоты 174,61 Гц)
240 - послать в канал 1 значение 8742 (константа для частоты 203,34 Гц)
240 - послать в канал 1 значение 9084 (константа для частоты 195,71 Гц)
241 - выключить канал 1
Таким образом в обоих примерах ноты звучат по шесть кадров, но во втором случае в последнем кадре чуток приподняли частоту.
- - - Добавлено - - -
Если вы не против, то возму некоторые кусочки кода вашего плеера в свои поделки =)
Это всегда пожалуйста - используйте наздоровье = ))
- - - Добавлено - - -
Ещё такой вопрос, а есть ли программы, которые преобразуют MIDI в удобный текстовый формат с сообщениями? просто ну уж очень не хочется самому
в ручную сырой MIDI разбирать =)))
Если что-то посоветуете, буду очень признателен =)
Спасибо!
Есть онлайн конвертер миди-файлов в текст Binary MIDI file to text conversion (http://flashmusicgames.com/midi/mid2txt.php). Я им как раз и пользуюсь.
- - - Добавлено - - -
Я так понимаю, что сигнал длится долго, более 10 линий кадровой синхронизации и в принципе его сложно проморгать, а вопрос был в том, можно ли успеть
в ожидании этого импульса что-то посчитать? например, складывать 32битное число и класть в память (для оценки запаса производительности между кадрами, например). Мне так кажется, что за 600мкс, можно успеть считать из памяти и положить в память число ) проверю)
Если кадровая 50 Гц, то у нас в целом не 600 мкс, а все 20000 (20 мс). Отловили импульс и почти всё это время можно складывать, музыку выводить, отрисовывать на экране и прочее. Главное закончить чуть раньше и пойти по-новой "ловить" импульс.
Или мы о разном?
Большое спасибо за подробный ответ! =)
Это значительно проясняет всё )
И не меньшее спасибо за ссылку)
Если кадровая 50 Гц, то у нас в целом не 600 мкс, а все 20000 (20 мс). Отловили импульс и почти всё это время можно складывать, музыку выводить, отрисовывать на экране и прочее. Главное закончить чуть раньше и пойти по-новой "ловить" импульс.
Или мы о разном?
да =) мне это проще проверить видимо будет)
но я вел разговор, чтобы внутри цикла ожидания ещё что-то успевать делать ) между командами lda crt_cmd_port и jz wait_vsync+3,
в частности посчитать сколько тактов остаётся в запасе =) а так да, я понял, что между кадрами 20мс.
wait_vsync:
lda crt_cmd_port
lda crt_cmd_port
ani crt_ir_flag
jz wait_vsync+3
ps: и такой момент почему два раза с порта загружается, а потом прыгает и загружается один раз )
я чуть в архитектуре не очень секу )) хотя могу как есть копипастнуть)
спасибо)
pss: раньше такими вещами не занимался, но интересно ))) извиняюсь, если вопросы банальные)
ps: и такой момент почему два раза с порта загружается, а потом прыгает и загружается один раз )
я чуть в архитектуре не очень секу )) хотя могу как есть копипастнуть)
спасибо)
Глянул весь код - действительно два раза подряд здесь не нужно. Можно переделать так:
lda crt_cmd_port
wait_vsync:
lda crt_cmd_port
ani crt_ir_flag
jz wait_vsync
Первым чтением сбрасываем IR, потому что он самостоятельно только выставляется, а сбрасывается чтением. Это нужно (но необязательно) только один раз в самом начале программы, чтобы точно определить начало кадра. Иначе можно попасть и в конец и в середину.
Pyhesty, походу я ошибся с формулой для вычисления pitch bend - не в те записи посмотрел при наборе текста.
Правильно будет так:
noteFreq/2 * 2^(pitchBend/8192)
где noteFreq это частота ноты к которой применяем изменение pitchBend
NEO SPECTRUMAN
15.05.2020, 19:09
вот бы этот ви53 еще нормально эмулировался...
а че с ним не так в эмуляторе?
вот бы этот ви53 еще нормально эмулировался...
Видимо, нужно выбирать правильный эмулятор :)
NEO SPECTRUMAN
16.05.2020, 21:01
Видимо, нужно выбирать правильный эмулятор
а в b2m муляторе уже больше чем 1 режим работы?
Если мы о режимах ВИ53, то все 6 режимов счёта эмулируются корректно. Вот только для звука подходит лишь 1 из 6.
А если мы о режиме ШИМ, то тут да, ресемплинг немного хромает, а фильтр для сглаживания проблемы я приделывать не хочу. Костыль это.
фильтр для сглаживания проблемы я приделывать не хочу. Костыль это.
Это не костыль и не "сглаживание проблемы", ФНЧ для предотвращения наложения спектров (antialiasing filter) - это обязательный элемент для соответствия реалу. Выходной сигнал реала не дискретизируется идеально по времени. Даже если в каком-то компе не принято специальных мер для фильтрации, то никто не отменяет тот факт, что в реальности значения не меняются мгновенно и бесконечного спектра у физически существующего сигнала не будет. Т.е. "лишние" повторения спектра обязательно будут убывать и что более важно, они не "завернутся" в основную полосу сигнала, что является основной причиной свиста ШИМа в эмуляторах. О чем можно поспорить, так это о конкретных характеристиках таких фильтров применительно к каждому компьютеру, но это уже детали. Мое личное мнение, что лучше передавить, чем недодавить (лишние повторения спектра), но это лишь имхо.
То, что emu скорее всего в лидерах по количеству и качеству поддержки режимов ВИ53 - это замечательно. Но звуковая система emu (которая строго говоря не связана жестко только с ВИ53 и касается и остальных источников звука, в первую очередь бипера) проигрывает "конкурентам": немного emu80, если говорить о мультиэмуляторах и сильно v06x, если только про вектор.
GARNIZON
20.05.2022, 01:35
А ссылки то на мелодии, все протухли. Автор больше не увлекается этим?
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot