<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kwasior</id>
	<title>HedgeDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kwasior"/>
	<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php/Special:Contributions/Kwasior"/>
	<updated>2026-04-17T08:18:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://hedgedocs.com/index.php?title=ACB_Audio_Injection&amp;diff=1139</id>
		<title>ACB Audio Injection</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=ACB_Audio_Injection&amp;diff=1139"/>
		<updated>2025-09-02T22:07:04Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: Added an image of created ACB playing in foobar2000&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this tutorial you will learn the basics of injecting audio (HCA, ADX) into CRIWARE&#039;s ACB files. Helps to cut down the size of mods by not shipping the entire ACB+AWB.&lt;br /&gt;
&lt;br /&gt;
The tutorial will be using &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt; from [[KwasTools (Hedgehog Engine)|KwasTools]] for ACB conversion to and from XML.&lt;br /&gt;
&lt;br /&gt;
Additional software will be required, such as the HCA audio converter and a text editor. I will be using [https://github.com/Thealexbarney/VGAudio VGAudioCli] and [https://notepad-plus-plus.org/ Notepad++]. &lt;br /&gt;
&lt;br /&gt;
I also recommend installing [https://www.foobar2000.org/ foobar2000] with [https://vgmstream.org/ vgmstream component] for easy preview of audio. Will also help with pinpointing file indices in AWB archive.&lt;br /&gt;
&lt;br /&gt;
For this tutorial, I will be replacing Cyber Space 1-1 music in [[Sonic Frontiers]].&lt;br /&gt;
&lt;br /&gt;
== Converting the ACB to XML ==&lt;br /&gt;
Converting the &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; is as easy as drag and dropping it on the &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt; executable.&lt;br /&gt;
&lt;br /&gt;
If conversion was successful, it&#039;ll create an XML file in the same directory as the &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt;. For me it created &amp;lt;code&amp;gt;bgm_cyber.acb.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:Bgm cyber acb in xml form.png|center|638x638px|XML opened in a text editor|alt=XML opened in a text editor|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Creating an internal AWB file ==&lt;br /&gt;
Some &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt;s do not have an internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file, which is required to store audio we want to use. This is the case with &amp;lt;code&amp;gt;bgm_cyber&amp;lt;/code&amp;gt;, it lacks one and we need to create it.&lt;br /&gt;
&lt;br /&gt;
The XML structure of &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file is the same as one from &amp;lt;code&amp;gt;cri_awb_tool&amp;lt;/code&amp;gt;. However, I will include a minimal example for Sonic Frontiers below to keep things straightforward.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AWB version=&amp;quot;2&amp;quot; offset_size=&amp;quot;4&amp;quot; id_size=&amp;quot;2&amp;quot; alignment=&amp;quot;32&amp;quot; subkey=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;0&amp;quot; path=&amp;quot;audio.hca&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/AWB&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Keep in mind that parameters need to match the external AWB&#039;s. Game will crash otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Inserting the internal AWB structure ===&lt;br /&gt;
Search for &amp;lt;code&amp;gt;&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AwbFile&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt; and you should find this:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;5456&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AutoModulationTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;StreamAwbTocWorkOld&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AwbFile&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;amp;#10;ACB Format/PC Ver.1.37.0 Build:&amp;amp;#10;&amp;quot; name=&amp;quot;VersionString&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;CueLimitWorkTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;We need to replace the &amp;lt;code&amp;gt;AwbFile&amp;lt;/code&amp;gt; record with our own &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; structure. &lt;br /&gt;
&lt;br /&gt;
After changes you should get something like this:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;5456&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AutoModulationTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;StreamAwbTocWorkOld&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;AWB version=&amp;quot;2&amp;quot; offset_size=&amp;quot;4&amp;quot; id_size=&amp;quot;2&amp;quot; alignment=&amp;quot;32&amp;quot; subkey=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;0&amp;quot; path=&amp;quot;my_audio.hca&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;1&amp;quot; path=&amp;quot;my_audio_boost.hca&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/AWB&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;amp;#10;ACB Format/PC Ver.1.37.0 Build:&amp;amp;#10;&amp;quot; name=&amp;quot;VersionString&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;CueLimitWorkTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ID starts at 0 and goes up. Paths are relative to XML&#039;s location.&lt;br /&gt;
&lt;br /&gt;
== Modifying Waveform data ==&lt;br /&gt;
Next, we need to change data in the &amp;lt;code&amp;gt;Waveform&amp;lt;/code&amp;gt; table for each track we want to replace.&lt;br /&gt;
&lt;br /&gt;
In short, we have to change the &amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Streaming&amp;lt;/code&amp;gt; values.&lt;br /&gt;
&lt;br /&gt;
=== Explanation of parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; is the index in the internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file. In our case, index &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the main track and index &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; is the boost version.&lt;br /&gt;
&lt;br /&gt;
Streaming is more interesting, it has three available options:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Streaming values&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Audio is streamed from internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file, which resides in RAM&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Audio is streamed from external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Short snippet of audio in internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file to initialize the decoder, rest of the audio is streamed from external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file&lt;br /&gt;
|}&lt;br /&gt;
What we&#039;re looking for is the value of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - streaming from internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Getting AWB IDs we want to replace ===&lt;br /&gt;
Cyber Space 1-1 stage name is &amp;lt;code&amp;gt;w6d01&amp;lt;/code&amp;gt;. Opening &amp;lt;code&amp;gt;bgm_cyber.awb&amp;lt;/code&amp;gt; in foobar2000 reveals that first two tracks are what we&#039;re looking for. However, foobar2000 lists all item indexes starting from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, so we need to subtract &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; from desired index.&lt;br /&gt;
[[File:Bgm cyber awb in foobar.png|center|thumb|642x642px|&amp;lt;code&amp;gt;bgm_cyber.awb&amp;lt;/code&amp;gt; playing in foobar2000, with Cyber Space 1-1 audio tracks selected.]]&lt;br /&gt;
So our IDs are &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; for main track and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; for boost. With that we can finally proceed.&lt;br /&gt;
&lt;br /&gt;
=== Modifying the parameters ===&lt;br /&gt;
Quick and easy way of finding a correct Waveform is searching for a string &amp;lt;code&amp;gt;&amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is the external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; track ID.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;812&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;row&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;MemoryAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;EncodeType&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;1&amp;quot; name=&amp;quot;Streaming&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;NumChannels&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;LoopFlag&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;48000&amp;quot; name=&amp;quot;SamplingRate&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;4999086&amp;quot; name=&amp;quot;NumSamples&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;8&amp;quot; name=&amp;quot;ExtensionData&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbPortNo&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;LipMorthIndex&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/row&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Waveform data for track &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. After modifications (that is, changing &amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Streaming&amp;lt;/code&amp;gt; value) we get the following:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;812&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;row&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;MemoryAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;EncodeType&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;Streaming&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;NumChannels&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;LoopFlag&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;48000&amp;quot; name=&amp;quot;SamplingRate&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;4999086&amp;quot; name=&amp;quot;NumSamples&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;8&amp;quot; name=&amp;quot;ExtensionData&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbPortNo&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;LipMorthIndex&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/row&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After repeating the process for the boost track, we can now finally convert back to &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; and check results ingame.&lt;br /&gt;
&lt;br /&gt;
== Converting the XML to ACB ==&lt;br /&gt;
Same as before, drag and drop the XML on the &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt;. It should output a big &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; file that&#039;s ready to be copied into a mod.&lt;br /&gt;
&lt;br /&gt;
Created &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; is playable in foobar2000 and will only show audio files we injected into it.&lt;br /&gt;
[[File:ACB with injected audio.png|center|thumb|660x660px|Resulting &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; playing in foobar2000]]&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
[[File:ACB Injection Result.webm|center|thumb|Result of ACB Injection|0x0px]]&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:ACB_with_injected_audio.png&amp;diff=1138</id>
		<title>File:ACB with injected audio.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:ACB_with_injected_audio.png&amp;diff=1138"/>
		<updated>2025-09-02T22:04:41Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Modified ACB showing injected audio for Cyber Space 1-1&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=ACB_Audio_Injection&amp;diff=1137</id>
		<title>ACB Audio Injection</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=ACB_Audio_Injection&amp;diff=1137"/>
		<updated>2025-09-02T21:56:03Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: Created the tutorial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this tutorial you will learn the basics of injecting audio (HCA, ADX) into CRIWARE&#039;s ACB files. Helps to cut down the size of mods by not shipping the entire ACB+AWB.&lt;br /&gt;
&lt;br /&gt;
The tutorial will be using &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt; from [[KwasTools (Hedgehog Engine)|KwasTools]] for ACB conversion to and from XML.&lt;br /&gt;
&lt;br /&gt;
Additional software will be required, such as the HCA audio converter and a text editor. I will be using [https://github.com/Thealexbarney/VGAudio VGAudioCli] and [https://notepad-plus-plus.org/ Notepad++]. &lt;br /&gt;
&lt;br /&gt;
I also recommend installing [https://www.foobar2000.org/ foobar2000] with [https://vgmstream.org/ vgmstream component] for easy preview of audio. Will also help with pinpointing file indices in AWB archive.&lt;br /&gt;
&lt;br /&gt;
For this tutorial, I will be replacing Cyber Space 1-1 music in [[Sonic Frontiers]].&lt;br /&gt;
&lt;br /&gt;
== Converting the ACB to XML ==&lt;br /&gt;
Converting the &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; is as easy as drag and dropping it on the &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt; executable.&lt;br /&gt;
&lt;br /&gt;
If conversion was successful, it&#039;ll create an XML file in the same directory as the &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt;. For me it created &amp;lt;code&amp;gt;bgm_cyber.acb.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[File:Bgm cyber acb in xml form.png|center|515x515px|XML opened in a text editor|alt=XML opened in a text editor|thumb]]&lt;br /&gt;
&lt;br /&gt;
== Creating an internal AWB file ==&lt;br /&gt;
Some &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt;s do not have an internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file, which is required to store audio we want to use. This is the case with &amp;lt;code&amp;gt;bgm_cyber&amp;lt;/code&amp;gt;, it lacks one and we need to create it.&lt;br /&gt;
&lt;br /&gt;
The XML structure of &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file is the same as one from &amp;lt;code&amp;gt;cri_awb_tool&amp;lt;/code&amp;gt;. However, I will include a minimal example for Sonic Frontiers below to keep things straightforward.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;AWB version=&amp;quot;2&amp;quot; offset_size=&amp;quot;4&amp;quot; id_size=&amp;quot;2&amp;quot; alignment=&amp;quot;32&amp;quot; subkey=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;0&amp;quot; path=&amp;quot;audio.hca&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/AWB&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Keep in mind that parameters need to match the external AWB&#039;s. Game will crash otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Inserting the internal AWB structure ===&lt;br /&gt;
Search for &amp;lt;code&amp;gt;&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AwbFile&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt; and you should find this:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;5456&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AutoModulationTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;StreamAwbTocWorkOld&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AwbFile&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;amp;#10;ACB Format/PC Ver.1.37.0 Build:&amp;amp;#10;&amp;quot; name=&amp;quot;VersionString&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;CueLimitWorkTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;We need to replace the &amp;lt;code&amp;gt;AwbFile&amp;lt;/code&amp;gt; record with our own &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; structure. &lt;br /&gt;
&lt;br /&gt;
After changes you should get something like this:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;5456&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;AutoModulationTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;StreamAwbTocWorkOld&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;AWB version=&amp;quot;2&amp;quot; offset_size=&amp;quot;4&amp;quot; id_size=&amp;quot;2&amp;quot; alignment=&amp;quot;32&amp;quot; subkey=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;0&amp;quot; path=&amp;quot;my_audio.hca&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;entry id=&amp;quot;1&amp;quot; path=&amp;quot;my_audio_boost.hca&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/AWB&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;amp;#10;ACB Format/PC Ver.1.37.0 Build:&amp;amp;#10;&amp;quot; name=&amp;quot;VersionString&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;record value=&amp;quot;&amp;quot; name=&amp;quot;CueLimitWorkTable&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ID starts at 0 and goes up. Paths are relative to XML&#039;s location.&lt;br /&gt;
&lt;br /&gt;
== Modifying Waveform data ==&lt;br /&gt;
Next, we need to change data in the &amp;lt;code&amp;gt;Waveform&amp;lt;/code&amp;gt; table for each track we want to replace.&lt;br /&gt;
&lt;br /&gt;
In short, we have to change the &amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Streaming&amp;lt;/code&amp;gt; values.&lt;br /&gt;
&lt;br /&gt;
=== Explanation of parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; is the index in the internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file. In our case, index &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; is the main track and index &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; is the boost version.&lt;br /&gt;
&lt;br /&gt;
Streaming is more interesting, it has three available options:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Streaming values&lt;br /&gt;
!Value&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Audio is streamed from internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file, which resides in RAM&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Audio is streamed from external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Short snippet of audio in internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file to initialize the decoder, rest of the audio is streamed from external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; file&lt;br /&gt;
|}&lt;br /&gt;
What we&#039;re looking for is the value of &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; - streaming from internal &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Getting AWB IDs we want to replace ===&lt;br /&gt;
Cyber Space 1-1 stage name is &amp;lt;code&amp;gt;w6d01&amp;lt;/code&amp;gt;. Opening &amp;lt;code&amp;gt;bgm_cyber.awb&amp;lt;/code&amp;gt; in foobar2000 reveals that first two tracks are what we&#039;re looking for. However, foobar2000 lists all item indexes starting from &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, so we need to subtract &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; from desired index.&lt;br /&gt;
[[File:Bgm cyber awb in foobar.png|center|thumb|557x557px|&amp;lt;code&amp;gt;bgm_cyber.awb&amp;lt;/code&amp;gt; playing in foobar2000, with Cyber Space 1-1 audio tracks selected.]]&lt;br /&gt;
So our IDs are &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; for main track and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; for boost. With that we can finally proceed.&lt;br /&gt;
&lt;br /&gt;
=== Modifying the parameters ===&lt;br /&gt;
Quick and easy way of finding a correct Waveform is searching for a string &amp;lt;code&amp;gt;&amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is the external &amp;lt;code&amp;gt;AWB&amp;lt;/code&amp;gt; track ID.&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;812&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;row&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;MemoryAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;EncodeType&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;1&amp;quot; name=&amp;quot;Streaming&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;NumChannels&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;LoopFlag&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;48000&amp;quot; name=&amp;quot;SamplingRate&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;4999086&amp;quot; name=&amp;quot;NumSamples&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;8&amp;quot; name=&amp;quot;ExtensionData&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbPortNo&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;LipMorthIndex&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/row&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Waveform data for track &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt;. After modifications (that is, changing &amp;lt;code&amp;gt;MemoryAwbId&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Streaming&amp;lt;/code&amp;gt; value) we get the following:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;812&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;row&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;MemoryAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;EncodeType&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;Streaming&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;NumChannels&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;2&amp;quot; name=&amp;quot;LoopFlag&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;48000&amp;quot; name=&amp;quot;SamplingRate&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;4999086&amp;quot; name=&amp;quot;NumSamples&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;8&amp;quot; name=&amp;quot;ExtensionData&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbPortNo&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;0&amp;quot; name=&amp;quot;StreamAwbId&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;record value=&amp;quot;65535&amp;quot; name=&amp;quot;LipMorthIndex&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/row&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After repeating the process for the boost track, we can now finally convert back to &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; and check results ingame.&lt;br /&gt;
&lt;br /&gt;
== Converting the XML to ACB ==&lt;br /&gt;
Same as before, drag and drop the XML on the &amp;lt;code&amp;gt;cri_utf_tool&amp;lt;/code&amp;gt;. It should output a big &amp;lt;code&amp;gt;ACB&amp;lt;/code&amp;gt; file that&#039;s ready to be copied into a mod.&lt;br /&gt;
&lt;br /&gt;
== Result ==&lt;br /&gt;
[[File:ACB Injection Result.webm|center|thumb|Result of ACB Injection]]&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:ACB_Injection_Result.webm&amp;diff=1136</id>
		<title>File:ACB Injection Result.webm</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:ACB_Injection_Result.webm&amp;diff=1136"/>
		<updated>2025-09-02T21:52:34Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ingame footage of Cyber Space 1-1 with music changed thanks to ACB Injection&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:Bgm_cyber_awb_in_foobar.png&amp;diff=1135</id>
		<title>File:Bgm cyber awb in foobar.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:Bgm_cyber_awb_in_foobar.png&amp;diff=1135"/>
		<updated>2025-09-02T21:15:44Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cyber Space music archive playing in foobar2000&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:Bgm_cyber_acb_in_xml_form.png&amp;diff=1134</id>
		<title>File:Bgm cyber acb in xml form.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:Bgm_cyber_acb_in_xml_form.png&amp;diff=1134"/>
		<updated>2025-09-02T20:32:55Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;bgm_cyber.acb converted with cri_utf_tool and opened for viewing in notepad++&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Creating_custom_uv-anims_with_KwasTools&amp;diff=815</id>
		<title>Creating custom uv-anims with KwasTools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Creating_custom_uv-anims_with_KwasTools&amp;diff=815"/>
		<updated>2025-08-03T16:15:41Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: Added example XML files for both HE1 and HE2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This guide uses &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;he_anim_tool&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; from [https://hedgedocs.com/index.php/KwasTools_(Hedgehog_Engine) KwasTools] package.}}&lt;br /&gt;
&lt;br /&gt;
== Brief description of the format ==&lt;br /&gt;
&#039;&#039;&#039;Uv-anims&#039;&#039;&#039; are used to animate textures inside of material files. The most common usage would be the animation of eyes in cutscenes.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Types of transformations&lt;br /&gt;
!Type&lt;br /&gt;
!Value&lt;br /&gt;
!HE1&lt;br /&gt;
!HE2&lt;br /&gt;
|-&lt;br /&gt;
|Position X&lt;br /&gt;
|0&lt;br /&gt;
|✔️&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Position Y&lt;br /&gt;
|1&lt;br /&gt;
|✔️&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Rotation&lt;br /&gt;
|2&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Scale X&lt;br /&gt;
|3&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Scale Y&lt;br /&gt;
|4&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Types of interpolation&lt;br /&gt;
!Type&lt;br /&gt;
!Value&lt;br /&gt;
|-&lt;br /&gt;
|Linear&lt;br /&gt;
|0&lt;br /&gt;
|-&lt;br /&gt;
|Constant&lt;br /&gt;
|1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Differences between HE versions ==&lt;br /&gt;
&lt;br /&gt;
=== Hedgehog Engine 1 ===&lt;br /&gt;
&lt;br /&gt;
* Data version in the mirage header is set to &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;&lt;br /&gt;
* One uv-anim can animate only one texture in the material&lt;br /&gt;
* Only position animation is possible (types &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Hedgehog Engine 2 ===&lt;br /&gt;
&lt;br /&gt;
* Data version in the mirage header is set to 3&lt;br /&gt;
* Multiple textures animated in one uv-anim&lt;br /&gt;
* All transformation types available&lt;br /&gt;
* Assignment of one animation to multiple textures&lt;br /&gt;
&lt;br /&gt;
== Example XML for HE1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;UVAnimation data_version=&amp;quot;2&amp;quot; material_name=&amp;quot;sonic_example_mat&amp;quot; texture_name=&amp;quot;sonic_example_mat-0000&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Animation name=&amp;quot;default&amp;quot; frame_rate=&amp;quot;60&amp;quot; start_frame=&amp;quot;0&amp;quot; end_frame=&amp;quot;60&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;KeyframeSet type=&amp;quot;0&amp;quot; flag2=&amp;quot;0&amp;quot; interpolation=&amp;quot;0&amp;quot; flag4=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Keyframe index=&amp;quot;0&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;Keyframe index=&amp;quot;61&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/KeyframeSet&amp;gt;&lt;br /&gt;
    &amp;lt;/Animation&amp;gt;&lt;br /&gt;
&amp;lt;/UVAnimation&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example XML for HE2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;UVAnimation data_version=&amp;quot;3&amp;quot; material_name=&amp;quot;sonic_example_mat&amp;quot; texture_name=&amp;quot;none&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Animation name=&amp;quot;sonic_example_mat-0000/sonic_example_mat-0001&amp;quot; frame_rate=&amp;quot;60&amp;quot; start_frame=&amp;quot;0&amp;quot; end_frame=&amp;quot;60&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;KeyframeSet type=&amp;quot;0&amp;quot; flag2=&amp;quot;0&amp;quot; interpolation=&amp;quot;0&amp;quot; flag4=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;Keyframe index=&amp;quot;0&amp;quot; value=&amp;quot;0&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;Keyframe index=&amp;quot;61&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;/KeyframeSet&amp;gt;&lt;br /&gt;
    &amp;lt;/Animation&amp;gt;&lt;br /&gt;
&amp;lt;/UVAnimation&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Creating_custom_uv-anims_with_KwasTools&amp;diff=814</id>
		<title>Creating custom uv-anims with KwasTools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Creating_custom_uv-anims_with_KwasTools&amp;diff=814"/>
		<updated>2025-08-03T15:51:47Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: Created the page and saved because my internet malfunctioned and I dont want to write it all over again&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This guide uses &amp;lt;i&amp;gt;&amp;lt;b&amp;gt;he_anim_tool&amp;lt;/b&amp;gt;&amp;lt;/i&amp;gt; from [https://hedgedocs.com/index.php/KwasTools_(Hedgehog_Engine) KwasTools] package.}}&lt;br /&gt;
&lt;br /&gt;
== Brief description of the formatBrief description of the format ==&lt;br /&gt;
&#039;&#039;&#039;Uv-anims&#039;&#039;&#039; are used to animate textures inside of material files. The most common usage would be the animation of eyes in cutscenes.&lt;br /&gt;
Files differ in capabilities between Hedgehog Engine 1 and Hedgehog Engine 2.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Types of transformations&lt;br /&gt;
!Type&lt;br /&gt;
!Value&lt;br /&gt;
!HE1&lt;br /&gt;
!HE2&lt;br /&gt;
|-&lt;br /&gt;
|Position X&lt;br /&gt;
|0&lt;br /&gt;
|✔️&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Position Y&lt;br /&gt;
|1&lt;br /&gt;
|✔️&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Rotation&lt;br /&gt;
|2&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Scale X&lt;br /&gt;
|3&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|-&lt;br /&gt;
|Scale Y&lt;br /&gt;
|4&lt;br /&gt;
|❌&lt;br /&gt;
|✔️&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=KwasTools_(Hedgehog_Engine)&amp;diff=597</id>
		<title>KwasTools (Hedgehog Engine)</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=KwasTools_(Hedgehog_Engine)&amp;diff=597"/>
		<updated>2025-05-10T19:25:36Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: Wrote more so that the page isn&amp;#039;t a stub. Also added informations related to recent development of KwasTools.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=KwasTools|author=Kwasior|website=https://github.com/ThisKwasior/KwasTools}}&lt;br /&gt;
&#039;&#039;&#039;KwasTools&#039;&#039;&#039; is a set of utilities for several games. Notably it contains tools to view and edit Hedgehog Engine &amp;lt;code&amp;gt;*-anim&amp;lt;/code&amp;gt; family of formats and CRIWARE formats. A [[wikipedia:Blender_(software)|Blender]] addon called &#039;&#039;&#039;[https://github.com/ThisKwasior/KwasTools/tree/master/addons/blender/io_kwastools io_kwastools]&#039;&#039;&#039; also exists for real-time preview and editing &amp;lt;code&amp;gt;.cam-anim&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.uv-anim&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
Entire suite of tools supports Windows and GNU/Linux operating systems.&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
=== he_anim_tool ===&lt;br /&gt;
[[File:KwasTools he anim tool usage.png|alt=he_anim_tool running without any arguments given to the program. By default, it prints supported file formats and how to use the software.|thumb|366x366px|Usage of &amp;lt;code&amp;gt;he_anim_tool&amp;lt;/code&amp;gt;]] &amp;lt;code&amp;gt;he_anim_tool&amp;lt;/code&amp;gt; is a tool for modifying animation files native to the Hedgehog Engine 1 and 2.&lt;br /&gt;
&lt;br /&gt;
Any given &amp;lt;code&amp;gt;*-anim&amp;lt;/code&amp;gt; will be converted to its XML representation. Same goes for XML files - tool will know the output format thanks to root element&#039;s name (XML identifier).   &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
Supported formats&lt;br /&gt;
!Format&lt;br /&gt;
!Description&lt;br /&gt;
!XML identifier&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.uv-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Translation (v2), rotation and scaling (v3) of a texture in the material&lt;br /&gt;
|&amp;lt;code&amp;gt;UVAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.cam-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Full control of in-game camera during events&lt;br /&gt;
|&amp;lt;code&amp;gt;CAMAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.vis-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Visibility of the mesh&lt;br /&gt;
|&amp;lt;code&amp;gt;VISAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.morph-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Animation of shape keys (Sonic&#039;s mouth in Unleashed/Generations uses this to speak)&lt;br /&gt;
|&amp;lt;code&amp;gt;MORPHAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.pt-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Texture swapping (Tokyo DLC in Shadow Generations uses this for the billboard)&lt;br /&gt;
|&amp;lt;code&amp;gt;PTAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.mat-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Transformation of a material (like swapping Sonic&#039;s mouth left-to-right)&lt;br /&gt;
|&amp;lt;code&amp;gt;MATAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;.lit-anim&amp;lt;/code&amp;gt;&lt;br /&gt;
|Companion to &amp;lt;code&amp;gt;.light&amp;lt;/code&amp;gt; files. Can animate its fields.&lt;br /&gt;
|&amp;lt;code&amp;gt;LITAnimation&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== cri_awb_tool ===&lt;br /&gt;
Unpacker and packer for AWB audio archives. Does not support decrypting data (will extract contents as-is).&lt;br /&gt;
&lt;br /&gt;
Extracts an AWB to a folder and writes an XML file with its metadata.&lt;br /&gt;
&lt;br /&gt;
Creates an AWB from a folder of files (with default values) or from an XML descriptor.&lt;br /&gt;
&lt;br /&gt;
=== cri_utf_tool ===&lt;br /&gt;
[[File:Example XML created by cri utf tool.png|alt=Converted bgm_miller.acb displayed in Notepad++ as an XML|left|thumb|385x385px|&amp;lt;code&amp;gt;bgm_miller.acb&amp;lt;/code&amp;gt; converted to XML]]&lt;br /&gt;
Multi-purpose tool for editing CRIWARE &amp;lt;code&amp;gt;@UTF&amp;lt;/code&amp;gt; tables. Created for modification of &amp;lt;code&amp;gt;.acb&amp;lt;/code&amp;gt; files, but will work fine with tables from other formats, such as &amp;lt;code&amp;gt;.acf&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.cpk&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.aax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.usm&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.csb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In addition to &amp;lt;code&amp;gt;@UTF&amp;lt;/code&amp;gt;, program will also parse &#039;&#039;&#039;ACB commands&#039;&#039;&#039; (used for example for looping of &#039;&#039;&#039;Sonic Frontiers&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; Titan songs) and embedded &#039;&#039;&#039;AWB files&#039;&#039;&#039; (which allows for modding music and sounds without shipping entire corresponding AWB file).&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:Example_XML_created_by_cri_utf_tool.png&amp;diff=596</id>
		<title>File:Example XML created by cri utf tool.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:Example_XML_created_by_cri_utf_tool.png&amp;diff=596"/>
		<updated>2025-05-10T19:19:57Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Converted bgm_miller.acb being displayed in Notepad++ as an XML file&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:KwasTools_he_anim_tool_usage.png&amp;diff=595</id>
		<title>File:KwasTools he anim tool usage.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:KwasTools_he_anim_tool_usage.png&amp;diff=595"/>
		<updated>2025-05-10T18:24:18Z</updated>

		<summary type="html">&lt;p&gt;Kwasior: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Default output of he_anim_tool with no arguments given&lt;/div&gt;</summary>
		<author><name>Kwasior</name></author>
	</entry>
</feed>