Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2010, 11:36   #1
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
Восклицание Генерация и синтез звуковых волн

Передо мной встала задача очень срочно сделать генератор звука, который бы генерировал два типа волн одновременно (синусоиду и прямоугольную), а также синтезировать их. Думаю насчет синтеза не проблема - просто главное чтобы амплитуда совпадала. А вот как генерировать звуковые волны и выводить их на динамики я не знаю. Помогите пожалуйста, очень срочно нужно и если можно, то лучше объяснить как работает.
Заранее благодарен!
Gr@nd вне форума Ответить с цитированием
Старый 14.02.2010, 13:25   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

http://www.pouet.net/prod.php?which=19993
Здесь вы найдёте не только исходники треккера (наподобие Impulse Tracker, Scream Tracker, Modplug Tracker), но и исходники работающего синтезатора звуков и эффектов. Для запуска откомпилированных примеров вам придётся отыскать через google следующие файлы: mfc71.dll, MSVCP71.DLL, msvcr71.dll.
mihali4 вне форума Ответить с цитированием
Старый 14.02.2010, 15:22   #3
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
По умолчанию

Спасибо, надеюсь разберусь.
Gr@nd вне форума Ответить с цитированием
Старый 14.02.2010, 15:35   #4
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
По умолчанию

а исходник то на си, не потяну Неужели ничего проще нет?? Мне всего надо две звуковые волны.
Gr@nd вне форума Ответить с цитированием
Старый 14.02.2010, 17:41   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

вам, TC, стоит рыть в сторону Multimedia API, то бишь генерацию Waveform в памяти и API функций WaveOutPrepareHeader и WaveOutWrite... сразу замечу, что задача сходна с синтезом DTMF сигнала, только законы модуляции будут различны

примеры есть в разделе статьи на форуме и блоге...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 14.02.2010 в 17:44.
raxp вне форума Ответить с цитированием
Старый 15.02.2010, 10:06   #6
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
По умолчанию

Компилятор ругается на Generator
Gr@nd вне форума Ответить с цитированием
Старый 15.02.2010, 11:55   #7
SERG1980
Участник клуба
 
Аватар для SERG1980
 
Регистрация: 28.03.2007
Сообщений: 1,814
По умолчанию

Есть неплохой набор компонентов Audiolab где можно такое реализовать
вот примерчик
Вложения
Тип файла: zip Sintez.zip (706.4 Кб, 83 просмотров)

Последний раз редактировалось SERG1980; 15.02.2010 в 12:05.
SERG1980 вне форума Ответить с цитированием
Старый 15.02.2010, 12:04   #8
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

вот намекаешь, намекаешь... юзверям даже лень заглянуть в готовую реализацию WAVEFORM для генерации двух сигналов одновременно и никаких-те компонентов не нужно, только стандартный модуль mmsystem.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 16.02.2010, 08:14   #9
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
вот намекаешь, намекаешь... юзверям даже лень заглянуть в готовую реализацию WAVEFORM для генерации двух сигналов одновременно и никаких-те компонентов не нужно, только стандартный модуль mmsystem.
Читал статью в Delphi World "Еще раз о звуке", вроде всё понял, но вот токо компиятор ругается на функции: Generator и Mix

delphisources.ru/pages/faq/base/about_sound_again.html
Gr@nd вне форума Ответить с цитированием
Старый 16.02.2010, 09:05   #10
Gr@nd
Пользователь
 
Регистрация: 27.05.2009
Сообщений: 32
По умолчанию

Покопался на англоязычных ресурсах и нашел рабочий код:

Код:
unit generator;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
TVolumeLevel = 0..127;
procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
{writes tone to memory and plays it}
var
 WaveFormatEx: TWaveFormatEx;
 MS: TMemoryStream;
 i, TempInt, DataCount, RiffCount: integer;
 SoundValue: byte;
 w: double; // omega ( 2 * pi * frequency)
 const
 Mono: Word = $0001;
 SampleRate: Integer = 44100; // 8000, 11025, 22050, or 44100
 RiffId: string = 'RIFF';
 WaveId: string = 'WAVE';
 FmtId: string = 'fmt ';
 DataId: string = 'data';
 begin
 if Frequency > (0.6 * SampleRate) then
 begin
 ShowMessage(Format('Sample rate of %d is too Low to play a tone of %dHz',
 [SampleRate, Frequency]));
 Exit;
 end;
 with WaveFormatEx do
 begin
 wFormatTag := WAVE_FORMAT_PCM;
 nChannels := Mono;
 nSamplesPerSec := SampleRate;
 wBitsPerSample := $0008;
 nBlockAlign := (nChannels * wBitsPerSample) div 8;
 nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
 cbSize := 0;
 end;
 MS := TMemoryStream.Create;
 with MS do
 begin
 {Calculate length of sound data and of file data}
 DataCount := (Duration * SampleRate) div 1000; // sound data
 RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
 SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // file data
 {write out the wave header}
 Write(RiffId[1], 4); // 'RIFF'
 Write(RiffCount, SizeOf(DWORD)); // file data size
 Write(WaveId[1], Length(WaveId)); // 'WAVE'
 Write(FmtId[1], Length(FmtId)); // 'fmt '
 TempInt := SizeOf(TWaveFormatEx);
 Write(TempInt, SizeOf(DWORD)); // TWaveFormat data size
 Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // WaveFormatEx record
 Write(DataId[1], Length(DataId)); // 'data'
 Write(DataCount, SizeOf(DWORD)); // sound data size
 {calculate and write out the tone signal} // now the data values
 w := 2 * Pi * Frequency; // omega
 for i := 0 to DataCount - 1 do
 begin
 SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate)); // wt = w * i / SampleRate
 Write(SoundValue, SizeOf(Byte));
 end;
 {now play the sound}
 sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
 MS.Free;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 MakeSound(1000,300,100);
end;



end.
Gr@nd вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
фоновое воспроизведение звуковых файлов в Delphi Lorden Помощь студентам 3 11.12.2009 17:22
СИНТЕЗ TreeView и CheckListBox! Wi1D Компоненты Delphi 2 29.07.2009 03:55
Серьезно: Симуляция волн на поверхности воды Levsha100 Свободное общение 6 05.06.2009 13:36
Тестер звуковых карт NotProCoder Софт 5 21.04.2009 19:01

Реклама для незарегистрированных, регистрация на форуме