Два дня правил звуки, расставил вызовы событий, в которых временно вручную указывал канал для воспроизведения (левый/центр/правый). Все звучало. И вот пришло время все-таки написать процедуру автоматического определения канала для звука. И тут мне в голову пришло, что все данные у меня уже есть — в любой точке вызова звука всегда известен адрес в экране того объекта, который издает звук. Просто надо передать его подпрограмме добавления нового звука в очередь, а та сама вычислит в какой канал этот звук разместить. Пришлось снова пройтись по всем исходникам и поменять при вызове звука номер канала на адрес в экране. И, конечно, добавить вычисление канала в саму подпрограмму добавления звука в очередь. И все зазвучало!
Когда я добавил звуки поднимающихся и опускающихся решеток, то сразу заметил, что как-то много звуков стало. Решил посмотреть, как в оригинале все это звучит. И выяснилось, что в оригинале звук опускающейся решетки слышен только тогда, когда она видна. А вот поднимающуюся решетку слышно всегда и везде. Но есть один момент — решетка в третьем лабиринте (кто знает, тот поймет) все-таки тоже везде слышна при опускании. Реализовал все это дело и сразу стало гораздо тише. Сегодня исправил кучу звуков и сделал новые. Теперь мне прям нравится как все звучит, даже заигрался в принца )) Не совсем нравятся шипы, но может еще исправлю. И совсем не нравятся звуки качающегося пола. Как выяснилось, в оригинале сделано вообще хитро — если прыгать на одном и том же месте, то каждый раз качающийся пол издает разные звуки:
Мне пока не удалось получить такие звуки для AY. Тем более как-то их перемешивать. Завтра помучаю этот вопрос.
Alexander «Sandro» Tishin подсказал, что в первом лабиринте существует скрытый способ пройти мимо стражника без меча. Оказалось, что у меня этот вариант был невозможен — отсутствовала одна падающая плита. Поставил плиту, теперь все стало возможно.
Вот такие особенности вдруг выясняются. Раньше на них и внимания не обращал никогда.
Добавил звуки фехтования. Вроде бы получилось неплохо. На записи цвиркание какое-то попадается, но в самой игре таких звуков не было, видимо приколы оцифровки с эмулятора.
Сегодня сделал новый звуковой движок: очереди выкинуты, сделаны три вида приоритетов. Важные звуки могут прерывать любые звуки (пила должна всегда быть слышна), средней важности могут быть заглушены важными (пила заглушает решетку, но решетка глушит шаги). И он заработал! Теперь надо делать звуки более похожими и соблюдать стерео при выводе звуков, чтобы правая решетка звучала справа и т.д.
Итак, занялся вплотную звуками. Как сделать звуки? Как обычно: записать с микрофона удары молотком по рельсу на фоне отбойного молотка, в лучших традициях ранних Депешей. Но вот незадача — нужны звуки на AY, в виде всяких там периодов и частот шума. Поискал софт для создания звуков, нашел несколько редакторов. Но мои синусоиды, нарисованные в стиле импрессионизма, никаких вменяемых звуков не выдавали. Пришлось смотреть как сделаны другие «сэмплы», звучащие круто. Математический смысл вроде понятен. Но вот как взять и нарисовать звук «железных челюстей, с грохотом смыкающихся, с низкочастотным ударом и металлический звоном»? Фиг его знает. Но я в итоге нарисовал:
Ок, звучание меня устроило. Вроде бы очень даже похоже и на удар и на звон такой с легким эхом:
Что с этим делать дальше? Редактор позволяет выгрузить звук в нескольких форматах: afx и двух вариантах текстового формата. В доке есть описание формата afx:
Формат одиночного эффекта, расширение .afx
Каждое прерывание кодируется последовательностью байт, их количество может изменяться в зависимости от изменений значений тона/шума/громкости в текущем прерывании. Сначала идёт информационный байт:
bit0..3 Громкость
bit4 Запрещение T
bit5 Изменение T
bit6 Изменение N
bit7 Запрещение N
Если установлен bit5, далее следуют два байта со значением тона; если установлен bit6 - байт со значением шума; если установлены оба этих бита - сначала идёт значение тона, потом шума; если не установлен ни один - сразу идёт следующий информационный байт.
Конец эффекта помечается последовательностью байт #D0,#20. Плеер должен определять её до вывода в регистры (сравнением значения шума на = #20). В редакторе за признак конца эффекта считается последнее ненулевое значение громкости, вне зависимости от остальных параметров.
Как я уже знал из различных док, примеров и ценных советов гуру, самый быстрый способ выводить звук на AY — писать в его регистры уже готовые данные, не вычисляя ничего на ходу. Иначе говоря, мне нужно было преобразовать мой AFX в PSG-формат. Порылся на просторах интернета — конвертера не обнаружил. Придется самому. Берем блокнот и декодируем:
-- 000
EF Инф байт 1110 1111
Громкость F (17)
bit 4=0 разрешено Т
bit 5=1 далее значит два байта со значением тона
bit 6=1 и еще байт шума
bit 7=1 запрещение шума
88 байт тона 210
0B байт тона 13
17 байт шума 27
-- 001
EE Инф байт 1110 1110
Громкость E (16)
bit 4=0 разрешено Т
bit 5=1 далее значит два байта со значением тона
bit 6=1 и еще байт шума
bit 7=1 запрещение шума
83 байт тона 203
0C байт тона 14
10 байт шума 20
Вколачиваю полученные значения в таблицу в исходник тестового «плеера», накиданного за 5 минут, которые просто хватает данные из этой таблицы и пишет в регистры 4,5,6,7,10 AY. Компилирую, запускаю — какое-то хрипение. Ну, особо никто и не надеялся, как всегда какой-то косяк. Ага, перепутал биты в канале управления регистра C. Исправляем, запускаем:
Оуууууееее!!
Теперь, правда, надо создать все другие звуки принца… А там, помимо бряцания и клацания, есть весьма непростые, типа перерубаемого принца, воплей падения и прочих звуков органического происхождения. Будем, значит, сочинять ))
Ну, и конвертер написать придется, а то на бумажке конвертить не очень интересно ))
Продолжил править маски объектов. Наконец-то нормальную маску получили обломки. Раньше для них использовалась маска обычной плиты, и если в подвалах это было не особо заметно, т.к. там торец плиты черный, то в дворцах это очень бросалось в глаза, когда обломки лежали у стены. Они накладывались на стену или решетку и выглядело это ужасно. Теперь все как положено. К тому же и принц теперь бродит среди обломков правильно — отдельные камни закрывают ступни.
Выглядело это так:
Теперь вот так:
Сделал кровищу на пиле. Т.к. в палитре подвала нет красного цвета, пришлось сделать кровь черной.
Разбираюсь со скелетом, и вдруг обнаруживаю, что он в оригинале ведет себя довольно странно. Если его спихнуть в пропасть вправо — он не будет стоять под стеной, он почему-то окажется в середине экрана! Но это еще ерунда. Если скелета спихнуть влево, то он вообще должен упасть на самый нижний уровень (как он и падал у меня). Но он все равно будет ждать принца посреди экрана. Т.е., в оригинале скелет залезает на уровень вверх, чтобы там поджидать принца, хотя ни один стражник такого не умеет ))
Реализовал все это дело, теперь скелет (чуть не написал «мой скелет») в нашем принце тоже ждет принца где положено.
Проявился-таки старый глюк с проваливанием под землю стражника, стоящего на краю. Все никак не могу отловить его в повторяемом виде. На этот раз уже скелет решил, что ему-то можно перемещаться под землей ))
Свежие комментарии