Перейти к содержимому

VBA Excel. Функция Beep API (звуковой сигнал, мелодия)

Генерация звукового сигнала с заданной частотой и длительностью и простых мелодий в VBA Excel с помощью функции Beep API из набора базовых функций Windows.

  1. Функция Beep API
  2. Примеры звуковых сигналов
  3. Создание простой мелодии

Функция Beep API

Функция Beep из набора базовых функций Windows API предназначена для генерации звукового сигнала заданной тональности и продолжительности. Последовательное размещении в коде VBA Excel нескольких строк с функцией Beep API или вызов ее с помощью цикла позволит проиграть несколько гудков друг за другом и даже составить из них несложную мелодию.

Синтаксис функции Beep API

Beep (FrequencyHz As Long, TimeMs As Long)

  • Beep - имя функции, в дальнейшем мы заменим его на BeepAPI, чтобы не возникало конфликта с одноименным оператором.
  • FrequencyHz - частота звукового сигнала в герцах. Она должна быть в диапазоне от 37 до 32 767.
  • TimeMs - продолжительность сигнала в миллисекундах.

В коде VBA параметры функции Beep API (FrequencyHz, TimeMs) указываются через запятую, но без скобок.

Объявление функции Beep API

Для функции Beep API можно завести отдельный модуль в рабочей книге Excel, где хранить свои гудки и мелодии. Объявляется функция в разделе Declarations модуля VBA следующей строкой:

Private Declare Function Beep Lib "kernel32" (ByVal FrequencyHz As Long, ByVal TimeMs As Long) As Long

Но в данном случае функция будет вызываться ключевым словом Beep и будет конфликтовать с оператором Beep, который предназначен для извлечения системных звуков.

Поэтому следует дать функции Beep API другое наименование, например, BeepAPI. Тогда код объявления для раздела Declarations модуля VBA Excel будет выглядеть следующим образом:

Private Declare Function BeepAPI Lib "kernel32" Alias "Beep" (ByVal FrequencyHz As Long, ByVal TimeMs As Long) As Long

Примеры звуковых сигналов

Пример 1
Одиночный звуковой сигнал:

Sub Primer1()
  BeepAPI 1700, 500
End Sub

Изменяйте параметры сигнала, наблюдайте за изменением его тональности и продолжительности.

Пример 2
Последовательность звуковых сигналов:

Sub Primer2()
  BeepAPI 1500, 200
  BeepAPI 900, 250
  BeepAPI 2000, 200
  BeepAPI 900, 250
  BeepAPI 1500, 200
  BeepAPI 900, 250
  BeepAPI 2000, 500
  BeepAPI 0, 500 'pause
  BeepAPI 2000, 500
End Sub

Параметры подобраны наугад с небольшой корректировкой для лучшего звучания. Напишите свою последовательность, более благозвучную. Если нужна пауза, указывайте в параметрах функции Beep API частоту равную нулю и необходимую продолжительность паузы.

Создание простой мелодии

Теперь давайте напишем простую мелодию для проигрывания ее из кода VBA Excel.

Сначала находим в интернете простые ноты какого-нибудь музыкального произведения, например, танца Ламбада для исполнения одним пальцем:

Первые ноты танца Ламбада
Первые ноты танца Ламбада

Названия нот и октав смотрим по таблице из Википедии, представленной в статье Октавная система:

Названия октав и нот скрипичного ключа
Названия октав и нот скрипичного ключа

В нашем отрывке мелодии из танца Ламбада присутствуют ноты первой и второй октав. Соответствующие им частоты узнаем из таблиц «Первая октава» и «Вторая октава» в статье Октавная система из Википедии. Частоты округляем до целых значений.

Соотношение длительности нот и пауз определяем по таблице из Википедии, представленной в статье Длительность (музыка):

Относительная длительность нот и пауз
Относительная длительность нот и пауз

Если нота или пауза опубликована с одной точкой, к ней прибавляется еще половина ее длительности, которую она имеет без точки.

Наш отрывок мелодии состоит из 15 нот. Соответственно, необходимо определить 15 пар параметров: частота-длительность.

Примем длительность целой ноты за 1200 миллисекунд, и исходя из нее рассчитаем продолжительность нот, имеющихся в примере.

Заполняем данными таблицу (номер октавы указан надстрочным шрифтом):

Нота Частота Длительность
Ми¹ 330 300
Ми² 660 450
Ре² 587 150
До² 523 150
Си¹ 494 150
Ля¹ 440 300
Ля¹ 440 150
До² 523 150
Си¹ 494 150
Ля¹ 440 150
Соль¹ 392 150
Ля¹ 440 150
Ми¹ 330 150
Ре¹ 294 150
Ми¹ 330 900

Чтобы сократить код VBA для воспроизведения этой мелодии, присвоим числовые параметры из таблицы массиву. Затем проиграем последовательность сигналов с помощью цикла For…Next.
Пример 3
Воспроизведение простой мелодии с помощью кода VBA Excel:

Sub Primer3()
Dim i As Integer, a() As Variant
a = Array(330, 300, 660, 450, 587, 150, _
523, 150, 494, 150, 440, 300, 440, 150, _
523, 150, 494, 150, 440, 150, 392, 150, _
440, 150, 330, 150, 294, 150, 330, 900)
  For i = 1 To 29 Step 2
    BeepAPI a(i - 1), a(i)
  Next i
End Sub

Если разместить этот код в столбик:

BeepAPI 330, 300
BeepAPI 660, 450
BeepAPI 587, 150
'и так далее,

все будет работать, как и полагается. Хотя код будет более громоздким, зато более наглядным и удобным для редактирования. Для первоначальной настройки воспроизведения простых мелодий из кода VBA Excel рекомендую использовать именно его.

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора. Комментарии, поступившие с 20.11.18 по 25.11.18, пройдут модерацию 26-27.11.18