Генерация звукового сигнала с заданной частотой и длительностью и простых мелодий в VBA Excel с помощью функции Beep API из набора базовых функций Windows.
Функция 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
Одиночный звуковой сигнал:
1 2 3 |
Sub Primer1() BeepAPI 1700, 500 End Sub |
Изменяйте параметры сигнала, наблюдайте за изменением его тональности и продолжительности.
Пример 2
Последовательность звуковых сигналов:
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 2 3 4 5 6 7 8 9 10 |
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 |
Если разместить этот код в столбик:
1 2 3 4 |
BeepAPI 330, 300 BeepAPI 660, 450 BeepAPI 587, 150 'и так далее, |
все будет работать, как и полагается. Хотя код будет более громоздким, зато более наглядным и удобным для редактирования. Для первоначальной настройки воспроизведения простых мелодий из кода VBA Excel рекомендую использовать именно его.
Но это же только для 64 битной системы, — Объявление функции Beep API.
Обсуждение закрыто.