Учебник
DirectMusic
Для начала, создайте новый
проект в Visual Basic и добавьте в него все
необходимое для работы с DirectX. Я
подразумеваю, что вы уже знаете, как делать
это. Также, я подразумеваю, что вы знакомы
хотя бы с разделом DirectDraw. Если же нет, вам
будет трудновато усвоить следующий
материал. Итак...
DirectMusic - довольно новый
раздел в истории DirectX. Он есть пока в
версиях 6 и 7. Это неплохой компонент и если
машина пользователя обладает
достаточными ресурсами, он может быть еще
полезнее, чем использование прочих
стандартов. DirectMusi загружает .MID - файлы в
буфер (наподобии DirectSound/Draw), и, модифицируя
их, проигрывает. Кроме MIDI есть еще один
формат, поддерживаемый DirectMusic: Downloadable sound.
Может быть позже я это освещу, но для
среднего игродела на VB это покажется
овольно запутанным.
Для этого учебника вам
понадобится какой-нибудь .MID файл. Поищите
его у себя на диске. Если уж совсем ничего
не найдете, вы можете скачать пример и
использовать .MID файл, который находится в
нем.
Эти переменные вам надо
поместить в раздел Declarations главной формы
проекта
Dim dx As New DirectX7
'Главный объект, который имеется в
любом приложении DirectX7 |
Следующий маленький
кусочек кода - процедура для генерации
сообщения об ошибке. Маленькая, но
полезная.
Sub
localerror(ErrorNum As Long, ErrorDesc As String) 'Здесь
и
объяснять-то
нечего...... |
Прежде, чем начать писать программу, нам надо сделать интерфейс со всеми необходимыми объектами. Вот вариант, как он может выглядеть:
Обратите внимание, что
здесь имеется таймер, и элемент Shape,
наложенный на PictureBox. (Эта картинка сделана
во время работы программы)
Используйте эту таблицу
для выставления свойств обектов:
Form1 cmdOpen
-Верхняя
Command Button cmdPlay cmdPause cmdStop Edit_Volume
-Метка,
показывающая
громкость UpDown_Volume
- Элемент
можно
найти
в
"Microsoft Common Controls 2" Get_Time_Timer
-Timer Control Picture1 Shape1
- Поместите
это
внутри
Picture1 lblPercentage
-Маленькая
метка
в
центре
Progress Bar - кликните
на
ней
правой
кнокой
и
выберите
"Bring To Front" lblLength lblTimeSig lblTempo |
Ну вот теперь можно начать
писать код. Если у вас возникли трудности с
составлением интерфейса, загрузите
готовый проект. Ссылка внизу этой страницы.
Эти строки - первые,
которые выполняет наша программа.
Поместите их в модуль кода формы.
Private
Sub Form_Load() On
Error GoTo LocalErrors 'Созданием
Perf2 мы добиваемся того, что получаеи
информацию о сегментах без их Set
perf = dx.DirectMusicPerformanceCreate()'Создать
первый
буфер LocalErrors:
Call
localerror(Err.Number, Err.Description) 'Это
мы
уже
писали End Sub |
Большинство кода должно
быть вам понятно. То, что заслуживает
комментариев закомментировано :)
В этих строках мы
приготавливаем буфера к принятию данных, а
затем загружаем в них музыку. Скопируйте
этот код в обработку кнопки cmdOpen
Private
Sub cmdOpen_Click() Dim
Minutes As Integer On
Error GoTo LocalErrors If
Not seg Is Nothing And Not segstate Is Nothing Then
' Cостояния
Segment и
SegmentState Set
loader = Nothing '
Установть
поисковую
диреторию
на
основе
размещения
загруженного
.mid файла 'Сделать
все
Captions пустыми 'Проиграть
сегмент
до
тех
пор,
пока
не
получим
информацию 'Получить
темп 'Получить
временнУю
подпись 'Получить
длину '
Теперь, получив все данные сегмента мы
прекращаем его проигрывание Exit
Sub LocalErrors:
If
Not seg Is Nothing Then End
Sub |
Если вы теперь запустите
приложение, то увидите, что метки
заполнились информацией. Уже полезно, но
не будем останавливаться на достигнутом!
Давайте теперь получим
более весомый результат. Если все сделаем
правильно, следующий код будет
проигрывать содержимое буфра "perf". Но
не пытайтесь запускать программу прежду
чем не напишите код команды "stop", так
как вы не сможете остановить проигрывание!
Скопируйте нижеследующее в обработку
кнопки "play".
Private
Sub cmdPlay_Click() If
seg Is Nothing Then
'Пользоваель
еще
не
нажимал
"Открыть" If
fIsPaused Then
'Если
в
режиме
паузы,
продолжаем
проигрывать
с
этого
места fIsPaused
= False End
Sub |
На очереди код обработки
паузы. Вся эта связка (Play/pause/stop) должна быть
сделана полностью, поэтому не тестируйте
программу, до того как добавите весь код.
Следующие строки предназначены для кнопки
"Пауза"
Private
Sub cmdPause_Click() On
Error GoTo LocalErrors If
seg Is Nothing Then 'Если
еще
ничего
не
загружено,
уходим IsPlayingCheck
= perf.IsPlaying(seg, segstate) LocalErrors:
Call
localerror(Err.Number, Err.Description) 'Отловщик
ошибок End Sub |
И наконец, код,
останавливающий музыку. Когда вы
закончите его писать, то будете уже готовы
прослушать первый MIDI файл (заждались уже
небось 8))) Эти строки относятся к обработке
кнопки "Стоп".
Private
Sub cmdStop_Click() If
seg Is Nothing Then 'Еще
ничего
не
загрузили fIsPaused
= False 'внутренний
флаг,
говорящий
о
том,
что
нет
паузы End Sub |
Остаток программы
посвящен оптимизации и получения еще
больше результатов от приложения. Код,
который мы уже написали, является
необходимым для каждого проекта,
использующего DirectMusic, однако
нижеследующий код тоже довольно полезен.
Изменение громкости выполняется очень
просто. Вставьте следующие строки в проект:
Private Sub UpDown_Volume_Change() Private
Sub Edit_Volume_Change() |
Экспериментриуйте с
громкостью в ваших программах. Вы можете
создавать потрясные эффекты, увеличивая
громкость в ключевых местах, или просто
плавно снижая ее в конце уровня. Хороший
пример - игра Earth Worm Jim 3D :)
Это последний штрих,
который мы добавим в программу. В примере
это не показано, но после просмотра этого
кода вам должно стать понятно, как
выполнить цикл в программе. Этот код
выдает прогресс музыки в процентах, так
что когда будет 100%, вы останавливаете
музыку, перематываете на начало и снова
начинаете проигрывать. Получается цикл.
Следующие строки обрабатывают событие
таймера
Private
Sub get_Time_Timer_Timer() If
perf.IsPlaying(Nothing, segstate) = True Then 'Обновлять
только,
если
музыка
играет,,, End
Sub |