Логотип
Главная 
Практика 
Игры 
Софт 
Ссылки 
Анекдоты 
Звук в Visual Basic
ПРАКТИКА
Программирование и звук
Предыдущая тема  |  Практика. Тема 1  |  Следующая тема
Программирование звука

Программирование звука в Visual Basic.

1. Как осуществляется программирование звука в Visual Basic for Application - языке Visual Basic, интегрированном в приложения MicroSoft Office (VBA)? Возможности при программировании звука определяются ещё и установленной операционной системой.
Программирование воспроизведения звука встроенной в Visual Basic командой BEEP (переменная i регулирует длительность интервала, в зависимости от которого звук через колонки будет воспроизводиться 1 раз или более):

      Private Sub UserForm_Load()
              Dim i As Long
              For i = 0 To 100
                      Beep
              Next i
      End Sub

Программирование звука командой Beep работает и в VB, но вместо UserForm в описании события указывается Form.

2. В WIN32 API имеются 2 функции, отвечающие за воспроизведение звука - MessageBeep и Beep. Принципиальное между ними отличие в том, что первая функция выводит звук через внешние динамики (колонки), а вторая - через встроенный в системный блок динамик.

Программирование звука MessageBeep: Переменная wType, в примере = i, регулирует тип звука. Для Windows98 при i = -1 Вы услышите звук сухого щелчка из встроенного в системный блок динамика, как исключение; при i=0 (1-15, 80-..., MB_ICONMASK) - звук звонка через колонки; при i=16 (17-79, ...) - низкий звук клавиши пианино через колонки. Для WindowsXP, если вместо i поставить значение одной из пяти констант, описанных ниже, например, MB_ICONASTERISK, то Вы услышите воспроизведение звука клавиши рояля. Другие константы вызывают иные системные звуки, в том числе тишину. MB_ICONMASK вызывает тот же звук, что и команда воспроизведения звука BEEP:

      Private Declare Function MessageBeep Lib "user32" _
        (ByVal wType As Long) As Long

      Private Const MB_ICONASTERISK = &H40&
      Private Const MB_ICONEXCLAMATION = &H30&
      Private Const MB_ICONHAND = &H10&
      Private Const MB_ICONQUESTION = &H20&
      Private Const MB_ICONMASK = &HF0&

      Private Sub Form_Load()
              Call MessageBeep(i)
      End Sub

Программирование звука Beep: К сожалению, в Windows98 эта функция бесполезна. Для WindowsXP: Разместите на форме кнопку Command1, затем запишите код модуля формы. Переменная Freq - это частота звука. Её можно установить в пределах от 37 до 32767 Герц. Число 200 - это значение переменной dwDuration - оно отражает длительность звучания в миллисекундах. Запустив проект на выполнение, нажимайте кнопку. Звук с каждым нажатием будет меняться в зависимости от частоты звука, указываемой в заголовке формы:

      Private Declare Function Beep& Lib "kernel32" _
        (ByVal dwFreq As Long, ByVal dwDuration As Long)

      Private Sub Command1_Click()
      Static Freq&
      Freq = Freq + 100
      If Freq < 3100 Then
              Caption = Freq
              Call Beep(Freq, 200)
      End If
      End Sub

3. В WIN32 API существует несколько функций для воспроизведения звука: функция sndPlaySound, позволяющая проигрывать звуковые файлы формата "*.wav". (Аналогична функция воспроизведения звука PlaySound.) Переменная uFlags, в примере = 1, проявляет функцию в 3 вариантах:
  1, 3, и т.д. - программа реагирует на все события, музыка или звук проигрываются и после закрытия приложения, при нажатии кнопки прерывается, начинается вновь. Вместо цифрового значения можно поставить константу SND_SYNC (синхронно), если её предварительно объявить, как показано в примере.
  0, 2, 8, 10 и т.д. - программа не реагирует на события, музыка или звук проигрывается до окончания. Вместо цифрового значения - SND_ASYNC (асинхронно).
  9, 11 - зацикленное воспроизведение звука, соответствующая константа SND_LOOP (непрерывно): программа реагирует на все события, но звук продолжает воспроизводиться бесконечно:

      Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
        (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long

      Private Const SND_SYNC = &H0
      Private Const SND_ASYNC = &H1
      Private Const SND_LOOP = &H8

      Private Sub Form_Load()
              lpszSoundName = "C:\Windows\Media\Ding.wav"
              Call sndPlaySound(lpszSoundName, 1)
      End Sub

Описанная выше функция может воспроизводить одновременно только один звуковой файл.

4. Другая функция WIN32 API mciSendString предназначена для программирования проигрывания звука только формата "*.mid". Практического значения для программирования звука она не имеет. Также способна воспроизводить одновременно только один звуковой файл. Разместите на форме Command1, вставьте код в модуль формы:

      Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
        (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
        ByVal uRetrunLength As Long, ByVal hwndCallback As Long) As Long

      Private Sub Form_Load()
              Call mciSendString ("Open c:\windows\media\flourish.mid type sequencer alias music", 0, 0, 0)
              Call mciSendString ("Play music", 0, 0, 0)
      End Sub

      Private Sub Command1_Click()
              Call mciSendString ("Stop music", 0, 0, 0)
      End Sub

5. Программирование звука с функцией mciExecute с более широким диапазоном возможностей у меня долго не получалось (по причине, указанной ниже в п.4). В приводимом примере воспроизведение звука гарантировано:

      Private Declare Function mciExecute Lib "winmm.dll" _
        (ByVal lpstrCommand As String) As Long

      Private Sub Form_Load()
              lpstrCommand = "Play " & "C:\Windows\Media\Chimes.wav"
              Call mciExecute(lpstrCommand)
      End Sub

mciExecute имеет ряд особенностей её применения:
1. Без проблем в mciExecute проигрываются файлы звука "*.wav", "*.mid", "*.mp3".
2. Файлы "*.avi" воспроизводятся лишь если звук идёт без изображения, либо изображение имеет несжатый формат.
3. Для управления mciExecute нужны лишь три команды: "Play", "Stop", "Pause".
4. Путь не должен содержать пробелы. Так, если путь к файлу - "C:\Мои документы\Ding.wav", то проигрываться mciExecute он не будет, но если "C:\Мои_документы\Ding.wav" - звук воспроизведётся.
5. В путь можно добавить интервал воспроизведения части файла:
"Play " & "C:\Windows\Media\Chimes.wav from 100 to 631". Длина всего файла определяется экспериментально. Так, если в этом примере поставить не 631, а 632, то программа выдаст сообщение об ошибке.
6. mciExecute может одновременно воспроизводить несколько звуковых файлов с разными расширениями. Из файлов звука, имеющих одно расширение, например "*.mp3", воспроизведётся первый, запущенный на воспроизведение звука.
7. Функция работает независимо от sndPlaySound и mciSendString, что позволяет использовать функции одновременно, например, "*.wav"-файлы в sndPlaySound для фоновой музыки и mciExecute для звуков игры. Фоновая музыка посредством mciExecute не очень подходит - повтор функцией mciExecute не предусмотрен.
8. Зациклить звучание в mciExecute можно только организацией цикла в программе.
9. Управлять громкостью воспроизведения в mciExecute, как и в sndPlaySound, и в mciSendString нельзя.

6. Дополнительный элемент управления Visual Basic - MediaPlayer. Щёлкнув правой кнопкой мыши на панели инструментов и выбрав "Компоненты", на вкладке "Управления" в самом низу отметьте пункт "Windows Media Player". После нажатия "ОК" на панели инструментов появляется новый элемент управления. Его и надо поместить на форму для программирования звука.

Если планируется лишь воспроизведение звука, то свойству AutoSize надо присвоить значение False, размеры элемента изменить так, чтобы остались видны лишь необходимые кнопки управления звуком.

Если Вы хотите сделать фоновый звук или музыку, Вам немного будет мешать неприятный эффект мерцания элемента управления. Элемент надо оттащить за край формы, видимый при работе программы. При возможности его можно сделать вообще невидимым. Свойству Mute должно быть присвоено значение False для разрешения воспроизведения звука. Для бесконечного повторения или определённого количества повторений воспроизведения файла звука в свойстве (Custom) надо нажать пустое поле, затем на появившуюся кнопку, на вкладке "Воспроизведение" отметить "Повторять бесконечно" или задать число повторений. Для автоматического запуска воспроизведения звука при наступлении того или иного события, например, Form_Load, необходимо в свойстве AutoStart отметить True, либо как в примере прописать команду MediaPlayer1.Play. Из других команд интересны MediaPlayer1.AboutBox - описание элемента управления (моя версия 6.4.09.1120), MediaPlayer1.Stop и MediaPlayer1.Pause .

А теперь пример программирования звука посредством MediaPlayer. На форму поместите кнопку CommandButton - Command1 для остановки воспроизведения звука и элемент управления MediaPlayer - MediaPlayer1. Внесите нобходимые коррективы в его свойства. Добавьте на форму элемент управления HScrollBar - HScroll1 для регулировки громкости звучания, текстовое поле TextBox - Text1 для вывода величины громкости звука. Можете изменить путь к файлу звука на желаемый Вами:

      Private Sub Form_Load()
              HScroll1.Max = -1
              HScroll1.Min = -40
              MediaPlayer1.FileName = "C:\Windows\Media\flourish.mid"
              MediaPlayer1.Play
      End Sub

      Private Sub HScroll1_Change()
              Text1.Text = HScroll1.Value * 100
              MediaPlayer1.Volume = HScroll1.Value * 100
      End Sub

      Private Sub Command1_Click()
              MediaPlayer1.Stop
      End Sub

Диапазон вывода громкости звука находится в пределах от 0 (максимальный уровень громкости) до -10000 (минимальный), однако достаточно ограничить нижний предел -4000, так как и при этом значении звук практически не слышно.

Для регулировки громкости звука можно использовать элемент управления Slider. Из дополнительных компонентов панели инструментов надо подключить набор Microsoft Windows Common Controls 6.0 (дополнительный системный файл mscomctl.ocx, 1042 кБт) или Microsoft Windows Common Controls 5.0 (COMCT232.ocx, 161 кБт) - в этих наборах и находится Slider. Отличие: Slider из версии 6.0 при изменении значения во всплывающем окне показывает своё текущее значение. В целях экономии объёма разрабатываемого Вами приложения рациональнее использовать Slider из версии 5.0, так как распространять созданную программу с использованием Slider необходимо совместно с одним из этих файлов - COMCT232.ocx иkb mscomctl.ocx - данные файлы находятся в системных папках обычно только тех компьютеров, на которых установлен Visual Basic.

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

Выводы. "Windows Media Player" не имеет тех ограничений, которые есть у функций воспроизведения звука из WIN32 API. Он позволяет одновременно воспроизводить несколько файлов звука, в том числе одного расширения, даже один и того же файл, но каждый раз через дополнительный элемент управления: MediaPlayer1, MediaPlayer2 и так далее.

При распространении программы нужно помнить, что для её работы необходимо наличие в системной папке (например, "C:\windows\System32" для WinXP или "C:\windows\System" для Win98) файла "msdxm.ocx", если, конечно, в операционной системе не установлен Windows Media Player или VB.

И ещё. Имеется в Visual Basic элемент управления Microsort Multimedia Control - MMControl, который тоже можно использовать при программировании звука. Наглядность и возможности в чём-то превосходят MediaPlayer. Не хватает в нём автозапуска.

Предыдущая тема  |  Практика. Тема 1  |  Следующая тема

Отзывы пишите по адресу AlexAnSol@mail.ru

шкафы купе продажа  |  Восстановление данных