PDA

Просмотр полной версии : Длина звуков



amd103
31.03.2011, 15:43
С учетом того, что теперь длину звуков скрипты должны знать заранее, написал программу, которая выводит длину всех wavок в заданной папке в нужном формате.

Обновлено — теперь длина звуков всегда выводится с десятичной точкой.

Пример использования:

wavlengthlist "E:\TS2010\UserData\editing\2te116 sounds\tedsound" "soundDb.SetNamedTag(\"%f\", %l);"

Результат выполнения:

soundDb.SetNamedTag("idle_1.wav", 0.193);
soundDb.SetNamedTag("idle_10.wav", 0.250);
soundDb.SetNamedTag("idle_100.wav", 0.353);
soundDb.SetNamedTag("idle_101.wav", 0.255);
soundDb.SetNamedTag("idle_102.wav", 0.264);
soundDb.SetNamedTag("idle_103.wav", 0.202);
soundDb.SetNamedTag("idle_104.wav", 0.261);
soundDb.SetNamedTag("idle_105.wav", 0.255);
soundDb.SetNamedTag("idle_106.wav", 0.252);
soundDb.SetNamedTag("idle_107.wav", 0.261);
soundDb.SetNamedTag("idle_108.wav", 0.262);
soundDb.SetNamedTag("idle_109.wav", 0.253);
soundDb.SetNamedTag("idle_11.wav", 0.256);
soundDb.SetNamedTag("idle_110.wav", 0.264);
soundDb.SetNamedTag("idle_111.wav", 0.194);
soundDb.SetNamedTag("idle_112.wav", 0.279);
soundDb.SetNamedTag("idle_113.wav", 0.279);
soundDb.SetNamedTag("idle_114.wav", 0.298);
soundDb.SetNamedTag("idle_115.wav", 0.321);
soundDb.SetNamedTag("idle_116.wav", 0.301);
soundDb.SetNamedTag("idle_117.wav", 0.312);
soundDb.SetNamedTag("idle_118.wav", 0.287);
soundDb.SetNamedTag("idle_119.wav", 0.255);
soundDb.SetNamedTag("idle_12.wav", 0.261);
soundDb.SetNamedTag("idle_120.wav", 0.209);
soundDb.SetNamedTag("idle_13.wav", 0.262);
soundDb.SetNamedTag("idle_14.wav", 0.256);
soundDb.SetNamedTag("idle_15.wav", 0.284);
soundDb.SetNamedTag("idle_16.wav", 0.288);
soundDb.SetNamedTag("idle_17.wav", 0.272);
soundDb.SetNamedTag("idle_18.wav", 0.305);
soundDb.SetNamedTag("idle_19.wav", 0.496);
soundDb.SetNamedTag("idle_2.wav", 0.247);
soundDb.SetNamedTag("idle_20.wav", 0.501);
soundDb.SetNamedTag("idle_21.wav", 0.501);
soundDb.SetNamedTag("idle_22.wav", 0.500);
soundDb.SetNamedTag("idle_23.wav", 0.501);
soundDb.SetNamedTag("idle_24.wav", 0.500);
soundDb.SetNamedTag("idle_25.wav", 0.500);
soundDb.SetNamedTag("idle_26.wav", 0.500);
soundDb.SetNamedTag("idle_27.wav", 0.501);
soundDb.SetNamedTag("idle_28.wav", 0.501);
soundDb.SetNamedTag("idle_29.wav", 0.501);
soundDb.SetNamedTag("idle_3.wav", 0.246);
soundDb.SetNamedTag("idle_30.wav", 0.282);
soundDb.SetNamedTag("idle_31.wav", 0.285);
soundDb.SetNamedTag("idle_32.wav", 0.252);
soundDb.SetNamedTag("idle_33.wav", 0.312);
soundDb.SetNamedTag("idle_34.wav", 0.272);
soundDb.SetNamedTag("idle_35.wav", 0.347);
soundDb.SetNamedTag("idle_36.wav", 0.260);
soundDb.SetNamedTag("idle_37.wav", 0.277);
soundDb.SetNamedTag("idle_38.wav", 0.276);
soundDb.SetNamedTag("idle_39.wav", 0.250);
soundDb.SetNamedTag("idle_4.wav", 0.225);
soundDb.SetNamedTag("idle_40.wav", 0.290);
soundDb.SetNamedTag("idle_41.wav", 0.264);
soundDb.SetNamedTag("idle_42.wav", 0.319);
soundDb.SetNamedTag("idle_43.wav", 0.287);
soundDb.SetNamedTag("idle_44.wav", 0.356);
soundDb.SetNamedTag("idle_45.wav", 0.284);
soundDb.SetNamedTag("idle_46.wav", 0.254);
soundDb.SetNamedTag("idle_47.wav", 0.253);
soundDb.SetNamedTag("idle_48.wav", 0.252);
soundDb.SetNamedTag("idle_49.wav", 0.249);
soundDb.SetNamedTag("idle_5.wav", 0.231);
soundDb.SetNamedTag("idle_50.wav", 0.251);
soundDb.SetNamedTag("idle_51.wav", 0.266);
soundDb.SetNamedTag("idle_52.wav", 0.198);
soundDb.SetNamedTag("idle_53.wav", 0.222);
soundDb.SetNamedTag("idle_54.wav", 0.273);
soundDb.SetNamedTag("idle_55.wav", 0.274);
soundDb.SetNamedTag("idle_56.wav", 0.283);
soundDb.SetNamedTag("idle_57.wav", 0.221);
soundDb.SetNamedTag("idle_58.wav", 0.245);
soundDb.SetNamedTag("idle_59.wav", 0.257);
soundDb.SetNamedTag("idle_6.wav", 0.260);
soundDb.SetNamedTag("idle_60.wav", 0.279);
soundDb.SetNamedTag("idle_61.wav", 0.282);
soundDb.SetNamedTag("idle_62.wav", 0.282);
soundDb.SetNamedTag("idle_63.wav", 0.296);
soundDb.SetNamedTag("idle_64.wav", 0.279);
soundDb.SetNamedTag("idle_65.wav", 0.279);
soundDb.SetNamedTag("idle_66.wav", 0.277);
soundDb.SetNamedTag("idle_67.wav", 0.284);
soundDb.SetNamedTag("idle_68.wav", 0.214);
soundDb.SetNamedTag("idle_69.wav", 0.214);
soundDb.SetNamedTag("idle_7.wav", 0.259);
soundDb.SetNamedTag("idle_70.wav", 0.233);
soundDb.SetNamedTag("idle_71.wav", 0.268);
soundDb.SetNamedTag("idle_72.wav", 0.282);
soundDb.SetNamedTag("idle_73.wav", 0.268);
soundDb.SetNamedTag("idle_74.wav", 0.277);
soundDb.SetNamedTag("idle_75.wav", 0.501);
soundDb.SetNamedTag("idle_76.wav", 0.501);
soundDb.SetNamedTag("idle_77.wav", 0.253);
soundDb.SetNamedTag("idle_78.wav", 0.499);
soundDb.SetNamedTag("idle_79.wav", 0.511);
soundDb.SetNamedTag("idle_8.wav", 0.240);
soundDb.SetNamedTag("idle_80.wav", 0.258);
soundDb.SetNamedTag("idle_81.wav", 0.303);
soundDb.SetNamedTag("idle_82.wav", 0.263);
soundDb.SetNamedTag("idle_83.wav", 0.331);
soundDb.SetNamedTag("idle_84.wav", 0.504);
soundDb.SetNamedTag("idle_85.wav", 0.496);
soundDb.SetNamedTag("idle_86.wav", 0.502);
soundDb.SetNamedTag("idle_87.wav", 0.498);
soundDb.SetNamedTag("idle_88.wav", 0.568);
soundDb.SetNamedTag("idle_89.wav", 0.604);
soundDb.SetNamedTag("idle_9.wav", 0.250);
soundDb.SetNamedTag("idle_90.wav", 0.633);
soundDb.SetNamedTag("idle_91.wav", 0.350);
soundDb.SetNamedTag("idle_92.wav", 0.279);
soundDb.SetNamedTag("idle_93.wav", 0.270);
soundDb.SetNamedTag("idle_94.wav", 0.393);
soundDb.SetNamedTag("idle_95.wav", 0.232);
soundDb.SetNamedTag("idle_96.wav", 0.270);
soundDb.SetNamedTag("idle_97.wav", 0.273);
soundDb.SetNamedTag("idle_98.wav", 0.321);
soundDb.SetNamedTag("idle_99.wav", 0.327);

Скачать:
exe (http://ifile.it/df85p6z/wavlengthlist.exe)
src (http://pastebin.com/2JW724cR)

amd103
29.04.2011, 10:05
Мы все любим командную строку:
http://s41.radikal.ru/i091/1104/07/e62a7ec1ec78t.jpg (http://radikal.ru/F/s41.radikal.ru/i091/1104/07/e62a7ec1ec78.png.html)
Вот она, она прекрасна:
http://i010.radikal.ru/1104/e7/9605ad37975dt.jpg (http://radikal.ru/F/i010.radikal.ru/1104/e7/9605ad37975d.png.html)
Есть какая-то куча звуков:
http://s012.radikal.ru/i319/1104/0e/c750058af3f6t.jpg (http://radikal.ru/F/s012.radikal.ru/i319/1104/0e/c750058af3f6.png.html)
Пишем нужные параметры — путь к папке и формат вывода:
http://i001.radikal.ru/1104/bc/2e0abd373102t.jpg (http://radikal.ru/F/i001.radikal.ru/1104/bc/2e0abd373102.png.html)
Получаем результат:
http://s40.radikal.ru/i088/1104/10/2394c86f7721t.jpg (http://radikal.ru/F/s40.radikal.ru/i088/1104/10/2394c86f7721.png.html)

amd103
11.05.2011, 16:36
Немного поправленная версия — теперь длина звуков всегда выводится с десятичной точкой.
exe (http://ifile.it/df85p6z/wavlengthlist.exe)
src (http://pastebin.com/2JW724cR)

mashinist
11.05.2011, 19:31
А что дальше?
Прописываем слипы?

TRam_
11.05.2011, 21:53
да, верно.

Диспетчер
11.05.2011, 22:02
А можно более подробно в формате текстового файла на примере части скрипта объяснить как всё правильно переписать...?

TRam_
11.05.2011, 22:12
Индивидуально для разных скриптов. В 2ТЭ116 последних версий это было вынесено в конфиг библиотеки звуков.

Don_Capone
12.05.2011, 11:55
ТРам всегда так объясняет, что вопросов после его ответа становится в 2-3 раза больше :)

А можно более подробно в формате текстового файла на примере части скрипта объяснить как всё правильно переписать...? В общем случае так:
Находим длину всех звуков, потом в скрипте ищем строчки типа:

Sleep(World.PlaySound(ass,"sound/ekg_start.wav",0.1f,5.0f,30.0f,loco,"a.bog1"));

Допустим, длина звука ekg_start.wav 0.433 секунды.
Эту строчку надо будет поменять, чтобы она приняла следующий вид:

World.PlaySound(ass,"sound/ekg_start.wav",0.1f,5.0f,30.0f,loco,"a.bog1");
Sleep(0.433);

То есть убираем слип из первой строчки, и добавляем его ниже дополнительным действием. В принципе для большинства звуков такой манипуляции будет достаточно. Возможно не всё будет звучать как хотелось бы, тогда значения Sleep придётся подгонять опытным путём.

amd103
12.05.2011, 12:16
Надо вызывать Слип с меньшим числом, чтобы в зацикленных звуков не появлялись паузы между семплами. Слип никогда не спит ровно столько, сколько ему сказано, а в общем случае не менее указанного времени, причем чем ниже ФПС, тем больше будет ошибка. Я вычитаю 0.05 из длины звука для учета этого эффекта.

Don_Capone
12.05.2011, 12:34
Да, всё верно. Если звук требуют четкого зацикливания придётся колдовать.

Но если звук проигрывается разово, то можно и не урезать величину слипа.

BlackGoga
13.05.2011, 10:21
Потоки в скриптах являются псевдопотоками. Т.е. на параметр "thread" новый поток не создается физически, а функция заносится в список тредовых очередей.
Реально создается пулл потоков, потоки из этого пула производят все тредовые, да и не тредовые вычисления поочереди. Соответственно чей-то скрипт работает, чей-то ждет своей очереди. Поэтому точной синхронизации добиться не получиться. Чем меньше нагрузка на проц - тем точнее будут работать алгоритмы.
Поэтому со слипами правило такое - слип будет продолжаться не меньше указанного времени. Исходя из загрузки процессора в реальности слип будет равен или больше заданного времени.

amd103
20.05.2011, 11:13
Имхо для игры реальная вытесняющая многопоточность не нужна. С ней только прибавится мороки с необходимостью синхронизации, а преимуществ особо и не видно.

BlackGoga
20.05.2011, 12:00
реальная вытесняющая многопоточность не нужнаСовершенно верно, и проблема тут абсолютно не в синхронизации (это делается легко), а в том что:
1. Посмотрите сколько thread функций вы используете к примеру в локе, вагоне.
2. Посчитайте сколько объектов на карте имеющих thread функции.
3. Сложите их количество (thread функций).
И теперь самое главное, если на все это плодить отдельные потоки, то ваш процессор будет только тем и заниматься, что перегружать свои регистры стеком очередного потока. Делать все остальные дела ему будет некогда:)
Да и если посмотреть на тот факт, что одновременно выполняется потоков равное числу ядер - чрезмерное и не обдуманное создание потоков не даст роста производительности.

TRam_
20.05.2011, 12:19
1. Посмотрите сколько thread функций вы используете к примеру в локе, вагоне.в данный момент используется число потоков, равное числу воспроизводимых звуков (и иногда +1 дополнитеьный). В дальнейшем планируется делать таблицу выполнения звуков, чтоб реализовать "многопоточность" в самом скрипте, используя только один thread. Например система z7-xPath построена исключительно на обработчиках сообщений, поток там используется только для отмены блокировки построения маршрутов на перегон, задаваемой перед переключением направления этого перегона.


Да и если посмотреть на тот факт, что одновременно выполняется потоков равное числу ядерну это понятно. В zdsim'е, как я понял, физику считает одно ядро, перебрасыванием текстур и моделей в видеокарту - второе. В трейнзе физика не такая сложная, скрипты (которые стандартные, а не которые мы делаем) тоже простые, потому аурановцы такого распараллеливания не сделали.

amd103
20.05.2011, 13:38
реализовать "многопоточность" в самом скрипте, используя только один thread.
Смыселъ? :)
Как правило, любая реализация чего-либо в скрипте значительно медленнее того же в коде игры.

Например система z7-xPath построена исключительно на обработчиках сообщений, поток там используется только для отмены блокировки построения маршрутов на перегон, задаваемой перед переключением направления этого перегона.
Событийная ориентированность хороша лишь там, где она хороша. В локомотиве, в моделировании его с т.з. физики, её роль крайне мала.

В трейнзе физика не такая сложная, скрипты (которые стандартные, а не которые мы делаем) тоже простые, потому аурановцы такого распараллеливания не сделали.
У вытесняющей многопоточности в скриптах нет преимущества ни в производительности, ни в удобстве, так что простые ли, сложные ли расчеты скриптов и физики, оная в ГС не_нужна.

Jericho
24.12.2012, 23:55
Немного поправленная версия — теперь длина звуков всегда выводится с десятичной точкой.
exe (http://ifile.it/df85p6z/wavlengthlist.exe)
src (http://pastebin.com/2JW724cR)

как скачать то качается какой то плеер,а по второй ссылке какие то крякозябры как ими пользоваться?

Jericho
26.12.2012, 19:13
Спасибо во всем разобрался,хорошая програмулинка!

Snark
01.04.2013, 15:28
На всякий случай, если вдруг кто не знал, вывод программы можно "положить" в текстовый файл, делается это подобным образом:

C:\wavelength "C:\sounds" "%f %l" > output.txt
И в папке, откуда вызывалась программа (в примере - в корне диска C) появится файл output.txt с нужными нам данными.



New