Здравствуйте! примеров много как вытащить заголовки из 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;
|
результат:
или этот сразу в графику рисует:
| Код | 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 НО как это сделать пока играет звук, а не сразу выводить результаты??? а то получается результаты вывел. как узнать если играет скрипка (частота), то вывести в мемо скрипка??? как в примере.... |