Чтобы сэмплировать звук, вы должны сохранить амплитуду звуковой волны через равные интервалы времени. Чем меньше интервал времени между соседними сэмплами, тем больше цифровой сигнал соответствует аналоговому, а, следовательно, при воспроизведении он больше похож на реальный звук. Именно поэтому при преобразовании звука в цифровой вид важны частота дискретизации и объем информации, хранящийся в одном сэмпле. Частота измеряется в Герцах (Гц, Hz), она определяет число сэмплов в одной секунде. Например, музыка CD-качества сэмлируется на частоте 44000 Гц (44 кГц), соответственно при прослушивании компакт-диска вы на самом деле слышите 44 тысячи сэмплов в секунду.
Кроме частоты, на качество звука влияет число бит, используемых для сохранения амплитуды звука, а также его качество (стерео или моно). Имея это в виду, можно разбить звук категории в зависимости от его параметров:
► частота;
► количество бит в сэмпле;
► моно/стерео.
Частота сэмплирования, как правило, варьируется от 8 кГц до 44 кГц, верхняя граница соответствует качеству звука, записанного на CD. Обычно один сэмпл содержит 8 или 16 бит, для звука CD-качества число бит равно 16.
Затем сэмплированый звук делится на стерео и моно. Под монозвуком понимается, что используется лишь один звуковой канал, в то время как стереозвук имеет два канала. Как вы, вероятно, поняли, стереозвук содержит в два раза больший объем данных по сравнению с монозвуком. Не удивительно, что звук CD-качества всегда стерео. Следовательно, теперь, когда речь пойдет о звуке CD-качества, вы должны понимать, что его характеристики таковы: 44 кГц, 16-бит, стерео.
...
В копилку Игрока
DVD-аудио поднял планку качества цифрового звука, и популярность этого вида носителя неуклонно растет. По сравнению с CD-аудио новый носитель позволяет использовать частоты до 192 кГц, число бит для хранения информации увеличить до 24, а число каналов до 6. Однако для хранения DVD-аудио требуется значительный объем памяти, что делает этот тип звука неприменимым для мобильных игр.
Поскольку в мобильных телефонах ограничена память и скорость соединения, то вы должны минимизировать необходимые вашему мидлету ресурсы. Я говорю не только о зависимости размера звукового файла от его длины, но и о качестве звука. Например, звук CD-качества (44 кГц, 16 бит, стерео) – это слишком большая роскошь для большинства современных мобильных телефонов. Поэтому очень важно найти компромисс между качеством звука и требуемым объемом памяти.
Есть еще один вопрос, который необходимо решить, если вы используете звуки в играх. Это вопрос авторского права. Вы не можете использовать авторские звуки без письменного согласия владельца прав. Например, звуки, сэмлированные из видео– или аудиозаписей, не могут быть использованы без разрешения. Это все равно, что нельзя использовать нелицензионное программное обеспечение. Поэтому будьте осторожны, сэмплируя звуки из источников, охраняемых авторским правом.
...
В копилку Игрока
Некоторые общедоступные коллекции звуковых эффектов на самом деле охраняются авторским правом, и могут навлечь на вас неприятности. Большинство таких типов коллекций – это аудио компакт-диски, содержащие различные звуковые эффекты. Внимательно прочитайте надписи на CD и убедитесь, что вы можете законно использовать его содержимое.
Знакомство с волновыми звуками
Один из популярных звуковых форматов платформы Windows – это волновые звуки (wave sound). Такие звуки хранятся в файлах с расширением wav, их можно сохранять в любых форматах в зависимости от требуемого качества звучания. Вы можете сохранять звуки с частотой дискретизации от 8 до 44 кГц с 8 или 16 битами в одном сэмпле, качества стерео или моно.
Как и в случае любого другого цифрового аудио, размер Wav-файла прямо пропорционален качеству звука. Чем выше качество, тем больше памяти требует файл.
Для некоторых мобильных игр, чтобы минимизировать требуемые ресурсы и увеличить производительность, может потребоваться самое плохое качество звука. Выбор качества определяется самим звуком. Для большинства мобильных игр достаточно использовать звук со следующими характеристиками: 8 кГц, 8 бит, моно. Более того, такие звуковые файлы имеют минимальный размер. Не забывайте, что редкий телефон имеет динамики, которые можно сравнить с динамиками настольного компьютера. Поэтому не нужно сохранять качество звука.
Если вы используете компьютер, управляемый Windows, для экспериментов с Wav-файлами в этой операционной системе есть специальный инструмент. Он называется Sound Recorder (Звукозапись). Чтобы запустить его, выполните следующее:
1. щелкните по кнопке Start (Пуск);
2. выберите All Programs ==> Accessories ==> Entertainment (Программы ==> Стандартные ==> Развлечения);
3. выберите программу Sound Recorder (Звукозапись).
...
В копилку Игрока
Sound Recorder включен во все версии операционной системы Windows. Вы найдете его в папке Accessories (Стандартные). Если вы не используете Windows, то необходимо найти другое программное обеспечение.
Программа Sound Recorder показана на рис. 9.1
Рис. 9.1. С помощью программы Sound Recorder вы можете записывать звуки и работать с ними
Вы заметите, что инструмент Sound Recorder содержит ряд кнопок, которые очень похожи на кнопки видеомагнитофона. Используя эти кнопки, вы можете записывать звуки с микрофона или CD-ROM, а также воспроизводить и останавливать их. Вы можете записать какой-нибудь звук, а затем добавить спецэффекты, например, обратное воспроизведение. Помните слухи о том, что если воспроизвести рок-музыку в обратном направлении, то можно услышать скрытые послания? Создайте собственное.
...
Совет Разработчику
Точное выделение звуков поможет не только минимизировать занимаемую ими память, но также сделает их воспроизведение более эффективным. Если вы запишете звук так, что в начале и конце не будет тишины, то он будет воспроизводиться быстро, в соответствии с выполняемыми действиями. В противном случае тишина будет вызывать заметную и раздражающую задержку в воспроизведении звука.
Создание и редактирование волновых звуков
Когда вы приготовились к тому, чтобы создавать звуки, необходимо выбрать средство записи. Например, вы можете использовать для этих целей микрофон, записать стереозвук с кассетного проигрывателя или даже видеомагнитофона. Микрофон, пожалуй, – самое простое средство, поскольку практически все мультимедийные компьютеры оснащены им. Это также наиболее креативный способ. Однако вы можете использовать звуки, уже записанные на кассете, видеокассете, CD или DVD. В этом случае просто присоедините соответствующее средство к компьютеру.
Вне зависимости от места хранения требуемого звука процесс сохранения и обработки сэмплированного звука неизменен. После того как звук сэмплирован, воспроизведите его, убедитесь, что все в порядке. Может быть, звук будет слишком громким или, наоборот, тихим. Чтобы определить громкость звука, посмотрите на его временную диаграмму (waveform). Временная диаграмма – это графическое представление звуковой волны во времени. Если амплитуда сигнала слишком высока (выходит за пределы видимой области), то звук очень громкий. Если же вы с трудом слышите звук, то, вероятно, он слишком тихий. Чтобы устранить такие проблемы, вы можете либо подстроить входной уровень устройства и сэмплировать его снова, либо использовать инструменты усиления звукового редактора.
Самый лучший способ решения проблемы громкости звука – это подстройка входного уровня устройства и повторная дискретизация звука. После того как вы добились нужного уровня громкости, необходимо обрезать звук, удалив ненужные фрагменты. Обрезание звука (clipping) подразумевает выделение в звуковом редакторе области временной диаграммы и удаление ненужных фрагментов и тишины. Это помогает сократить длину звука и устранить ненужные задержки.
...
Совет Разработчику
Задержка (latency) – это интервал времени между началом воспроизведения звукового файла до начала звучания. Задержка должна быть сведена к минимуму, чтобы звуки воспроизводились в нужный момент. Лишние фрагменты тишины в начале звукового файла часто являются причиной задержки.
После того как создан звуковой эффект, он должен быть готов к своему звездному часу. Вы можете поэкспериментировать с различными звуковыми эффектами, которые можно создать с помощью звукового редактора. Это может быть обратное воспроизведение, эхо или фазовые сдвиги. Все ограничено лишь вашей фантазией!
Продолжение знакомства с интерфейсом Player
В предыдущей главе вы узнали, как использовать интерфейс Player для воспроизведения тоновых звуков. Несмотря на то что тоны поддерживаются широким спектром телефонных аппаратов, цифровые звуки и MIDI-музыка переводят аудио мобильных игр на новый уровень. К счастью, интерфейс Player также позволяет без труда воспроизводить эти типы звуков. Но перед тем как приступить непосредственно к изучению методов воспроизведения звуков, давайте снова взглянем на интерфейс Player, побольше узнаем о его работе.
В MIDP 2.0 Media API интерфейс Player выполняет функции пульта дистанционного управления для воспроизведения различных типов звуков. Обычно, воспроизведение звука с использованием интерфейса Player включает следующие шаги:
1. создание проигрывателя с помощью метода Manager.CreatePlayer();
2. вызов метода prefetch(), который инициализирует подкачку звука и минимизирует задержку;
3. вызов метода start(), который запускает воспроизведение;
4. вызов метода stop(), прекращающий воспроизведение при необходимости;
5. вызов метода close(), закрывающего проигрыватель.
Итак, перед вами достаточно ясная картина того, что необходимо выполнить, чтобы воспроизвести звук с помощью интерфейса Player. Однако многое осталось за кадром. Так, проигрыватель имеет пять стадий жизненного цикла: UNREALIZED, REALIZED, PREFETCHED, STARTED и CLOSED. Их важность заключается в том, что при воспроизведении звука проигрыватель постоянно переходит из одного состояния в другое. Точно так же, как вы проводите свою жизнь: спите, гуляете, обедаете, гуляете и так далее, – проигрыватель проходит через свои стадии.
Аккуратное определение состояний проигрывателя поможет обеспечить лучшее управление аудио. Например, если вы разрабатываете игру, в которой необходимо загружать большой файл звука посредством сетевого соединения, полезно будет знать состояние загрузки и готов ли звук к воспроизведению. Ниже приведено пошаговое описание переходов проигрывателя из одного состояния в другое:
1. первое состояние проигрывателя – UNREALIZED;
2. проигрыватель входит в состояние REALIZED, когда в его распоряжении есть все необходимое для получения медиаресурсов;
3. проигрыватель входит в состояние PREFETCHED, когда нужные файлы закачены и готовы к воспроизведению;
4. состояние STERTED наступает при воспроизведении ресурса проигрывателем;
5. проигрыватель возвращается в состояние PREFETCHED по окончании воспроизведения;
6. проигрыватель входит в состояние CLOSED при закрытии.
После того как проигрыватель инициализирован и запущен, большую часть времени он проводит в состояниях PREFETCHED и STARTED, в зависимости от того, воспроизводится ли звук. Чтобы получить текущее состояние проигрывателя, используется метод getState(), который возвращает одну из пяти констант состояния (UNREALIZED, REALIZED, PREFETCHED или CLOSED).
Теперь, когда вы имеете представление о различных состояниях проигрывателя, давайте посмотрим на некоторые важные методы интерфейса Player, рассмотрим их функции:
► realize() – реализует проигрыватель без получения медиаресурсов (обычно нет необходимости в отдельном вызове этого метода);
► prefetch() – получает медиаресурсы, помогает минимизировать задержу (вызывается при инициализации проигрывателя);
► getState() – этот метод возвращает состояние проигрывателя (вызывается в случае, если необходимо точно знать текущее состояние проигрывателя);
► setLoopCount() – метод устанавливает число повторов при воспроизведении звука (должен вызываться перед методом start());
► start() – начинает воспроизведение звука;
► stop() – останавливает воспроизведение;
► getDuration() – возвращает длину звука (в миллисекундах);
► getMediaTime() – возвращает текущее время воспроизводимого ресурса (в миллисекундах);
► setMediaTime() – устанавливает время текущего ресурса (в миллисекундах);
► close() – закрывает проигрыватель.
Сейчас нет необходимости запоминать названия методов и их функции. В последующих разделах вы познакомитесь с ними в контексте реальной программы, в которой будет показано, как воспроизводить звуки, MIDI– и MP3-музыку.
Воспроизведение Wav-звуков в мобильных играх
Благодаря MIDP 2.0 Media API в мобильных играх без труда можно воспроизводить цифровые звуки. Главное, что вы должны решить, – откуда берется звук. Например, он может храниться в JAR-файле или скачиваться через сеть. Очевидно, что удобнее всего получать файл из JAR-архива, поэтому в большинстве игр делается именно так. В следующих разделах речь пойдет о том, как воспроизводить звуки, воспользовавшись каждым из методов.
...
В копилку Игрока
Помимо того, что вы можете воспроизводить звуки, хранящиеся в JAR-файле или в сетевом ресурсе, также можно проигрывать звуки из хранилища записей. Хранилище записей – это специальные базы данных, которые использует мидлет для доступа к данным и их хранения. Поскольку проще всего для хранения звуков использовать JAR-файл, то такой подход применяется чаще всего.
Воспроизведение звука из JAR-файла
Чтобы получить доступ к звуку, хранящемуся в JAR-файле мидлета, сначала необходимо убедиться, что нужный файл был добавлен в JAR-архив на этапе сборки мидлета. Если вы поместите звуковой файл в папке res внутри основной папки мидлета, он будет автоматически добавлен в JAR-файл при сборке мидлета инструментом KToolbar. Когда нужный файл находится в архиве, можно рассмотреть код, который необходим для его воспроизведения.
Чтобы воспроизвести звук из JAR-файла, необходимо создать поток звукового файла, а затем использовать его как основу для создания проигрывателя. Это может показаться не простой задачей, однако необходимо написать лишь пару строк кода. Ниже приведен фрагмент кода, который воспроизводит звук "окончания игры" из JAR-файла:
try {
Player gameoverPlayer;
InputStream is = getClass().getResourseAsStream("GameOver.wav");
gameoverPlayer = Manager.createPlayer(is, "audio/x-wav"); //MIME-тип auto/X очень важен – он означает волновой звук
gameoverPlayer.prefetch();
gameoverPlayer.start();
}
catch(IOException ioe) {
}
catch(MediaException e) {
}
Сначала создается объект InputStream, методу getResourseAsStream передается имя файла, который вызывается классом, возвращаемым методом getClass(). После того как входной поток создан, его необходимо передать в метод Manager.createPlayer(), а также указать MIME-тип звукового файла. В результате вы получаете новый объект проигрывателя, который почти готов к воспроизведению указанного звука. Чтобы убедиться, что звук воспроизводится с минимальной задержкой, вызывается метод prefetch(). Наконец, чтобы начать воспроизведение, вызывается метод start(). Поскольку некоторые из указанных методов могут вызывать исключения, их вызовы производятся в конструкции try-catch. Помните, вы можете вызвать метод start() столько раз, сколько это необходимо. Однако если вызывать этот метод, когда звук воспроизводится, то он не начнет воспроизводиться заново. Для этого применяется метод setMediaTime(), в который в качестве параметра следует передать 0. Это будет означать, что вы хотите остановить воспроизведение и начать его с начала:
gameoverPlayer.setMediaTime(0);