Главная страница
    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.009 c
1-88053
zom
2003-03-14 17:38
2003.03.27
Сохранение и редактирование файлов QuickReport (*.QRT)


14-88131
Arcada
2003-03-10 10:34
2003.03.27
Какая клавиша нажата?


1-88028
Grey
2003-03-14 11:21
2003.03.27
Как программно отключить обработчик события OnCalcFields ?


6-88111
s22_shura
2002-12-15 20:19
2003.03.27
Буфер UDP


14-88202
alxx
2003-03-10 22:02
2003.03.27
Рисунки.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский