Форум: "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