Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать wav фаил Stereo с разностью фаз на 90 гр. Как это реализовать. 
V
    Опции темы
ivan219
  Дата 13.3.2008, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



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

Как это реализовать???
PM MAIL ICQ   Вверх
ivan219
  Дата 15.3.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Нашол код и переделал под себя:
Код

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.

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

Это сообщение отредактировал(а) ivan219 - 15.3.2008, 23:07
PM MAIL ICQ   Вверх
Alexeis
Дата 15.3.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459





--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 16.3.2008, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



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

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

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

Это сообщение отредактировал(а) ivan219 - 16.3.2008, 10:55
PM MAIL ICQ   Вверх
Alexeis
Дата 16.3.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Код

   End
      else
        DataCount := SampleRate * WaveFormatEx.nBlockAlign;
      

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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 16.3.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



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

Спасибо.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0667 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.