PC-01 Lviv
http://pc01.lviv.ua/forum/

Программирование звука
http://pc01.lviv.ua/forum/viewtopic.php?f=3&t=15
Page 2 of 4

Author:  b2m [ 29 Aug 2012, 22:33 ]
Post subject:  Re: Программирование звука

Quote:
Поделитесь секретом, как именно домогаетесь.
Можно управлять каждым битом порта С в отдельности. Для этого в управляющий порт ВВ55 выводится команда такого вида:
0000nnnx
где nnn - номер бита, а x - новое значение

Типа так:
Code:
mvi a,0
out 3

mvi a,1
out 3

Author:  liberation [ 29 Aug 2012, 22:43 ]
Post subject:  Re: Программирование звука

Quote:
Можно управлять каждым битом порта С в отдельности. Для этого в управляющий порт ВВ55 выводится команда такого вида:
0000nnnx
где nnn - номер бита, а x - новое значение
Ага, понятно. Теперь нам не нужно беспокоиться об угрозе случайного изменения остальных битов порта C2. А никаких других скрытых возможностей такой способ не предоставляет?

Author:  ivagor [ 30 Aug 2012, 05:47 ]
Post subject:  Re: Программирование звука

Quote:
Чё бы оно не работало. Вполне документированная для ВВ55 команда.
Это понятно, на векторе же такой вариант работает. А вот дешифрацию адресов портов ты по схеме делал (почти риторический вопрос)?
Quote:
А никаких других скрытых возможностей такой способ не предоставляет?
Он предоставляет явную возможность слегка повыпендриваться :)
Quote:
Quote:
3. Для (мизерного) ускорения и сокращения программы (а также просто для удовольствия) используется недокументированная команда.
Откроешь секрет? :)
Секрет Полишинеля. В оригинале используются оба набора регистров (основной и альтернативный) и еще IX. Чтобы после переноса на 580ВМ80 сохранить некое подобие быстродействия пришлось многое переделать на самомодифицирующийся код. В основном меняются аргументы, но в паре мест - команда. Есть два фрагмента типа такого:
mvi a, 20h ;Это и константа для сравнения и nop
cmp d
jc loc_21C
mvi a, 14h ;inc d
loc_21C:
sta loc_253
Сначала после cmp d я написал mvi a,0, а потом убрал, и ничего плохого не случилось. В итоге -4 байта и -14 (вероятно) тактов на ноту. Ерунда, но почему бы и нет. На z80 все равно лучше использовать оригинальный плеер.

Author:  b2m [ 30 Aug 2012, 08:34 ]
Post subject:  Re: Программирование звука

Quote:
А вот дешифрацию адресов портов ты по схеме делал (почти риторический вопрос)?
В стандартной конфигурации вроде по схеме (используется один бит для дешифрации одной из ВВ55 и два младших для номера регистра, т.е. по маске 13h).
При добавлении хамелеон-дос пришлось ещё пару бит добавить, но как там реально было, я не знаю.

Author:  ivagor [ 30 Aug 2012, 08:58 ]
Post subject:  Re: Программирование звука

Еще раз изменил архив - добавил авторов композиций и полные названия (в Examples.src)

Author:  ivagor [ 02 Sep 2012, 19:08 ]
Post subject:  Re: Программирование звука

v1.1

Attachments:
MSPLAY.ZIP [10.93 KiB]
Downloaded 766 times

Author:  liberation [ 02 Sep 2012, 23:08 ]
Post subject:  Re: Программирование звука

Quote:
v1.1
Спасибо! Добавлю здесь changelog, копию отправлю в файловый архив.
Quote:
v1.1 - 01.09.2012
Оптимизировнный по скорости и размеру вариант.
Теперь проигрывание можно прервать "Пробелом".
Адрес порта бипера изменен на стандартный.
Добавлен еще один музыкальный пример, теперь их четыре. Полные названия и авторов музыкальных композиций смотрите в папке Examples.src

Author:  ivagor [ 21 Nov 2012, 14:19 ]
Post subject:  Re: Программирование звука

Очередной приступ графомании.
Учитывая отсутствие полной ясности с торможением в ОЗУ, звук с предсказуемой частотой можно получить только используя подпрограммы из ПЗУ.
1. Штатная подпрограмма для SOUND, уже описанная в данной ветке - можно вызывать по адресу DE94. На входе длительность в D, полупериод (соответствующий требуемой звуковой частоте) в L. Диапазон извлекаемых частот от 85 Гц до 13387 Гц. Вроде бы неплохой охват звукового диапазона, но "шаги" в этом диапазоне слишком большие, в результате нельзя задать многие ноты большой октавы (с низкой стороны) и нельзя задать без фальши часть нот 3й и 4й октав (с высокой стороны) .
2. Для извлечения звука в некоторых случаях может лучше подойти фрагмент процедуры, используемый для записи пилот-сигнала - можно вызывать по адресу E28D. Длительность (число периодов звуковых колебаний) задается в BC (длительность нот здесь измеряется в целых периодах, а не в, условно говоря, "пакетах тактов", и может быть заметно больше, чем в процедуре DE94, но, с другой стороны, длительность будет зависеть от играемой ноты - IMHO это основной недостаток данной процедуры, т.к. обеспечение примерного равенства длительностей нот разной частоты потребует отдельного внимания). Период колебаний задается ячейками BE82-длительность "нулевой части" и BE83-длительность "единичной части". Возможность раздельного задания длительностей частей периода позволяет менять скважность в широких пределах, а значит можно получить не только разные частоты (определяемые суммой значений), но и тембры (определяемые отношением значений). Диапазон значений получаемых частот несколько уже, чем у предыдущей процедуры - от 284 Гц до 12415 Гц, т.е. в области НЧ даже малая октава не вся охватывается, но, с другой стороны дискретность задания частот в "оставшейся" части выше, чем в DE94. При использовании этой процедуры из бейсика надо не забывать сохранять (до) и восстанавливать (после) значения ячеек BE82-BE83, чтобы стандартно кликала клавиатура и записывался пилот.

UPD: Кстати, в процедуре DE94 для самых высоких частот, которые, правда, вряд ли кто-то будет использовать в музыке, получается не меандр.

UPD2: Сначала как-то стормозил - процедура DE94, если ее вызвать с адреса DE96, позволяет задать полупериод в регистровой паре HL, а не только в младшей части (в L). Это расширяет частотный диапазон вниз чуть ли не до 0, но, к сожалению, точности это не добавляет.

Author:  Zelya [ 22 Nov 2012, 13:45 ]
Post subject:  Re: Программирование звука

Все заслушиваюсь музыкой. Это просто потрясающе! Наужно еще музыч нарыть и Jukebox под ПК-01 написать.

Author:  ivagor [ 24 Nov 2012, 14:47 ]
Post subject:  Re: Программирование звука

Сделал нечто под названием Fine Tuned Beep. Идея была в том, чтобы добиться хорошей точности настройки нот в максимально широком частотном диапазоне, для чего пришлось вместо цикла использовать развернутый цикл. В принципе получилось, но:
1. Частоты нот расчитаны для тактовой частоты 2.222222 МГц при отсутствии торможения, т.е. для реала нужно их откорректировать.
2. Даже максимальная длительность ноты довольно мала.

Из непринципиальных вещей, связанных с тем, что я поленился считать - в исходнике нет готовых значений нот с бемолями/диезами. Досчитать их просто - Fноты=2222222/(Задержка*15+44)/2
Если вдруг захотите посчитать субконтроктаву (я опять же поленился) - не забудьте увеличить BeepDelayMax

UPD: Также приложил зачатки плеера с тремя очень простенькими примерами. Дикий темп исполнения создает особый колорит.

UPD2: Доработал "плеер", теперь темп в 2 раза меньше (нормальный) и выходит в бейсик по нажатию пробела.

UPD3: Удалил старые версии в связи с выкладыванием новой, см. на следующей странице

Author:  Zelya [ 25 Nov 2012, 13:04 ]
Post subject:  Re: Программирование звука

ivagor
Красота! Как я понял все значения нот и длительностей - это такты. Хм... если использовать мелодии в пределах одной октавы, можно попробовать прикрутить фоновую музычку к игре.

Author:  ivagor [ 25 Nov 2012, 13:51 ]
Post subject:  Re: Программирование звука

Quote:
ivagor
Как я понял все значения нот и длительностей - это такты.
Почти, чтобы получить такты нужно умножить длительности на 30 (в V2) или на 15 (в первом варианте), это слегка приближенно, но довольно точно.
Quote:
ivagor
если использовать мелодии в пределах одной октавы, можно попробовать прикрутить фоновую музычку к игре.
Почему в пределах одной октавы? Фишка этого варианта именно в том, что в широком диапазоне (в т.ч. и для верхних октав) сохраняется хорошая точность задания частот. Другое дело, что сейчас частоты нот рассчитаны для эмулятора EMU, для реала их нужно калибровать собственно с использованием реального ПК-01.
Если для игрушки планируется мелодия в диапазоне малая октава-вторая октава, то IMHO, проще и надежнее использовать ПЗУшную процедурку DE94 (или DE96), она и на реала и в EMU должна работать одинаково, бемоли/диезы уже посчитаны. Недостаток Fine Tuned Beep - нужно сравнительно много памяти, чем более низкие октавы используются тем больше нужно памяти.

Author:  Zelya [ 26 Nov 2012, 11:43 ]
Post subject:  Re: Программирование звука

Quote:
Почему в пределах одной октавы?
Проблема в том, что паузы для нот нужно заполнять полезными действиями движка, например, отрисовкой графики. Если ноты будут иметь очень широкий диапазон, то нужно будет придумывать дополнительные методы синхронизации, чтобы не было сильной зависимости между музыкой и быстротой игрового процесса. Не скажу, что это не возможно, но трудновато.

Author:  ivagor [ 26 Nov 2012, 14:20 ]
Post subject:  Re: Программирование звука

Quote:
Проблема в том, что паузы для нот нужно заполнять полезными действиями движка, например, отрисовкой графики. Если ноты будут иметь очень широкий диапазон, то нужно будет придумывать дополнительные методы синхронизации, чтобы не было сильной зависимости между музыкой и быстротой игрового процесса. Не скажу, что это не возможно, но трудновато.
Возможно как минимум 2 подхода и я не совсем понял, о каком из них идет речь:
1. Простой вариант - ноты коротенькие, паузы между нотами заполнены полезными действиями (рисуем на экране и т.п.), желательно чтобы паузы были небольшие, чем меньше тем лучше. Скорее всего паузы между нотами не удастся сделать совсем маленькими и музыка будет отрывистой, типа как в jet set и подобных. Зато при этом используются стандартные звуковые процедуры.
2. Сложный вариант - разделяем задание периода колебаний и их длительности на 2 части - постоянную, в которую можем делать какие-то полезные действия (опять же рисовать и т.п.) и довесок, который будет подстраивать период по конкретную ноту. Fine Tuned Beep как раз несложно переделать в такой вариант, но в целом такой подход слишком сложен.

UPD: Вот еще вариант:
3. Можно играть не отдельные ноты а "звуковой файл". Либо клипировать wav до 1 бита, и выдавать эти биты через равные промежутки в бипер или даже использовать ШИМ. Плюс этих подходов в том, что легче добиться равномерного хода игрового процесса. Минус огромный - нужна куча памяти. На Львове, насколько помню, есть пример воспроизведения музыки на заставке в таком варианте - то ли ROCKMAN то ли ROCKчто-то. Там вроде 16 Кб или больше ушло под короткий фрагмент.

Author:  Zelya [ 26 Nov 2012, 14:59 ]
Post subject:  Re: Программирование звука

Я говорю как раз о втором варианте. Я его уже пробовал описать в теме про движок. По-моему, это единственный прийнятный вариант для музыкального оформления во время игры. Я бы его даже в демке опробовал, но к сожалению у меня есть несколько не равных по продолжительности фрагментов, обрабатывающих логику. Апдейтить текущий движок - скорее всего ничего не доделать. Так что идея отсалась на будущее.

Page 2 of 4 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/