Форум Программирование Как создать звук? |
Страницы: «1» «2» | |||||||
|
О, код, уже лучше. Только бросьте его в pastebin, а то превращается в какую-то гомосятину. виконання програми розпочинається з того самого мiсця, де призупинилося. | ||||||
|
ZvukData = Record wSamplesPerSec : Cardinal; wAvgBytesPerSec: Cardinal; wBitsPerSample : WORD; wChannels : WORD; Data : TMemoryStream; end; TWaveHeaderChank = packed record wFormatTag : Smallint; wChannels : WORD; wSamplesPerSec : Cardinal; wAvgBytesPerSec: Cardinal; wBlockAlign : WORD; wBitsPerSample : WORD; wcbSize : WORD; end; .......................................................................... Function WriteWave(FileName : AnsiString; data : ZvukData) : WORD; var f : TFileStream; wFileSize : Cardinal; wChankSize : Cardinal; ID : array[0..3] of Char; Header : TWaveHeaderChank; Begin f:=nil; Try f := TFileStream.Create(FileName, fmCreate); f.Seek(0, soFromBeginning); Header.wFormatTag := 1; Header.wChannels := data.wChannels; Header.wSamplesPerSec := data.wSamplesPerSec; Header.wBlockAlign := data.wChannels * (data.wBitsPerSample div 8); Header.wAvgBytesPerSec:= data.wSamplesPerSec * Header.wBlockAlign; Header.wBitsPerSample := data.wBitsPerSample; Header.wcbSize := 0; ID := 'RIFF'; f.WriteBuffer(ID, 4); wFileSize := 0; f.WriteBuffer(wFileSize, 4); ID := 'WAVE'; f.WriteBuffer(ID, 4); ID := 'fmt '; f.WriteBuffer(ID, 4); wChankSize := SizeOf(Header); f.WriteBuffer(wChankSize, 4); f.WriteBuffer(Header, SizeOf(Header)); ID := 'data'; f.WriteBuffer(ID, 4); wChankSize := data.Data.Size; f.WriteBuffer(wChankSize, 4); data.Data.Seek(0, soFromBeginning); f.CopyFrom(data.Data, data.Data.Size); f.Seek(SizeOf(ID), soFromBeginning); wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize); f.Write(wFileSize, 4); except f.Free; end; end; procedure TForm1.Button7Click(Sender: TObject); var x,y,liniya: integer; r: ZvukData; d: SmallInt; begin try with r do begin wSamplesPerSec:=Chastota; wBitsPerSample:=8; wChannels:=1; Data:=TMemoryStream.Create; Data.Seek(0,soFromBeginning); end; liniya:=-1; For y:=0 to Image1.Height-1 do begin For x:=0 to Image1.Width-1 do begin If massiv[x,y]=True then begin liniya:=liniya+1; d:=500; ///данные массива r.Data.WriteBuffer(d, 1); end else begin d:=-128; r.Data.WriteBuffer(d, 1); end; end; end; WriteWave(FileName, r); finally r.Data.Free; end; ShowMessage('..... Файлик успешно откомпелирован! .....'); end; | ||||||
|
Вроде все правильно сделал, перепроверил, пересмотрел двадцать раз, но потом до меня дошло: я когда проверяю откомпелированную программу, у меня там вводятся такие данные, что частота = 90 Герц, и только поэтому видимо плеер, через который я проигрывал звук (вообще-то редактор Sound Forge 8.0)) ), и который создавала в конечной работе моя программа, ускорял автоматически при проигрывании. Но если установить частоту 180 или выше, то все будет чики пуки)))... Быть может посоветуете лучше, как заполнять массив данных ?, высота звука там должна зависить от частоты? иначе у меня там такие интересные звуки получаются)), то колонки не в состоянии на такой частоте выдать звук, т.е он вроде и есть, но его я не слышу)))) , да в принцепи там всякое получается разное, если поэксперементировать с переменной d В коде видно, что я на обум ввел число 500. Но как должна выглядеть формула, если конечно эта переменная должна зависить от частоты. С другой стороны я и вовсе иногда не буду слышать звук, потому что исход работы программы (генерируемый wav файлик) зависит от массива данных. Как никак я не амплитуду сделал, а просто раскидал точки данных в два ряда. | ||||||
|
Цитата (IgoRek125): а просто раскидал точки данных в два ряда Ну, это пилообразный сигнал получился. Я ж говорил - возьми синусоиду, как простейший случай. График нарисуй и сразу всё поймешь, период функции соответствует частоте сигнала, а частота дискретизации - то, где берешь значения функции. виконання програми розпочинається з того самого мiсця, де призупинилося. | ||||||
|
Да я уже во всем разобрался)) | ||||||
Перейти в раздел:
© 2004 - 2024, Delphi.int.ru |
Версия форума: 1.10 (19.01.2010) |
Выполнено за 0.02 сек. |