# 00043. Работа с аудио

Работа с аудио|Начинаем наш новый урок! Эта тема посвящена работе с аудио-файлами.|wmysterio|wmysterio||||Аудио-файлы можно "разбить" на три категории: звук, саундтрек и музыка. Зачем это нужно? Потому, что воспроизводятся они разными опкодами. Рассмотрим по очереди все категории:

**Звуки**. Отличается короткой длиной и типом файла. Обычно в игре звуки имеют тип "\*.wav". Для начала, нужно загрузить звук опкодом:

```
03CF: load_wav 23000 as 1
```

Здесь:\
23000 - номер ( ID ) звука. Все номера звуков хранятся в файле \*\*AudioEvents.txt\*\*, что в папке "data"\
1 - это, так сказать "переменная", в которой будет хранится звук

Потом нужно сделать проверку на загруженность:

```
03D0: wav 1 loaded
```

Здесь:\
1 - это та самая "переменная", в которую мы записали номер звука

После этого можно воспроизвести сам звук:

```
03D1: play_wav 1
```

Здесь:\
1 - загруженная "переменная" со звуком

Существует также проверка на окончание воспроизведения звука:

```
03D2: wav 1 ended
```

Когда звук больше не нужен, то обязательно выгружаем звук опкодом:

```
040D: unload_wav 1
```

Здесь:\
1 - загруженная "переменная" со звуком

Существует ещё опкод, который не нуждается в загрузке звука и который сразу проигрывает звук:

```
018C: play_sound 1052 at 0.0 0.0 0.0
```

Здесь:\
1052 - номер звука. Я пока знаю где найти описание всех номеров, поэтому берите то, что есть в "main.scm"\
0.0 0.0 0.0 - точно не знаю зачем эти цифры, так что оставляйте как есть× \*\*Примечание:\*\* следует помнить, что этот опкод воспроизводит не все звуки, так что приходится выбирать и тестировать наугад

**Саундтреки**. Эта категория аудио, как и звуки, отличается своей длиной и типом. Они имеют расширение "\*.ogg" и намного длиннее, чем звуки. Для примера саундтрека: когда входим в интерьер дискотеки играет музыка, на битве лоурайдеров - тоже звучик саундтрек. Саундтреки требуют загрузки:

```
0952: load_soundtrack 10 // увы, я не помню все номера саундтреков, но вы можете протестировать
0954: start_playing_loaded_soundtrack // воспроизводит саундтрек
```

× \*\*ВАЖНО:\*\* Одновременно можно проигрывать только 1 сандтрек

Так же можно занести в переменную статус саундтрека:

```
0953: get_soundtrack_status_to 17@
```

Здесь:\
17@ - переменная, в которую заносится статус.

А вот эта команда прекращает воспроизведение саундтрека:

```
0955: end_playing_loaded_soundtrack
```

**Музыка**. Музыка не требует дополнительной загрузки и её можно воспроизводить когда угодно. Она загружается вместе с игрой. Музыку можно услышать когда вы прошли миссию или купили дом. Опкод, запускающий музыку:

```
0394: play_music 2
```

Здесь:\
2 - номер музыки: 1 - миссия пройдена, 2 - дом куплен.

С выходом Cleo 4, нам добавилось несколько опкодов для работы с аудио. Теперь можно проигрывать прямо в игре любимый трек. Рассмотрим алгоритм запуска аудио-файла. Сначала кидаем в папку Cleo ( или в другую папку ) нужный трек и переименовуем его на английские символы ( без пробелов ) или числа. Вот например я кинул в папку Cleo трек с названием "1.mp3". Потом в скрипте нужно обязательно проверить: "Существует ли файл?":

```
0AAB: file_exists "CLEO&#92;1.mp3"
```

Здесь:\
"CLEO\1.mp3" - путь к аудио-файлу

После успешной проверки, загружаем аудио:

```
0AAC: $hMP3 = load_audiostream "CLEO&#92;1.mp3"
```

Здесь:\
$hMP3 - переменная, в которой будет хранится аудио\
"CLEO\1.mp3" - путь к аудио-файлу

После этого запускаем аудио:

```
0AAD: set_audiostream $hMP3 perform_action 1
```

Здесь:\
$hMP3 - переменная, в которой хранится аудио\
1 - флаг. ( 1 - запустить проигрывание сначала, 0 - остановить проигрывание, 2 - поставить на паузу, 3 - возобновить проигрывание )

Опкод, регулирующий громкость аудио в игре:

```
0ABC: set_audiostream $hMP3 volume 1.0
```

Здесь:\
$hMP3 - переменная, в которой хранится аудио\
1.0 - громкость ( от 0.0 до 1.0 )

Ещё один полезный опкод, который позволяет автоматически начать воспроизведение, если музыка была остановлена:

```
0AC0: loop_audiostream $hMP3 flag 1
```

Здесь:\
$hMP3 - переменная, в которой хранится аудио\
1 - флаг. Если поставить 1, то аудио будет повторятся после окончания, если 0 - не будет повторятся

И, наконец, выгрузка звука:

```
0AAE: release_audiostream $hMP3
```

Давайте напишем простенький скрипт, чтобы при нажатии кнопки 1\` играла музыка "1.mp3". Вот код:

```
:AUDIO
thread 'AUDIO'
wait 0
if
0AAB: file_exists "CLEO&#92;1.mp3"
jf @AUDIO_END
0AAC: $hMP3 = load_audiostream "CLEO&#92;1.mp3"
0ABC: set_audiostream $hMP3 volume 1.0
0@ = 0

:AUDIO_1
wait 0
if
0@ == 0
then
 if
 0AB0: key_pressed 49 // 1
 then
 0AC0: loop_audiostream $hMP3 flag 1
 0AAD: set_audiostream $hMP3 perform_action 1 // PLAY
 wait 250
 0@ = 1
 end
else
 if
 0AB0: key_pressed 49 // 1
 then
 0AC0: loop_audiostream $hMP3 flag 0
 0AAD: set_audiostream $hMP3 perform_action 0 // STOP
 wait 250
 0@ = 0
 end
end
jump @AUDIO

:AUDIO_END
wait 0
end_thread
```

Пока не будем кидать этот код в мейн, так как сейсач нет такой необходимости.|2782|1|0||rabota\_s\_audio|1498947823
