Ver Mensaje Individual
  #4  
Antiguo 04-10-2010
drakon007 drakon007 is offline
Registrado
 
Registrado: ene 2009
Posts: 4
Reputación: 0
drakon007 Va por buen camino
Muchas gracias por tu ayuda, pero ya encontré la solución a mi problema usando este código:

Código Delphi [-]
uses
   ExtCtrls,MMSytem;

procedure MakeSound(Frequency{Hz}, Duration{mSec}, Volume: Integer);
var
  WaveFormatEx: TWaveFormatEx;
  MS: TMemoryStream; 
  i, TempInt, DataCount, RiffCount: integer;
  SoundValue: byte; 
  w: double;
const 
  Mono: Word = $0001;
  SampleRate: Integer = 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
     DataCount := (Duration * SampleRate) div 1000;
    RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
      SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; 

    Write(RiffId[1], 4);
    Write(RiffCount, SizeOf(DWORD));
    Write(WaveId[1], Length(WaveId));
    Write(FmtId[1], Length(FmtId));
    TempInt := SizeOf(TWaveFormatEx);
    Write(TempInt, SizeOf(DWORD));
    Write(WaveFormatEx, SizeOf(TWaveFormatEx));
    Write(DataId[1], Length(DataId));
    Write(DataCount, SizeOf(DWORD));

    w := 2 * Pi * Frequency;
    for i := 0 to DataCount - 1 do
    begin
      SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate));
      Write(SoundValue, SizeOf(Byte));
    end;

    sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
    MS.Free;
  end;
end;
Responder Con Cita