Инструкция: Как изменять музыку в Worms 4
|
|
Сообщений: 3813
|
Опубликовано: 24.01.2011, 11:26:07
Чтобы изменить Музыку в Worms 4, необходимо знать в каком файле находится музыкальная тема. Она хранится в mufronte.sab и вспомогательном файле mufronte.sob , которые можно найти в директории: WORMS 4 MAYHEM\data\Audio\WXSoundBanks\PC\ Но для начала надо узнать как устроен Sab-файл. Смотрим на рисунок выше. 1 - Здесь указан формат. Если стоит 06 - это музыкальный формат, если 02 - звуковой. 2 - Коррекция звука. 03 - лучшее значение. 3 - Скорость проигрывание. Если число меньше - то скорость больше, если больше - то меньше... 00 00 00 7D - дефолтная скорость. 4 - Время звучания, если в пункте 1 был указан тип "Музыка" (06), если указан тип "Звук", не используется. 5 - Время звучания, если в пункте 1 был указан тип "Звук" (02), если указан тип "Музыка", не используется. Максимальное время звучания: 4:25 (FF в 16й СС = 255 в 10й, 255/60=4,25) 6 - Повтор. Если 01 - повтор выключен, если 00 - включен. Теперь, если вы поняли как устроен Sab, можете попробовать импортировать свою музыку. Для этого ее надо конвертировать в .wav PCM Signed 16bit, стерео RateHz 16000 . На картинке показано как это сделать, при помощи программы GoldWave. 1 - Add Files - открывает ваш файл, который вы хотите конвертировать. 2 - Во вкладке Folder указать папку, в которую сохраниться конвертированный файл. 3 - Выставите настройки звука как в красной рамке. Посмотрите какое время в секундах имеет ваша музыка. Прибавьте к этому времени несколько секунд, чтобы при зацикленном проигрывании после музыки было несколько секунд паузы. В примере музыка имеет время проигрывания 3:41, так что 3*60+41 = 221, при переводе в данное число в шестнадцатеричную систему счисления получится DD. Чтобы переводить числа в 16ю СС проще всего воспользоваться Windows калькулятором. Включите Вид-Инженерный, введите число в 10й СС, потом выберите вид-Шестнадцатеричный и число автоматом переведется в новый формат =) (прим. пер.) Теперь надо запустить Шестнадцатеричный редактор (Я использую HxD) и переместить wav в него wav. Ниже на картинке выведен 16й код wav-файла: Если проделали все как на картинке выше, осталось изменить время звучания и сохранить, как mufronte.sab Конечный файл должен выглядеть как на картинке ниже: =) Ссылка на sab-файл: http://www.sendspace.com/file/i84ath Ссылка на музыку (из видео): http://www.sendspace.com/file/qjlfrv
Смысл жизни в том, чтобы жизнь имела смысл... (firsacho 2005) Рай придуман, чтобы не страшно было умирать. Ад придуман, чтобы не страшно было жить. (firsacho 2007) Мир делиться на два типа людей: Бездарные трудоголики и Талантливые лентяи. (firsacho 2008)
mod.worms.pro - мод Worms Renewation для Worms4
|
|
|
|
Сообщений: 825
|
Опубликовано: 30.01.2011, 17:04:40
нашел ошибку: в проге при конвертировании смешается на байт каждый 5120 байт, из за ошибки в цикле щас выложу исправленную версию UPD: вот прикрепляю файл погрешность определения время воспроизведения +/- 3 секунды Сейчас звук должен быть чистым как стеклышко)
:3
|
|
|
|
|
Сообщений: 825
|
Опубликовано: 30.01.2011, 17:28:40
rocketvadim, я знаю))) теперь надо придумать как можно в проге конвертировать из мп3 в wav и как можно конвертировать из sab в wav
:3
|
|
|
|
|
Сообщений: 825
|
Опубликовано: 30.01.2011, 17:33:20
rocketvadim, Quote (Lex-Serest) З.Ы. не обращайте внимание на сообщение после конвертации, это я тестил прогу и забыл это удалить, а пересобирать мне уже лень я это и хотел сделать)
:3
|
|
|
|
Сообщений: 2848
|
Опубликовано: 30.01.2011, 17:37:59
Quote (Lex-Serest) З.Ы. не обращайте внимание на сообщение после конвертации, это я тестил прогу и забыл это удалить, а пересобирать мне уже лень это где ты писал? о_О
------------------------------------------------------------- And when the sun is shining, there is justice for all... And all the people will remember that funny "war". War, which was so dark in the beginning and so shiny in the end. But now it's over. Over for all. ------------------------------------------------------------- Я сюда захожу только из-за Game Project. И да, я больше не модер, поэтому не надо писать мне тонны лс с просьбами кого-либо забанить. И еще: черви меня не интересуют. Совсем. Поэтому, даже не напоминайте мне про них - вызовете большой БУГУРТ.
|
|
|
|
Сообщений: 825
|
Опубликовано: 30.01.2011, 17:42:30
rocketvadim, я уже удалил, так как перезалил
:3
|
|
|
|
|
Сообщений: 1463
|
Опубликовано: 30.01.2011, 18:26:59
а зачем конвертер mp3 и wav?
|
|
|
|
|
Сообщений: 825
|
Опубликовано: 01.02.2011, 18:41:59
я нашел способ конвертации из sab в wav, когда заплачу за инет, выложу
:3
|
|
|
|
Сообщений: 825
|
Опубликовано: 09.02.2011, 20:10:13
Воитек ошибся по фрейду, он ошибся в "1 - Здесь указан формат. Если стоит 06 - это музыкальный формат, если 02 - звуковой.", и где располагается длина проигрывания Так же я почти разобрал файл *.sob
:3
|
|
|
|
Сообщений: 825
|
Опубликовано: 02.04.2011, 15:14:13
ыыы решил дописать конвертор, поэтому решил декомпелировать прогу от k^2 для экспорта и импорта ыыыы надо было еще изучать ассемблер
:3
|
|
|
|
Сообщений: 3
|
Опубликовано: 30.06.2011, 13:41:00
сяп помогли
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.06.2013, 02:56:29
Так как я добавил в новый XomView проигрывание sob /sab звуков, то могу сказать со 100% уверенностью урок данный можно выкинуть в топку, он не верен на корню!!! например числа в уроке:
00 7D 00 00 = (freq) - частота 32000Hz 00 3F DD 00 = (size) - размер 14 499 584 байт
В общем структура sob файла такая: Код TSOB_HEADER = packed record id : array[0..3] of char; // CTF2 ver: array[0..3] of byte; //01 00 00 02 numsamples: Longword; unknown: Longword; end;
TSOB_SAMPLE = packed record id : array[0..3] of byte;// 01 01 00 00 FF : Longword; // ffffffff zeros: array[0..5] of Longword; items: longword; //01 dummy: array[0..1] of Longword; end; а sab файла следующая: Код TSAB_HEADER = packed record id : array[0..3] of char; // CSW2 ver: array[0..3] of byte; //01 00 00 02 numsamples: Longword; unknown: Longword; offset: Longword; nSlotNumber: Longword; end;
TSAB_SAMPLE = packed record is_file: Longword; chan: Longword; freq: Longword; size: Longword; loopstart: Longword; loopend: Longword; offset: Longword; end;
Сам процесс считывания sob информации идет так: Код SOB.LoadFromFile(filename);
SOB.ReadBuffer(sobh,sizeof(sobh)); num:=sobh.numsamples; SOBChunks.Count:=num;
for i := 0 to num-1 do begin SOB.ReadBuffer(sobs,sizeof(sobs));
if sobs.FF<>$ffffffff then begin Showmessage(format('Error reading SOB stream[%d] 0x%x',[i,SOB.Position])); goto closep; end; if (sobs.id[0]and 1)>0 then SOB.Seek(64,1); case sobs.id[0] of 0,1,5: AddSoundItem; // 101B 8,9: AddSequeenceItem; // 1001B 32: AddInterleavedItem; // 100000B 65: AddMatrixItem; // 1000001B end;
end;
// читаем названия for i := 0 to num-1 do begin SOB.ReadBuffer(id,4); SOB.ReadBuffer(namesize,4); FillChar(cname,255,0); SOB.ReadBuffer(cname,namesize); SOBChunks[i].Name:=cname; end;
В зависимости от типа меняется длинная считываемого контейнера, краткое описание функций считывания:
Код
procedure AddSoundItem(); var k:integer; begin Node.Text:='soundItem'; for k:=1 to sobs.items do begin INode:=Tree.Items.AddChild(Node,'entryItem'); SOB.Read(val,4); // index; AddReadVal(INode,'sampleBankIndex'); AddReadVal(INode,'sampleObjectIndex'); SOB.Seek(4*4,1); // AddReadVal(INode,'level'); // AddReadVal(INode,'cents'); // AddReadVal(INode,'randomCents'); // AddReadVal(INode,'randomLevel'); end; end;
procedure AddSequeenceItem(); var k:integer; begin Node.Text:='sequenceItem'; for k:=1 to sobs.items do begin INode:=Tree.Items.AddChild(Node,'trackItem'); SOB.Read(val,4); // index; AddReadVal(INode,'soundBank'); AddReadVal(INode,'soundName'); AddReadValf(INode,'time'); end; end;
procedure AddMatrixItem(); var k:integer; begin Node.Text:='matrixItem'; SOB.Seek(32,1); // matrixItem 2(matrixItem) for k:=1 to sobs.items do begin INode:=Tree.Items.AddChild(Node,'matrixItem'); AddReadVal(INode,'sampleBankIndex'); AddReadVal(INode,'sampleObjectIndex'); SOB.Seek(4*2,1); end; end;
procedure AddInterleavedItem(); var k:integer; begin Node.Text:='interleavedItem'; for k:=1 to sobs.items do begin INode:=Tree.Items.AddChild(Node,'sampleItem'); AddReadVal(INode,'sampleBankIndex'); AddReadVal(INode,'sampleObjectIndex'); SOB.Seek(4*2,1); end; end;
Для sab файла: Код SAB.LoadFromFile(filename); SAB.ReadBuffer(sabh,sizeof(sabh)); num:=sabh.numsamples; baseoffset:=sizeof(sabh)+sizeof(sabs)*num; SABChunks.Count:=num; for i := 0 to num-1 do begin SAB.ReadBuffer(sabs,sizeof(sabs)); oldpos:=SAB.Position; SAB.Position:=baseoffset+sabs.offset; // выделяем место в памяти под wav дату и копируем туда инфу SAB.ReadBuffer(p^,Size); SAB.Position:=oldpos; end; end;
P.S. может данная инфа будет кому полезна =)
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.06.2013, 03:07:57
А вот музыку все таки проиграть у меня не получилось... там странная система кодирования каналов... все звуки отлично играются, а музыка с глюками...
|
|
|
|
Сообщений: 523
|
Опубликовано: 26.06.2013, 14:36:14
Heh =). Now smarter than 2years ago :P. Good work.
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.06.2013, 16:24:46
В общем попытался анализировать музыку и нашел взаимосвязь.. в sab файле каналы чередуются через определенное количество байт, которое я еще не смог вычислить... Вот картинка волн, на ней оригинальная музыка со стерео дорожками и дорожка взятая из файла sab как моно канал, как видно тут идут блоки левый канал, правый канал...
|
|
|
|
Сообщений: 1042
|
Опубликовано: 26.06.2013, 17:07:11
Раскодировал!!! В общем в TSAB_HEADER неизвестное значение это SampleAlign т.е. длинна семпла одного канала Код TSAB_HEADER = packed record id : array[0..3] of char; // CSW2 ver: array[0..3] of byte; //01 00 00 02 numsamples: Longword; aSampleAlign: Longword; offset: Longword; nSlotNumber: Longword; end; Теперь все работает!!!
ссылка на XomView
При импорте стереомузыки нужно менять это значение на ту длину семплов на канал, который у вас в аудиофайле!!!!
|
|
|
|
Сообщений: 44
|
Опубликовано: 28.06.2013, 17:08:40
Why do not you unused?
Sample voclassi.sab is unused (preview wormsx.cpf) - captured
- flawless
- jump1
- kamikaze
Missing!
|
|
|
|