Wie kann ich Töne über den PC-Speaker ausgeben?


1. Windows95/98

Diese Assembler-Routinen von Gerd Kayser realisieren die Klangausgabe über direkte Portzugriffe und funktionieren daher nicht unter Windows NT. Die Prozedur "Sound" erzeugt einen Ton mit der Frequenz "Hz", die Prozedur "NoSound" stoppt die Klangausgabe.

function InPort(PortAddr:word): byte; assembler; stdcall;
asm
  mov dx,PortAddr
  in al,dx
end;

procedure OutPort(PortAddr: word; Databyte: byte); assembler; stdcall;
asm
  mov al,Databyte
  mov dx,PortAddr
  out dx,al
end;

Procedure Sound(Hz : Word);
var TmpW : Word;
begin
  OutPort($43,182);
  TmpW := InPort($61);
  OutPort($61,TmpW or 3);
  OutPort($42,lo(1193180 div hz));
  OutPort($42, hi(1193180 div hz));
end;

Procedure NoSound;
var TmpW : Word;
begin
  OutPort($43,182);
  TmpW := InPort($61);
  OutPort($61,TmpW and 3);
end;

2. WindowsNT

Unter Windows NT geht es wesentlich einfacher mit der Beep-Funktion aus der Windows-Unit:

Windows.Beep(Frequenz, Dauer);

Die Frequenz wird in Hertz angegeben und muß zwischen 37 und 32.767 (0x25 bis 0x7FFF) liegen, Die Dauer wird in Millisekunden angegeben. Wenn als Dauer -1 übergeben wird, wird der Ton asynchron so lange ausgegeben, bis die Funktion erneut aufgerufen wird.

Delphi 1 Delphi 2 Delphi 3 Delphi 4
nicht getestet Version nicht betroffen getestet

siehe auch:


Delphi FAQ