<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.lumasworkshop.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xayrga</id>
	<title>Luma&#039;s Workshop - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.lumasworkshop.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Xayrga"/>
	<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/wiki/Special:Contributions/Xayrga"/>
	<updated>2026-06-04T06:17:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=WSYS&amp;diff=883</id>
		<title>WSYS</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=WSYS&amp;diff=883"/>
		<updated>2025-05-29T06:15:54Z</updated>

		<summary type="html">&lt;p&gt;Xayrga: take casualness out&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;WSYS&#039;&#039;&#039; Wave System&lt;br /&gt;
&lt;br /&gt;
Internally, Wave System.&lt;br /&gt;
&lt;br /&gt;
This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. &lt;br /&gt;
&lt;br /&gt;
WSYS format is consistent between engine versions, however some games do not make use of the waveCount bytes. If the wavecount int32 is missing in anything newer than twilight princess, the WSYS will not function correctly.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;WSYS Structure&amp;lt;/h1&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x57535953 &#039;WSYS&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || size || WSYS Size&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || wsysID || WSYS ID (This is how insts select the wsys)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || waveCount || WSYS Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32 || [[WSYS#WINF | WINF Pointer]] || WBINF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || [[WSYS#WINF | WBCT Pointer]] || WBCT&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
==WINF==&lt;br /&gt;
WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]].&lt;br /&gt;
&lt;br /&gt;
The ID&#039;s for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up,  WaveGroup[1] uses WaveScenes[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x57494E46 &#039;WINF&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || waveGroupCount || Count of wavegroups&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; ||  [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SCNE==&lt;br /&gt;
SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x53434E45 &#039;SCNE&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int64 || padding || padding&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Scene Waves==&lt;br /&gt;
&lt;br /&gt;
Note: The other sections C-ST, and C-EX point to to this category as well. They remain empty. Code for parsing them isn&#039;t even in the executables.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x432D4446 (&#039;C-DF&#039;) || Magic&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || wavesCount || Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID&#039;s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WAVEID==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int16 || waveGroupID || Wave Group ID (Current WSYS)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x02&amp;lt;/center&amp;gt; || int16 || waveID || The ID assigned from this wave&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WaveGroup==&lt;br /&gt;
SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || char[0x70] || archiveName || File Path for .AW&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x70&amp;lt;/center&amp;gt; || int32|| wavesCount || Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x74&amp;lt;/center&amp;gt; || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WAVE==&lt;br /&gt;
&lt;br /&gt;
Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || byte || 0x00 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x01&amp;lt;/center&amp;gt; || byte || format || WaveFormat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x02&amp;lt;/center&amp;gt; || byte || baseKey || Base Key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x03&amp;lt;/center&amp;gt; || byte || 0x00 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || float || sampleRate || Sample Rate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || awOfsStart || AW Offset Start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || awOfsEnd || AW Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32(bool) || loop || Loop flags?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || loopStartSample || Loop Start Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x18&amp;lt;/center&amp;gt; || int32 || loopEndSample || Loop End Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x20&amp;lt;/center&amp;gt; || int32 || sampleCount || Samples Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x24&amp;lt;/center&amp;gt; || short || pLast || ADPCM Loop Last Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x26&amp;lt;/center&amp;gt; || short || pPenult || ADPCM Loop Penult Sample&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xayrga</name></author>
	</entry>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=WSYS&amp;diff=882</id>
		<title>WSYS</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=WSYS&amp;diff=882"/>
		<updated>2025-05-29T06:13:03Z</updated>

		<summary type="html">&lt;p&gt;Xayrga: correct wsys juice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;WSYS&#039;&#039;&#039; Wave System&lt;br /&gt;
&lt;br /&gt;
Internally, Wave System.&lt;br /&gt;
&lt;br /&gt;
This section contains all of the information required for decoding the [[AW|AW File]] as well as other information for melodic tuning, root key, and other various parts of JAudio. &lt;br /&gt;
&lt;br /&gt;
Great part about WSYS is it doesn&#039;t matter what version of JAudio you&#039;re running. The WSYS format never changed between engine versions (minus the wave count int, but that doesn&#039;t matter because older versions just ignore it!)&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;WSYS Structure&amp;lt;/h1&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x57535953 &#039;WSYS&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || size || WSYS Size&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || wsysID || WSYS ID (This is how insts select the wsys)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || waveCount || WSYS Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32 || [[WSYS#WINF | WINF Pointer]] || WBINF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || [[WSYS#WINF | WBCT Pointer]] || WBCT&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
==WINF==&lt;br /&gt;
WINF is a pointer container. They point to the [[WSYS#WaveGroup|Wave Groups]].&lt;br /&gt;
&lt;br /&gt;
The ID&#039;s for every wave group are controlled by the [[WSYS#SCNE|SCNE]] object. They line up,  WaveGroup[1] uses WaveScenes[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x57494E46 &#039;WINF&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || waveGroupCount || Count of wavegroups&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; ||  [[WSYS#WaveGroup|WaveGroup]]*[] (int32) || waveGroupPointers || Pointers to the individual wavegroups. &lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==SCNE==&lt;br /&gt;
SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x53434E45 &#039;SCNE&#039; || Magic &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int64 || padding || padding&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-DF&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-EX &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || [[WSYS#C-DF|C-DF]]* || Pointer to C-ST&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Scene Waves==&lt;br /&gt;
&lt;br /&gt;
Note: The other sections C-ST, and C-EX point to to this category as well. They remain empty. Code for parsing them isn&#039;t even in the executables.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int32 || 0x432D4446 (&#039;C-DF&#039;) || Magic&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || int32 || wavesCount || Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || [[WSYS#WAVEID|WAVEID]]*[] || Pointer array waveID&#039;s&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WAVEID==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || int16 || waveGroupID || Wave Group ID (Current WSYS)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x02&amp;lt;/center&amp;gt; || int16 || waveID || The ID assigned from this wave&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WaveGroup==&lt;br /&gt;
SCNE is a pointer container as well. They point to the [[WSYS#C-DF|C-DF]] objects. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || char[0x70] || archiveName || File Path for .AW&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x70&amp;lt;/center&amp;gt; || int32|| wavesCount || Wave Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x74&amp;lt;/center&amp;gt; || int32 || [[WSYS#WAVE|WAVE]]*[] || Pointer array of Waves&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==WAVE==&lt;br /&gt;
&lt;br /&gt;
Container format for Wave Information. This tells you where the ADPCM / PCM / whatever data starts inside of the .AW file for the current group and for what wave. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset                !! Type !! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x00&amp;lt;/center&amp;gt; || byte || 0x00 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x01&amp;lt;/center&amp;gt; || byte || format || WaveFormat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x02&amp;lt;/center&amp;gt; || byte || baseKey || Base Key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x03&amp;lt;/center&amp;gt; || byte || 0x00 || unknown&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x04&amp;lt;/center&amp;gt; || float || sampleRate || Sample Rate&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x08&amp;lt;/center&amp;gt; || int32 || awOfsStart || AW Offset Start&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x0C&amp;lt;/center&amp;gt; || int32 || awOfsEnd || AW Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x10&amp;lt;/center&amp;gt; || int32(bool) || loop || Loop flags?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x14&amp;lt;/center&amp;gt; || int32 || loopStartSample || Loop Start Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x18&amp;lt;/center&amp;gt; || int32 || loopEndSample || Loop End Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x20&amp;lt;/center&amp;gt; || int32 || sampleCount || Samples Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x24&amp;lt;/center&amp;gt; || short || pLast || ADPCM Loop Last Sample&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;0x26&amp;lt;/center&amp;gt; || short || pPenult || ADPCM Loop Penult Sample&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Xayrga</name></author>
	</entry>
	<entry>
		<id>https://www.lumasworkshop.com/w/index.php?title=BMS_(File_Format)&amp;diff=881</id>
		<title>BMS (File Format)</title>
		<link rel="alternate" type="text/html" href="https://www.lumasworkshop.com/w/index.php?title=BMS_(File_Format)&amp;diff=881"/>
		<updated>2025-05-28T04:45:01Z</updated>

		<summary type="html">&lt;p&gt;Xayrga: added some instruction descriptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:File formats]]&lt;br /&gt;
== File Format ==&lt;br /&gt;
BMS files are &#039;&#039;&#039;B&#039;&#039;&#039;inary &#039;&#039;&#039;M&#039;&#039;&#039;usic &#039;&#039;&#039;S&#039;&#039;&#039;equences that store commands for the audio engine to play notes, similar to the MIDI file format.&lt;br /&gt;
&lt;br /&gt;
== Data ==&lt;br /&gt;
BMS files contain raw instructions for the audio engine. There are no headers or filesize checks. Each instruction (OpCode) stands for its own function in the engine. The following table lists all JAudio2 OpCodes that have functions in SMG2:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! OpCode&lt;br /&gt;
! Function (SMG/SMG2)&lt;br /&gt;
! Usage&lt;br /&gt;
! Example&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 00&amp;lt;br /&amp;gt;01&amp;lt;br /&amp;gt;02&amp;lt;br /&amp;gt;...&amp;lt;br /&amp;gt;7D&amp;lt;br /&amp;gt;7E&amp;lt;br /&amp;gt;7F&lt;br /&gt;
| JASSeqParser::parseNoteOn&lt;br /&gt;
| {OpCode[1]} {Voice[1]} {Velocity[1]}&amp;lt;br /&amp;gt;OpCode: one byte with range 0x00 through 0x7F. 0x00 = C-1, 0x3C = C4 (middle C), 0x7F = G9.&amp;lt;br /&amp;gt;Voice: one byte with range 0x01 through 0x07 (needs testing/verification). Each Voice can only hold one Note.&amp;lt;br /&amp;gt;Velocity: one byte with range 0x00 through 0x7F. 0x00 = 0, 0x7F = 127.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If the Voice is not 1 - 7, the game will treat this note as a Midi Gate note, and will expect a 4th value that is one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. It is unknown what effects this has on the output.&lt;br /&gt;
| 64 02 68&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;64: Key E4&amp;lt;br /&amp;gt;02: Voice 2&amp;lt;br /&amp;gt;68: Velocity 104&lt;br /&gt;
| Starts playing a Note with the previously defined Instrument (see E1, E2 and E3).&lt;br /&gt;
|-&lt;br /&gt;
| 80&lt;br /&gt;
| JASSeqParser::cmdWaitByte&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Seems to do nothing based on the code.&lt;br /&gt;
|-&lt;br /&gt;
| 81&amp;lt;br /&amp;gt;...&amp;lt;br /&amp;gt;87&lt;br /&gt;
| JASSeqParser::parseNoteOff&lt;br /&gt;
| {OpCode[1]}&amp;lt;br /&amp;gt;OpCode: one byte with range 0x81 through 0x87. 0x81 = Close Voice 1, 0x87 = Close Voice 7.&lt;br /&gt;
| 81: Stop voice ID 1&lt;br /&gt;
| Stops playing a Note.&lt;br /&gt;
|-&lt;br /&gt;
| 88&amp;lt;br /&amp;gt;...&amp;lt;br /&amp;gt;8F&lt;br /&gt;
| Unknown&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 90&amp;lt;br /&amp;gt;...&amp;lt;br /&amp;gt;9F&lt;br /&gt;
| Unknown&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A0&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A1&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A2&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A3&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A4&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A5&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A6&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A7&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A8&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| A9&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AA&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AB&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AC&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AD&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AE&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| AF&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B0&lt;br /&gt;
| Extended Opcode Indicator&lt;br /&gt;
| See B000 or B001.&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B1&lt;br /&gt;
| JASSeqParser::cmdNoteOn&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B2&lt;br /&gt;
| JASSeqParser::cmdNoteOff&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B3&lt;br /&gt;
| JASSeqParser::cmdNote&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B4&lt;br /&gt;
| JASSeqParser::cmdSetLastNote&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B5&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B6&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B7&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B8&lt;br /&gt;
| JASSeqParser::cmdParamE&lt;br /&gt;
| {OpCode[1]} {Target[1]} {Parameter[1]}&amp;lt;br/&amp;gt;OpCode: one byte, B8.&amp;lt;br/&amp;gt;Target: one byte with range 0x00 through 0x03.&amp;lt;br/&amp;gt;Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:&lt;br /&gt;
* Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).&lt;br /&gt;
* Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.&lt;br /&gt;
* Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.&lt;br /&gt;
* Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.&lt;br /&gt;
| B8 00 64&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;B8: OpCode&amp;lt;br/&amp;gt;00: Target (Volume)&amp;lt;br/&amp;gt;64: ~78% volume&lt;br /&gt;
| Allows different operations onto the music track&lt;br /&gt;
|-&lt;br /&gt;
| B9&lt;br /&gt;
| JASSeqParser::cmdParamI&lt;br /&gt;
| {OpCode[1]} {Target[1]} {Parameter[2]}&amp;lt;br/&amp;gt;OpCode: one byte, B9.&amp;lt;br/&amp;gt;Target: one byte with range 0x00 through 0x03.&amp;lt;br/&amp;gt;Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:&lt;br /&gt;
* Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).&lt;br /&gt;
* Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.&lt;br /&gt;
* Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.&lt;br /&gt;
* Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.&lt;br /&gt;
| B9 01 04 00&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;B9: OpCode&amp;lt;br/&amp;gt;01: Target (Pitch)&amp;lt;br/&amp;gt;04 00: Pitch of 4 keys&lt;br /&gt;
| Allows different operations with higher precision onto the music track&lt;br /&gt;
|-&lt;br /&gt;
| BA&lt;br /&gt;
| JASSeqParser::cmdParamEI&lt;br /&gt;
| {OpCode[1]} {Target[1]} {Parameter[1]} {Fade time[2]}&amp;lt;br/&amp;gt;OpCode: one byte, BA.&amp;lt;br/&amp;gt;Target: one byte with range 0x00 through 0x03.&amp;lt;br/&amp;gt;Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:&lt;br /&gt;
* Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).&lt;br /&gt;
* Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.&lt;br /&gt;
* Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.&lt;br /&gt;
* Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.&lt;br /&gt;
Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.&lt;br /&gt;
| BA 02 22 01 68&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;BA: OpCode&amp;lt;br/&amp;gt;02: Target (Reverb)&amp;lt;br/&amp;gt;22: Reverb of strength 34&amp;lt;br/&amp;gt;01 68: 360 Ticks&lt;br /&gt;
| Allows different operations with fade time onto the music track&lt;br /&gt;
|-&lt;br /&gt;
| BB&lt;br /&gt;
| JASSeqParser::cmdParamII&lt;br /&gt;
| {OpCode[1]} {Target[1]} {Parameter[2]} {Fade time[2]}&amp;lt;br/&amp;gt;OpCode: one byte, BB.&amp;lt;br/&amp;gt;Target: one byte with range 0x00 through 0x03.&amp;lt;br/&amp;gt;Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:&lt;br /&gt;
* Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).&lt;br /&gt;
* Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.&lt;br /&gt;
* Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.&lt;br /&gt;
* Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.&lt;br /&gt;
Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.&lt;br /&gt;
| BA 03 7F FF 02 00&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;BB: OpCode&amp;lt;br/&amp;gt;03: Target (Panning)&amp;lt;br/&amp;gt;7F FF: Panned to right channel&amp;lt;br/&amp;gt;02 00: 512 Ticks&lt;br /&gt;
| Allows different operations with higher precision and fade time onto the music track&lt;br /&gt;
|-&lt;br /&gt;
| BC&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BD&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BE&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| BF&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C0&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C1&lt;br /&gt;
| JASSeqParser::cmdOpenTrack&lt;br /&gt;
| {OpCode[1]} {TrackNumber[1]} {Pointer[3]}&amp;lt;br /&amp;gt;OpCode: one byte, C1.&amp;lt;br /&amp;gt;TrackNumber: one byte with range 0x00 through 0x0F. 0x00 = Track 0, 0x0F = Track 15.&amp;lt;br /&amp;gt;Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.&lt;br /&gt;
| C1 04 05 B4 73&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;C1: OpCode&amp;lt;br /&amp;gt;04: Track 4&amp;lt;br /&amp;gt;05 B4 73: Offset&lt;br /&gt;
| Creates a Track which can play Notes. Track 15 is usually reserved for Yoshi Drums.&lt;br /&gt;
|-&lt;br /&gt;
| C2&lt;br /&gt;
| JASSeqParser::cmdCloseTrack&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C3&lt;br /&gt;
| JASSeqParser::cmdCall&lt;br /&gt;
| {OpCode[1]} {Pointer[3]}&amp;lt;br /&amp;gt;OpCode: one byte, C3.&amp;lt;br /&amp;gt;Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.&lt;br /&gt;
| C3 00 00 40&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;C3: OpCode&amp;lt;br /&amp;gt;00 00 40: Offset&lt;br /&gt;
| Redirects execution to the defined offset. Execution can return with C5.&lt;br /&gt;
|-&lt;br /&gt;
| C4&lt;br /&gt;
| JASSeqParser::cmdCallF&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C5&lt;br /&gt;
| JASSeqParser::cmdRet&lt;br /&gt;
| {OpCode[1]}&amp;lt;br /&amp;gt;OpCode: one byte, C5.&lt;br /&gt;
| &lt;br /&gt;
| Returns redirected execution (like from C3) to the initial call.&lt;br /&gt;
|-&lt;br /&gt;
| C6&lt;br /&gt;
| JASSeqParser::cmdRetF&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C7&lt;br /&gt;
| JASSeqParser::cmdJmp&lt;br /&gt;
| {OpCode[1]} {Pointer[3]}&amp;lt;br /&amp;gt;OpCode: one byte, C7.&amp;lt;br /&amp;gt;Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.&lt;br /&gt;
| C7 08 02 34&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;C7: OpCode&amp;lt;br /&amp;gt;08 02 34: Offset&lt;br /&gt;
| Redirects execution to the defined offset, used for Loops.&lt;br /&gt;
|-&lt;br /&gt;
| C8&lt;br /&gt;
| JASSeqParser::cmdJmpF&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| C9&lt;br /&gt;
| JASSeqParser::cmdJmpTable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CA&lt;br /&gt;
| JASSeqParser::cmdCallTable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CB&lt;br /&gt;
| JASSeqParser::cmdLoopS&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CC&lt;br /&gt;
| JASSeqParser::cmdLoopE&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CD&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CE&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| CF&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D0&lt;br /&gt;
| JASSeqParser::cmdReadPort&lt;br /&gt;
| {OpCode[1]} {Source[1]} {Destination[1]}&lt;br /&gt;
Opcode: One byte, D0&lt;br /&gt;
Source: One byte, 0-15 , source port &lt;br /&gt;
Destination: One byte, 0-32, destination register&lt;br /&gt;
| &lt;br /&gt;
| Imports the value from sequence port Source and writes it to destination register &#039;Destination&#039;, the value is also written to register 3&lt;br /&gt;
|-&lt;br /&gt;
| D1&lt;br /&gt;
| JASSeqParser::cmdWritePort&lt;br /&gt;
| {OpCode[1]} {Source[1]} {Destination[1]}&lt;br /&gt;
Opcode: One byte, D1&lt;br /&gt;
Source: One byte, source register, 0-32&lt;br /&gt;
Destination: One Byte, destination port, 0-15&lt;br /&gt;
| &lt;br /&gt;
| Writes the value in register &#039;Source&#039; and saves it to register 3, as well as port &#039;Destination&#039;&lt;br /&gt;
|-&lt;br /&gt;
| D2&lt;br /&gt;
| JASSeqParser::cmdCheckPortImport&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D3&lt;br /&gt;
| JASSeqParser::cmdCheckPortExport&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D4&lt;br /&gt;
| JASSeqParser::cmdParentWritePort&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D5&lt;br /&gt;
| JASSeqParser::cmdChildWritePort&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D6&lt;br /&gt;
| JASSeqParser::cmdParentReadPort&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D7&lt;br /&gt;
| JASSeqParser::cmdChildReadPort&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| D8&lt;br /&gt;
| JASSeqParser::cmdRegLoad&lt;br /&gt;
| {OpCode[1]} {Setting[1]} {Unknown[1]} {Variable[1]}&amp;lt;br /&amp;gt;OpCode: one byte, D8.&amp;lt;br /&amp;gt;Setting: one byte with unknown range. Different bytes will trigger different effects:&amp;lt;br /&amp;gt;- 0x62: set PPQN (seen in BMS)&amp;lt;br /&amp;gt;- 0x6B: set PPQN (seen in SC)&amp;lt;br /&amp;gt;Unknown: one byte with unknown range and purpose.&amp;lt;br /&amp;gt;Variable: one byte with different range and purpose depending on the Setting byte.&lt;br /&gt;
| D8 62 00 78&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;D8: OpCode&amp;lt;br /&amp;gt;62: set PPQN&amp;lt;br /&amp;gt;00: Unknown&amp;lt;br /&amp;gt;78: PPQN 120&lt;br /&gt;
| Different purposes.&lt;br /&gt;
|-&lt;br /&gt;
| D9&lt;br /&gt;
| JASSeqParser::cmdReg&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DA&lt;br /&gt;
| JASSeqParser::cmdReg&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DB&lt;br /&gt;
| JASSeqParser::cmdRegUni&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DC&lt;br /&gt;
| JASSeqParser::cmdRegTblLoad&lt;br /&gt;
| {OpCode[1]} {AccessMode[1]} {Destination[1]} {Offset[3]} {Index[1]}&lt;br /&gt;
OpCode: One Byte, 0xDC &lt;br /&gt;
AccessMode: Determines how the sequence accesses the table. &lt;br /&gt;
Destination: 24-bit offset of table&lt;br /&gt;
Index: Register target index into table&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DD&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DE&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| DF&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E0&lt;br /&gt;
| JASSeqParser::cmdTempo&lt;br /&gt;
| {OpCode[1]} {Unknown[1]} {BPM[1]}&amp;lt;br /&amp;gt;OpCode: one byte, E0.&amp;lt;br /&amp;gt;Unknown: one byte with unknown range and purpose.&amp;lt;br /&amp;gt;BPM: one byte with range 0x00 through 0xFF. 0x78 = 120, F0 = 240.&lt;br /&gt;
| E0 00 90&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;E0: OpCode&amp;lt;br /&amp;gt;00: Unknown&amp;lt;br /&amp;gt;90: BPM 144&lt;br /&gt;
| Defines the tempo (playback speed) of the BMS file.&lt;br /&gt;
|-&lt;br /&gt;
| E1&lt;br /&gt;
| JASSeqParser::cmdBankPrg&lt;br /&gt;
| {OpCode[1]} {Bank[1]} {Program[1]}&amp;lt;br /&amp;gt;OpCode: one byte, E1.&amp;lt;br /&amp;gt;Bank: one byte with range 0x00 through 0xFF. This byte represents a WSYS ID.&amp;lt;br /&amp;gt;Program: one byte ranging from 0x00 through 0xFF. This byte represents a LIST entry in the IBNK belonging to the defined WSYS ID.&lt;br /&gt;
| E1 01 0F&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;E1: OpCode&amp;lt;br /&amp;gt;01: WSYS ID 1&amp;lt;br /&amp;gt;0F: IBNK LIST entry 15&amp;lt;br /&amp;gt;(01 0F is the percussion set for Yoshi Drums)&lt;br /&gt;
| Defines the Instrument to be used in a Track.&lt;br /&gt;
|-&lt;br /&gt;
| E2&lt;br /&gt;
| JASSeqParser::cmdBank&lt;br /&gt;
| {OpCode[1]} {Bank[1]}&amp;lt;br /&amp;gt;OpCode: one byte, E2.&amp;lt;br /&amp;gt;Bank: one byte with range 0x00 through 0xFF. This byte represents a WSYS ID.&lt;br /&gt;
| E2 53&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;E2: OpCode&amp;lt;br /&amp;gt;53: WSYS ID 83&amp;lt;br /&amp;gt;(This bank holds sounds for Megahammer)&lt;br /&gt;
| Defines the WSYS/IBNK whose sounds are to be used in a Track.&lt;br /&gt;
|-&lt;br /&gt;
| E3&lt;br /&gt;
| JASSeqParser::cmdPrg&lt;br /&gt;
| {OpCode[1]} {Program[1]}&amp;lt;br /&amp;gt;OpCode: one byte, E3.&amp;lt;br /&amp;gt;Program: one byte with range 0x00 through 0xFF. This byte represents a LIST entry in the IBNK belonging to the defined WSYS ID.&lt;br /&gt;
| E3 0B&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;E3: OpCode&amp;lt;br /&amp;gt;0B: IBNK LIST entry 11&amp;lt;br /&amp;gt;(In relation to Megahammer, this Program holds movement related sounds)&lt;br /&gt;
| Defines the Keyboard which holds more specific sounds to an IBNK.&lt;br /&gt;
|-&lt;br /&gt;
| E4&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E5&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E6&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E7&lt;br /&gt;
| JASSeqParser::cmdEnvScaleSet&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E8&lt;br /&gt;
| JASSeqParser::cmdEnvSet&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| E9&lt;br /&gt;
| JASSeqParser::cmdSimpleADSR&lt;br /&gt;
| {OpCode[1]} {Attack[2]} {Sustain[2]} {Decay[2]} {Amplitude[2]} {Release[2]}&amp;lt;br/&amp;gt;OpCode: one byte, E9.&amp;lt;br/&amp;gt;Attack: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade-in in ticks.&amp;lt;br/&amp;gt;Sustain: two bytes with range 0x0000 through 0x7FFF. Define the duration for how long the wave is kept at maximum amplitude in ticks.&amp;lt;br/&amp;gt;Decay: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade between maximum and controlled amplitude in ticks.&amp;lt;br/&amp;gt;Amplitude: two bytes with range 0x0000 through 0x7FFF. Define the volume of the wave for the 2nd sustain duration.&amp;lt;br/&amp;gt;Release: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade-out in ticks.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;If Amplitude is set to 0x7FFF, Sustain and Decay won&#039;t have an audible effect to the wave.&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;The Attack, Decay and Release operations affect the volume of the wave linearly.&lt;br /&gt;
| E9 00 80 01 00 00 80 5F FF 00 3C&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;E9: OpCode&amp;lt;br/&amp;gt;00 80: Attack (fade-in) for 128 ticks&amp;lt;br/&amp;gt;01 00: Sustain for 256 ticks&amp;lt;br/&amp;gt;00 80: Decay for 128 ticks&amp;lt;br/&amp;gt;5F FF: Amplitude of 75% compared to maximum&amp;lt;br/&amp;gt;00 3C: Release (fade-out) for 60 ticks&lt;br /&gt;
| Perform ADSR operations on a key. Must be placed before the actual key presses. [https://cdn.discordapp.com/attachments/1361554635369873490/1376201837237239899/image.png?ex=68347756&amp;amp;is=683325d6&amp;amp;hm=10661c473bb1ecb6187a17baafbc22c7d8af0a59cb0ceb87d7c85f42a8fee54c See this image for a visual representation of the ADSR operations].&lt;br /&gt;
|-&lt;br /&gt;
| EA&lt;br /&gt;
| JASSeqParser::cmdBusConnect&lt;br /&gt;
| {OpCode[1]} {Unknown[1]} {Unknown[1]} {Unknown[1]}&amp;lt;br /&amp;gt;OpCode: one byte, EA.&amp;lt;br /&amp;gt;Unknown: one byte with unknown range and purpose.&lt;br /&gt;
| EA 00 FF FF&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;EA: OpCode&amp;lt;br /&amp;gt;00: Unknown&amp;lt;br /&amp;gt;FF: Unknown&amp;lt;br /&amp;gt;FF: Unknown&lt;br /&gt;
| Unknown purpose, only seen in SC.&lt;br /&gt;
|-&lt;br /&gt;
| EB&lt;br /&gt;
| JASSeqParser::cmdIIRCutOff&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| EC&lt;br /&gt;
| JASSeqParser::cmdIIRSet&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| ED&lt;br /&gt;
| JASSeqParser::cmdFIRSet&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| EE&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| EF&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F0&lt;br /&gt;
| JASSeqParser::cmdWait&lt;br /&gt;
| {OpCode[1]} {WaitTime[n]}&amp;lt;br /&amp;gt;OpCode: one byte, 0xF0.&amp;lt;br /&amp;gt;WaitTime: one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. Time is measured in ticks here.&lt;br /&gt;
| F0 60 (96 Ticks)&amp;lt;br /&amp;gt;F0 81 56 (214 Ticks)&amp;lt;br /&amp;gt;F0 83 81 30 (49328 Ticks)&lt;br /&gt;
| Creates a delay, used to define the length of a Note or gap between Notes.&lt;br /&gt;
|-&lt;br /&gt;
| F1&lt;br /&gt;
| JASSeqParser::cmdWaitByte&lt;br /&gt;
| {OpCode[1]} {WaitTime[1]}&lt;br /&gt;
Waits for WaitTime ticks&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F3&lt;br /&gt;
| JASSeqParser::cmdSetIntTable&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F4&lt;br /&gt;
| JASSeqParser::cmdSetInterrupt&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F5&lt;br /&gt;
| JASSeqParser::cmdDisInterrupt&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F6&lt;br /&gt;
| JASSeqParser::cmdRetI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F7&lt;br /&gt;
| JASSeqParser::cmdClrI&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F8&lt;br /&gt;
| JASSeqParser::cmdIntTimer&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| F9&lt;br /&gt;
| JASSeqParser::cmdSyncCPU&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FA&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FB&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FC&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FD&lt;br /&gt;
| JASSeqParser::cmdPrintf&lt;br /&gt;
| {OpCode[1]} {Message[n]} {NullTerminator[1]}&amp;lt;br /&amp;gt;OpCode: one byte, FD.&amp;lt;br /&amp;gt;Message: ASCII string of undefined length, ending with &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;.&amp;lt;br /&amp;gt;NullTerminator: one byte, 00.&lt;br /&gt;
| FD 48 65 6C 6C 6F 5C 6E 00&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;FD: OpCode&amp;lt;br /&amp;gt;48 65 6C 6C 6F 5C 6E: &amp;quot;Hello\n&amp;quot;&amp;lt;br /&amp;gt;00: Null-terminator&lt;br /&gt;
| Prints a specified message to OSReport.&lt;br /&gt;
|-&lt;br /&gt;
| FE&lt;br /&gt;
| JASSeqParser::cmdNop&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| FF&lt;br /&gt;
| JASSeqParser::cmdFinish&lt;br /&gt;
| {OpCode[1]}&amp;lt;br /&amp;gt;OpCode: one byte, 0xFF.&lt;br /&gt;
| &lt;br /&gt;
| Stops execution of a Track.&lt;br /&gt;
|-&lt;br /&gt;
| B000&lt;br /&gt;
| NULL&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| B001&lt;br /&gt;
| JASSeqParser::cmdDump&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
[https://cdn.discordapp.com/attachments/421356154795458570/1291660143758413824/BMS_DEC.zip?ex=6719f440&amp;amp;is=6718a2c0&amp;amp;hm=f44c5197a070f30a00283858942f9e4ae5066034862eba006f8abe87a228a6aa&amp;amp; BMS_DEC] (converts BMS to MIDI)&amp;lt;br&amp;gt;&lt;br /&gt;
[https://github.com/XAYRGA/JaiSeqX JaiSeqX] (playback for JAudio1 and JAudio2 BMS files)&lt;/div&gt;</summary>
		<author><name>Xayrga</name></author>
	</entry>
</feed>