Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как в Delphi реализовать возможность пропищать звук различной длины и частоты

Delphi , Мультимедиа , Аудио

Как в 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;
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;

Ностальгия по коду Delphi!

Этот код предназначен для производства звука заданной частоты. Вот разбивка кода:

  1. Процедура SetPort записывает значение в адрес порта (в этом случае, $61 и $42).
  2. Функция GetPort читает значение из адреса порта.
  3. Процедура Sound генерирует звук заданной частоты.

Чтобы изменить длину и частоту звука, вы можете модифицировать процедуру Sound следующим образом:

  • Чтобы изменить длительность звука, отрегулируйте количество циклов или используйте болееadvanced механизм времени (например, системный таймер).
  • Чтобы изменить частоту звука, просто передайте новый значений параметра Freq. Код будет рассчитывать правильные значения для адресов порта на основе новой частоты.

Вот пример модификации процедуры Sound для производства звука заданной длины и частоты:

procedure Sound(Freq: Word; Duration: Integer);
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);

     // Добавьте цикл для управления длительностью звука
    for i := 1 to Duration do
    begin
       // Повторите процесс настройки частоты для желаемой продолжительности
      SetPort($42, Freq);
      SetPort($42, Freq shr 8);
      Sleep(1000 div Freq); // Регулируйте время сна в зависимости от частоты
    end;
  end;
end;

В этом модифицированном варианте я добавил параметр Duration для указания длительности звука. Цикл в процедуре повторяет процесс настройки частоты для указанного количества раз, эффективно создавая звук заданной длины и частоты.

Обратите внимание, что это базовая реализация, и вы можете улучшить ее использованием болееadvanced механизмов времени или добавлением других функций (например, управления громкостью).

В статье описывается реализация возможности пропищать звук различной длины и частоты в приложении на языке Delphi с помощью использования функции SetPort для изменения параметров звуковой карты и процедуры Sound для генерации звука с заданной частотой.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Аудио ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:33:31/0.0060060024261475/1