Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.27;
Скачать: CL | DM;

Вниз

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

 
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 вся ветка

Текущий архив: 2003.03.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
3-87864
SVA
2003-03-11 09:48
2003.03.27
Помогите с Select


3-87863
AlexGof
2003-03-07 11:01
2003.03.27
Работа с ADO под SQL Server


1-87899
Andrey V.
2003-03-16 19:57
2003.03.27
Как в TSpeedButtone прижать , скажем , влево caption ?


1-87887
AFrolov
2003-03-13 17:45
2003.03.27
получить список форм кот. созданы в Application через CreateForm


3-87813
Эльман
2003-03-07 16:44
2003.03.27
Суммирование калькулируемых полей