Просмотр полной версии : Простая работа с AY
Oleg N. Cher
29.10.2014, 01:05
Требуется озвучить игру простыми звуками сопроцессора. В связи с этим вопрос к гуру: как вызвать из машинного кода оператор 128к-бейсика PLAY ? Вопрос посложнее: как сделать это на машине с сопроцессором, но без 128кб-ПЗУ? Второй вопрос - чистое пижонство или "очень хочется сделать чтобы работало на 48к-машинках с AY - правда, никогда не встречал таких машинок, даже не уверен, что где-то наберётся хоть пара штук". Так что первый вопрос всё-таки важнее. Но давайте и к нему отнесёмся критично. Может я чего-то недопонимаю. Первым помыслом было желание взять плеер из WHAM+AY. Вторым - некоторое исследование в области "а какие вообще плееры и (более или менее) стандартные форматы музыки для них используются?" Первым, что я нашёл, был плеер PT3x0A в журнале 3BIT. Его-то и думаю использовать, если не найду что-то поинтереснее (может даже покомпактнее).
На Обероне работа с данным плеером выглядит так. Очень плохой стиль, очень. :) Непереносимый. Ну а шо делать.
MODULE TestPT3;
IMPORT Asm, B := Basic, PT3x0A;
VAR
ace: PT3x0A.Melody;
BEGIN (*$MAIN*)
B.Init;
IF PT3x0A.TabAdr() MOD 256 # 0 THEN
B.PRSTR("Start address of module must be aligned to ");
B.PRINT(PT3x0A.TabAdr() MOD 256); B.PRSTR(" bytes"); B.PAUSE(0);
END;
(* Player & melodies are from http://zxpress.ru/article.php?id=9508 *)
B.DEFDATA(ace, 2137); (* ace.m *)
B.DATA(...); (* Данные мелодии поскипаны *)
PT3x0A.Install(ace);
Asm.Code("play_l$: LD IY,#0x5C3A");
Asm.Code(" EI ");
Asm.Code(" HALT ");
PT3x0A.Play;
Asm.Code(" LD A,#0x7F ");
Asm.Code(" IN A,(-2) ");
Asm.Code(" RRA ");
Asm.Code(" JR C,play_l$ ");
PT3x0A.Stop;
B.Quit;
END TestPT3.
Хочется работать со звуками где-то так:
Basic.PLAY("строка...");
Ну и чтобы сам плеер был как можно компактнее. И фиг с ним, пусть вызывается из ПЗУ 128.
Перерыл кучу материалов, но не нашёл как это сделать из машкода.
Олег, использовать подпрограммы 128 ПЗУ дурной тон. Есть специальный пакет от Shiru для работы с эффектами на ay.
http://shiru.untergrund.net/files/ayfxedit04.zip
Player на асме достаточно компактный.
denpopov
29.10.2014, 11:40
А что, дизассемблер процедур с комментариями отменили чтоли?
Alex Rider
29.10.2014, 13:20
Олег, использовать подпрограммы 128 ПЗУ дурной тон.
А что в нем дурного? Надо только следить, чтобы в переменной состояния 7ffd была правда всегда. Ну и да, все-таки включать ПЗУ 128 безопасно с точки зрения прерываний.
Кстати, а у кого-нить есть дизассемблер 128K? На WoS ссылка протухла.
Собсна, из дизассемблера можно вытащить проигрыватель и оформить как либу в ZXDev.
Oleg N. Cher
29.10.2014, 14:49
Есть специальный пакет от Shiru для работы с эффектами на ay.Ну шо ж, плеер от Shiru так плеер от Shiru, принимаюсь за его исследование.
Собсна, из дизассемблера можно вытащить проигрыватель и оформить как либу в ZXDev.Да, мысль хорошая. Можно даже сделать опцию - вызывать плеер из ПЗУ 128 или включать его в целевой код.
Дизассемблировать ПЗУ 128 или получить его готовый листинг, да ещё и с комментами - конечно заманчиво. Надо поискать, а если у кого есть - приаттачьте, плиз.
Спасибо за идеи.
solegstar
29.10.2014, 15:39
А что в нем дурного? Надо только следить, чтобы в переменной состояния 7ffd была правда всегда.
просто не у всех она (128 ПЗУ) есть в наличии, очень часто вместо неё прошивают какой-нить коммандер.
Andrew771
29.10.2014, 16:41
в книге "Как написать игру на Ассемблере" про программирование AY есть, припоминаю.
просто не у всех она (128 ПЗУ) есть в наличии, очень часто вместо неё прошивают какой-нить коммандер.
Всё верно. К тому же версий 128ой прошивки целая куча, Amstrad в пример. Да и самопала много, в виде зашитых командеров и утилит.
Player от Shiru вешается на прерывания, а управляется из общего цикла подачей в регистр номера эффекта. Редактор эффектов сделан под PC, а формат уже как стандарт в нашем скромном хобби :)
denpopov
29.10.2014, 17:20
К тому же версий 128ой прошивки целая куча, Amstrad в пример
а Амстрад тут причем?
shurik-ua
29.10.2014, 19:22
Дизассемблировать ПЗУ 128 или получить его готовый листинг, да ещё и с комментами - конечно заманчиво.
Если и реверсить, то лучше из сборников MSX-1,2,xx - там же и звучки прикольные:
http://zxaaa.untergrund.net/view_demos.php?t=0&s=msx&title=Title
molodcov_alex
29.10.2014, 23:40
а Амстрад тут причем?
При том, что +2 и +3.
Barmaley_m
31.10.2014, 00:40
А что в нем дурного?
Возможностей мало, сложно и тормозно.
В зависимости от сложности или простоты эффектов можно 1) работать с регистрами AY непосредственно. Там три-четыре записи в регистры - и AY уже звучит. 2) использовать проигрыватель от какого-нибудь треккера, в треккере создать нужные эффекты.
Способ 2) более универсальный и удобный, 1) годится только в случае совсем уж простых эффектов.
О плеере эффетов от Shiru не знал, но если такой существует - то конечно надо пользоваться. Shiru гений в области программирования звука на Спектруме, на бипере такие вещи вытворяет, что даже у меня челюсть отвисает.
Alex Rider
31.10.2014, 12:05
Возможностей мало, сложно и тормозно.
Ну в оригинальном сообщении речь шла про любые процедуры из 128к-ПЗУ, вообще говоря. Основная проблема там, действительно, в том, что его у многих нет (хотя, люди, которые шьют туда всякие коммандеры, наверное, должны отдавать себе отчет в том, что совместимость страдает). У Олега стоит задача написание либы к языку высокого уровня для озвучки игр, тут возможностей стандартного PLAY вполне достаточно, а вот вопрос памяти, занимаемой либой, критичен. Но да, поскольку версий ПЗУ-128 несколько, все же стоит перенести код в либу. Боюсь, его придется еще и править, сдается мне, что этот код зовет что-то из ПЗУ-48.
Господа, ткаи не завалялось у кого дизассемблера 128K 86-го года все-таки?
Barmaley_m
02.11.2014, 14:11
У Олега стоит задача написание либы к языку высокого уровня для озвучки игр, тут возможностей стандартного PLAY вполне достаточно,
Вполне достаточно? Ты не шутишь? В каких же играх встречается озвучка оператором PLAY?
В том-то и дело, что возня с Play того не стоит, учитывая простоту программирования регистров AY. В музыке из игр основное место занимает не базовое программирование регистров (чем оператор play по сути только и занимается), а организация сложной структуры музыки, хранение нот и их интерпретация по всем каналам одновременно.
а вот вопрос памяти, занимаемой либой, критичен.
Критичен ли он для либы? Сомневаюсь. Все зависит от целей программиста, какую программу он желает создать. Или он хочет реализовать сложную музыку с богатыми возможностями, или пару простых звуков. В обоих случаях решения разные, даже если и там, и там предъявляется требование минимального размера кода и данных.
Уж лучше в такой ситуации обратиться к 1к-интрам и тому подобным вещам. Там достаточно сложная музыка занимает мало места в памяти за счет оптимизации плеера по коду.
По-моему Олег ставил несколько иную задачу, чем просто организовать звук с минимальным кодом. А именно, он хотел получить либу, по своим возможностям максимально аналогичную возможностям бейсика, чтобы этой либой было легко пользоваться тем, кто привык программировать на бейсике и хочет перейти на Оберон. В контексте оператора Play, я не видел ни одной серьезной программы, которая им пользуется. Соответственно не слышал и о программистах на бейсике, которые привыкли пользоваться этим оператором. Поэтому тем более овчинка выделки не стоит.
проблема с PLAY в том что он работает блокирующим вызовом, хотя сопроцессор вполне может проигрывать звук не напрягая основной процессор, в этом его суть.
Поэтому используя PLAY, нельзя будет выполнять другие полезные задачи. Он работает как BEEP. Врядли ктото в играх будет использовать процедуру BEEP из бейсика, по той-же самой причине - это блокирующий вызов :)
Для сопроцессора нужно использовать асинхронные вызовы, а процедуры из пзу для этого не подойдут
denpopov
02.11.2014, 20:37
При том, что +2 и +3.
снова невпопад:)
снова невпопад
а что не понятного?-Amstrad внесли изменения в ПЗУ 128 и 48 басиков и впендюрили это в +2, +2A, +3.
denpopov
03.11.2014, 03:53
-Amstrad внесли изменения в ПЗУ 128 и 48 басиков и впендюрили это в +2, +2A, +3.
да ну?
да ну?
C:\Temp> fc /b 128-1.rom plus3-3.rom | wc -l
1045
denpopov
03.11.2014, 09:48
C:\Temp> fc /b 128-1.rom plus3-3.rom | wc -l
1045
_____
аштоэта? поясните темному..
аштоэта? поясните темному..
Пруф того, что между 48-м васиком zx128 и 48-м васиком +3 больше килобайта разницы.
---------- Post added at 12:12 ---------- Previous post was at 12:05 ----------
Сравнивал барсик-48 потому, что его хотя бы визуально по F3 в коммандере можно узнать. А basic-128 перекопан вообще весь - ничего общего, 16118 байт различаются.
denpopov
03.11.2014, 10:17
все же я не вижу связи бейсика с упомянутым Амстрадом, ну да ладно..
denpopov
03.11.2014, 18:18
ну да!
вот и поговорили:)
все же я не вижу связи бейсика с упомянутым Амстрадом, ну да ладно..
http://savepic.org/6397088.png
48-й бейсик:
http://savepic.ru/6215463.png
denpopov
04.11.2014, 04:02
ZXMAK, такая картинка привычнее:
http://i67.fastpic.ru/big/2014/1104/c4/66d7a6deb84e6066b82745e3922683c4.gif
Splinter
04.11.2014, 07:47
Книга Мир звуков спектрума (http://trd.speccy.cz/book/ZXSWORLD.ZIP) очень помогает.
Alex Rider
04.11.2014, 14:18
Вполне достаточно? Ты не шутишь? В каких же играх встречается озвучка оператором PLAY?
Для игр на ЯВУ достаточно. Озвучки бейсик-игр оператором Play нет по одной простой причине - игра приобретает AY-звук (не шедеврального качества, надо сказать), но при этом теряет совместимость с 48к. А озвучки на блокирующем BEEP с еще менее шедевральными возможностями - сколько угодно.
Критичен ли он для либы? Сомневаюсь. Все зависит от целей программиста, какую программу он желает создать.
Критичен. Потому что ЯВУ. Он итак компилится в менее эффективный код, чем код, написанный на ассемблере руками, так еще и либы с собой тянет. Так недолго и всю памяти скушать еще до того, как кончатся идеи для релиза.
По-моему Олег ставил несколько иную задачу, чем просто организовать звук с минимальным кодом.
Олег просил способ позвать как-то Play из машкода даже если нет ПЗУ-128. Я почитал код Play'а, и теперь уверенно могу присоединиться к тем, кто отговаривает Олега его использовать. Для начала, оно сильно "любит" фишки 48 BASIC - workspace и калькулятор, например. А еще оно поддерживает мертворожденный MIDI, что совсем не надо в либе для ЯВУ. И, да, в нем есть баги.
Barmaley_m
05.11.2014, 00:53
Для игр на ЯВУ достаточно.
Очень спорное и ничем не обоснованное утверждение.
Озвучки бейсик-игр оператором Play нет по одной простой причине - игра приобретает AY-звук (не шедеврального качества, надо сказать), но при этом теряет совместимость с 48к.
Причина возможная, но не единственно возможная. Ты же не залезешь в голову всем, кто думал реализовать озвучку игр или чего-то другого оператором PLAY, но отказался от этой идеи?
Критичен. Потому что ЯВУ.
И что? Даже на бейсике можно встретить программы с AY-музыкой (на прерываниях или через PAUSE 1), использующие ассемблерные плееры.
Если размер кода критичен - можно предложить пользователю на выбор несколько вариантов библиотеки, различных по своим возможностям, но различающихся по размеру кода. Это лучше, чем лишать его почти всех возможностей под предлогом того, что "размер критичен". Самая лучшая экономия получится, если вообще отказаться от AY-звука.
Он итак компилится в менее эффективный код, чем код, написанный на ассемблере руками, так еще и либы с собой тянет.
Предполагается, что звуковая либа будет написана на ассемблере, поэтому на размере кода за счет этой либы сэкономить не удастся, даже если писать всю программу на ассемблере целиком.
Alex Rider
05.11.2014, 22:30
Очень спорное и ничем не обоснованное утверждение.
Ну, во-первых, PLAY воспроизводит не только звуки, но и эффекты. Да, сделать музыку во время игрвого процесса с ним не получится, но озвучить всякие экшены можно вполне себе неплохо. А с учетом низкого порога вхождения это - хорошая альтернатива самописному плееру. Но, повторюсь, для озвучки событий и коротких музыкальных вставок на паузе, а не для музыкального сопровождения игрового процесса.
Причина возможная, но не единственно возможная.
Ok, я бы во-превых и в-единственных не стал озвучивать игру на BASIC'е оператором PLAY потому что она перестанет идти на машинах, на которых нет 128к. Может быть, есть и еще причины. Моего уровня кодинга хватит чтобы озвучить игру и ассемблерными вставками, но я не уверен, что все игрописатели на бейсике могут это сделать, а альтернатива PLAY в этом случая - либо BEEP, либо всякие глючные мегабейсики, резко отжирающие память своим рантаймом.
Если размер кода критичен - можно предложить пользователю на выбор несколько вариантов библиотеки, различных по своим возможностям, но различающихся по размеру кода.
Согласен с одним комментарием. Сначала надо сделать самое востребованное, а потом смотреть фидбэк и добавлять всякие опции.
Предполагается, что звуковая либа будет написана на ассемблере, поэтому на размере кода за счет этой либы сэкономить не удастся, даже если писать всю программу на ассемблере целиком.
Да. Но все зависит от универсальности этой либы. Если сделать максимально функционально, разработчик ради экономии памяти может плюнуть на либу и использовать BEEP или писать выод звука на ассемблере сам. Вариант с использованием команды PLAY из ПЗУ заведомо экономнее по памяти, но, как выяснилось, сильно геморройный. Опять же, плееры AY-музыки есть быстрые и длинные, есть медленные и короткие. Какой лучше включить в либу? Все? Хотя, нормальны трек, ЕМНИП, все равно существенно длиннее плеера, так что при его тспользовании уже сэкономить не получится (кстати, строки PLAY'а сильно короче компилированных музык).
Amstrad внесли изменения в ПЗУ 128 и 48 басиков и впендюрили это в +2, +2A, +3.
ПЗУ в +2 от 128 отличается только двумя надписями.
+3 перелопатили посеръёзней для работы с контроллером дисковода.
поэтому также поплыл синтаксис использования рамдиска.
сильно сомневаюсь что в ПЗУ моделей +2AB/+3 есть разница
Barmaley_m
07.11.2014, 17:18
А с учетом низкого порога вхождения это - хорошая альтернатива самописному плееру.
Что такое в твоем понимании "самописный плеер"? Кто его пишет? Автор библиотеки или автор прикладной программы? Если первое - то плеер такой же "самописный", как и оператор бейсика PLAY. Не Свыше же он возник, написанный кем-то непогрешимым.
Насчет низкого порога вхождения PLAY - это ты откуда взял? С чем сравнивал порог вхождения?
Стоит задуматься, почему оператором PLAY по сути никто не пользовался за весь период существования Spectrum 128 с 1986г, особенно после того, как этот стандарт стал базовым для ZX, а не факультативным. И почему, с другой стороны, такое широкое распространение получили ассемблерные плееры. Как при таком обилии 128-Only программ - оператором Play никто не пользуется?
ЯВУ - это не значит "язык для чайников". На ЯВУ должно быть возможно писать не только мелкие поделки, но и серьезные программы.
Моего уровня кодинга хватит чтобы озвучить игру и ассемблерными вставками, но я не уверен, что все игрописатели на бейсике могут это сделать,
А кто предлагает игрописателям на ЯВУ самим писать ассемблерные вставки для звука? Тут идет обсуждение как раз о том, чтобы автор _библиотеки_ для ЯВУ предоставил указанные ассемблерные процедуры, чтобы прикладной программист мог их просто использовать. В этом случае, почему бы сразу не предоставить нормальные процедуры без искусственных ограничений, накладываемых PLAY?
а альтернатива PLAY в этом случая - либо BEEP, либо всякие глючные мегабейсики, резко отжирающие память своим рантаймом.
Библиотека для ЯВУ - это и есть рантайм. Глючным он будет или нет - зависит от автора, но какие-то хотя бы мелкие ошибки скорее всего неизбежны. И этот рантайм неизбежно будет отжирать память. Хочешь избавиться от этого - откажись от возможностей рантайма. Самая экономная по памяти программа - это отсутствие программы. Вся память свободна. Профит. Заодно и глюков не будет.
Да. Но все зависит от универсальности этой либы. Если сделать максимально функционально, разработчик ради экономии памяти может плюнуть на либу и использовать BEEP или писать выод звука на ассемблере сам.
Никто и не предлагал изобретать "серебряную пулю" на все случаи жизни. Должен быть какой-то разумный компромисс между возможностями и затратами на их реализацию.
А вот эти постоянные отсылы к экономии памяти... К чему это? Не во всякой программе узким местом является именно память. Сколько я писал программ на спектруме, разной сложности, и даже создавал на Z80 встраиваемые приложения с ограниченной памятью - экономить приходилось, но не так, чтобы уж прямо совсем по дну скрести, чтобы отказываться от музыкального плеера ради лишней пары десятков байт. Не стоит раздувать из мухи слона.
Опять же, плееры AY-музыки есть быстрые и длинные, есть медленные и короткие. Какой лучше включить в либу? Все?
Конечно все. Прикладной программист использует наиболее подходящий для его программы, а компоновщик включит выбранный программистом плеер (или урезанную звуковую библиотеку с минимальными возможностями) в сборку проекта.
Более того, я бы в первую очередь включал в библиотеку ЯВУ те плееры, которые покороче (хотя и медленнее). В большинстве применений это лучший компромисс, и только там, где идет бескомпромиссная оптимизация по скорости, следует применять "быстрые" плееры.
(кстати, строки PLAY'а сильно короче компилированных музык).
Сильно короче? Сомневаюсь. Для воспроизведения одной ноты по всем трем каналам необходимо: сам оператор PLAY и как минимум 3 числа - аргументы. Так как числа в бейсике представлены и в ASCII, и в двоичной форме - то на каждый аргумент имеем 3 байта на ASCII + 6 байт двоичного представления + 1 байт на запятую или двоеточие. Итого около 31 байт на каждую строку Play. В компилированной музыке на каждую ноту тратится 3-4 байта на канал, итого 12 байт против 31.
Alex Rider
07.11.2014, 20:45
Что такое в твоем понимании "самописный плеер"? Кто его пишет? Автор библиотеки или автор прикладной программы?
А даже и не важно. Ибо писателю на ЯВУ сделать свой плеер практически нереально, а сторонний плеер, висящий на прерываниях, будет диктовать свои малопонятные ограничения типа расположения себя любимого, музыки, таблицы прерываний, режима прерывний.... Это все же сложнее, чем
BASIC.PLAY('A', 'B', 'C'); // Ни о чем думать не надо!
Как при таком обилии 128-Only программ - оператором Play никто не пользуется?
А где такое обилие 128k BASIC only программ? А нету его. Потому что 128-й бейсик дает только 2 преимущества перед 48 - это RAM-диск с малоюзабельным MERGE! и пресловутый PLAY. И ради этих преимуществ программисту придется отказаться от поддержки 48к и писать в убогом и глючном 128к-редакторе.
В этом случае, почему бы сразу не предоставить нормальные процедуры без искусственных ограничений, накладываемых PLAY?
Библиотеки для чего? Для проигрывания музыки? Да, с PLAY музыку играть сложно (но можно). Для озвучки событий? А сколько надо процедур для создания всех возможных эффектов? Делать эффекты через плеер музыки? Если надо полсотни эффектов, сколько автор игры проведен в музредакторе чтобы их сделать, скомпилить, разместить в памяти и играть с помощью универсального плеера?
Не во всякой программе узким местом является именно память.
Ну в построителе биоритмов - да, согласен. Но разработка хорошей игры на ЯВУ как правило упирается в память, ибо она не резиновая, а идей много.
Для воспроизведения одной ноты по всем трем каналам необходимо: сам оператор PLAY и как минимум 3 числа - аргументы. Так как числа в бейсике представлены и в ASCII, и в двоичной форме - то на каждый аргумент имеем 3 байта на ASCII + 6 байт двоичного представления + 1 байт на запятую или двоеточие. Итого около 31 байт на каждую строку Play
Садись, "два". PLAY играет стринги, в BASIC PLAY "A","B","C" займет 12 байт, из них только 3 байта, собственно, данных. В компилируемой программе (при условии ASCIIZ-строк) данные для такого PLAY займут 6 байт. Если использовать ПЗУшный PLAY, то на этом расход памяти кончится. А количество эффектов, которое им можно создать, конечно несравнимо меньше, чем их можно создать в музредакторе, но тоже огромно.
---------- Post added at 20:42 ---------- Previous post was at 20:32 ----------
Oleg N. Cher, Я поглядел повнимательнее - в PLAY-таки можно вломиться из машкода минуя всякие BASIC'овские парсинги строк. Но ограничений все равно хватает. Для начала, верно сказано, он блокирующий, да еще и запрещает прерывания на время своей работы (но BREAK опрашивает и зовет BREAK into PROGRAM если нажат). При ошибках в строках зовет 128k-обработчик ошибок, чем это черевато - не знаю. Буфер принтера портит нещадно. Уговорить его отказаться от воркспейса можно, но калькулятор все равно будет использовать. Ну и да, в разных ПЗУ может иметь разные адреса, а на компах без 128 Бэйсика работать не будет.
В принципе, его можно перетянуть и в ОЗУ, но тогда надо сильно пилить напильником - вырезать MIDI, переключалки ПЗУ, использолвание IY (если не запрещать прерывания).
И то, и то реально. Советом помогу, кодом - нет (только если примерами).
---------- Post added at 20:45 ---------- Previous post was at 20:42 ----------
Кстати, неплохих результатов можно добиться, если просто реализовать в либе отправку замаскированного множеством (если они поддерживаются) массива байт (али record'а) в регистры AY.
ПЗУ в +2 от 128 отличается только двумя надписями.
этого достаточно чтобы некоторый софт не работал. Например ксорки с ПЗУ. Кстати говоря эта проблема встречалась и во многих отечественных клонах которые позволяли себе вместо 1982 Sinclair... вставлять что-то типа Elbrus-001...
в BASIC PLAY "A","B","C" займет 12 байт
Сравни хотя бы с плотностью, понятностью и, самое главное, возможностями формата от Super Sonic (кстати, не взлетевшего, чего уж говорить про PLAY).
http://zxtunes.com/software.php?id=9
Barmaley_m
08.11.2014, 05:37
Ибо писателю на ЯВУ сделать свой плеер практически нереально,
ЯВУ и "для чайников" - это разные вещи, не надо их путать. Опытный программист, которому по плечу реализовать плеер на ассемблере, может быть, захочет реализовать на ЯВУ игру или что-нибудь еще. Почему нет? Экономия времени и усилий разработчика.
К тому же, зачем делать свой плеер на ассемблере, когда их и так полно? Просто обернуть плеер в библиотеку для ЯВУ - и все.
а сторонний плеер, висящий на прерываниях, будет диктовать свои малопонятные ограничения типа расположения себя любимого,
Объектные файлы и библиотеки обычно являются перемещаемыми. О каких ограничениях на расположение идет речь?
музыки, таблицы прерываний, режима прерывний....
Где ты вообще видел плеер, который накладывает такие жесткие ограничения? И даже если видел - кому он нужен, если есть нормальные плееры без подобных ограничений? Если плеер доступен в виде исходника - его можно скомпилировать на любой адрес. Компилированная музыка обычно тоже является перемещаемой. Прерывания - это вообще вне компетенции плеера, ими занимается вызывающая программа. У самого плеера есть только две точки входа: INIT и PLAY, первую надо вызвать перед проигрыванием, вторую вызывать каждое прерывание. Даже на бейсике можно встретить что-то типа:
10 RANDOMIZE USR 49152
20 RANDOMIZE USR 49155: PAUSE 1: GO TO 20
В случае размещения плеера по адресу 49152. Прекрасно играет. Что в этом сложного?
BASIC.PLAY('A', 'B', 'C'); // Ни о чем думать не надо!
Да, совсем ни о чем не надо думать... Кроме содержания строк для проигрывания. Чтобы получить не просто "пук", а интересный звук, надо совершенно неудобным образом составлять эти строки. В то время как в музыкальном редакторе можно быстро сделать нужный звуковой эффект с визуальной и звуковой поддержкой. Ну, не то, чтобы совсем быстро, но это реально самый легкий способ, легче в принципе не бывает.
А где такое обилие 128k BASIC only программ? А нету его. Потому что 128-й бейсик дает только 2 преимущества перед 48 - это RAM-диск с малоюзабельным MERGE! и пресловутый PLAY. И ради этих преимуществ программисту придется отказаться от поддержки 48к и писать в убогом и глючном 128к-редакторе.
Ну, это ты привел свои причины. А для других людей они могли быть другими. В частности - разочарование возможностями PLAY. Обычно всем возможностям находится применение, но этой так и не нашлось. Хотя задумывалась как "легкая, с малым порогом входа". И получилось, что все, кто делал AY-звук, делали его на ассемблере, пока трекеры не появились.
Библиотеки для чего? Для проигрывания музыки?
А почему нет? Разве ты не допускаешь мысли, что какой-нибудь начинающий программист, знающий, к примеру, си, но не знающий ассемблера, захочет написать игру с музыкой? Самый легкий путь - сделать музыку в трекере, скомпилировать, потом вызвать плеер из ЯВУ в соответствии с документацией. А ты что предлагаешь - через PLAY музыку делать?
Делать эффекты через плеер музыки? Если надо полсотни эффектов, сколько автор игры проведен в музредакторе чтобы их сделать,
А как иначе? Делать эффекты через PLAY - думаешь, будет быстрее? Чем проведение времени в музредакторе хуже проведения времени с компилятором ЯВУ? Сначала написать программу, потом ее подправить, потом скомпилировать, запустить, и так для каждого изменения? В музредакторе ты можешь сразу слышать результаты изменений параметров. Он явно более приспособлен для создания звука, в том числе эффектов, чем любая среда программирования.
скомпилить, разместить в памяти и играть с помощью универсального плеера?
На компиляцию тратятся секунды, и один раз, когда редактирование завершено. Размещение в памяти и проигрывание - те же затраты возникают в случае использования PLAY. От них никуда не уйдешь.
И вообще, какие могут быть сложности с размещением плеера в памяти, если плеер доступен в виде модуля библиотеки для ЯВУ? Размещает его в памяти компоновщик. Автоматически.
Но разработка хорошей игры на ЯВУ как правило упирается в память, ибо она не резиновая, а идей много.
Это ты в реальности наблюдал или просто предполагаешь?
Кстати, неплохих результатов можно добиться, если просто реализовать в либе отправку замаскированного множеством (если они поддерживаются) массива байт (али record'а) в регистры AY.
Ну вот это гораздо более дельная идея. Фактически, речь идет о простом и маленьком плеере спецэффектов на ассемблере. Что наводит на мысль взглянуть на продукцию в этом направлении таких опытных товарищей, как Shiru.
Oleg N. Cher
10.11.2014, 22:06
Я почитал код Play'а, и теперь уверенно могу присоединиться к тем, кто отговаривает Олега его использовать.Господа, спасибо за активное обсуждение. Уточню задачу. Я портирую игру Dark Woods (http://zx.oberon2.ru/forum/viewforum.php?f=26) с QuickBasic 4.5 для DOS. Всего в игре 7 звуковых схем:
' QB4.5
PLAY "o0l50c"
PLAY "MBo4l64fgbbcc"
PLAY "MBo5l64cdefgabo6l64cdefgab"
PLAY "MBo0l64bagfedc"
PLAY "MBo3l64cdefgbg"
PLAY "MBo1l64cdefgabo2cdefgabo3cdefgabo4cdefgabo5l5cl20c co4l8bagbl5a"
PLAY "MBo0l15ffgfg+fg+a"Стоит задача с минимальной сложностью, но с максимальной точностью воспроизвести подобие этих звуков на AY. Соответственно по аналогии я вспомнил про PLAY из Basic128. Полагаю, блокируемость звуков в проигрывателе ПЗУ не станет серьёзным препятствием. Ведь там скорее всего используется банальная задержка. Переписать это на прерывания, да и всё.
Для SDL-версии игры я вырезал эти звуки прямо из DosBox (Ctrl+F6 и потом - звук в wav-формате в папке DOSBox\capture). Но у меня не получается вырезать звук без пауз в начале и конце (не получается вырезать паузы до микросекунд с точностью), а даже маленькая пауза уже портит картинку игры со звуком. Есть программы для обработки звуков, которые сами ищут паузы (например, mp3DirectCut), но они заточены всё-таки не для этого.
Усложним вопрос. Какой библиотекой можно генерировать AY-подобные звуки для Windows/Linux (SDL)? Сейчас для вывода wav использую SDL_mixer.dll
Обидно, что код самой игры без UPX'а весит 30 кб, а с SDL_mixer и wav'ками получается около 500 кб.
Alex Rider
11.11.2014, 02:37
Переписать это на прерывания, да и всё.
Я думал про это, не получится так просто. PLAY оперирует с задержками 1/96 секунды, на прерываниях можно сделать только 1/48,5 ~ 1/60 в зависимости от модели. На первый взгляд, в PLAY придется шибко дофига перепилить чтобы от этого отвязаться.
Barmaley_m
11.11.2014, 15:20
Я портирую игру Dark Woods (http://zx.oberon2.ru/forum/viewforum.php?f=26) с QuickBasic 4.5 для DOS. Всего в игре 7 звуковых схем:
' QB4.5
PLAY "o0l50c"
PLAY "MBo4l64fgbbcc"
PLAY "MBo5l64cdefgabo6l64cdefgab"
PLAY "MBo0l64bagfedc"
PLAY "MBo3l64cdefgbg"
PLAY "MBo1l64cdefgabo2cdefgabo3cdefgabo4cdefgabo5l5cl20c co4l8bagbl5a"
PLAY "MBo0l15ffgfg+fg+a"Стоит задача с минимальной сложностью, но с максимальной точностью воспроизвести подобие этих звуков на AY.
И все? Ну тогда я могу предложить решения, основанные не на эмуляции, а на интерпретации аргументов PLAY Qbasic и конвертирования этого в какой-нибудь формат с последующим воспроизведением на AY.
Какой целевой язык? Допускается ли реализация функции "Play" на ассемблере?
Для SDL-версии игры я вырезал эти звуки прямо из DosBox (Ctrl+F6 и потом - звук в wav-формате в папке DOSBox\capture). Но у меня не получается вырезать звук без пауз в начале и конце (не получается вырезать паузы до микросекунд с точностью)
А вот это непонятно. Любой звуковой редактор должен решать эту проблему при условии, что из DosBox получается нормальный wav. Никаких форматов mp3 - компрессия должна выполняться после, а не до обработки.
Микросекундная точность для звука - это в принципе недостижимо, т.к. на частоте дискретизации 44100Гц промежуток времени между соседними отсчетами составляет ~23мкс. Кроме того, человек даже такую задержку не заметит на слух. Задержки в 20-50 миллисекунд (это в 1000 раз больше, чем микросекунды) на слух никак не будут восприняты. Когда я совмещал видеоряд и звук в тех случаях, когда синхронизация между ними была нарушена, точности даже в 100мс (1мс=1000мкс) хватало, и разницы никак не было заметно.
Усложним вопрос. Какой библиотекой можно генерировать AY-подобные звуки для Windows/Linux (SDL)?
Я бы делал свою, основанную на эмуляции AY или Atari Pokey (как автор mzpokeysnd.c я бы скорее всего выбрал второй вариант). Дело в том, что генерация прямоугольных звуковых сигналов - это нетривиальная задача. Чтобы обеспечить высокое качество звука, необходимо привлекать цифровые фильтры и некоторые особые, нестандартные их реализации.
Сделал в программе (http://zx-pk.ru/showpost.php?p=749196&postcount=2).
Хорошая программа. Немного топорный интерфейс. Нельзя сделать эффект с огибающей. А так - нормально. :)
Oleg N. Cher
13.11.2014, 04:18
И все? Ну тогда я могу предложить решения, основанные не на эмуляции, а на интерпретации аргументов PLAY Qbasic и конвертирования этого в какой-нибудь формат с последующим воспроизведением на AY.В принципе, склоняюсь к этому же! Нашёл тут такие интересные наработки Сергея Бульбы. На Дельфи. Нужно делать .dll или переписывать на Оберон.
YMEngine (http://bulba.untergrund.net/progr.htm)
YMEngine - это пакет исходных текстов на паскале, который позволяет легко добавлять эмуляцию YM2149F AY эмулятора в Ваши собственные программы. Если Вы считаете, что исходные тексты Ay_Emul слишком сложны для понимания, то можете смело воспользоваться опытом автора YMEngine (Sledge Hammer of Grinder), который сделал все за Вас. Вы можете скачать две демонстрации и две игры как примеры использования YM-Engine. Существует также адаптация пакета YMEngine к SDL с возможностью компиляции под Linux и другие платформы. Стоит отметить, что все пакеты YMEngine базируются на устаревшей версии Ay_Emul, в частности, не совсем правильно играются некоторые YM5 и YM6-файлы. Версия YMEngine под Windows содержит также спорные моменты в коде-обвязке WaveOut, унаследованные из старой версии Ay_Emul. Просьба, с любыми вопросами по пакетам YMEngine обращаться с начала к их авторам.Подчёркнутые моменты, правда, как-то не впечатляют. Сразу руки опускаются. :)
SquareTone (http://bulba.untergrund.net/progr.htm)
SquareTone - это портированный под Linux Ay_Emul v2.7 beta 3. Имеется простой консольный плеер SimplePlayer, а также плагин для популярного XMMS плеера. Данная версия может проигрывать YM и PT3 файлы. Все исходные тексты и инструкции прилагаются. Проект расчитан для компиляции во Free Pascal. Преимуществами данного пакета служат его платформонезависимость (SDL), а также то, что пакет основан на более новой версии Ay_Emul, чем YMEngine, а это автоматически избавляет от некоторых ошибок, унаследованных в YMEngine из более старого Ay_Emul. Автор - Martin Andersson.А вот здесь вариант - только для Linux (вывод через SDL).
Вариант Сергея Бульбы (как для Windows, так и для SDL), похоже, очень грамотный. Отпугивает отсутствие .dll/.so, декларируемая "устаревшесть" кода, отсутствие единостильной по интерфейсу работы с проигрыванием для различных платформ. И необходимость переписывать такую гору Дельфи-кода на Оберон, но это ладно, на крайнячок вариант. ;)
Какой целевой язык?Для Спека - любой. Ну кроме экзотики конечно. Асм. Для Win/Linux - Оберон или Си.
Допускается ли реализация функции "Play" на ассемблере?Для Спека - безусловно, на чём же ещё. А для Win/Linux - ну наверное тоже, но я не пробовал асмовые вставки использовать. Но наверно можно. Или объектник готовый прилинковать.
У меня двойная задача. Звук нужен для игры. Музыка (PT3) - нужна просто шобы было, для будущих проектов. Платформа - Спек, винда, линукс и Java microedition. Для последней можно юзать wav или midi.
А вот это непонятно. Любой звуковой редактор должен решать эту проблему при условии, что из DosBox получается нормальный wav.Просто получается звук с паузами. Я пробую вырезать их мышкой, но получается коряво. А хочется красиво сделать.
Я бы делал свою, основанную на эмуляции AY или Atari Pokey (как автор mzpokeysnd.c я бы скорее всего выбрал второй вариант). Дело в том, что генерация прямоугольных звуковых сигналов - это нетривиальная задача. Чтобы обеспечить высокое качество звука, необходимо привлекать цифровые фильтры и некоторые особые, нестандартные их реализации.Не возражаю, надо глянуть. Оно на Си написано? И для каких платформ?
Reobne неплохой звучок сделал, будем разрабатывать этот вариант. Reobne, спасибо! :)
Я тут PT2/3 засунул в SDCC http://zx-pk.ru/showthread.php?t=23473
может тебе это поможет чем
Oleg N. Cher
14.11.2014, 23:57
Reobne не только сделал звуки, но и адаптировал плеер специально для игры Dark Woods. Получилось весьма круто, послушайте! :)
Взялся делать маленький плеер, специально для DarkWoods.
Думаю код+данные должны получится не больше 400 байт.
Нужно давить кнопки 1-7. Причём быстро отпускать, а то первая нота всё портит.Думаю, Reobne не будет возражать против моего поста. :) Оберон-код, вызывающий воспроизведение звука:
(*
(c) Reobne, 2014
*)
MODULE TestSnd;
IMPORT Sound, B := Basic, Input, Asm;
VAR
key: Input.Key;
fx1, fx2, fx3, fx4, fx5, fx6, fx7: Sound.Fx;
PROCEDURE ProcIM2;
BEGIN
Sound.RunMe50Hz;
Asm.Code("LD IY,#0x5C3A");
Asm.Code("RST 0x38 "); (* Клавиши опрашиваются, таймер тикает *)
END ProcIM2;
BEGIN (*$MAIN*)
B.Init;
(* FX1 P=0 L=3 *)
B.DEFDATA(fx1, 3); B.DATA(...); (* Данные звуков поскипаны... *)
(* FX7 P=75+89=164 L=4+3+5*4+4=31 *)
(* ... *)
B.DEFDATA(fx7, 31); B.DATA3(...);
B.IM2PROC(ProcIM2);
Sound.Play(fx7);
LOOP
CASE Input.Read() OF
| "1": Sound.Play(fx1);
| "2": Sound.Play(fx2);
| "3": Sound.Play(fx3);
| "4": Sound.Play(fx4);
| "5": Sound.Play(fx5);
| "6": Sound.Play(fx6);
| "7": Sound.Play(fx7);
END;
END;
END TestSnd.Уважаемый Reobne, не сердись, что я публикую материалы, это на правах популяризации ZXDev. :)
Oleg N. Cher
15.11.2014, 00:04
Теперь возникает более чем насущный вопрос к уважаемому Shiru: каким кодом можно проиграть звуки, созданные в AY Sound FX Editor v0.4, под Windows(WinAPI), Linux и SDL(1.2 или 2)? Я, правда, не знаю, читает ли Shiru данный форум. Но отсутствие универсального, единого по интерфейсам плеера AY-музыки и звуковых AY-эффектов для этих платформ - пробел, требующий восполнения. А может я просто плохо искал?
Теперь возникает более чем насущный вопрос к уважаемому Shiru: каким кодом можно проиграть звуки, созданные в AY Sound FX Editor v0.4, под Windows(WinAPI), Linux и SDL(1.2 или 2)? Я, правда, не знаю, читает ли Shiru данный форум. Но отсутствие универсального, единого по интерфейсам плеера AY-музыки и звуковых AY-эффектов для этих платформ - пробел, требующий восполнения. А может я просто плохо искал?
Shiru здесь не пишет с 2005 года и скорее всего не читает.
а пакет ay sfx предназначен для создания звуков играемых на ау
как вариант можно прикрутить изолентой к YMEngine.
там кстати даже импорт есть из wav файлов.
Oleg N. Cher
15.11.2014, 18:23
Ну шож, раз я уж и так решился на доп. dll'ку SDL_mixer.dll, то можно вместо неё заюзать и SDL_AY.dll, вот только где её взять, может Vitamin запилит? ;)
Импорт да, заценил.
Reobne, позволь поинтересоваться технологией. Ты использовал для производства звуков импорт из wav, и насколько он хорош? Или это ручное перекодирование?
Вручную. Нашёл инфу по QBasic-Play. Все цифирки частот пальчиками набрал в программе #2 (http://zx-pk.ru/showpost.php?p=749196&postcount=2), пока не стало пищать похоже. Потом вручную переписал под Оберон. Так что никакой фантастики.
---------- Post added at 22:36 ---------- Previous post was at 22:30 ----------
Непонятно было соответствие октав. В книжке по QBasic написано:
O n - Устанавливает текущую октаву. Всего семь октав, от 0 до 6
Не понял какие частоты какой октаве соответствуют, поэтому пришлось подобрать на слух. Надеюсь угадал. :)
Книжка "Программируем на языке Quick BASIC 4.5 Г.Зельднер 1996". Не помню где скачал, нашёл в гугле.
Oleg N. Cher
16.12.2014, 02:07
Люди, у кого-нить есть трекерные музончики, звучащие как бипер Спектрума? Приаттачьте, плиз. Точно помню, у меня был такой музончик из игры Exolon.
Dark Woods продвигается, уже можно мочить монстров, стричь траву и сами монстры уже двигаются, правда, ещё не совсем так же как в оригинале. Мне тут пришло в голову, что вместо эмуляции чиповой музыки AY/YM можно попробовать сделать звуки игры в трекерном формате. В интересной статье Разработка игры в 115 кб — хаки, баги и досада (http://habrahabr.ru/post/244417/) упоминается миниатюрная библиотека для воспроизведения звука uFMOD (http://ufmod.sourceforge.net), воспроизводящая трекерную музыку в формате XM (можно сконвертить из STM, MOD или S3M), вобщем, похоже, что формат XM наиболее универсальный и многоголосый.
Вот я и подумал: вместо того чтобы возиться с эмуляцией чиповой музыки, можно звуки в Windows- и Linux- версии Dark Woods'а реализовать через трекерный формат XM и эту библиотеку. Я знаком с трекерными форматами, когда-то немного писал музыку. Там есть набор инструментов, которые при воспроизведении транспонируются на нужную высоту и смешиваются. Можно использовать инструмент "бипер спектрума" из готового музона.
Reobne, если возьмёшься делать звуки игры в виде XM-файлов - остальное с меня - интеграция библиотеки uFMOD в XDev и т.п. Создавать и редактировать мелодии можно в Scream Tracker 3, удобно; он, правда, досовый.
Вот, нашёл WHAMовские конверсии.
Создавать и редактировать мелодии можно в Scream Tracker 3, удобно; он, правда, досовый.
OpenMPT (http://openmpt.org/) для этого тоже подойдёт.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot