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

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

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:

 

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

 

 

  Показать спойлер

 

 

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

 

		btst	#3,d0
	bne.s	loc_71CAC

 

 

  Показать спойлер

 

 

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

 

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

 

 

  Показать спойлер

 

 

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

 

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

 

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

 

 

  Показать спойлер

 

 

Затем, перейдите к лейбелу '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

 

 

  Показать спойлер

 

 

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

 

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

 

 

  Показать спойлер

 

 

Вот и все!

 

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

 

Откройте файл 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.

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


Ссылка на сообщение
  В 6/12/2012 в 09:01, Ivan YO сказал:

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

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

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

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


Ссылка на сообщение
  В 6/12/2012 в 10:34, vladikcomper сказал:

Впервые вижу такую ошибку. Я тоже вставлял свой драйвер в 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

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


Ссылка на сообщение
  В 6/13/2012 в 10:43, vladikcomper сказал:

Очевидно, раз я выложил этот драйвер публично, значит он рабочий. То же относится и к предложенному гиду по его установке. Гид был составлен на примере того, как я сам внедрял этот драйвер в Соник 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?

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


Ссылка на сообщение
  В 6/18/2012 в 18:03, vladikcomper сказал:

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

 

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

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

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

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

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

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

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


Ссылка на сообщение
  В 6/19/2012 в 10:31, Ivan YO сказал:

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

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

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

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

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


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

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

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

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


Ссылка на сообщение
  В 6/21/2012 в 13:20, KameKAgZZe сказал:

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

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

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


Ссылка на сообщение
  В 6/16/2012 в 10:29, Ivan YO сказал:

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

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

  В 6/19/2012 в 10:31, Ivan YO сказал:

Я немного поэкспериментировав, сконвертил свои сэмплы в формат 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.

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


Ссылка на сообщение
  В 6/21/2012 в 18:34, Ivan YO сказал:

"Сконвертил в 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? Я уже неделю над этим бьюсь.

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


Ссылка на сообщение
  В 7/5/2012 в 13:42, Ivan YO сказал:

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

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


Ссылка на сообщение
  В 7/5/2012 в 15:14, Алмаз сказал:

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

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


Ссылка на сообщение
  В 7/5/2012 в 16:29, Ivan YO сказал:

Я вставил твой код, заработало на 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 балла тебе.

 

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

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


Ссылка на сообщение
  В 7/5/2012 в 20:23, Ivan YO сказал:

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

 

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

 

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

 

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

 

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

 

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

  • Лайк 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

×
Этот сайт использует кукисы, стораджи и подобное. Бла, бла, бла.
Более подробно о том как мы их используем можно прочитать в нашей политике конфиденциальности.