Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > Библиотеки

Библиотеки Сторонние библиотеки для Blitz

Ответ
 
Опции темы
Старый 18.09.2010, 16:19   #1
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Получение свойств WAV-файла

;code for B3D:	impersonalis (icq 11-999-51-51)
;info:			https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

Function imp_MusProperty_GetByteStr$(bank%,start%,l%=4)
	Local s$=""
	Local i%
	Local endi%=start+(l-1)
	For i=start To endi
		s=s+Chr(PeekByte(bank,i))
	Next
	Return s
End Function

Function imp_MusProperty_Short2Int%(a%)
	Local M1%=%00000000000000001000000000000000
	Local M2%=%11111111111111110000000000000000
	Local D%=a And M1
	If D
		a = a Xor M2
	EndIf
	Return a
End Function

Type T_imp_MusProperty_Wav
	Field ChunkID$
	Field ChunkSize%
	Field Format$
	Field Subchunk1ID$
	Field Subchunk1Size%
	Field AudioFormat%
	Field NumChannels%
	Field SampleRate%
	Field ByteRate%
	Field BlockAlign%
	Field BitsPerSample%
	Field Subchunk2ID$
	Field Subchunk2Size%
End Type

Function imp_MusProperty_WavFileProc.T_imp_MusProperty_Wav(filename$)
	Local WP.T_imp_MusProperty_Wav=New T_imp_MusProperty_Wav
	
	Local i%
	Local file%=ReadFile(filename)
	If file=0
		RuntimeError "Cannot open "+filename
	EndIf
	Local RIFF_chunk%=CreateBank(12)
	Local fmt_subchunk%=CreateBank(24)
	Local data_subchunk%=CreateBank(8)
	ReadBytes(RIFF_chunk,file,0,BankSize(RIFF_chunk))
	ReadBytes(fmt_subchunk,file,0,BankSize(fmt_subchunk))
	ReadBytes(data_subchunk,file,0,BankSize(data_subchunk))
	CloseFile(file)
	WP\ChunkID=imp_MusProperty_GetByteStr(RIFF_chunk,0)
	WP\ChunkSize=PeekInt(RIFF_chunk,4)
	WP\Format=imp_MusProperty_GetByteStr(RIFF_chunk,8)
	WP\Subchunk1ID=imp_MusProperty_GetByteStr(fmt_subchunk,0)
	WP\Subchunk1Size=PeekInt(fmt_subchunk,4)
	WP\AudioFormat=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,8))
	WP\NumChannels=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,10))
	WP\SampleRate=PeekInt(fmt_subchunk,12)
	WP\ByteRate=PeekInt(fmt_subchunk,16)
	WP\BlockAlign=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,20))
	WP\BitsPerSample=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,22))
	WP\Subchunk2ID=imp_MusProperty_GetByteStr(data_subchunk,0)
	WP\Subchunk2Size=PeekInt(data_subchunk,4)
	FreeBank(RIFF_chunk)
	FreeBank(fmt_subchunk)
	FreeBank(data_subchunk)
	
	Return WP
End Function

Function imp_MusProperty_IsWav%(WP.T_imp_MusProperty_Wav)
	Return WP\Format="WAVE"
End Function
Для многих очевидный код, но кому-то пригодится. Основное применение: функции ChannelPitch channel_handle, hertz и SoundPitch sound_variable, hertz принимают в качестве hertz частоту дискретизации воспроизводимого звука - это логично но может порвать мозг в некторых случаях. Например, у вас есть wav-файл с записанной в него "чистой" синусойдой в 2КГц, какой hertz нужно передать в ChannelPitch, чтобы услышть звук частотой 10Кгц? 5? Фиг. Итоговая формула (опуская дефекты оконечной звуковой аппаратуры и психофизиологические особенности восприятия конкретного индивида и свойства среды распространения сигнала):
СлышимаяЧастота=ЧастотаЗаписанногоЗвука*ЧастотаДискретизацииЗвукаВФайле*hertz
Вот ЧастотаДискретизацииЗвукаВФайле нам и надо узнать. Причём сам гадский Блитц её знает, т.к. воспроизводит звук по умолчанию верно, но с нами делиться не хочет. Возможно, конечно, за воспроизведение отвечают кодеки, доставшиеся Марку в виде объектных файлов... пофиг
Что мы можем сделать:
взываем imp_MusProperty_WavFileProc с параметром filename$ равным пути до wav-файла и его имени с расширением. На выходе получаем объект типа T_imp_MusProperty_Wav, который можем чекнуть на валидность функцией imp_MusProperty_IsWav - проверим является ли файл WAV-ом. Удаляем объект обычным деструкторм структур - Delete.
ЧастотаДискретизацииЗвукаВФайле это поле ByteRate.
Вообще, вы можеет просто записывать все ваши файлы с одной и той же дисркетизацией, но вам надо это(?) когда данное свойство файла легко получить.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
pepel (04.12.2010), Randomize (19.09.2010), SBJoker (18.09.2010), Tadeus (18.09.2010)
Старый 30.09.2010, 23:57   #2
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Получение свойств WAV-файла

Добавил функцию.
;code for B3D:	impersonalis (icq 11-999-51-51)
;info:			https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
;				http://www.gamedev.ru/code/forum/?id=38568

Function imp_MusProperty_GetByteStr$(bank%,start%,l%=4)
	Local s$=""
	Local i%
	Local endi%=start+(l-1)
	For i=start To endi
		s=s+Chr(PeekByte(bank,i))
	Next
	Return s
End Function

Function imp_MusProperty_Short2Int%(a%)
	Local M1%=%00000000000000001000000000000000
	Local M2%=%11111111111111110000000000000000
	Local D%=a And M1
	If D
		a = a Xor M2
	EndIf
	Return a
End Function

Type T_imp_MusProperty_Wav
	Field ChunkID$
	Field ChunkSize%
	Field Format$
	Field Subchunk1ID$
	Field Subchunk1Size%
	Field AudioFormat%
	Field NumChannels%
	Field SampleRate%
	Field ByteRate%
	Field BlockAlign%
	Field BitsPerSample%
	Field Subchunk2ID$
	Field Subchunk2Size%
End Type

Function imp_MusProperty_WavFileProc.T_imp_MusProperty_Wav(filename$)
	Local WP.T_imp_MusProperty_Wav=New T_imp_MusProperty_Wav
	
	Local i%
	Local file%=ReadFile(filename)
	If file=0
		RuntimeError "Cannot open "+filename
	EndIf
	Local RIFF_chunk%=CreateBank(12)
	Local fmt_subchunk%=CreateBank(24)
	Local data_subchunk%=CreateBank(8)
	ReadBytes(RIFF_chunk,file,0,BankSize(RIFF_chunk))
	ReadBytes(fmt_subchunk,file,0,BankSize(fmt_subchunk))
	ReadBytes(data_subchunk,file,0,BankSize(data_subchunk))
	CloseFile(file)
	WP\ChunkID=imp_MusProperty_GetByteStr(RIFF_chunk,0)
	WP\ChunkSize=PeekInt(RIFF_chunk,4)
	WP\Format=imp_MusProperty_GetByteStr(RIFF_chunk,8)
	WP\Subchunk1ID=imp_MusProperty_GetByteStr(fmt_subchunk,0)
	WP\Subchunk1Size=PeekInt(fmt_subchunk,4)
	WP\AudioFormat=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,8))
	WP\NumChannels=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,10))
	WP\SampleRate=PeekInt(fmt_subchunk,12)
	WP\ByteRate=PeekInt(fmt_subchunk,16)
	WP\BlockAlign=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,20))
	WP\BitsPerSample=imp_MusProperty_Short2Int(PeekShort(fmt_subchunk,22))
	WP\Subchunk2ID=imp_MusProperty_GetByteStr(data_subchunk,0)
	WP\Subchunk2Size=PeekInt(data_subchunk,4)
	FreeBank(RIFF_chunk)
	FreeBank(fmt_subchunk)
	FreeBank(data_subchunk)
	
	Return WP
End Function

Function imp_MusProperty_IsWav%(WP.T_imp_MusProperty_Wav)
	Return WP\Format="WAVE"
End Function

Function imp_MusProperty_GetWavTimeInSec#(WP.T_imp_MusProperty_Wav)
	Return WP\Subchunk2Size / Float( (WP\BitsPerSample / 8.0) * WP\NumChannels * WP\SampleRate)
End Function
imp_MusProperty_GetWavTimeInSec возвращает время воспроизведения звукового файла в секундах (float). Кстати, неплохо бы потестить (у меня пашет).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 11:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com