Форум: "Потрепаться";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизКак сгенерировать звук? Найти похожие ветки
← →
D (2003-03-24 16:43) [0]Что-нибудь получше Beep, вроде паскалевских пр-р Sound, Delay, NoSound ?
← →
Danilcha (2003-03-24 17:19) [1]Во, я генерил. Могу, конечно, свою программку дать, но я бы, например, на это бы не положился. :) Лучше в MSDN Platform SDK:
Graphics and Mult. | Windows Mult. | Waveform audio
Глянь, например, пример в Юзинг:
Example of Writing Waveform Data
Причём отмечу, что память под буффер нудно выделать именно так, как в примере:
// Allocate and lock memory for the waveform data.
hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize);
иначе, он будет играть не сразу а, наверное, куда-то этот буффер сначала копировать, так, что если ему подсовывать эти буфферы всё время для непрерывной игры, будет между ними запинаться.
Для непрерывной игры так и нудно делать - делать сразу 2-8 буффера, заполнять их звуком и подсовывать играть.
Вот. Ну а если нужно спикером гудеть - Windows.Beep(Freq, Delay). Но только для NT.
← →
copyr25 (2003-03-24 19:02) [2]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure SetPort(address, Value:Word);
var
bValue: byte;
begin
bValue := trunc(Value and 255);
asm
mov dx, address
mov al, bValue
out dx, al
end;
end;
function GetPort(address:word):word;
var
bValue: byte;
begin
asm
mov dx, address
in al, dx
mov bValue, al
end;
GetPort := bValue;
end;
procedure Sound(Freq : Word);
var
B : Byte;
begin
if Freq > 18 then
begin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 then
begin
SetPort($61, Word(B or 3));
SetPort($43, $B6);
end;
SetPort($42, Freq);
SetPort($42, Freq shr 8);
end;
end;
procedure NoSound;
var
Value: Word;
begin
Value := GetPort($61) and $FC;
SetPort($61, Value);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Sound(440);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
NoSound;
end;
end.
← →
D (2003-03-24 19:09) [3]Cпасибо большое, попытаемся разобраться :)
← →
Anatoly Podgoretsky (2003-03-24 19:11) [4]Вот эти две переписать так
procedure SetPort(Address: Word; Value: Byte);
asm
xchg dx,ax
out dx, al
end;
function GetPort(Address: Word): Word;
asm
xchg dx, ax
in al, dx
end;
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.028 c