» TeamX (Архив Форума)«


Форум TeamX » Исследования » Фол и wav-ы (Soundplay и компания)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 ] Все собщения

 
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

Итак, было раскрыто назначение ещё одной фоловской команды.

int soundplay(string wav_file,unsigned int flags);

Первый параметр (например, "my_music/ambient/back.wav") - имя и путь к wav-файлу. К началу припишется master_patches (т.е. обычно указываемый путь - относительно папки data). Wav должен быть без заголовка (raw).

Второй. Список флагов (спасибо WG):
---------------------
soundnormal   0x0000
soundloop     0x0001
sound8bit     0x0000
sound16bit    0x0002
soundmemory   0x0100
soundstreamed 0x0200
soundmono     0x1000
soundstereo   0x2000
---------------------

Флаги складываются. Не забывайте, что Фол понимает только десятичный формат. Так что для проигрывания 8-ми битного моно-файла, нужно указать параметр 4096 (0x1000).

А иеперь - пара фокусов. Берём ваш любимый эмбиентный трэк в mp3 (можно и дефметал или что вы там слушаете?) в одну руку, конвертер mp3->wav в другую. Конвертим (не забывайте про raw!), запоминаем параметры (например, 16 бит, стерео), кладём получившуюся wav-у (пусть будет back.wav) в data/music. Пишем такой скрипт:
---------------------------------------
variable pause;
variable ret;

procedure start begin end

procedure critter_p_proc begin
end

procedure map_enter_p_proc begin
 ret:=soundplay("music/back.wav",8195); //8195=0x2000+0x0002+0x0001 (stereo, 16bit, loop)
end

procedure talk_p_proc begin
 if not pause then begin
   pause:=1;
   display_msg("Pause");
   soundpause(ret);
 end else begin
   pause:=0;
   display_msg("Resume");
   soundresume(ret);
 end
end
---------------------------------------
Компилируйте, привязывайте к Клинту, начинайте игру. Впечатляет? :-) Ваш бэк, зацикленный, да ещё и с возможностью паузы. Играть одновременно может несколько звуков. Soundplay возвращает "указатель" на проигрываемый звук. Зная указатель, можно проигрыванием управлять.


А теперь, друзья, дело за вами :-) Не оставьте наработку недоделанной, поучаствуйте в открытии :-)

Итак, несколько вещей, на которые у меня, к сожалению, нет времени:
1. разобраться с командами soundrewind(p1) и sounddelete(p1).
2. попробовать сделать проигрыватель музыки на интерфейсных функциях (используя SelectFileList)
3. попробовать сделать динамическое изменение музыки при переходе в боевой режим
4. разобраться с флагами soundmemory и soundstreamed

Дерзайте :-) Я тоже буду потихоньку ковырять.

Да, если вы думаете "всё это, конечно, хорошо - но какой идиот приложит к своему моду музыку в wav-ах?" - посмотрите НВ 1.1. Не пожалеете :-) Намётка: музыку можно поставлять и в ogg/mp3. И декодировать в wav при установке мода.

(Отредактировал(а) Raven - 19:51 - 28 Янв., 2005)


(Добавление от 14:22 - 28 Янв., 2005.)


Добавление: если звук многоканальный (стерео), то кроме stereo-флага нужно ставить и streamed-флаг.

Отправлено: 12:48 - 28 Янв., 2005
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Впечатляет. Да ещё как. Сразу возникло много идей. Но об этом после.
Есть идея как сделать :

>>3. попробовать сделать динамическое изменение музыки при переходе в боевой режим

Но сначала хочется кое-что узнать.
1)В приведеном скрипте не работает пауза. Soundresume и soundpause  - это стандартные функции?
2)попробовал подставить трек длинной в 4 минуты. В вав он занял 50 метров. В mp3 - 5. При начале проигрывания звука фолл сильно подвисает. А потом всё нормально. Кроме того, звук значительно искажается и растягивается, хоть флаги выставлены вроде правильно. Может просто двиг пытается всё подгрузить в память(бывают у него такие заморочки - пытается, редко правда, запихнуть всю библиотеку игры в память. ) Качество wav - 44100 Hz, 16 bit per sample, стерео.  Значение выставлено в 8195. Какие есть идеи.
(Кстати тачка не слабая, тормозить сама по себе не должна, да и не тормозит.)


(Добавление от 14:54 - 28 Янв., 2005.)


На момент моего ответа не видел дополнения. Частично становится ясно.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 14:52 - 28 Янв., 2005
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

>>Значение выставлено в 8195. Какие есть идеи.

См. добавление. Для стерео - не 0x2002, а 0x2202. Поставь 8706. Иначе Фол будет считать, что звук - на один канал. А тормозов не замечал. Может, с диска читала долго? Или ты растягивание (вдвое в твоём случае) за тормоза принял?

>>1)В приведеном скрипте не работает пауза. Soundresume и soundpause  - это стандартные функции?

Да. Всё работает. Ты точно возврат soundplay-я в вару сохраняешь? Вара - не локальная? Не в этой же процедуре объявлена? (Не подумай, что я тебя за дурака считаю и такие вот вопросы детские задаю :-) Просто - может, проглядел чего?).

А с боевым режимом уже начал разобираться, всё, вроде, работает. Но без crossfade-а (плавного перехода по громкости между темами) - звучит не очень.


(Добавление от 15:06 - 28 Янв., 2005.)


>>На момент моего ответа не видел дополнения. Частично становится ясно.
Я тоже твоё добавление мимо глаз пропустил :-)

Отправлено: 15:05 - 28 Янв., 2005
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

Тормоза действительно были, причём нешуточные.
Использовал дополнение. Тормоза исчезли
>>Или ты растягивание (вдвое в твоём случае) за тормоза принял?
Стоп. А как от растягивания избавиться ?
И ещё. Loop - это же проигрывание по кругу? А то проверять и ждать 10 минут влом.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 15:43 - 28 Янв., 2005
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

>>Стоп. А как от растягивания избавиться ?

Правильно подобрать флаги. Чтобы точно соответствовали формату читаемого файла. Если у тебя звук растягивается, значит файл в стерео, а флаги установлены на моно (ещё раз - полноценное стерео это soundstereo+soundstreamed - 0x2200)

Короче, поиграйся с наборами разных флагов. Стерео/моно, 8/16. 2^2=4 комбинации (4096, 8192, 4610, 8706. Для loop добавь 1). Просто перебери их и всё. Если неправильно подобран бит, то будет хрип. Если неправильно указано число каналов - происходет растягивание (стерео читается как моно) или ускорение (моно читается как стерео).

>>И ещё. Loop - это же проигрывание по кругу? А то проверять и ждать 10 минут влом.

Да. Это зацикливание.

Отправлено: 16:50 - 28 Янв., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Тут мысль такая возникла...
acm в Фоле 22050 Hz. Может быть, wavы тоже должны быть с той же частотой сэмплирования?

Отправлено: 16:52 - 28 Янв., 2005
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

>>acm в Фоле 22050 Hz. Может быть, wavы тоже должны быть с той же частотой сэмплирования?

У меня и 44100 неплохо работают, вроде.

Отправлено: 17:02 - 28 Янв., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Да, но только с soundstreamed. А что если это вовсе не для того предназначено? ;) Надо проверить.

ЗЫ Мне не лень, просто на работе колонок нет :).


(Добавление от 17:24 - 28 Янв., 2005.)


Да, кстати, флаги можно использовать буквально, это константы, которые "понимает" компилер БИС.

Отправлено: 17:22 - 28 Янв., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

Результаты эксперимента:
wav  22050 Hz, 16 бит, стерео
Проигрывается абсолютно одинаково в обоих случаях:
soundplay("17arroyo.wav", sound16bit bwor soundstereo bwor soundstreamed);
soundplay("17arroyo.wav", sound16bit bwor soundstereo);
Боюсь, soundstreamed имеет несколько иной смысл... ;)


(Добавление от 21:46 - 28 Янв., 2005.)


Вот инфа. Если нет добавлений, то так и пойдёт в "доку".

snd_handler soundplay(string file, int mode) - проигрывает звуковой файл
Аргументы:
file - имя (путь) к звуковому файлу в формате wav или raw с частотой сэмплирования 22050 Гц
mode - режим:
soundnormal (0x0000)
soundloop (0x0001)
sound8bit (0x0000)
sound16bit (0x0002)
soundmemory (0x0100)
soundstreamed (0x0200)
soundmono (0x1000)
soundstereo (0x2000)
Возвращаемое значение:
Идентификатор звукового файла (snd_handler)
Примечания:
Флаги режима могут комбинироваться при помощи bwor, например, для проигрывания 16-битного стерео параметр mode должен быть равен (sound16bit bwor soundstereo), а для "зацикливания" этого звука - (sound16bit bwor soundstereo bwor soundloop).
Звуки могут проигрываться одновременно (накладываться).

void sounddelete(snd_handler handler) - удалить (отключить) звук, созданный при помощи soundplay
Аргументы:
handler - идентификатор звукового файла

void soundstop(snd_handler handler) - остановить проигрывание звука, созданного при помощи soundplay
Аргументы:
handler - идентификатор звукового файла

void soundpause(snd_handler handler) - пауза звука, созданного при помощи soundplay
Аргументы:
handler - идентификатор звукового файла

void soundresume(snd_handler handler) - возобновить проигрывание звука, остановленного soundpause
Аргументы:
handler - идентификатор звукового файла
Примечания:
Если звук был остановлен при помощи soundstop, то проигрывание всё равно возобновляется с момента вызова soundstop, а не с начала файла, так что разница между этими функциями не совсем ясна

void soundrewind(snd_handler handler) - по-идее перемотка в начало, но у меня (F2 v1.02d eng) не работает
Аргументы:
handler - идентификатор звукового файла

ЗЫ У меня файлы 44 кГц проигрываются замедленно вне зависимости от наличия флага soundstreamed. Версия F2 1.02d eng.

Отправлено: 20:30 - 28 Янв., 2005
ABel
Партизан

Откуда: Krasnoyarsk
Регистрация: Дек. 2002

Всего: 307 сообщений

Мне кажется, что Фолл WAVы проигрывать не умеет.
Он их, как RAW рассматривает.
ВАВовский заголовок тоже проигрывает, в общем.

-----
Семь раз об дверь, один - об рельс.

Отправлено: 12:08 - 4 Фев., 2005
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 ] Все собщения


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com