Проблемы с воспроизведением звука.
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Проблемы с воспроизведением звука.
Когда я знакомился с языком мне было странно почему почти все используют для звукового сопровождения функции воспроизведения фалов подобных 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.
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.
Re: Проблемы с воспроизведением звука.
К сожалению, подсказать ничего не могу, т.к. КПК не имею (
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
Вообщемто КПК тут особо непричём. Сначала я просто брал почти весь 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)
Вообщем на ПК тот 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)
Re: Проблемы с воспроизведением звука.
Неслабый код )
Можно кстати пойти по пути наименьшего сопротивления - запихнуть wav-файл в XM-формат (через любой трекер) а потом грузить и прослушивать так:
load_music( "zvuk.xm" );
play_music
music_volume( 255 )
Можно кстати пойти по пути наименьшего сопротивления - запихнуть wav-файл в XM-формат (через любой трекер) а потом грузить и прослушивать так:
load_music( "zvuk.xm" );
play_music
music_volume( 255 )
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
А можеш посоветовать чтонибудь, что это может сделать? Только мне нужен именно WAV в XM(или любой другой совместимый формат), а не наоборот.
Re: Проблемы с воспроизведением звука.
Могу посоветовать трекер под названием MilkyTracker - свободно распространяемый, максимально совместимый со стандартом .XM (сам им пользуюсь)
http://www.milkytracker.net/
В двух словах: в новой композиции нужно загрузить сэмпл - необходимый wav-файл и разместить ноту данного инструмента в любой колонке в самом верху (нота должна быть такой, чтобы звук не искажался: не ускорялся и не замедлялся. Какую именно не помню, подбери эмпирически)
Если все-же возникнут проблемы - спрашивай, распишу по шагам.
http://www.milkytracker.net/
В двух словах: в новой композиции нужно загрузить сэмпл - необходимый wav-файл и разместить ноту данного инструмента в любой колонке в самом верху (нота должна быть такой, чтобы звук не искажался: не ускорялся и не замедлялся. Какую именно не помню, подбери эмпирически)
Если все-же возникнут проблемы - спрашивай, распишу по шагам.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
Так появились вопросы... к примеру может ли он писать стерео? И есть ли ограничение по длительности записи файла? Тоесть возможноли сделать так чтобы WAV 16bit Stereo 3мин звучал как Stereo 3х минутный а не 1минутный моно?
Re: Проблемы с воспроизведением звука.
16 бит должен поддерживать (вновь создаваемые семплы поддерживает), стерео есть, ограничения по времени тоже быть не должно.
Скинь пробный файл, проверю.
Скинь пробный файл, проверю.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
Вот то что получилось: http://file.qip.ru/file/94539086/426760f8/Untitled.html
А вот то счего делал: http://file.qip.ru/file/94539103/fb167448/2_online.html
А вот то счего делал: http://file.qip.ru/file/94539103/fb167448/2_online.html
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
В следстивии долгих мытарств с программой выяснилось следующее:
- Стерео: один канал копируется в два. Тоесть по обоим канлам идут идентичные звуковые потоки.
- 16бит: Есть.
- Длительность: Добиться возможности воспроизведения фалов длительностью более 30секунд можно при помощи разбиения файла на несколько кусочков каждый длительностью 30секунд ... поскольку максимальное их число = 256 то в данном формате можно хранить единовременно где то около 2х часов аудио.
- Проблема с буффером: Отсутствует.
Поправьте меня если я что-то сказал нетак.
- Стерео: один канал копируется в два. Тоесть по обоим канлам идут идентичные звуковые потоки.
- 16бит: Есть.
- Длительность: Добиться возможности воспроизведения фалов длительностью более 30секунд можно при помощи разбиения файла на несколько кусочков каждый длительностью 30секунд ... поскольку максимальное их число = 256 то в данном формате можно хранить единовременно где то около 2х часов аудио.
- Проблема с буффером: Отсутствует.
Поправьте меня если я что-то сказал нетак.
Re: Проблемы с воспроизведением звука.
Вроде бы все так сказал )
Однако, зачем музыкальные файлы слушать именно через Пикси? Свой плеер?
По идее сторонних плееров должно быть полно.
Однако, зачем музыкальные файлы слушать именно через Пикси? Свой плеер?
По идее сторонних плееров должно быть полно.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
Поскольку на pixilang можно много чего делать то почему бы не добавить туда 16 биттную стеро музыку, или эффекты, котрые в свою очередь будут нетолько являться звуковым сопровождением но и добавлять коррективы в ход самой демосцены... ну и т.д. А также можно использовать этот алгоритм в обратном порядке для синтезации 16 битной стерео музыки\звуков в WAV. Извиняюсь если чего нето сказал, или изобретаю велосипед уменя бывает вообщем я доделал программу преобарзования в 16биттного звукового потока в понятный для функции send_sound... но проблема с буффером осталась к сожалению. Так что если интересно могу выложить всё, что есть.
Re: Проблемы с воспроизведением звука.
Конечно выкладывай! Интересно же )
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!
-
- Posts: 68
- Joined: Sun Jun 28, 2009 11:07 pm
Re: Проблемы с воспроизведением звука.
Собственно код.
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.
Всё остальное можно смело вырезать или использовать по\не по назначению.
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.
Всё остальное можно смело вырезать или использовать по\не по назначению.
Re: Проблемы с воспроизведением звука.
классно, пора делать какую нибудь прикольную прожку для написания музыки