Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

Как сгенерировать звук?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
3-30303
Sirus
2003-03-23 10:43
2003.04.10
IBase 5.5 и IBase 6 на одной машине... Можно или нет???


6-30482
TankMan
2003-02-12 00:52
2003.04.10
Какой-то глюк с ClientSocket


14-30545
S-S
2003-03-13 15:08
2003.04.10
Двухмиониторное отображение


1-30339
Aleksandr
2003-03-31 12:46
2003.04.10
Несовпадения про конвертации FileDateToDateTime и назад.


1-30395
Provodnick
2003-03-29 00:26
2003.04.10
Проблема с созданием потомка класса.