Интернет магазин музыки, mp3 почтой, заказать mp3 диски

баннер интернет-магазина ножей nifovka.ru

RSS - RSS,
Карта сайта

Rambler's Top100

Написать на e-mail © 2007-2012 г.



Теги страницы:

ЕСЛИ вы впервые встретились с динамической музыкой, то самое время ненадолго прерваться. Остановитесь здесь и прочитайте. Класс CDinamicMusic. Создание нового класса C++. Новый класс называется СПупатicMusic и получается из класса CDirectMusic- Segment, который вы уже знаете и любите. Благодаря качественной C++ ар.чшсктурс. код этого раздела будет достаточно простым. Так как партитуры динамической музыки, созданные в DirectMusic Producer, на самом деле просто сегменты. Что вам нужно сделать, - это добавить несколько методов, характерных для динамической музыки, новому классу CDynamicMusic, этого будет вполне достаточно.

Настройка. Для новичков вот код, позволяющий загрузить сегмент динамической музыки с диска, из памяти или с ресурсов. Сейчас он уже хорошо знаком нам. Говоря бессмертными словами Дэвида Вирпа: «Такой же, как всегда». Единственное отличие здесь в том, что код обновляет класс CDynamicMusic и затем вызывает его метод LoadMolils. После LoadMotifs он возвращает «умный указатель» CSou id. LoadMotifs загружает все мотивы, содержащиеся в стилях, представленных в сегменте. CAuciioMirnagei вызывает этот метод, когда загружает мелодию, поэтому, когда приходит время воспроизводить мотив, код не теряет времени на то, чтобы найти специальный интерфейс JDirectMusicScgmcnt8 для этого мотива. LoadMotifs проходит по всему сегменту и собирает карту имен мотивов. Этот код, основанный на примере программы PlayMotif DirectX, проходит по всем стилям в сегменте. Для каждого стиля он проходит уже по стилю — на этот раз по всем мотивам, имеющимся в стиле. Для каждого мотива он берет интерфейс. Ничего особенного здесь нет. Деструктор использует цикл, чтобы пройтись по всему содержимому карты и удалить все встретившиеся.

Воспроизведение динамической музыки. Чтобы динамическая музыка работала правильно, вам нужно изменить одну ключевую вещь в классе CDirectMusicSegment. Чтобы понять почему, вам нужно сначала разобрать с тем, что такое контрольный сегмент. DirectMusic позволяет вам воспроизводить более одного сегмента одновременно. Например, вы можете проигрывать сегмент, содержащий вашу динамическую музыку, и одновременно с ним сегмент, содержащий WAV файл или звуковой эффект. Как вы знаете, каждый сегмент содержит набор треков. Большинство из них влияют только на свой сегмент - ничего страшного, если воспроизводятся два сегмента и каждый имеет свой трек ритмического уровня. Но некоторые треки сегмента должны быть одинаковы для всех. Например, у всех сегментов должен одинаковый темп и карта аккордов (это не производит, когда музыка играется с разными скоростями и с разными аккордами).

Итак, если у вас есть сегмент с аккордами 2СМ и еще один с аккордами Л?! ш7 и вы проигрываете их вместе, то как DirectMusic должен выбирать, какой трек аккордов «победит»? В таком случае он использует мнение контрольного сегмента. Контрольные сегменты «правят» другими играющими сегментами; DirectMusic использует всегда их глобальные треки (аккордов, темпа и т. д.). Это достаточно важно, потому что чаще всего вам необходимо, чтобы ваш сегмент динамической музыки был контрольным. Иначе все использованные вами изменения аккордов не будут учтены, и музыка будет звучать неверно. Хорошо, что легко указать Direct Music, что конкретный сегмент должен быть контрольным - нужно просто передать флаг DMUS SHGF CONTROL методу PlaySegmentEx IDirectMusicPorfonnimeef!, If.ioxo. что из-за C++ архитектуры звукового движка, превращение этой процедуры в доступную требует исправления нескольких различных классов.

Начнем с верхнего уровня - вам необходимо добавить параметр к методу Play сегмента. Новый параметр, называемый control, это логическая переменная, должен ли сегмент, воспроизводимый вами, быть помечен как новый контрольный сегмент. Этот параметр напрямую передается методу Init CSoundlnstance. потому что именно вызывает PlaySegmentEx. Init также приобретает новый параметр (он тоже называется control - представьте который определяет, нужно ли флаг DMUS_SEGF_CONTROL передать в PlaySegmentEx. Теперь достаточно просто заставить метод Play CDynamicMusie использовать новый флаг bool Play () { return (CDirectMusicSegir.ent: :?lay (NULL, trust ; ; }. Это достаточно хитро, но тем не менее важно, так как это гарантирует, что ваша динамическая музыка правильно.