|
Библиотеки Сторонние библиотеки для Blitz |
18.09.2010, 16:19
|
#1
|
Зануда с интернетом
Регистрация: 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 за это полезное сообщение:
|
|
30.09.2010, 23:57
|
#2
|
Зануда с интернетом
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:40.
|