Пришло время оживить наш виртуальный рояль – добавить звуки. Нам потребуется двадцать четыре звуковых файла с нотами от до первой октавы, до си второй октавы. Я записал все ноты с помощью программы Cubase, а после разрезал полученный файл на двадцать четыре куска в звуковом редакторе. Использование звуковых редакторов – это отдельная большая тема, которая не будет обсуждаться в рамках данной статьи. Вы можете записать звуковые файлы самостоятельно или скачать мои звуковые файлы. Чтобы у вас было меньше проблем в дальнейшем, дайте каждому файлу имя записанной в нем ноты.

Импортируйте ваши звуковые файлы в ваш проект (см. главу «Flash MX и звук»). Там же описано, как сжать каждый импортированный файл. Сделать это нужно обязательно, так как размер каждого звукового файла 50-60 килобайт, и без сжатия размер вашего финального ролика будет велик.

После импортирования, необходимо каждый звуковой файл связать с переменной (см. главу «Flash MX и звук»). Имена связям сразу делайте в нашей системе кодирования, так нота ре первой октавы должна получить имя d_1.
На основной сцене создайте еще один слой и назовите его «действия». На этом слое будет располагаться код Action Script. Внимание! В статье программный код будет помещаться фрагментами, в зависимости от того, какую часть проекта мы сейчас обсуждаем. Так код, приведенный в этой части статьи для клавиши рояля не полный, дальше мы будем добавлять его. При этом обязательно будет сказано, к какому кадру или объекту данный код относится. Код будет снабжен номерами строк, чтобы удобней было его комментировать. В реальном коде номера строк, разумеется, писать не нужно. Кроме этого в конце статьи будет приведен весь программный код целиком, как он написан у меня. Также вы можете скачать файл проекта, открыть его в Macromedia Flash и сравнить его со своим проектом.

В первом кадре на слое «действия» вам нужно добавить следующий код:

1
2
3
4
5
6
7
8
ms1 = getTimer();
ms2 = getTimer();
c_1 = new Sound();
c_1.attachSound("c_1");
cd1 = new Sound();
cd1.attachSound("cd1");
d_1 = new Sound();
d_1.attachSound("d_1");
и т.д. для каждой ноты

Давайте разберем смысл приведенного фрагмента. В первых двух строках создаются две переменные ms1 и ms2. В качестве значений этих переменных используется значение функции getTimer().

Функция getTimer() определяет количество миллисекунд, прошедших с запуска ролика. Для вызова функции установите курсор в поле значение переменной, откройте группу команд Functions - getTimer().

С помощью этих двух переменных, а точнее с помощью разницы между ними мы будем определять время, прошедшее с того или иного события. Для нас это очень важно, ведь мы должны задавать длительности нот.

Начиная с третьей строчки, начинается однотипный программный код. В нем создаются объекты переменные, а после над объектом выполняется метод. Здесь необходимо пояснение. Action Script – объектно-ориентированный язык программирования. В ООП каждый объект, которым мы хотим управлять программно имеет имя, набор свойств (которые могут изменяться) и набор методов – действий, которые данный объект может выполнять. В нашем случае объектом является звук. Он имеет набор свойств, например громкость, панорамирование (в каком стереоканале он будет звучать и т.д.). Также он имеет набор методов, например запустить, остановить и т.д.

Операции с объектами, создание, изменение их свойств, вызов методов в окне «Действия кадра располагаются в группе команд Object. В нашем случае мы работаем с объектом Movie – Sound.

Так третья строчка создает объект c_1, значение данной переменной new Sound()говорит, что это не просто переменная, а звуковой объект. В четвертой строке для объекта c_1 вызывается метод .attachSound("c_1") который связывает объект с файлом, находящимся в библиотеке. Именно для вызова звука программно, мы создавали связи в библиотеке.

Обратите внимание, при вызове метода используется так называемая точечная нотация. Вначале записывается объект, а далее через точку метод объекта. Мне кажется, что такие команды удобней набирать уже в экспертном режиме окна «Действия кадра».

Так как имена звуков не имеют жестко заданной последовательности имен a1, a2 a3 и т.д. мы не можем выполнить действия по созданию и связыванию звуков в цикле. Вам придется повторить эти строчки двадцать четыре раза. Будьте внимательны, имена переменных должны совпадать со связками в библиотеке, а те в свою очередь, с именами нот в нашей системе кодирования.

Нам осталось запускать звуки. Для этого задайте действия для каждой клавиши рояля.

1
2
3
4
5
6
7
8
9
on (press) {
ms1 = getTimer();
c_1.start("", 1);
}
on (release) {
ms2 = getTimer();
d = ms2-ms1;
call("pausa");
}

Здесь приведен код для клавиши ДО. Он состоит из двух частей. Первый код (строки 2 и 3) выполняются, когда музыкант нажмет на клавишу. В переменной ms1 запоминается время нажатия клавиши, а после над объектом c_1 выполняется метод .start("", 1) он запускает (проигрывает) объект c_1. Метод имеет два параметра: первый определяет, что звук будет воспроизводиться в данном кадре, а второй показывает, что звук будет проигран только один раз.
Вторая часть кода (строки 6-8) выполняются в момент, когда клавиша будет отпущена. В переменной ms2 запоминается время этого события, по разнице ms2-ms1 можно определить, сколько времени клавиша была нажата, а после перевести это время в длительности с помощью процедуры «pausa». О ней мы поговорим позже.

Обратите внимание, в проекте явно не останавливается звук, это можно сделать с помощью метода .stop(). Мне показалось это излишним, длительность звука в музыке можно задать не только временем звучания, но и интервалами, паузами между звуками. Звуки как бы продолжают звучать в наших головах.

Аналогичный код вы должны добавить для каждой клавиши нашего рояля, и он оживет. Если зайти в режим запуска ролика вы можете нажимать на клавиши рояля и наслаждаться его звучанием.