Воспроизведение тональных звуков
При создании звукового сопровождения к играм и приложениям в основном используются так называемые тональные звуки, генерируемые телефоном. Мобильные телефоны ограничены в системных ресурсах, поэтому воспроизведение wav, mp3 файлов не всегда возможно.
Воспроизведение тональных звуков происходит примерно тем же способом, что и воспроизведение wav-файлов, рассмотренное в предыдущем разделе. Создание тональных звуков строится на основе секвенсора, используемого музыкантами. То есть, в вашем распоряжении имеются семь нот, которые могут быть сыграны в любой тональности. Указав определенную последовательность нот в заданном массиве данных, вы сможете их впоследствии последовательно воспроизвести. В принципе, аналогичные действия можно произвести в любом телефоне, где в музыкальном редакторе вы выстраиваете некую последовательность определенных Символов, обозначающих ноты. Указав нужную последовательность нот, вы получаете готовую мелодию, созданную при помощи тональных звуков.
Перейдем к практике. Первым делом необходимо создать те самые семь нот. В классе ToneControl пакета javax.microedition.media.control.*, доступна константа С4, которая по своему звучанию соответствует ноте «До». Для того чтобы создать, например ноту Ре, можно воспользоваться следующей конструкцией кода:
byte Re = (byte)(ToneControl.C4+1);
Для создания последующей ноты Ми нужно прибавить к ноте До (то есть С4), число два и так далее. Когда закончатся все семь нот, то вы переходите к следующей октаве, что и предопределяет разные тональности звукового сопровождения. Всего можно использовать значение от 0 до 127.
Затем создается массив данных, можно назвать его секвенсором, в котором указывается последовательность нот. Синтаксис, используемый в секвенсоре, строго определен, и его необходимо правильно использовать. Например, имеется следующий массив данных, характеризующийся как секвенсор:
byte[] Nota = {...};
В этом массиве данных первой строкой кода должно идти указание версии используемого атрибута.
ToneControl.VERSION,1,
Затем задается скорость воспроизведения с помощью целочисленного значения, которое может варьироваться от 5 до 127. Например:
ToneControl.TEMPO,30,
Далее необходимо дать команду, указывающую начало блока последовательности нот для воспроизведения, например:
ToneControl.BLOCK_START, 0,
И только после этого идет последовательность нот. Между нотами ставится обязательно длина ноты обычно заданная переменной, и ее диапазон может быть от 2 до 16. Например:
byte d = 4; Re,d,Mi,d,Re,d,
Между воспроизведением нот можно использовать паузы для создания выразительной мелодии. Пауза задается с помощью константы SELENCE, например:
byte stop = ToneControl.SELENCE; byte d = 4;
Тогда последовательность нот может быть следующей:
Re,d,stop,d,Mi,d,stop,d,stop,d,Re,d,
После того как вы задали всю последовательность нот, необходимо четко указать конец блока с помощью константы BLOCK_END следующим образом:
ToneControl.BLOCK_END, 0,
На каждую константу BLOCK_START, должна присутствовать константа BLOCK_END. Иначе возникнет ошибка при компиляции.
В конце нужно воспользоваться константой PLAY_BLOCK для воспроизведения блока последовательности нот. После этого созданный секвенсор можно использовать для воспроизведения проигрывателем тональных звуков. Посмотрите на листинг 9.2, где показана демонстрационная программа, воспроизводящая все семь нот одной октавы.
/ * * листинг 9.2 класс TonMIDlet воспроизводит тональные звуки */ import javax.microedition.Icdui.*; import javax.microedition.midlet.*; import javax.microedition.media.*; import javax.microedition.media.control.*; import java.io.*; public class TonMIDlet extends MIDlet implements CommandListener // команда выхода private Command exitMidlet = new Command("Выход",Command.EXIT, 0); // команда воспроизведения private Command pi = new Command("Играть", Command.OK, 1); // объект mydisplay представляет экран телефона private Display mydisplay; public TonMIDlet() { mydisplay = Display.getDisplay(this); } public void startApp() Form Is = new Form("Тональные звуки"); // добавляем команду выхода ls.addCommand(exitMidlet); // добавляем команду воспроизведения ls.addCoiranand(pl); ls.setCommandListener(this); // отражаем текущий дисплей my.display. setCurrent (Is) ; } private void TonPlay() { // нота До byte Do = ToneControl.C4;, // нота Ре byte Re = (byte)(ToneControl.C4 + 1); // нота Ми byte Mi = (byte)(ToneControl.C4 + 2) ; // нота Фа byte Fa = (byte)(ToneControl.C4 + 3); // нота Соль byte So = (byte)(ToneControl.C4 + 4); // нота Ля byte Lj = (byte)(ToneControl.C4 + 5); // нота Си byte Si = (byte)(ToneControl.C4 + 6); // пауза byte stop = ToneControl.SILENCE; // скорость воспроизведения тональных звуков byte speed = 30; // продолжительность воспроизведения ноты byte pr = 4; // секвенсор byte[] Nota = { // атрибут, задающий номер версии ToneControl.VERSION, 1, // скорость воспроизведения ToneControl.TEMPO, speed, // начало блока ToneControl.BLOCK_START, 0, // последовательность нот для воспроизведения Do,pr,stop,pr,Re,pr,stop,pr,Mi,pr,stop,pr, Fa,pr,stop,pr,So,pr,stop,pr,Lj,pr,stop,pr,Si,pr, // конец блока ToneControl.BLOCK_END, 0, // воспроизведение блока ToneControl.PLAY_BLOCK, 0, } ; // воспроизводим тональные звуки из секвенсора try{ Player player = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR); player.realize(); ToneControl toncontrl = (ToneControl)player.getControl(«ToneControl»); toncontrl.setSequence(Nota); player.start(); } catch (IOException zxz){} catch (MediaException zmz){} } public void pauseApp() {} public void destroyApp(boolean unconditional){} public void commandAction(Command c, Displayable d) { if (c = = exitMidlet) { destroyApp(false); notifyDestroyed(); } if (c == pi) { TonPlay(); } } }
В основе программы из листинга 9.2 лежит модель, используемая в предыдущем разделе при .воспроизведении wav-файла. В классе TonMIDlet создается пустая форма классом Form и назначаются две команды: выход из программы и воспроизведение тональных звуков. При нажатии на кнопку Играть, задействуется метод TonPlay (), где создаются ноты, секвенсор, после чего происходит воспроизведение последовательности нот.
Содержание раздела