Este artículo muestra cómo reroducir sonidos de onda (waveform) de diferentes fuentes

Ejecutando un sonido propio

Copyright © 2000 Ernesto De Spirito

KnowledgeBase Vortex 2.9

Si desea reproducir uno de los sonidos básicos del sistema, llame a MessageBeep con el parámetro apropiado. Llame a

MessageBeep(-1);

si desea escuchar el pitido del parlante de la PC.

Para reproducir un sonido WAV, puede usar un objeto TMediaPlayer, pero si quiere algo rápido, la forma más fácil es llamando a la función API sndPlaySound (declarada en la unidad mmsystem). Por ejemplo:

uses MMSystem;

procedure TForm1.Button1Click(Sender: TObject);
begin
  sndPlaySound('C:\Windows\Media\Tada.wav',
    SND_NODEFAULT Or SND_ASYNC Or SND_LOOP);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  sndPlaySound(nil, 0); // Detiene el sonido
end;

Si pretende ejecutar un sonido más o menos seguido, tal vez debería considerar cargar el archivo en memoria y reproducirlo desde ahí:

var
  tada: string;

procedure TForm1.Button1Click(Sender: TObject);
begin
  sndPlaySound(Pointer(tada), SND_MEMORY
    Or SND_NODEFAULT Or SND_ASYNC);
end;

initialization
  tada := LoadFile('C:\Windows\Media\Tada.wav');

finalization
  tada := ''; // Libera la memoria ocupada por la cadena
end.

Puede insertar uno o más archivos de onda (wave) en su ejecutable y reproducirlos desde allí. Primero necesita crear un archivo de recursos (.RES). Para hacerlo, cree un archivo .RC, por ejemplo llamado sonidos.rc:

tada wave c:\windows\media\tada.wav
chimes wave c:\windows\media\chimes.wav

Luego debe compilarlo con el compilador de recursos (BRCC32.EXE en el directorio Delphi\Bin) y así obtendrá un archivo llamado sonidos.res que puede cargar en su proyecto con la directiva $R. Para reproducir el sonido directamente del ejecutable llame a PlaySound (en vez de sndPlaySound) con el indicador SND_RESOURCE:

uses MMSystem;

{$R sonidos.res}

procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound('chimes', hInstance, SND_RESOURCE or SND_SYNC);
  PlaySound('tada', hInstance, SND_RESOURCE or SND_ASYNC);
end;

Nuevamente, si va a reproducir un sonido con cierta frecuencia, debería considerar cargar el recurso en memoria y ejecutarlo desde allí:

uses MMSystem, Windows;

{$R sonidos.res}

var
  tada: Pointer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  sndPlaySound(tada, SND_MEMORY
    or SND_NODEFAULT or SND_ASYNC);
end;

initialization
  // Aquí usamos algunas conversiones para evitar usar otra variable
  tada := Pointer(FindResource(hInstance, 'tada', 'wave'));
  if tada <> nil then begin
    tada := Pointer(LoadResource(hInstance, HRSRC(tada)));
    if tada <> nil then tada := LockResource(HGLOBAL(tada));
  end;
end.
JfControls Library - para Delphi y C++ Builder