Как в Delphi реализовать возможность пропищать звук различной длины и частоты
- Алло! Техотдел?! Я комп врубаю, а на экране ничего!!!
- Перезагрузи для начала.
- Как?
- Alt-Ctrl-Del.
- Не нажимаются!
- Тогда нажми Reset - потом перезвони.
(Минут через десять)
- Алло! На экране все равно ничего нет!
- Reset нажал?
- Нажал!
- Ну, и?..
- Что "и"?! Держу!!!
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;
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;
Ностальгия по коду Delphi!
Этот код предназначен для производства звука заданной частоты. Вот разбивка кода:
Процедура SetPort записывает значение в адрес порта (в этом случае, $61 и $42).
Функция GetPort читает значение из адреса порта.
Процедура Sound генерирует звук заданной частоты.
Чтобы изменить длину и частоту звука, вы можете модифицировать процедуру Sound следующим образом:
Чтобы изменить длительность звука, отрегулируйте количество циклов или используйте болееadvanced механизм времени (например, системный таймер).
Чтобы изменить частоту звука, просто передайте новый значений параметра Freq. Код будет рассчитывать правильные значения для адресов порта на основе новой частоты.
Вот пример модификации процедуры Sound для производства звука заданной длины и частоты:
procedureSound(Freq:Word;Duration:Integer);varB:Byte;beginifFreq>18thenbeginFreq:=Word(1193181divLongInt(Freq));B:=Byte(GetPort($61));if(Band3)=0thenbeginSetPort($61,Word(Bor3));SetPort($43,$B6);end;SetPort($42,Freq);SetPort($42,Freqshr8);// Добавьте цикл для управления длительностью звукаfori:=1toDurationdobegin// Повторите процесс настройки частоты для желаемой продолжительностиSetPort($42,Freq);SetPort($42,Freqshr8);Sleep(1000divFreq);// Регулируйте время сна в зависимости от частотыend;end;end;
В этом модифицированном варианте я добавил параметр Duration для указания длительности звука. Цикл в процедуре повторяет процесс настройки частоты для указанного количества раз, эффективно создавая звук заданной длины и частоты.
Обратите внимание, что это базовая реализация, и вы можете улучшить ее использованием болееadvanced механизмов времени или добавлением других функций (например, управления громкостью).
В статье описывается реализация возможности пропищать звук различной длины и частоты в приложении на языке Delphi с помощью использования функции SetPort для изменения параметров звуковой карты и процедуры Sound для генерации звука с заданной частотой.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.