Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > как разобрать Wav файл


Автор: leon2009 16.3.2023, 07:37
Здравствуйте! примеров много как вытащить заголовки из wav, НО я сомневаюсь те ли данные я вытаскиваю:
пр: 1
Код

procedure TForm1.OpenMedia(WaveFile: string);
var
 MyOpenParms: TMCI_Open_Parms;
begin
 with MyOpenParms do
 begin
  dwCallback := Handle; // TForm1.Handle
  lpstrDeviceType := PChar('WaveAudio');
  lpstrElementName := PChar(WaveFile);
 end; {with MyOpenParms}
 dwFlags := MCI_WAIT or MCI_OPEN_ELEMENT or MCI_OPEN_TYPE;
 MyError := mciSendCommand(0, MCI_OPEN, dwFlags, Longint(@MyOpenParms));
 // one could use mciSendCommand(DevId, here to specify a particular device
 if MyError = 0 then
  FDeviceID := MyOpenParms.wDeviceID
 else
  raise Exception.Create('Open Failed');
end;

function TForm1.GetStatus(StatusRequested: DWORD): Longint;
var
 MyStatusParms: TMCI_Status_Parms;
begin
 dwFlags := MCI_WAIT or MCI_STATUS_ITEM;
 with MyStatusParms do
 begin
  dwCallback := Handle;
  dwItem := StatusRequested;
 end;
 MyError := mciSendCommand(FDeviceID, MCI_STATUS, MCI_WAIT or MCI_STATUS_ITEM, Longint(@MyStatusParms));
 if MyError = 0 then
  Result := MyStatusParms.dwReturn
 else
  raise Exception.Create('Status call to get status of ' +  IntToStr(StatusRequested) + ' Failed');
end;

procedure TForm1.CloseMedia;
var
 MyGenParms: TMCI_Generic_Parms;
begin
 if FDeviceID > 0 then
 begin
  dwFlags := 0;
  MyGenParms.dwCallback := Handle; // TForm1.Handle
  MyError := mciSendCommand(FDeviceID, MCI_CLOSE, dwFlags, Longint(@MyGenParms));
  if MyError = 0 then
  FDeviceID := 0
  else
  begin
  raise Exception.Create('Close Failed');
  end;
 end;
end;

результат:
Цитата

176400
16
44100
2

или этот сразу в графику рисует:
Код

const
  data_chunk_position= smallint(2);
  buffersize = 256;
var
  memstr:TMemoryStream;
  //buf:array [1..56] of byte;
  buf:array [1..buffersize] of byte;
  Volume:array [1..buffersize] of byte;
  i,ch:integer;
  readed:integer; Buffer:integer;  buf16: ^smallint;
begin
  memstr:=TMemoryStream.Create;
  memstr.LoadFromFile('sound08.wav');
  memstr.Seek(data_chunk_position, soFromBeginning);
 Chart1.Series[0].Clear;
 readed:=memstr.Read(buf,sizeof(buf));
  i:=1;
  repeat
    Chart1.Series[0].Add(buf[i]);
   // memo1.Lines.Add(inttostr(buf[i]));
    if buf[i]<=70 then  edit1.Text:='baraban' else edit1.Text:='violin';
    inc(i);
  until i>readed;
 новички не за путайтесь в варе много лишнего....  
я хотел получить такой результат:
https://disk.yandex.ru/d/hXxv-NIMjq4uNg
https://rutube.ru/video/27d89237909c7c44bf2cbef677edea66/ = если страшно открывать EXE
https://disk.yandex.ru/d/wvBuxzZsCl2sXA
НО как это сделать пока играет звук, а не сразу выводить результаты??? 
а то получается результаты вывел.
как узнать если играет скрипка (частота), то вывести в мемо скрипка??? как в примере....  smile 

Автор: Seenkao 22.3.2023, 09:13
Непонятно, что ты хочешь сделать. Заголовки файла вытащить?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)