Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];

Вниз

Обработка звукового сигнала...   Найти похожие ветки 

 
maker   (2002-12-13 13:50) [0]

Здравствуйте!
Мне необходимо обработать звуковой сигнал, те. нарисовать его "волну", как это делает, например, CoolEditPro и многие другие программы. Данные необходимо получать из wav фала. С 8-ми битными wav понятно - LineTo(i, read_byte) где read_byte – это байт из wav файла. А как быть с 16 битными, не знаю... :( пробовал читать два байта(word), затем делить на 256 (чтоб вмещалось в форму) но получилась "абракадабра"...


 
Anatoly Podgoretsky   (2002-12-13 14:03) [1]

По твоему описанию правильно, можно даже не делить, а взять просто старший байт, равно силно делению на 256.


 
maker   (2002-12-13 17:11) [2]

Помогите это реализовать(всмысле примерчик)...
У меня ничего не получается.. :(


 
Ketmar   (2002-12-13 17:38) [3]

2maker:
вы учитываете, что файл может быть стерео? что файл *.wav может быть вовсе даже mp3 или adpcm? т.е. проверяете тэг fmt? если все "да" - давайте код.

Satanas Nobiscum! 13-Dec-XXXVII A.S.


 
trotski   (2002-12-14 08:58) [4]

Во-во. Когда-то я еще на Pascal"е этим занимался на работе. Могу код прислать. Важно знать формат данных, а для этого надо не полениться и прочесть служебную инфу


 
maker   (2002-12-14 10:49) [5]

вот код... но рисует "абракадабру"...
procedure WaveFileOpen(FileName:String);
var
wfx:TWaveFormatEX;
info:array[1..4] of char;
tmp:array[0..255] of byte;
tb:array [1..2] of byte;
i:integer; wFile:TFileStream;
begin
if FileName <> "" then
begin
wFile:=TFileStream.Create(FileName,$0000);
wFile.Read(info,4);
if info <> "RIFF" then SendError(2,0);
wFile.Seek(4,1);
wFile.Read(info,4);
if info <> "WAVE" then SendError(3,0);
wFile.Read(info,4);
if info <> "fmt " then SendError(3,0) else
begin
wFile.Seek(6,1);
wFile.Read(info,2);
wfx.wFormatTag:=1;
wfx.nChannels:=ord(info[1]);
wFile.Read(info,2);
wfx.nSamplesPerSec:=ord(info[2])*256+ord(info[1]);
wFile.Seek(8,1); wFile.Read(info,2);
wfx.wBitsPerSample:=ord(info[2])*256+ord(info[1]);
wfx.nBlockAlign:=(wfx.wBitsPerSample div 8)*wfx.nChannels;
wfx.nAvgBytesPerSec:=wfx.nSamplesPerSec*wfx.nBlockAlign;
wFile.Read(tmp,4);
//позиция=40; поиск data
while ((tmp[i]<>$64) or (tmp[i+1]<>$61) or
(tmp[i+2]<>$74) or (tmp[i+3]<>$61)) do
begin
wFile.Read(tmp[i+4],1);
inc(i);
end;
wFile.Read(wDataEnd,100);
wDataStart:=40+i;
posit:=wDataStart;
end;
end;
// инфа получена
//pb - paintbox
for i:=1 to 400 do // Напимер 400px...
begin
wFile.Read(tb,2); //для 16-битных моно...
pb.Canvas.LineTo(i,tb[2]); // или (tb[1]*tb2) div 256
end;
end;


Какие у меня ошибки?


trotski:
Вышли пожалуйста код на: maker@stsland.ru


 
maker   (2002-12-18 15:26) [6]

вопрос ещё актуален...


 
Ketmar   (2002-12-18 17:49) [7]

ошибок много. от той, хотя бы, что вы НЕ ПРОВЕРЯЕТЕ формат файла. и до неумения работать с потоками...

Satanas Nobiscum! 18-Dec-XXXVII A.S.


 
SanteR   (2002-12-19 13:24) [8]

2maker:
недостатков в коде конечно много,
но совет будет только один:

в случае 16bit звуковые отсчеты читаются
в целое со знаком и двухбайтовое.
(а не два раза по байту)



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
8-88078
Yasha
2002-12-19 18:04
2003.03.27
печать графики


14-88158
Guzz
2003-03-05 20:05
2003.03.27
Вопрос по видимости форм!


1-88038
asafr
2003-03-13 18:29
2003.03.27
COM сервера MS Office,


1-87890
LoCKeR
2003-03-16 12:49
2003.03.27
Как показать файлы, как в проводнике?


1-87991
Yozch_
2003-03-13 22:04
2003.03.27
Как узнать ширину текста в Label.caption и пикселах?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский