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


Автор: ivan219 13.3.2008, 21:20
Вобщем нужно создать wav фаил с 2 каналами но при этом 2 канал должен отстовать от первого на 90 градусов.

Как это реализовать???

Автор: ivan219 15.3.2008, 23:05
Нашол код и переделал под себя:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

Const
  noError            = 0;
  ReadError          = 1;
  HeaderError        = 2;
  DataError          = 3;
  FileCorrupt        = 4;
  IncorectFileFormat = 5;
  HeaderWriteError   = 6;
  StreamError        = 7;

type
  TForm1 = class(TForm)
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TWaveHeaderChank = packed record     //Заголвок (чанк) формата
    wFormatTag     : Smallint;
    wChannels      : WORD;
    wSamplesPerSec : Cardinal;
    wAvgBytesPerSec: Cardinal;
    wBlockAlign    : WORD;
    wBitsPerSample : WORD;
    wcbSize        : WORD;
  end;
  
  TWaveResult = record          //Минимальная структура
    ERROR          : WORD;      //Используеися для возвращения результата
    wSamplesPerSec : Cardinal;  //разбора Wav файла
    wBitsPerSample : WORD;
    wChannels      : WORD;
    Data           : TMemoryStream;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

uses math;

Function WriteWave(FileName : AnsiString; data : TWaveResult) : WORD; 
var
  f             : TFileStream;
  wFileSize     : Cardinal;
  wChankSize    : Cardinal;
  ID            : array[0..3] of Char;
  Header        : TWaveHeaderChank;

Begin
   Result := noError;
   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)); //Запись чанка формата

   except
    Result := HeaderWriteError;
   end;
   Try
    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);

   except
    Result := StreamError;
   end;
   
   f.Seek(SizeOf(ID), soFromBeginning);     //Поиск записи размера файла
   wFileSize := f.Size - SizeOf(ID) - SizeOf(wFileSize);
   f.Write(wFileSize, 4);                   //Запись размера файла - заголовок
   f.Free;
   Form1.Caption := 'Готово!';
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  r : TWaveResult;
  I: Integer;
  d : SmallInt;
begin
  r.ERROR := noError;
  r.wSamplesPerSec := 44100;
  r.wBitsPerSample := 16;
  r.wChannels      := 2;
  r.Data           := TMemoryStream.Create;
  r.Data.Seek(0, soFromBeginning);

  For i := 0 to r.wSamplesPerSec * 10  do
    Begin
      d :=Round(32767 * Sin(DegToRad(1000 * 360 * I/r.wSamplesPerSec)));
      r.Data.WriteBuffer(d, 2);
      d :=Round(32767 * Sin(DegToRad(1000 * 360 * I/r.wSamplesPerSec + 90)));
      r.Data.WriteBuffer(d, 2);
    end;
  WriteWave('Sample.wav', r);
  r.Data.Free;
end;
end.

Но в созданном файле слышны щелчки если посмотреть на сигнал то в месте щелчков видно что синусоида разрывается и происходит реское падение.
Как от этого избавится???

Автор: Alexeis 15.3.2008, 23:21
http://forum.vingrad.ru/index.php?show_type=forum&showtopic=99607&st=30&hl=wave#

Автор: ivan219 16.3.2008, 00:51
Спасибо smile но не совсем то, мне надо что бы создавался фаил а если сделать так:
Код

      end;
      FPlaing := True;
      Position := 0;
      SaveToFile('1.wav');

то записывается всего 1 секунда попробовал увеличить цикл но это результата не дало фаил увеличился а звука нет.

Автор: Alexeis 16.3.2008, 13:07
Код

   End
      else
        DataCount := SampleRate * WaveFormatEx.nBlockAlign;
      

DataCount - число байт аудио данных. Тут задается 1 секунда. Умножаем на сколько надо и будет больше длительность.

Но это в режиме с постоянной фазой, если фаза меняется, то там сложнее расчет.

Автор: ivan219 16.3.2008, 13:20
Цитата(Alexeis @  16.3.2008,  13:07 Найти цитируемый пост)
DataCount - число байт аудио данных.

Спасибо.

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