Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - Как создать звук?  

Как создать звук?


Страницы: «1» «2»
bugmenot
bugmenot
3-ий класс
Сообщения: 88
[Сообщение #11] 26 апреля 2012, 15:11
О, код, уже лучше. Только бросьте его в pastebin, а то превращается в какую-то гомосятину.

виконання програми розпочинається з того самого мiсця, де призупинилося.

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #12] 27 апреля 2012, 00:24
   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;

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #13] 27 апреля 2012, 00:26
Вроде все правильно сделал, перепроверил, пересмотрел двадцать раз, но потом до меня дошло: я когда проверяю откомпелированную программу, у меня там вводятся такие данные, что частота = 90 Герц, и только поэтому видимо плеер, через который я проигрывал звук (вообще-то редактор Sound Forge 8.0)) ), и который создавала в конечной работе моя программа, ускорял автоматически при проигрывании.
Но если установить частоту 180 или выше, то все будет чики пуки)))...

Быть может посоветуете лучше, как заполнять массив данных ?, высота звука там должна зависить от частоты? иначе у меня там такие интересные звуки получаются)), то колонки не в состоянии на такой частоте выдать звук, т.е он вроде и есть, но его я не слышу)))) , да в принцепи там всякое получается разное, если поэксперементировать с переменной d
В коде видно, что я на обум ввел число 500. Но как должна выглядеть формула, если конечно эта переменная должна зависить от частоты. С другой стороны я и вовсе иногда не буду слышать звук, потому что исход работы программы (генерируемый wav файлик) зависит от массива данных. Как никак я не амплитуду сделал, а просто раскидал точки данных в два ряда.

bugmenot
bugmenot
3-ий класс
Сообщения: 88
[Сообщение #14] 6 мая 2012, 16:51

Цитата (IgoRek125):

а просто раскидал точки данных в два ряда

Ну, это пилообразный сигнал получился. Я ж говорил - возьми синусоиду, как простейший случай. График нарисуй и сразу всё поймешь, период функции соответствует частоте сигнала, а частота дискретизации - то, где берешь значения функции.

виконання програми розпочинається з того самого мiсця, де призупинилося.

IgoRek125
IgoRek125
Посетитель
Сообщения: 9
[Сообщение #15] 6 мая 2012, 23:11
Да я уже во всем разобрался))


Страницы: «1» «2» (всего страниц: 2, текущая: 2)
Всего сообщений: 15 (сейчас показаны: с 11 по 15)

Перейти в раздел:


 © 2004 - 2024, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.02 сек.
Обратная связь