Перейти к содержимому

Рекомендуемые сообщения

Mega PCM - это мой новый DAC драйвер для Соник 1, написанный с нуля. У нас уже есть DAC-драйверы от JMan'а и S1HL, которые предоставляют массу дополнительных удобств по сравнению с родным драйвером Соник 1. Лично я долго время пользовался драйвером от JMan'а, так как лучше всего подходил моим целям. Однако, как и у всех Z80-драйверов, у него были неприятные недостатки и ограничения. По большому счету, все эти "недостатки" вызваны архитектурой железа: процессор Z80 очень ограничен в плане доступа к ROM-секции (доступ осуществляется через банки в 32 кб) и процессор вынужден посылать сигналы в DAC самостоятельно, что привносит в программирование драйвера немалые трудности.

 

В своем драйвере, я постарался избавиться от неприятных ограничений, которыми обладают другие Z80-драйверы. Я стремился сохранить высокую скорость воспроизведения звука, не смотря на то, что код теперь перегружен дополнительными функциями, которые пришлось внедрить, чтобы преодолеть известные ограничения. К моему удивлению, это удалось, в данный момент Mega PCM способен воспроизводить сэмплы быстрее максимальной частоты выхода DAC у звукового чипа YM2612 (~27 kHz), так что все еще остается место для новых возможностей! ;)

 

Возможности

 

  • Автоматическое переключение банков
    Про банки можно забыть, располагайте сэмплы где угодно, как угодно. Сэмплы больше не требуется выравнивать по границе в 32 КБ и следить за тем, чтобы они эту границу не пересекали.
     
  • Неограниченный размер сэмплов
    Размер сэмплов больше не ограничивается 32 КБ. "Mega PCM" может проигрывать сэмплы любого размера, так что сэмплы могут быть настолько большими, насколько это позволит размер РОМа.
     
  • Поддержка двух звуковых форматов
    "Mega PCM" поддерживает форматы 4-bit DPCM и 8-bit PCM.
    Первый широко применялся в Сониковских играх как основной формат для DAC-сэмплов, так он занимает в два раза меньше места чем обычный PCM. Однако, 8-bit PCM является "родным" форматом для звукового чипа YM2612 Сеги, он занимает больше места, но отличается более хорошим качеством.
     
  • Расширенное управление воспроизведением: Стоп, Пауза, Повтор, Приоритет
    "Mega PCM" может приостанавливать и продолжать воспроизведение звука, так что если вы поставите игру на паузу, длинные сэмплы не будут обрезаны после того как вы игру с паузы снимете.
    Имеется возможности повторять сэмпл (подходит для DAC-песен).
    Приоритет означает, что воспроизведение сэмпла не будет прерываться другими, пока он не доиграет до конца (подходит для голосов в игре)
     
  • Панорамирование звука
    Можно настроить воспроизведение сэмпла только в левом или в правом динамике.
     
  • До $5F слотов для сэмплов
    К примеру, драйвер JMan'а позволял не более $1F сэмплов из-за использования в коде 8-битных поинтеров. На самом деле, количество слотов ограничивается только размером памяти, которую занимает таблица сэмплов. Однако SMPS разрешает не более $5F слотов ($81-$CF).

 

Как установить Mega PCM

 

Если вы заинтересовались драйвером и хотите его опробовать, тогда вперед!

В этом гиде, я расскажу как вставить драйвер в хак и слегка улучшить SMPS в угоду потребностям нового драйвера. После этого можно с легкостью включать новые сэмплы в игру!

Этот гид также содержит маленький бонус: "Как воспроизводить голоса в игре" (см. ниже)

 

Для начала, скачайте этот архив: https://dl.dropbox.com/u/44757401/MegaPCM_Bin.7z

Это почти готовая к использованию конфигурация драйвера, включающая в себя сэмплы из Соник 3 (кроме timpani, версия С3 сюда не подходит). Скопируйте все файлы в папку с дизасемблом.

 

Гид написан для дизасембла Hivebrain, а также S1HS.

 

1. Замена старого драйвера и загрузчика

 

Откройте Sonic1.asm и найдите лейбел 'Kos_Z80', вы увидите следующий код:

 

Kos_Z80:	incbin	sound\z80_1.bin
	dc.w ((SegaPCM&$FF)8)
	dc.b $21
	dc.w (((EndOfRom-SegaPCM)&$FF)8)
	incbin	sound\z80_2.bin
	even

 

Удалите весь этот код, вместо этого вставьте:

 

	include	'MegaPCM.asm'

 

Теперь, перейдите к лейбелу 'SoundDriverLoad' и замените весь код на новый:

 

SoundDriverLoad:			; XREF: GameClrRAM; TitleScreen
	nop
	move.w	#$100,d0
	move.w	d0,($A11100).l
	move.w	d0,($A11200).l
	lea	(MegaPCM).l,a0
	lea	($A00000).l,a1
	move.w	#(MegaPCM_End-MegaPCM)-1,d1

@Load:	move.b	(a0)+,(a1)+
	dbf	d1,@Load
	moveq	#0,d1
	move.w	d1,($A11200).l
	nop
	nop
	nop
	nop
	move.w	d0,($A11200).l
	move.w	d1,($A11100).l
	rts
; End of function SoundDriverLoad

 

2. Изменение SMPS для работы с Mega PCM

 

Найдите лейбел 'sub_71B4C' (UpdateMusic в S1HS) и чуть ниже найдите этот участок кода:

 

		btst	#7,($A01FFD).l
	beq.s	loc_71B82
	move.w	#0,($A11100).l	; start	the Z80
	nop	
	nop	
	nop	
	nop	
	nop	
	bra.s	sub_71B4C
; ===========================================================================

loc_71B82:

 

Удалите или закомментируйте этот код.

 

 

Этот код проверял статус драйвера и не запускал движок SMPS в случае если драйвер устанавливал специальный флаг. Если флаг был задан, SMPS ждал пока драйвер не очистит его. "Mega PCM" такой флаг не нужен, эта проверка была специфична для старого драйвера.

 

 

Далее, найдите перейдите к лейбелу 'loc_71C88', найдите и удалите в коде эти команды:

 

		btst	#3,d0
	bne.s	loc_71CAC

 

 

Это был не очень хороший "костыль" (или "хак") для старого драйвера. Хак срабатывал для слотов $88-$8B и вызывал воспроизведение сэмпла $83 (timpani) с разным темпом. Новому драйверу не нужен такой костыль, так как такие вещи можно прописать в таблице сэмплов.

И да, 'loc_71CAC' теперь неиспользованный код, его тоже можно удалить.

 

 

Найдите лейбел 'loc_71C44', в самое начало кода добавьте:

 

		move.b	($A04000).l,d2
	btst	#7,d2
	bne.s	loc_71C44
	move.b	#$2A,($A04000).l

 

 

Mega PCM не настраивает YM-регистр 2A перед отправкой DAC-сигнала в цикле воспроизведения. Это освобождает от дополнительных затрат при доступе к YM. Драйвер полагается, что регистр 2A, настроенный перед началом воспроизведения, не будет сбит. Однако, SMPS во время своей работы посылает команды в другие регистры YM. Таким образом, SMPS должен восстанавливать номер регистра 2A перед возвращением шины Z80 и передачей управления драйверу.

 

 

Следующие изменения позволят Mega PCM приостанавливать воспроизведение сэмплов при паузе и продолжать после нее.

 

Найдите 'loc_71E7C' и почти в самом конце, перед командой BRA, вставьте:

 

		move.b	#$7F,($A01FFF).l; pause DAC

 

 

Воспроизведение сэмпла $7F вызывают команду "пауза".

 

 

Затем, перейдите к лейбелу 'loc_71EDC' и замените весь код до лейбела 'loc_71EFE' на это:

 

loc_71EDC:
	adda.w	d3,a5
	dbf	d4,loc_71EC4

	lea	$340(a6),a5
	btst	#7,(a5)
	beq.s	@UnpauseDAC
	btst	#2,(a5)
	bne.s	@UnpauseDAC
	move.b	#-$4C,d0
	move.b	$A(a5),d1
	jsr	sub_72722(pc)

@UnpauseDAC:
	move.b	#0,($A01FFF).l	; unpause DAC

 

 

Воспроизведение сэмпла $00 отменяет паузу.

 

 

И последний штрих. Будем вызывать команду "остановка", когда SMPS останавливает звук. Перейдите к лейбелу 'loc_725B6' (часть кода 'Sound_E4') и прямо перед "bra.w sub_729B6" добавьте:

 

		move.b	#$80,($A01FFF).l ; stop DAC playback

 

 

Воспроизведение сэмпла $80 останавливает сэмпл.

 

 

Вот и все!

 

Как пользоваться драйвером

 

Откройте файл MegaPCM.asm. Этот файл включает в РОМ скомпилированный Z80-код драйвера, а также таблицу сэмплов. Чтобы облегчить работу с таблицей, для формирования таблицы и включения сэмплов я создал макросы и константы, которые делают часть работы за вас.

 

Прокрутите код, пока не увидите эту часть:

 

; ---------------------------------------------------------------
; DAC Samples Table
; ---------------------------------------------------------------

DAC_Entry	$08, Kick, dpcm			; $81	- Kick
DAC_Entry	$08, Snare, dpcm		; $82	- Snare
DAC_Entry	$1B, Timpani, dpcm		; $83	- Timpani
dc.l	0,0					; $84	- 
dc.l	0,0					; $85	- 
dc.l	0,0					; $86	- 
dc.l	0,0					; $87	- 
DAC_Entry	$12, Timpani, dpcm		; $88	- Hi-Timpani
DAC_Entry	$15, Timpani, dpcm		; $89	- Mid-Timpani
DAC_Entry	$1B, Timpani, dpcm		; $8A	- Mid-Low-Timpani
DAC_Entry	$1D, Timpani, dpcm		; $8B	- Low-Timpani

MegaPCM_End:

; ---------------------------------------------------------------
; DAC Samples Files
; ---------------------------------------------------------------

IncludeDAC	Kick, bin
IncludeDAC	Snare, bin
IncludeDAC	Timpani, bin
even

 

Первый блок -- таблица DAC сэмплов, в которой указывается какой сэмпл играть и как его играть. Таблица будет загружена в память Z80 вместе с кодом драйвера.

 

Второй блок включает сами сэмплы в РОМ. Макрос 'IncludeDAC' ищет файл с заданными именем и расширением в папке 'dac' дизасембла, которую вы добавили из скачанного архива.

 

BIN-файлы обычно используются для DPCM-формата. Благодаря тому, что Mega PCM поддерживает этот формат, можно воспроизводить любые сэмплы из Сониковских игр без преобразования в формат PCM, что сделает файл в два раза тяжелее при том же качестве звука. Если вы хотите преобразовать PCM в DPCM, используйте конвертер JMan'а: http://selbi.se.funpic.de/s1sndcomp.exe

 

WAV-файл должны быть в формате "8-bit unsigned PCM". PCM звук может также быть представлен файлом с расширением 'RAW' (звуковой поток без заголовка), некоторые трекеры работают с этим форматом.

 

Частота звука может быть любой до ~30 kHz для PCM и ~32 kHz для DPCM (Да, внезапно с более сложным в декодировании форматом мой драйвер работает быстрее, похоже я слишком сильно оптимизировал код. Думаю ему помогает то, что он посылает 2 импульса DAC за цикл воспроизведения.)

В действительности, выходная частота DAC у YM2612 ограничивается ~27 kHz (вывод DAC производится за 288 внутренних такта YM), т.е. сэмплы не должны играть быстрее (превышение частоты приводит к потере части посылаемых DAC импульсов).

Однако, эмуляторы не эмулируют такую ситуацию и если вы не заботитесь о качестве звука на реальном железе, не обращайте на это внимание.

 

Таблица DAC сэмплов формируется макросом 'DAC_Entry', у которого следующий формат:

[asm]DAC_Entry <pitch>, <sample name>, <flags>[/asm]

Настоящий 8-байтовый формат, который использует "Mega PCM" вы можете увидеть в определении этого макроса.

 

Pitch (шаг) определяет, как быстро должен играть сэмпл. Чем ниже питч, тем быстрее он играет.

 

Sample Name (имя сэмпла) ссылается на название файла с сэмплом, которое задается макросом 'IncludeDAC'.

 

Flags (флаги) может принимать следующие флаги:

* pcm - задает формат PCM

* dpcm - задает формат DPCM

* loop - заставляет сэмпл повторяться

* pri - флаг приоритета, воспроизведение не будет прервано другими сэмплами. В этом режиме, драйвер отвечает только на команды "пауза"/"остановить"

* panL - воспроизвести только в Левом динамике

* panR - воспроизвести только в Правом динамике

* panLR - воспроизвести в обоих динамиках

 

Флаги можно комбинировать, например так: dpcm+panL+loop+pri

 

Замечание: если флаги панорамирования не заданы (panLR/L/R), "Mega PCM" не будет настраивать панорамирование, сохраняя настройки, сделанные SMPS.

 

Бонус: Как воспроизводить голоса в игре

 

Небольшой пример использования "Mega PCM" -- возможность воспроизводить голоса в игре. Я почти не видел этого в хаках, потому все доступные драйвера до этого момента были весьма неудобны в этом плане.

 

Скачайте небольшой клип: https://dl.dropbox.com/u/44757401/V_Hurt.wav

Поместите его в папку 'dac' дизасембла.

 

В самом конце файла MegaPCM.asm, прямо перед 'even', запилите:

	IncludeDAC	V_Hurt,wav

 

Теперь нужно добавить новый сэмпл в один из свободных слотов в таблице. Для примера, я выберу номер $84. Итак, нам нужно чтобы Mega PCM проиграл сэмпл в формате PCM и с приоритетом (иначе его перебьют DAC-сэмплы из музыки).

Если записать все в таблицу, она будет выглядить примерно вот так:

 

	DAC_Entry	$08, Kick, dpcm			; $81	- Kick
DAC_Entry	$08, Snare, dpcm		; $82	- Snare
DAC_Entry	$1B, Timpani, dpcm		; $83	- Timpani
DAC_Entry	$07, V_Hurt, pcm+pri		; $84	- 'Hurt' voice
dc.l	0,0					; $85	- <Free>
dc.l	0,0					; $86	- <Free>
dc.l	0,0					; $87	- <Free>
DAC_Entry	$12, Timpani, dpcm		; $88	- Hi-Timpani
DAC_Entry	$15, Timpani, dpcm		; $89	- Mid-Timpani
DAC_Entry	$1B, Timpani, dpcm		; $8A	- Mid-Low-Timpani
DAC_Entry	$1D, Timpani, dpcm		; $8B	- Low-Timpani

 

Готово! Теперь сэмпл можно воспроизвести. Однако, чтобы воспользоваться этим, потребуется добавить в игру новую функцию. Найдите код 'PlaySound' и прямо над ним вставьте:

 

; ---------------------------------------------------------------------------
; Subroutine to	play a DAC sample
; ---------------------------------------------------------------------------

PlaySample:
move.w	#$100,($A11100).l	; stop the Z80
@0	btst	#0,($A11100).l
bne.s	@0
move.b	d0,$A01FFF
move.w	#0,($A11100).l
rts

 

Новая функция позволяет воспроизводить DAC сэмплы по их номеру. Номер нового сэмпла - $84, воспроизведем его в игре!

 

Перейдите к 'Hurt_Sound' и замените:

	jsr	(PlaySound_Special).l

на

		moveq	#$FFFFFF84,d0
	jsr	PlaySample

 

Теперь Соник будет кричать, когда его бьют. Наслаждайтесь!

 

Исходный код Mega PCM

 

Mega PCM - драйвер с открытым исходным кодом, вот он:

https://dl.dropbox.com/u/44757401/MegaPCM_SourceCode.7z

 

Я принимаю любые идеи по улучшению ядра Mega PCM а также сообщения о багах. Вы можете свободно модифицировать драйвер для своих целей или создавать новые продукты на его основе.

 

Счастливых сэмплов!

Изменено пользователем vladikcomper
  • Лайк 4

Поделиться сообщением


Ссылка на сообщение

это невероятно сложно! я признателен автору за разработку драйвера ибо это даёт огромный простор для хакинга!

особенно радует

возможность воспроизводить голоса в игре

и кстати, ты специально выбирал дату релиза(00:00)?

Изменено пользователем Aslan

Поделиться сообщением


Ссылка на сообщение

Маленькая поправка к первому посту:

 

В секции "Как воспроизводить голоса в игре" была небольшая ошибка.

В примере неправильно заданы флаги воспроизведения (в таблице).

 

Исправлено.

Поделиться сообщением


Ссылка на сообщение

Очень и очень круто! Я знал что ты когда-нибудь напишешь звуковой драйвер, но чтоб настолько крутой....

Теперь мне будет удобно обращаться с PCM, так как раньше вообще не знал как их подгружать.

Ну что же, ждем хороших хаков с голосом.

Поделиться сообщением


Ссылка на сообщение

Отличный гид, но я сделал все по твоему гайду и у меня вылезла вот такая ошибка:Sonic 1.asm(39880): Unexpected case option outside case statement. Что делать? На всякий случай. Пользовался S1Hacking Studio и Полноценным SC 0.9.

Поделиться сообщением


Ссылка на сообщение

Отличный гид, но я сделал все по твоему гайду и у меня вылезла вот такая ошибка:Sonic 1.asm(39880): Unexpected case option outside case statement. Что делать? На всякий случай. Пользовался S1Hacking Studio и Полноценным SC 0.9.

Впервые вижу такую ошибку. Я тоже вставлял свой драйвер в S1HS2, только обычный.

Покажи мне эту строку номер 39880 в sonic1.asm, потому что из описания ошибки ничего не ясно.

Поделиться сообщением


Ссылка на сообщение

Впервые вижу такую ошибку. Я тоже вставлял свой драйвер в S1HS2, только обычный.

Покажи мне эту строку номер 39880 в sonic1.asm, потому что из описания ошибки ничего не ясно.

Незнаю, твой ДизАСМ не прав. Строка 39880 - это суброутина "Obj09_Move" строчка где ничего даже нет.

 


...move.w #0,d0
- строка 39880.
loc_1BA94:
...

Сейчас еще попробую на обычном ДизАСМ'е Соника 1.

Поделиться сообщением


Ссылка на сообщение

Ничего не вышло. Это не у меня проблемы с кодом - а у тебя. Если тебе не трудно, дай полалуйста линк с чистым дисасемблом где вставлен твой драйвер.

Поделиться сообщением


Ссылка на сообщение
Это не у меня проблемы с кодом - а у тебя.

Очевидно, раз я выложил этот драйвер публично, значит он рабочий. То же относится и к предложенному гиду по его установке. Гид был составлен на примере того, как я сам внедрял этот драйвер в Соник 1. Разве мог я составить гид, если не добился бы полноценной работы драйвера в игре? Разве мог я выложить драйвер, если он не работает? если с кодом проблемы?

 

Работоспособность драйвера я проверял различными тестами. Предложенная в гиде конфигурация с сэмплами из Соник 3 - проверенная, так как именно с ней я и работал при внедрении драйвера. Конечно, не исключено, что в драйвере еще присутствуют некоторые баги, которые могут выявится при его использовании. Если вы нашли баг -- смело сообщайте, при возможности давая его наиболее подробное описание. Однако перед этим я советую убедиться, что баг не вызван какой-либо ошибкой при применении гида или неправильной работой с драйвером.

 

Ivan YO, а теперь еще раз касаемо гида. Как я уже сказал, я писал его по образцу того, как внедрял свой драйвер. Вначале внедрял, работал над кодом, добивался полноценной работы, и по результатам всех своих действий написал гид. Тут действительно могла закрасться ошибка -- когда пишешь такой массивный пост, можно что-то, да упустить (хотя когда я закончил пост, я был уверен, что ничего не забыл -- действий по большому счету в гиде немного).

 

Однако, я решил еще раз проверить свой гид, так как ты заявляешь о его полной неработоспособности. Скомпилировалось с первого раза. Теперь я точно могу сказать - в гиде ошибок нет!

 

* * * *

 

Прилагаю дизасембл Соник 1 со вставленным "Mega PCM":

https://dl.dropbox.com/u/44757401/Sonic_1_with_MegaPCM.7z

Заодно, тем кто раздумывает, можно посмотреть как оно выглядит и работает ;) Кстати, сразу хотел предоставить дизасембл, но поленился. Спасибо, что напомнили.

 

Все точно по гиду из первого поста, добавления/изменения в SMPS (по второму пункту гида) я пометил, их можно найти, вбив в поиске ';++', код, который нужно удалить я просто закомментировал, чтобы было видно где он.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Очевидно, раз я выложил этот драйвер публично, значит он рабочий. То же относится и к предложенному гиду по его установке. Гид был составлен на примере того, как я сам внедрял этот драйвер в Соник 1. Разве мог я составить гид, если не добился бы полноценной работы драйвера в игре? Разве мог я выложить драйвер, если он не работает? если с кодом проблемы?

 

Работоспособность драйвера я проверял различными тестами. Предложенная в гиде конфигурация с сэмплами из Соник 3 - проверенная, так как именно с ней я и работал при внедрении драйвера. Конечно, не исключено, что в драйвере еще присутствуют некоторые баги, которые могут выявится при его использовании. Если вы нашли баг -- смело сообщайте, при возможности давая его наиболее подробное описание. Однако перед этим я советую убедиться, что баг не вызван какой-либо ошибкой при применении гида или неправильной работой с драйвером.

 

Ivan YO, а теперь еще раз касаемо гида. Как я уже сказал, я писал его по образцу того, как внедрял свой драйвер. Вначале внедрял, работал над кодом, добивался полноценной работы, и по результатам всех своих действий написал гид. Тут действительно могла закрасться ошибка -- когда пишешь такой массивный пост, можно что-то, да упустить (хотя когда я закончил пост, я был уверен, что ничего не забыл -- действий по большому счету в гиде немного).

 

Однако, я решил еще раз проверить свой гид, так как ты заявляешь о его полной неработоспособности. Скомпилировалось с первого раза. Теперь я точно могу сказать - в гиде ошибок нет!

 

* * * *

 

Прилагаю дизасембл Соник 1 со вставленным "Mega PCM":

https://dl.dropbox.c...with_MegaPCM.7z

Заодно, тем кто раздумывает, можно посмотреть как оно выглядит и работает ;) Кстати, сразу хотел предоставить дизасембл, но поленился. Спасибо, что напомнили.

 

Все точно по гиду из первого поста, добавления/изменения в SMPS (по второму пункту гида) я пометил, их можно найти, вбив в поиске ';++', код, который нужно удалить я просто закомментировал, чтобы было видно где он.

Все, спасибо огромное, щас испробую))))

Поделиться сообщением


Ссылка на сообщение

Значит, записав звук в формате wav, я могу вставить его в игру? А как можно заменить звук Сэй-Га (Say-Ga)?

Поделиться сообщением


Ссылка на сообщение

Ну написано же:

 

WAV-файл должны быть в формате "8-bit unsigned PCM". PCM звук может также быть представлен файлом с расширением 'RAW' (звуковой поток без заголовка)

 

GoldWave в помощь.

Поделиться сообщением


Ссылка на сообщение

Мне кажется, или я один вообще не понял, что это, и с чем его едят. Я понял лишь, что это очень полезная штука, и что это звуковой драйвер

Поделиться сообщением


Ссылка на сообщение

Почему? Я вставил эти нужные мне сэмплы (сэмпли я использовал уже. Они нормальные, нужного формата)

Но они в музыке не воспроизводятся.

Вот код:


; ---------------------------------------------------------------
; DAC Samples Table (Таблица DAC сэмплов)
; ---------------------------------------------------------------

DAC_Entry			 $06, Kick, dpcm ; $81 - Kick
DAC_Entry   		  $08, Snare, dpcm ; $82 - Snare
DAC_Entry   		  $1B, Timpani, dpcm ; $83 - Timpani
DAC_Entry			 $0A, V_Hurt, pcm+pri ; $84 - Звук БОЛИ
dc.l 0,0   				;$85 - Clap S3
DAC_Entry   		  $05, Tom, dpcm ; $86 - Mid Tom S3
dc.l 0,0   				;$87 - MidBongo S2
DAC_Entry   		  $12, Timpani, dpcm ; $88 - Hi-Timpani
DAC_Entry   		  $15, Timpani, dpcm ; $89 - Mid-Timpani
DAC_Entry   		  $1B, Timpani, dpcm ; $8A - Mid-Low-Timpani
DAC_Entry   		  $1D, Timpani, dpcm ; $8B - Low-Timpani
dc.l 0,0
dc.l 0,0
DAC_Entry   		  $08, Crash, dpcm ; $8F  - Kick Crash Сymbal S3
DAC_Entry   		  $1A, CSnare, dpcm ; $90  - Credits Snare S3
DAC_Entry   		  $1A, CNormKick, dpcm ; $91  - Credits Normal Kick S3
DAC_Entry   		  $18, CCrash, dpcm ; $92  - Credits Crash S3
DAC_Entry   		  $0E, CHey, dpcm ; $93  - Credits "Hey" Kick S3
dc.l 0,0
dc.l 0,0
dc.l 0,0
dc.l 0,0
dc.l 0,0
dc.l 0,0
DAC_Entry   		  $0F, GoSnare, dpcm ; $9A  - "Go" Snare S3
DAC_Entry   		  $10, Tom, dpcm ; $9B  - Low Mid Tom S3


MegaPCM_End:

; ---------------------------------------------------------------
; DAC Samples Files (Файлы DAC сэмплов)
; ---------------------------------------------------------------

IncludeDAC Kick, bin
IncludeDAC Snare, bin
IncludeDAC Timpani, bin
IncludeDAC V_Hurt,wav ;++
IncludeDAC Crash, bin
IncludeDAC CSnare, bin
IncludeDAC CNormKick, bin
IncludeDAC CHey, bin
IncludeDAC GoSnare, bin
IncludeDAC Tom, bin
IncludeDAC CCrash, bin
even

Может я что-то делал не так?

Изменено пользователем Ivan YO

Поделиться сообщением


Ссылка на сообщение

Ivan YO, в этом коде все верно, тем более если это компилируется. Макросы (DAC_Entry и IncludeDAC) в любом случае настроят файлы и таблицу без ошибок.

 

Это ты уже в своем хаке пытаешься делаешь? Если да, то два вопроса:

Не забыл заменить функцию SoundDriverLoad?

Не был ли до этого как-то модифицирован сам движок SMPS?

Поделиться сообщением


Ссылка на сообщение

Ivan YO, в этом коде все верно, тем более если это компилируется. Макросы (DAC_Entry и IncludeDAC) в любом случае настроят файлы и таблицу без ошибок.

 

Это ты уже в своем хаке пытаешься делаешь? Если да, то два вопроса:

Не забыл заменить функцию SoundDriverLoad?

Не был ли до этого как-то модифицирован сам движок SMPS?

1. Я (потом уже) сделал саунд тесты по $FF.

2. Я немного поэкспериментировав, сконвертил свои сэмплы в формат pcm. И все зароботало. Незнаю, но dpcm он не принимал.

3. Я все делал по инструкции.

Поделиться сообщением


Ссылка на сообщение

1. Я (потом уже) сделал саунд тесты по $FF.

2. Я немного поэкспериментировав, сконвертил свои сэмплы в формат pcm. И все зароботало. Незнаю, но dpcm он не принимал.

3. Я все делал по инструкции.

Интересно, почему не работал DPCM. Если не сложно, скинь мне в личку MegaPCM.asm и сэмплы (нерабочие DPCM и сконверченные PCM), хотелось бы их проверить и установить причину проблемы.

Поделиться сообщением


Ссылка на сообщение

Драйвер крутой! Только вот, можно как-нибудь программно увеличить громкость PCM?

Изменено пользователем KameKAgZZe

Поделиться сообщением


Ссылка на сообщение

Драйвер крутой! Только вот, можно как-нибудь программно увеличить громкость PCM?

Если не поправит меня Vladickomper, я на 90% думаю что нельзя никак через АСМ. Но можно ее увеличить в любом музыкальном редакторе. Я увеличивал громкость сэмплов через GoldWave.

Поделиться сообщением


Ссылка на сообщение

Почему? Я вставил эти нужные мне сэмплы (сэмпли я использовал уже. Они нормальные, нужного формата)

Но они в музыке не воспроизводятся.

Я немного поэкспериментировав, сконвертил свои сэмплы в формат pcm. И все зароботало. Незнаю, но dpcm он не принимал.

 

Вобщем, я основательно изучил файлы, которые ты мне скинул в личку и выявил, что было на самом деле. Пожалуй, отвечу здесь.

 

Честно говоря, твои объяснения меня немало запутали, и я ожидал нечто невообразимое. Как оказалось, под "сконвертил свои сэмплы в формат pcm" ты имел ввиду что просто сменил флажок dpcm на pcm в таблице, а под "в музыке не воспроизводятся" имелось "воспроизводятся, но звук битый". Только когда сам это увидел, все встало на места.

 

Объясняй по-нормальнее. Плиз?

 

Вобщем, все в порядке. А сэмплы действительно были не в том формате. Они были PCM, а ты хотел воспроизвести их как DPCM. Ну и естественно, звук был битый. И правильно ты сделал, что потом исправил в таблице формат. Когда сэмплы стали играть в правильном формате, все заработало. Так что, все в порядке, драйвер работает исправно.

 

Кстати, если кто хочет достать все оригинальные сэмплы из S3K и даже S2, их можно найти в SK-драйвере от flamewing'а: http://www.mediafire...hje7jbl3ux090ab

 

В этой таблице перечислены названия всех сэмплов S3K: http://info.sonicret...FSonic_3D_Blast

 

Вот еще хороший топик: http://forums.sonicr...showtopic=18619

(Правда должен предупредить, сэмплы в некоторых играх используют немного модифицированный формат DPCM, тогда звук будет искаженным)

 

Драйвер крутой! Только вот, можно как-нибудь программно увеличить громкость PCM?

 

Программно кстати можно. На будущее, если я задумаю выпустить новый Mega PCM, возможно, там будет функция изменения громкости.

 

Чтобы изменить громкость звука, нужно домножить выдаваемый PCM-сигнал на некий коэффициент:

a*k, где k - коэффициент, а - PCM-сигнал.

При k>1 звук станет громче.

При k<1 звук станет тише.

 

Придется модифицировать код драйвера. В случае с Z80 реализация такого алгоритма осложняется тем, что в процессоре банально отсутствуют команды умножения и деления, так что придется ограничиться командами побитового сдвига, реализующими умножение/деление на одну из степеней двойки (2, 4, 8, 16 и т.д.)

Другое препятствие -- стоит нагрузить код дополнительной логикой, сразу же падает скорость воспроизведения звука, т.е. увеличивается интервал между отправлением сигнала в DAC (напомню, что эта работа лежит на суровых плечах Z80, очень неудобно!)

 

Впрочем, я хочу реализовать эту идею и новом переиздании Mega PCM. Может быть. Если оно случится. Можно будет динамически управлять уровнем громкости.

 

 

 

Думаю, уровнем громкости тебе управлять не нужно, ты хочешь просто сделать погромче и оставить все как есть. В таком случае сделай как говорит Ivan YO ;)

Поделиться сообщением


Ссылка на сообщение
Программно кстати можно. На будущее, если я задумаю выпустить новый Mega PCM, возможно, там будет функция изменения громкости.

 

Чтобы изменить громкость звука, нужно домножить выдаваемый PCM-сигнал на некий коэффициент:

a*k, где k - коэффициент, а - PCM-сигнал.

При k>1 звук станет громче.

При k<1 звук станет тише.

 

Придется модифицировать код драйвера. В случае с Z80 реализация такого алгоритма осложняется тем, что в процессоре банально отсутствуют команды умножения и деления, так что придется ограничиться командами побитового сдвига, реализующими умножение/деление на одну из степеней двойки (2, 4, 8, 16 и т.д.)

Другое препятствие -- стоит нагрузить код дополнительной логикой, сразу же падает скорость воспроизведения звука, т.е. увеличивается интервал между отправлением сигнала в DAC (напомню, что эта работа лежит на суровых плечах Z80, очень неудобно!)

 

Впрочем, я хочу реализовать эту идею и новом переиздании Mega PCM. Может быть. Если оно случится. Можно будет динамически управлять уровнем громкости.

tumblr_lltzgnHi5F1qzib3wo1_400.jpgНУ ТОГДА... ФЛАГ ТЕ В РУКИ =) .

Вобщем, я основательно изучил файлы, которые ты мне скинул в личку и выявил, что было на самом деле. Пожалуй, отвечу здесь.

 

Честно говоря, твои объяснения меня немало запутали, и я ожидал нечто невообразимое. Как оказалось, под "сконвертил свои сэмплы в формат pcm" ты имел ввиду что просто сменил флажок dpcm на pcm в таблице, а под "в музыке не воспроизводятся" имелось "воспроизводятся, но звук битый". Только когда сам это увидел, все встало на места.

 

Объясняй по-нормальнее. Плиз?

"Сконвертил в pcm", это значит что я не просто поменял флажок, а засунул сэмпл в GoldWave, импортировав его как формат RAW, 8000 KHz8 bit и экспортировав уже в формате 8 bit Unsigned Mono pcm в ту же папку с тем же именем, а потом уже поменял флажок в драйвере. И кстати, сэмплы там были изначально формата dpcm. Я пробовал просто поменять флажок, но это ничего не дало. Там в архиве лежали сэмплы оригинальные и сконверченные в pcm.

Поделиться сообщением


Ссылка на сообщение

"Сконвертил в pcm", это значит что я не просто поменял флажок, а засунул сэмпл в GoldWave, импортировав его как формат RAW, 8000 KHz8 bit и экспортировав уже в формате 8 bit Unsigned Mono pcm в ту же папку с тем же именем, а потом уже поменял флажок в драйвере. И кстати, сэмплы там были изначально формата dpcm. Я пробовал просто поменять флажок, но это ничего не дало. Там в архиве лежали сэмплы оригинальные и сконверченные в pcm.

Еще до этого я взял оригинальные сэмплы S3K по первой ссылке, которую давал в прошлом посте. Все они заведомо в формате DPCM. Для проверки поставил их вместо тех же сэмплов формата PCM. Воспроизводилось как и должно.

Кстати, а архиве я оригинальные сэмплы не нашел. У тебя часть сэмплов, что в BIN-файлах записаны в формате PCM, а в MegaPCM.asm числятся как DPCM-сэмплы. Я думаю, ты просто перепутал форматы. Сейчас же все работает?

 

 

Если хочешь могу скинуть тебе твой измененный набор сэмплов, где С3-сэмплы в оригинальном DPCM-формате. Но это завтра, сегодня уже нет сил раздобыть и заменить некоторые сэмплы (для проверки я менял не все, а лишь часть из них).

Поделиться сообщением


Ссылка на сообщение

Для тех, кто не понял как конвертить PCM в DPCM (или наоборот) конвертером от Jman'а, который был выклан сюда Vladikcomper'ом:

 

(-d/-c) <input file> <num of bytes> <output file>

 

-c - PCM конвертировать в DPCM.

-d - DPCM конвертировать в PCM.

<input file> - путь к файлу, который Вы хотите конвертировать.

<num of bytes> - количество байтов в DEC (писать значение не в HEX!) в файле, который Вы собираетесь конвертировать.

<output file> - путь к файлу, на который Вам надо сохранить сконвертированный файл.

 

Все это прописывается в командной строке. И да, не забудьте ввести с самого начала в командной строке запуск самого конвертера (т.е. ввести путь к самому конвертеру, чтобы его запустить.).

 

Пример:

 

D:\S1HackingStudio_v20\S1SNDCOMP\s1sndcomp.exe -c D:\S1HackingStudio_v20\SourceCode\dac\V_Hurt.wav 12332 D:\S1HackingStudio_v20\SourceCode\dac\V_Hurt.bin

 

Тут показана конвертация голоса Соника в DPCM.

 

P.S.: можно сделать при помощи батника конвертацию автоматизированным, чтобы не прописывать каждый раз пути и размер. (Я, к сожалению, не знаю как сделать, чтобы батник автоматически распознавал размер и путь PCM файла, который был перетащен мышкой к нему.)

Поделиться сообщением


Ссылка на сообщение
Я, к сожалению, не знаю как сделать, чтобы батник автоматически распознавал размер и путь PCM файла, который был перетащен мышкой к нему

 

Одним батником тут не обойдешься.

Поделиться сообщением


Ссылка на сообщение

1. Как узнать правильную скорость воспроизведения сэмплов?

2. Sonic 1 "Mega PCM" позволяет воспроизводить сэмлы по их номерам. КАК сделать так, чтобы на Scap Brain 3 играла мелодия pcm? Я уже неделю над этим бьюсь.

Поделиться сообщением


Ссылка на сообщение

1. Как узнать правильную скорость воспроизведения сэмплов?

2. Sonic 1 "Mega PCM" позволяет воспроизводить сэмлы по их номерам. КАК сделать так, чтобы на Scap Brain 3 играла мелодия pcm? Я уже неделю над этим бьюсь.

1. Об этом Vladikcomer не подумал или забыл. Думаю, он сделает это в следующем релизе, чтобы можно было ставить стандартные скорости воспроизведения, типо 8000 hz, 16000 hz, 22050 hz, 32000 hz, и т.д. (на счет следующих, которые после последнего, не знаю, если только он еще глубже оптимизирует драйвер, чтобы играть сэмпл с такой скоростью)

2. С самого начала Level_GetBgm поставь:

cmpi.b #1,($FFFFFE10).w ; SBZ уровень?

beq.s Level_PlayBgm4 ; перейти, если да

 

Весь код Level_PlayBgm3 замени на:

bsr.w PlaySound

bra.s Level_PlayBgm5 ; обойти воспроизведение сэмпла уровня SBZ

; ===========================================================================

 

Level_PlayBgm4:

moveq #$FFFFFFE4,d0 ; остановить заранее звучание мелодии тайтл-скрина, чтобы не остановилось воспроизведение сэмпла

jsr PlaySound

move.b #2,($FFFFF62A).w; выполнить в VBlank роутину 2, чтобы выполнить UpdateSound, т.е. там и остановится мелодия

bsr.w DelayProgram ; запустить VBlank

moveq #$FFFFFF??,d0 ; ?? - номер твоего семпла

jsr PlaySample ; воспроизвести этот семпл

 

Level_PlayBgm5: move.b #$34,($FFFFD080).w ; загрузить объект тайтл-кард

 

Это только отдельно для SBZ.

 

P.S.: можно сделать так, чтобы можно было играть для всех уровней сэмплы. Но это уже нужно писать совсем другой код, и придется составить таблицу где будут записаны номера семплов для каждого уровня.

Изменено пользователем Алмаз
  • Лайк 2

Поделиться сообщением


Ссылка на сообщение

1. Об этом Vladikcomer не подумал или забыл. Думаю, он сделает это в следующем релизе, чтобы можно было ставить стандартные скорости воспроизведения, типо 8000 hz, 16000 hz, 22050 hz, 32000 hz, и т.д. (на счет следующих, которые после последнего, не знаю, если только он еще глубже оптимизирует драйвер, чтобы играть сэмпл с такой скоростью)

2. С самого начала Level_GetBgm поставь:

 

 

Весь код Level_PlayBgm3 замени на:

 

 

Это только отдельно для SBZ.

 

P.S.: можно сделать так, чтобы можно было играть для всех уровней сэмплы. Но это уже нужно писать совсем другой код, и придется составить таблицу где будут записаны номера семплов для каждого уровня.

Я вставил твой код, заработало на 3 - ем акте SBZ, а на остальных актах SBZ - illegular instruction. Что делать? Ну SBZ это-ж вроде еще LZ4?

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Я вставил твой код, заработало на 3 - ем акте SBZ, а на остальных актах SBZ - illegular instruction. Что делать? Ну SBZ это-ж вроде еще LZ4?

Ой, ошибся, поторопился.

Замени весь код в Level_GetBgm на:

tst.w ($FFFFFFF0).w

bmi.w loc_3946

moveq #0,d0

move.b ($FFFFFE10).w,d0

cmpi.b #5,($FFFFFE10).w ; is level SBZ?

bne.s @skip ; if not, branch

cmpi.b #2,($FFFFFE11).w ; is level FZ?

bne.s Level_PlayBgm4 ; if not, branch

bra.s Level_BgmNotLZ4 ; if yes, branch

@skip cmpi.w #$103,($FFFFFE10).w ; is level SBZ3?

beq.s Level_PlayBgm4 ; if yes, branch

  • Лайк 3

Поделиться сообщением


Ссылка на сообщение

Спасибо огромное. Все заработало. Только мне нужно было поставить pcm только на SB3 а не на весь SPZ, но я уже это поставил. + 2 балла тебе.

 

Владикомпер, ты говорил что сэмплы после паузы будут продолжать воспроизводиться, а у меня после паузы нету звука, почему?

Поделиться сообщением


Ссылка на сообщение

Владикомпер, ты говорил что сэмплы после паузы будут продолжать воспроизводиться, а у меня после паузы нету звука, почему?

 

Дело в SMPS. Как было написано в первом посте про флаги:

 

Если флаги панорамирования не заданы (panLR/L/R), "Mega PCM" не будет настраивать панорамирование, сохраняя настройки, сделанные SMPS.

 

"Настройки, сделанные SMPS". А если SMPS ничего не воспроизводит, то он панорамирование DAC он настраивать не будет, то есть после паузы аудио на самом деле будет играть, но оно останется заглушенным.

 

Исправить это просто: нужно сделать так, чтобы Mega PCM сам настраивал панорамирование. Для этого достаточно добавить panLR к флагам твоей DAC-песни.

 

Кстати, скоро я напишу свой гид про воспроизведение DAC-песен с Mega PCM, где постараюсь реализовать это наиболее удобным способом и без "костылей". Перед этим будет еще один важный гид "как улучшить качество воспроизведения сэмплов". Для песен это критично. Из-за того, как часто Соник 1 прeрывает Z80, качество звука заметно падает, появляются шумы. Зато если усовершенствовать SMPS и исправить процедуры VBlank'а, результат получится достойный.

  • Лайк 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×