Билл Гейтс был ограблен по дороге в Банк, где он собирался уплатить налоги за 3 года наличными. Преступникам удалось угнать лишь две машины из всей колонны грузовиков.
Я применяю следующий код, однако он работает только под Win9x/me
(Под WinNT/2000/XP вы можете использовать Beep(Tone, Duration)
- задавать тон и продолжительность звучания).
procedure Sound(Freq: Word);
var
B: Byte;
beginif Freq > 18 thenbegin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 thenbegin
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 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;
beginasm
mov dx, address
in al, dx
mov bValue, al
end;
GetPort := bValue;
end;
Классический функционал звукового сигнала в Delphi!
Код, который я предоставил, работает, манипулируя динамиком PC для производства звука на конкретной частоте. Процедура Sound принимает целочисленный параметр Freq, представляющий частоту звука в Гц.
Вот разбивка того, что код делает:
Он проверяет, является ли вводная частота валидной (т.е., больше 18 Гц). Если это не так, он корректирует частоту для того, чтобы она была в диапазоне, который может обрабатывать динамик PC.
Он настраивает динамик PC, написав значения в порты $61 и $43. Порт $61 контролирует включение/выключение динамика и уровень громкости. Установка бита 0 в 1 включает динамик, а установка бита 1 в 1 устанавливает уровень громкости на максимальный.
Он пишет значение частоты в порт $42 два раза, который контролирует генерацию тона динамика.
Процедура NoSound просто отключает динамик, написав значение $FC (11111100) в порт $61. Это устанавливает биты 0 и 1 в 0, отключая динамик.
Процедуры SetPort и GetPort используются для чтения и записи значений в порты ввода/вывода. Эти процедуры необходимы потому, что встроенная поддержка Delphi для операций ввода-вывода ограничена.
Как вы упомянули, этот код работает под Win9x/Me, но не под WinNT/2000/XP. Причина этого заключается в том, что новые операционные системы используют другую архитектуру звука, основанную на Windows API (например, Beep(Tone, Duration)).
Если вам нужно сделать ваш функционал звукового сигнала совместимым с современными версиями Windows, я рекомендую использовать функцию Beep из Windows API или эквивалентную библиотеку. Это обеспечит более надежное и надежное производство звука.
Вот простой пример, как вы можете модифицировать свой код для использования функции Beep:
procedureSound(Freq:Word);beginBeep(Freq,100);// корректируйте продолжительность, если необходимоend;
Обратите внимание, что это более простой и надежный подход, чем оригинальный код. Вы также можете рассмотреть использование третьей-сторонней библиотеки или компонента, которая обеспечивает функциональность звукового сигнала для современных версий Windows.
В статье описывается библиотека BEEP для Delphi, позволяющая создавать звуки и музыку в приложении, а также примеры использования процедур Sound, NoSound, SetPort и GetPort.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.