Проблемы с воспроизведением звука.

Pixilang по русски
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Проблемы с воспроизведением звука.

Post by Several light »

Когда я знакомился с языком мне было странно почему почти все используют для звукового сопровождения функции воспроизведения фалов подобных MIDI, хотя в языке были функции для воспроизведения звуковых данных вроде send_sound. Таки образом решил создать програмку для чтения WAV файлов... и помимо всего прочего натолкнулся на проблему. На ПДА почему то нельзя загнать в память сразу все звуковые данне из WAV файла... поэтому пришлось создавть что-то на подобии буффера в котрый загружается определённое количество семплов... а потом воспроизводиться функцией... но появились давольно неприятные разрывы звука в тех местах где проходила операция заполнения буффера ... незнаю как оптимизировать программу свести разрывы к минимуму... пока что всё что я смог попытаться сделать привожу ниже

sbsn=10000*2
soud_buffer=new_array(sbsn)

n=0
k=0
while(k<(sdl/sbsn)-1){

i=0
while(i<sbsn-1){
a=fgetc(f)
if a<=127 {a=-(127-a)}
else {a=a-127}
soud_buffer=a
i+1
}

sec_soud_buffer=soud_buffer

try:
if get_sound_status(sound) > sbsn/2 - 1 | n=0 {goto trys}
goto try
trys:

sound=send_sound(sec_soud_buffer,df,ch,0)
sound_volume (1024)
n=1

k+1
}

P.S. это не вся программа, а та часть кторая отвечает непосредственно за чтение звуковых данных... перед её запуском открывается вав файл "f" и из него считываются служебные данные (ch - количествов каналов; df - частота дискретизации; sdl - общая длительность массива звуковых данных представленного в WAV файле и остальная иниформация котрая неиспользуется для работы). Считывание останавливается на конце массива служебной инфорации, а данная программа начинает считывание с самого первого байта звуковых данных.

P.S. Эта функция правельно считывает только 8-ми битные звуковые данные... попытки сделать прогамму для чтения 16 битных провалились. Либо я непонял принцип расположения 16 битного семпла в двух байтах толи я слишком многого хочу от функции send_sound.
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

К сожалению, подсказать ничего не могу, т.к. КПК не имею (
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

Вообщемто КПК тут особо непричём. Сначала я просто брал почти весь WAV файл и отсылал всю эту кучу данных функции send_sound, но потом выяснилось, что объём массива в который я могу поместить содержимое файла не резиновый... незнаю по каким причинам но если виличина массива считанных из файла данных была больше определённого числа то толи массив несоздавался толи функция send_sound отказывалась его читать. Причём эта проблема была как на ПК так и на КПК просто на КПК это число было меньше... также странно то, что впринципе при создании массива использовалась не вся имеющаясья память, а только небольшя её часть.
Вообщем на ПК тот WAV на котром я эксперментировал более или менее умещался в массив, а вот на КПК умещалась гдето отсилы секунд 10 20... во изза этого я и начал эксперментировать с загрузкой семплов в функцию send_sound по частям.

Вот собственно сама программа целиком. 1.wav это любой 8битный WAV файл частота дискретизации и количество каналов вродебы значения особого неимеют.

wsx=get_window_xsize
wsy=get_window_ysize
whx=-(wsx/2)
why=-(wsy/2)
tx=8
ty=8

f = fopen("1.wav", "rb")

//Read RIFF
id1 = new_string(4)
id1[0]=fgetc(f) id1[1]=fgetc(f) id1[2]=fgetc(f) id1[3]=fgetc(f)

//Read file len
a=fgetc(f) b=fgetc(f) c=fgetc(f) d=fgetc(f)
fl=a+(256*b)+(256*256*c)+(256*256*256*d)

//Read WAVE
id2 = new_string(4)
id2[0]=fgetc(f) id2[1]=fgetc(f) id2[2]=fgetc(f) id2[3]=fgetc(f)

//Read fmt
id3 = new_string(4)
id3[0]=fgetc(f) id3[1]=fgetc(f) id3[2]=fgetc(f) id3[3]=fgetc(f)

//Read title len
a=fgetc(f) b=fgetc(f) c=fgetc(f) d=fgetc(f)
tl=a+(256*b)+(256*256*c)+(256*256*256*d)

//Read data type
a=fgetc(f) b=fgetc(f)
dt=a+(256*b)

//Read num ch
a=fgetc(f) b=fgetc(f)
ch=a+(256*b)

//Read discreet fraq
if tl=16 {
a=fgetc(f) b=fgetc(f) c=fgetc(f) d=fgetc(f)
df=a+(256*b)+(256*256*c)+(256*256*256*d)
}
if tl=12 {
a=fgetc(f) b=fgetc(f)
df=a+(256*b)
}

//Read bps
if tl=16 {
a=fgetc(f) b=fgetc(f) c=fgetc(f) d=fgetc(f)
bps=a+(256*b)+(256*256*c)+(256*256*256*d)
}
if tl=12 {
a=fgetc(f) b=fgetc(f)
bps=a+(256*b)
}

//Read BP Sample
a=fgetc(f) b=fgetc(f)
bpsamp=a+(256*b)

//Read num bits
a=fgetc(f) b=fgetc(f)
nb=a+(256*b)

//Read num bits
id4 = new_string(4)
id4[0]=fgetc(f) id4[1]=fgetc(f) id4[2]=fgetc(f) id4[3]=fgetc(f)

//Read sound data len
a=fgetc(f) b=fgetc(f) c=fgetc(f) d=fgetc(f)
sdl=a+(256*b)+(256*256*c)+(256*256*256*d)


print("id1: ",whx,why, WHITE) .(id1,whx+(tx*5),why, WHITE)
.("file len: ",whx,why+(ty*1), WHITE) .("$fl",whx+(tx*10),why+(ty*1), WHITE)
.("id2: ",whx,why+(ty*2), WHITE) .(id2,whx+(tx*5),why+(ty*2), WHITE)
.("id3: ",whx,why+(ty*3), WHITE) .(id3,whx+(tx*5),why+(ty*3), WHITE)
.("title len: ",whx,why+(ty*4), WHITE) .("$tl",whx+(tx*11),why+(ty*4), WHITE)
.("data type: ",whx,why+(ty*5), WHITE) .("$dt",whx+(tx*13),why+(ty*5), WHITE)
.("channels: ",whx,why+(ty*6), WHITE) .("$ch",whx+(tx*13),why+(ty*6), WHITE)
.("discreet fraq: ",whx,why+(ty*7), WHITE) .("$df",whx+(tx*14),why+(ty*7), WHITE)
.("BPS: ",whx,why+(ty*8), WHITE) .("$bps",whx+(tx*5),why+(ty*8), WHITE)
.("BP Sample: ",whx,why+(ty*9), WHITE) .("$bpsamp",whx+(tx*12),why+(ty*9), WHITE)
.("bits: ",whx,why+(ty*10), WHITE) .("$nb",whx+(tx*7),why+(ty*10), WHITE)
.("id4: ",whx,why+(ty*11), WHITE) .(id4,whx+(tx*5),why+(ty*11), WHITE)
.("sound data len: ",whx,why+(ty*12), WHITE) .("$sdl",whx+(tx*17),why+(ty*12), WHITE)
frame

//Read sound data

sbsn=500000
soud_buffer=new_array(sbsn)

if nb=8 {

n=0
k=0
while(k<(sdl/sbsn)-1){

i=0
while(i<sbsn-1){
a=fgetc(f)
if a<=127 {a=-(127-a)}
else {a=a-127}
soud_buffer=a
i+1
}

try:
if get_sound_status(sound) > sbsn/2 - 1 | n=0 {goto trys}
goto try
trys:

sound=send_sound(soud_buffer,df,ch,0)
sound_volume (1024)
n=1

k+1
}

print("Sound started. ",whx,why+(ty*13), WHITE)
frame

}

fclose(f)
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

Неслабый код )
Можно кстати пойти по пути наименьшего сопротивления - запихнуть wav-файл в XM-формат (через любой трекер) а потом грузить и прослушивать так:

load_music( "zvuk.xm" );
play_music
music_volume( 255 )
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

А можеш посоветовать чтонибудь, что это может сделать? Только мне нужен именно WAV в XM(или любой другой совместимый формат), а не наоборот.
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

Могу посоветовать трекер под названием MilkyTracker - свободно распространяемый, максимально совместимый со стандартом .XM (сам им пользуюсь)
http://www.milkytracker.net/
В двух словах: в новой композиции нужно загрузить сэмпл - необходимый wav-файл и разместить ноту данного инструмента в любой колонке в самом верху (нота должна быть такой, чтобы звук не искажался: не ускорялся и не замедлялся. Какую именно не помню, подбери эмпирически)
Если все-же возникнут проблемы - спрашивай, распишу по шагам.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

Так появились вопросы... к примеру может ли он писать стерео? И есть ли ограничение по длительности записи файла? Тоесть возможноли сделать так чтобы WAV 16bit Stereo 3мин звучал как Stereo 3х минутный а не 1минутный моно?
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

16 бит должен поддерживать (вновь создаваемые семплы поддерживает), стерео есть, ограничения по времени тоже быть не должно.
Скинь пробный файл, проверю.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

Вот то что получилось: http://file.qip.ru/file/94539086/426760f8/Untitled.html
А вот то счего делал: http://file.qip.ru/file/94539103/fb167448/2_online.html
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

В следстивии долгих мытарств с программой выяснилось следующее:
- Стерео: один канал копируется в два. Тоесть по обоим канлам идут идентичные звуковые потоки.
- 16бит: Есть.
- Длительность: Добиться возможности воспроизведения фалов длительностью более 30секунд можно при помощи разбиения файла на несколько кусочков каждый длительностью 30секунд ... поскольку максимальное их число = 256 то в данном формате можно хранить единовременно где то около 2х часов аудио.
- Проблема с буффером: Отсутствует.

Поправьте меня если я что-то сказал нетак.
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

Вроде бы все так сказал )
Однако, зачем музыкальные файлы слушать именно через Пикси? Свой плеер?
По идее сторонних плееров должно быть полно.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

Поскольку на pixilang можно много чего делать то почему бы не добавить туда 16 биттную стеро музыку, или эффекты, котрые в свою очередь будут нетолько являться звуковым сопровождением но и добавлять коррективы в ход самой демосцены... ну и т.д. А также можно использовать этот алгоритм в обратном порядке для синтезации 16 битной стерео музыки\звуков в WAV. Извиняюсь если чего нето сказал, или изобретаю велосипед уменя бывает вообщем я доделал программу преобарзования в 16биттного звукового потока в понятный для функции send_sound... но проблема с буффером осталась к сожалению. Так что если интересно могу выложить всё, что есть.
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: Проблемы с воспроизведением звука.

Post by Al_Rado »

Конечно выкладывай! Интересно же )
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
Several light
Posts: 68
Joined: Sun Jun 28, 2009 11:07 pm

Re: Проблемы с воспроизведением звука.

Post by Several light »

Собственно код.

http://share.pixi.su/show.php?p=mtrknwe2mteznzcxmdeynzm

Код получился давольно грамостким,а интерфейс в духе консолои, так как уменя было желание понапихать всё и сразу. Возможно программа содержет море багов, и является скорее скелетом чем полноценной программой. Вообщем здесь есть две обязательные части:

1)Открытие файла и чтение служебной информации.
Впринципе для нормального функционирования достаточно выполнить процедуры чтения в следующие переменные:
- "tl" Имеет прикладную роль так как по спецификации WAV файла на разные частоты дискретизации и битрэйт отводиться разное количество байт (наверное это касалось старых форматов) врезультате все идущие за ней сдвигаются на это число. Данные читаемые в эту переменную используются для определения этого самого сдвига.
- "ch" Количество каналов. (Стерео, Моно, возможно больше).
- "df" Собственно частота дискретизации.
- "битрэйт(bps)" вприницпе можно нечитать... но сохранить код котрый необходим для смещения на определённое число байт в зависимосте от значения "tl".
- "nb" Определяет какой собственно WAV мы открыли 16 битный или 8 битный. (Меня хватило только на написание программ для преобразования этих дух форматов. Принципиально можно написать программы для звука меньшей биттности.). При написании выяснилось что функция send_sound поддерживает только 16 биттные уровни амплитуд. Изза этого амплитуды звука меньшей биттности можно подогнать, а вот большей такие как 32 биттные (а темболее с плавающей точкой) если и можно подогнать то звучать они будут как 16 битные если не хуже.
- "sdl" Собственно количество байт приходящихся на сам звук.

Примечание: При удалении процедур чтения "ненужных" служебных данных нужно заменять их соответствующими смещениями, а иначе все следующие процедуры будут читать не те байты котороые надо.


2) Программы перекодировки 8битного и 16битного формата в понятный для send_sound. (При перекодировке 8битного все получаемы значения амплитуд умножаются на 256, это делается для того чтобы громкость звучания 16 и 8 битных файлов были одинаковы). А также собственно функцию send_sound.

Всё остальное можно смело вырезать или использовать по\не по назначению.
goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: Проблемы с воспроизведением звука.

Post by goglus »

классно, пора делать какую нибудь прикольную прожку для написания музыки
Post Reply