<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://projectpokemon.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Psy+commando</id>
	<title>ProjectPokemon Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://projectpokemon.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Psy+commando"/>
	<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/Special:Contributions/Psy_commando"/>
	<updated>2026-05-27T22:04:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5512</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5512"/>
		<updated>2017-03-04T22:56:35Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Example Event */ Made a typo in the example.. There are 3 parameter bytes, so the note data should be 0xE5. Thanks to Techie for pointing it out! ^^&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:NDS Mystery Dungeon]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips the next byte in the track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- &lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes2&lt;br /&gt;
| Skips the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;br /&gt;
* The unknown Japanese author of the &amp;quot;smd2mid v0.10&amp;quot; utility floating around the web.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5511</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5511"/>
		<updated>2017-03-04T22:38:53Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* PlayNote(0x0 to 0x7F) */  Fixed massive typo on my end ^^; Octavemod and nb parambytes had their masks inverted! Thanks to Techy for pointing it out!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:NDS Mystery Dungeon]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips the next byte in the track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- &lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes2&lt;br /&gt;
| Skips the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;br /&gt;
* The unknown Japanese author of the &amp;quot;smd2mid v0.10&amp;quot; utility floating around the web.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5510</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5510"/>
		<updated>2017-03-04T22:38:25Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* PlayNote(0x0 to 0x7F) */  Fixed massive typo on my end ^^; Octavemod and nb parambytes had their masks inverted! Thanks to Techy for pointing it out!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:NDS Mystery Dungeon]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips the next byte in the track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- &lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes2&lt;br /&gt;
| Skips the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;br /&gt;
* The unknown Japanese author of the &amp;quot;smd2mid v0.10&amp;quot; utility floating around the web.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_Level_System&amp;diff=5377</id>
		<title>Pmd2 Level System</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_Level_System&amp;diff=5377"/>
		<updated>2017-01-05T22:06:26Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* The Level Table */  cleared up something&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Level System in the PMD Explorers Games}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article will try to describe how levels work in the pmd2 games.&lt;br /&gt;
&lt;br /&gt;
== Engine Modes ==&lt;br /&gt;
There are essentially 2 modes that the game can run levels as. In-dungeon, referred to as simply &amp;quot;Dungeon&amp;quot;, and out-of-dungeon, referred to as &amp;quot;Ground&amp;quot;.&lt;br /&gt;
Ground mode is the default mode. Dungeon mode is triggered from scripts run by the Ground engine.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Dungeon:&#039;&#039;&#039; The dungeon mode is run as soon as a script from the &amp;quot;ground&amp;quot; engine calls the command to run a dungeon. And once a dungeon concludes, execution returns to the line after the command to run the dungeon, and the game falls back into &amp;quot;ground&amp;quot; mode. Scripts aren&#039;t executed at all during dungeon mode, since the overlay running scripts is unloaded and replaced with the dungeon engine overlay.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ground:&#039;&#039;&#039; The game runs in this mode as soon as the chunsoft logo pops up on screen. Game scripts are executed only in this mode.&lt;br /&gt;
&lt;br /&gt;
== The Level Table ==&lt;br /&gt;
Located in the ARM9 binary. (arm9.bin) &lt;br /&gt;
Its a table associating a level ID to level related data. Every &amp;quot;Ground&amp;quot; levels in the game have an entry in this table.&lt;br /&gt;
&lt;br /&gt;
=== Location in the Binaries ===&lt;br /&gt;
The table is always inside the arm9 binary, and never in an overlay.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Game&lt;br /&gt;
! Game Code&lt;br /&gt;
! Table Offset&lt;br /&gt;
! Nb Entries&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;North American Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SE&lt;br /&gt;
| 0xA5488&lt;br /&gt;
| 431&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;European Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SP&lt;br /&gt;
| 0xA5BE0&lt;br /&gt;
| 459&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Japanese Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SJ&lt;br /&gt;
| 0xA689C&lt;br /&gt;
| 436&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
Each entry is 12 bytes and is laid out this way.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| mapty&lt;br /&gt;
| Type of the map. A value from 0 to 11 defining how a map is loaded and displayed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown value. (0 to 306)&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| mapid&lt;br /&gt;
| ID number of the map. Most likely used in the [[pmd2_bg_list.dat|bg_list.dat]] file to look up the level&#039;s resources files.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown value. (-1 to 7) &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| ptrstring&lt;br /&gt;
| Pointer to a null terminated string, containing the internal name of the level. Is used as directory name for the script to run, and for debugging.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Level Constants and Map Types ==&lt;br /&gt;
Depending on the map type, and on the command used to load a level, a different set of constant will be used by the game.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: red; text-decoration: bold;&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5374</id>
		<title>Pmd2 eos asm locations</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5374"/>
		<updated>2016-12-17T21:01:04Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* ARM9 Bin (0x2000000) */ reordered&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:ASM Locations in the PMD:Explorers of Sky Games}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This page contains list of the interesting offsets within the game&#039;s binaries.&lt;br /&gt;
The offsets are NDS memory relative, because that&#039;s more useful that bin files offsets.&lt;br /&gt;
Just subtract the binary&#039;s load address to get its respective file offset.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
Functions pointers and some documentation on them.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Parameters&lt;br /&gt;
! Return value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemAlloc&#039;&#039;&#039;&lt;br /&gt;
| 0x2001170&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: alloc size&lt;br /&gt;
*r1: unknown&lt;br /&gt;
|&lt;br /&gt;
*r0: Pointer to allocated buffer&lt;br /&gt;
| This function allocates a buffer on the heap of the desired size, and returns a pointer to it. The second parameter&#039;s role is unclear.. It might be a flag, since it doesn&#039;t seems to change the amount of memory allocated. It can be set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemFree&#039;&#039;&#039;&lt;br /&gt;
| 0x2001188&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: buffer to free&lt;br /&gt;
| none&lt;br /&gt;
| This function free a buffer that was allocated by MemAlloc.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ZeroFill&#039;&#039;&#039;&lt;br /&gt;
| 0x2003250&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: Buffer to fill&lt;br /&gt;
*r1: Length to fill&lt;br /&gt;
| none&lt;br /&gt;
| This function fills the given buffer with zeros.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;LoadFileFromRom&#039;&#039;&#039;&lt;br /&gt;
| 0x2008C3C&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| &lt;br /&gt;
*r0: PtrReturnStruct(Struct is 2 32bits integers, first is ptr of file buffer, second is loaded file length)&lt;br /&gt;
*r1: PtrStrFilePath (Ptr to path to the file to load)&lt;br /&gt;
*r2: Unknown (Set to 0 usually)&lt;br /&gt;
| Unknown&lt;br /&gt;
| This function will load a file from the rom filesystem into a heap allocated buffer. The function allocates the buffer, and fill it with the file data. The address to the buffer containing the file data and its size in bytes are put one after the other into the 8bytes of memory pointed by r0 when running the function!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DebugPrint&#039;&#039;&#039;&lt;br /&gt;
| 0x200C240&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| Unknown&lt;br /&gt;
| none&lt;br /&gt;
| This function would print to the debug log a printf formated string. But in the retail game it does nothing. Its interesting to note that its still called in the released games and is passed various debug strings and value which can be really useful for research!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HandleSIR0Translation&#039;&#039;&#039;&lt;br /&gt;
| 0x201F4B4&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: PtrToPtrSIR0BegOfData&lt;br /&gt;
*r1: PtrSrcFileBuffer&lt;br /&gt;
| none&lt;br /&gt;
| This function translates the offsets of a SIR0 file, and change the magic number in the header to SIRO. It places a pointer to the first pointed location in the SIR0 header into the ptr pointed to by r0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static Variables ==&lt;br /&gt;
Addresses of static variables and buffers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
Addresses of static constant values.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Length(bytes)&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PackFilesPathsTable&#039;&#039;&#039;&lt;br /&gt;
| 0x20AF6A0&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| 24&lt;br /&gt;
| char*[6]&lt;br /&gt;
| Contains a list of pointers to path strings to all known pack files. The game uses this table to load its resources when launching dungeon play!&lt;br /&gt;
Should contain pointers to the strings:&lt;br /&gt;
* &amp;quot;MONSTER/monster.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_attack.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_ground.bin&amp;quot;&lt;br /&gt;
* &amp;quot;EFFECT/effect.bin&amp;quot;&lt;br /&gt;
* &amp;quot;DUNGEON/dungeon.bin&amp;quot;&lt;br /&gt;
* &amp;quot;BALANCE/m_level.bin&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5373</id>
		<title>Pmd2 eos asm locations</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5373"/>
		<updated>2016-12-17T21:00:02Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* ARM9 Bin (0x2000000) */  added load file function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:ASM Locations in the PMD:Explorers of Sky Games}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This page contains list of the interesting offsets within the game&#039;s binaries.&lt;br /&gt;
The offsets are NDS memory relative, because that&#039;s more useful that bin files offsets.&lt;br /&gt;
Just subtract the binary&#039;s load address to get its respective file offset.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
Functions pointers and some documentation on them.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Parameters&lt;br /&gt;
! Return value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemAlloc&#039;&#039;&#039;&lt;br /&gt;
| 0x2001170&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: alloc size&lt;br /&gt;
*r1: unknown&lt;br /&gt;
|&lt;br /&gt;
*r0: Pointer to allocated buffer&lt;br /&gt;
| This function allocates a buffer on the heap of the desired size, and returns a pointer to it. The second parameter&#039;s role is unclear.. It might be a flag, since it doesn&#039;t seems to change the amount of memory allocated. It can be set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemFree&#039;&#039;&#039;&lt;br /&gt;
| 0x2001188&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: buffer to free&lt;br /&gt;
| none&lt;br /&gt;
| This function free a buffer that was allocated by MemAlloc.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ZeroFill&#039;&#039;&#039;&lt;br /&gt;
| 0x2003250&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: Buffer to fill&lt;br /&gt;
*r1: Length to fill&lt;br /&gt;
| none&lt;br /&gt;
| This function fills the given buffer with zeros.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DebugPrint&#039;&#039;&#039;&lt;br /&gt;
| 0x200C240&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| Unknown&lt;br /&gt;
| none&lt;br /&gt;
| This function would print to the debug log a printf formated string. But in the retail game it does nothing. Its interesting to note that its still called in the released games and is passed various debug strings and value which can be really useful for research!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;LoadFileFromRom&#039;&#039;&#039;&lt;br /&gt;
| 0x2008C3C&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| &lt;br /&gt;
*r0: PtrReturnStruct(Struct is 2 32bits integers, first is ptr of file buffer, second is loaded file length)&lt;br /&gt;
*r1: PtrStrFilePath (Ptr to path to the file to load)&lt;br /&gt;
*r2: Unknown (Set to 0 usually)&lt;br /&gt;
| Unknown&lt;br /&gt;
| This function will load a file from the rom filesystem into a heap allocated buffer. The function allocates the buffer, and fill it with the file data. The address to the buffer containing the file data and its size in bytes are put one after the other into the 8bytes of memory pointed by r0 when running the function!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HandleSIR0Translation&#039;&#039;&#039;&lt;br /&gt;
| 0x201F4B4&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: PtrToPtrSIR0BegOfData&lt;br /&gt;
*r1: PtrSrcFileBuffer&lt;br /&gt;
| none&lt;br /&gt;
| This function translates the offsets of a SIR0 file, and change the magic number in the header to SIRO. It places a pointer to the first pointed location in the SIR0 header into the ptr pointed to by r0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static Variables ==&lt;br /&gt;
Addresses of static variables and buffers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
Addresses of static constant values.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Length(bytes)&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PackFilesPathsTable&#039;&#039;&#039;&lt;br /&gt;
| 0x20AF6A0&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| 24&lt;br /&gt;
| char*[6]&lt;br /&gt;
| Contains a list of pointers to path strings to all known pack files. The game uses this table to load its resources when launching dungeon play!&lt;br /&gt;
Should contain pointers to the strings:&lt;br /&gt;
* &amp;quot;MONSTER/monster.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_attack.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_ground.bin&amp;quot;&lt;br /&gt;
* &amp;quot;EFFECT/effect.bin&amp;quot;&lt;br /&gt;
* &amp;quot;DUNGEON/dungeon.bin&amp;quot;&lt;br /&gt;
* &amp;quot;BALANCE/m_level.bin&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5372</id>
		<title>Pmd2 eos asm locations</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5372"/>
		<updated>2016-12-17T20:28:47Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added more explanations, and locations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:ASM Locations in the PMD:Explorers of Sky Games}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This page contains list of the interesting offsets within the game&#039;s binaries.&lt;br /&gt;
The offsets are NDS memory relative, because that&#039;s more useful that bin files offsets.&lt;br /&gt;
Just subtract the binary&#039;s load address to get its respective file offset.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
Functions pointers and some documentation on them.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Parameters&lt;br /&gt;
! Return value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemAlloc&#039;&#039;&#039;&lt;br /&gt;
| 0x2001170&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: alloc size&lt;br /&gt;
*r1: unknown&lt;br /&gt;
|&lt;br /&gt;
*r0: Pointer to allocated buffer&lt;br /&gt;
| This function allocates a buffer on the heap of the desired size, and returns a pointer to it. The second parameter&#039;s role is unclear.. It might be a flag, since it doesn&#039;t seems to change the amount of memory allocated. It can be set to 0.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemFree&#039;&#039;&#039;&lt;br /&gt;
| 0x2001188&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: buffer to free&lt;br /&gt;
| none&lt;br /&gt;
| This function free a buffer that was allocated by MemAlloc.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ZeroFill&#039;&#039;&#039;&lt;br /&gt;
| 0x2003250&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: Buffer to fill&lt;br /&gt;
*r1: Length to fill&lt;br /&gt;
| none&lt;br /&gt;
| This function fills the given buffer with zeros.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DebugPrint&#039;&#039;&#039;&lt;br /&gt;
| 0x200C240&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| Unknown&lt;br /&gt;
| none&lt;br /&gt;
| This function would print to the debug log a printf formated string. But in the retail game it does nothing. Its interesting to note that its still called in the released games and is passed various debug strings and value which can be really useful for research!&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HandleSIR0Translation&#039;&#039;&#039;&lt;br /&gt;
| 0x201F4B4&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: PtrToPtrSIR0BegOfData&lt;br /&gt;
*r1: PtrSrcFileBuffer&lt;br /&gt;
| none&lt;br /&gt;
| This function translates the offsets of a SIR0 file, and change the magic number in the header to SIRO. It places a pointer to the first pointed location in the SIR0 header into the ptr pointed to by r0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static Variables ==&lt;br /&gt;
Addresses of static variables and buffers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
Addresses of static constant values.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin (0x2000000) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Length(bytes)&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PackFilesPathsTable&#039;&#039;&#039;&lt;br /&gt;
| 0x20AF6A0&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| 24&lt;br /&gt;
| char*[6]&lt;br /&gt;
| Contains a list of pointers to path strings to all known pack files. The game uses this table to load its resources when launching dungeon play!&lt;br /&gt;
Should contain pointers to the strings:&lt;br /&gt;
* &amp;quot;MONSTER/monster.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_attack.bin&amp;quot;&lt;br /&gt;
* &amp;quot;MONSTER/m_ground.bin&amp;quot;&lt;br /&gt;
* &amp;quot;EFFECT/effect.bin&amp;quot;&lt;br /&gt;
* &amp;quot;DUNGEON/dungeon.bin&amp;quot;&lt;br /&gt;
* &amp;quot;BALANCE/m_level.bin&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5371</id>
		<title>Pmd2 eos asm locations</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_eos_asm_locations&amp;diff=5371"/>
		<updated>2016-12-15T08:33:49Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Created the base structure of the page and added a few functions to the list for now. More to do!!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:ASM Locations in the PMD:Explorers of Sky Games}}&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This page contains list of the interesting offsets within the game&#039;s binaries.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
Functions pointers and some documentation on them.&lt;br /&gt;
&lt;br /&gt;
=== ARM9 Bin ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name&lt;br /&gt;
! Offset NA&lt;br /&gt;
! Offset EU&lt;br /&gt;
! Offset JP&lt;br /&gt;
! Parameters&lt;br /&gt;
! Return value&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemAlloc&#039;&#039;&#039;&lt;br /&gt;
| 0x2001170&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: alloc size&lt;br /&gt;
*r1: unknown&lt;br /&gt;
|&lt;br /&gt;
*r0: Pointer to allocated buffer&lt;br /&gt;
| This function allocates a buffer on the heap of the desired size, and returns a pointer to it.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;MemFree&#039;&#039;&#039;&lt;br /&gt;
| 0x2001188&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: buffer to free&lt;br /&gt;
| none&lt;br /&gt;
| This function free a buffer that was allocated by MemAlloc.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ZeroFill&#039;&#039;&#039;&lt;br /&gt;
| 0x2003250&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
|&lt;br /&gt;
*r0: Buffer to fill&lt;br /&gt;
*r1: Length to fill&lt;br /&gt;
| none&lt;br /&gt;
| This function fills the given buffer with zeros.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DebugPrint&#039;&#039;&#039;&lt;br /&gt;
| 0x200C240&lt;br /&gt;
| NA&lt;br /&gt;
| NA&lt;br /&gt;
| Unknown&lt;br /&gt;
| none&lt;br /&gt;
| This function would print to the debug log a printf formated string. But in the retail game it does nothing. Its interesting to note that its still called in the released games and is passed various debug strings and value which can be really useful for research!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static Variables ==&lt;br /&gt;
Addresses of static variables and buffers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
Addresses of static constant values.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5370</id>
		<title>Pokémon Mystery Dungeon Explorers</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5370"/>
		<updated>2016-12-15T08:06:51Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Explorers of Sky */ Added a link to the asm location page for PMD2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
This page contains data on the Pokémon Mystery Dungeon: Explorers of Sky/Time/Darkness games.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Sky ==&lt;br /&gt;
Data Specific to Explorers of Sky&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a list of all known functions and data offsets within the game&#039;s binaries:&lt;br /&gt;
* [[pmd2_eos_asm_locations|Functions and Data Offset]]&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #00&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 395,680 bytes&lt;br /&gt;
:* Description: Possibly contains data and code related to wifi multiplayer, in addition to the root menu.  It mentions several files from the BACK folder that are known backgrounds for the root menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #01&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 77,088 bytes&lt;br /&gt;
:* Description: Seems related to wifi rescue. It mentions several files from the GROUND and BACK folders:&lt;br /&gt;
:** 0x11ab8 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b00 : &amp;quot;BACK/s07p02a.bgp&amp;quot;&lt;br /&gt;
:** 0x11b38 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b70 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b84 : &amp;quot;GROUND/s18p01a4.wan&amp;quot;&lt;br /&gt;
:** 0x11b98 : &amp;quot;GROUND/s18p01a2.wan&amp;quot;&lt;br /&gt;
:** 0x11bac : &amp;quot;GROUND/s18p01a3.wan&amp;quot;&lt;br /&gt;
:** 0x11be4 : &amp;quot;GROUND/s18p01a1.wan&amp;quot;&lt;br /&gt;
:** 0x11bf8 : &amp;quot;BACK/s18p01a.bgp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #02&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 176,032 bytes&lt;br /&gt;
:* Description: Most likely code for the Nintendo wifi setup.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #03&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 41,312 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0xA078.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #04&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,232 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0x2BA4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #05&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 12,864 bytes&lt;br /&gt;
:* Description: Unknown so far. Contain a single line of dialog formated text &amp;quot;[CS:X][string:0][CR][CLUM_SET:88][rank:0]&amp;quot; at 0x31EC&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #06&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 9,312 bytes&lt;br /&gt;
:* Description: Probably linked to WiFi rescue. Found those strings:&lt;br /&gt;
:** 0x2354 : &amp;quot;Mysterious WiFi: Illegal Identifier&amp;quot;&lt;br /&gt;
:** 0x237C : &amp;quot;Mysterious WiFi: Difference Version&amp;quot;&lt;br /&gt;
:** 0x23A4 : &amp;quot;Mysterious WiFi: Difference Language&amp;quot;&lt;br /&gt;
:** 0x23CC : &amp;quot;Mysterious WiFi: Difference Check Sum: 0x%08x 0x%08x&amp;quot;&lt;br /&gt;
:** 0x2404 : &amp;quot;Mysterious WiFi: Illegal Data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #07&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 20,736 bytes&lt;br /&gt;
:* Description: Unknown so far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #08&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 8,704 bytes&lt;br /&gt;
:* Description: Seems related to WiFi communications, from the string search results.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #09&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,648 bytes&lt;br /&gt;
:* Description: Unknown this far. Has a single mention of &amp;quot;BACK/s18p02a.bgp&amp;quot; at 0x2D00&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #10&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 128,928 bytes&lt;br /&gt;
:* Description: Unknown this far. Some interesting strings:&lt;br /&gt;
:** 0x1F58C : &amp;quot;Lv. %d&amp;quot;&lt;br /&gt;
:** 0x1F594 : &amp;quot;[value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5AC : &amp;quot;Lv. %d [CLUM_SET:44][value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5D8 : &amp;quot;%s[CLUM_SET:70]%s&amp;quot;&lt;br /&gt;
:** 0x1F5EC : &amp;quot;/DUNGEON/sub2.bgp&amp;quot;&lt;br /&gt;
:** 0x1F600 : &amp;quot;/DUNGEON/sub.bgp&amp;quot;&lt;br /&gt;
:** 0x1F614 : &amp;quot;MainGame enter dungeon mode %d %d&amp;quot;&lt;br /&gt;
:** 0x1F638 : &amp;quot;dungeon fade out mode %d&amp;quot;&lt;br /&gt;
:** 0x1F654 : &amp;quot;dungeon getout result %d&amp;quot;&lt;br /&gt;
:** 0x1F694 : &amp;quot;rom0:BALANCE/mappa_gs.bin&amp;quot;&lt;br /&gt;
:** 0x1F6B0 : &amp;quot;dungeon map index %3d floor %3d -&amp;gt; dg index %3d floor max %3d -&amp;gt; bg index %3d table index %3d&amp;quot;&lt;br /&gt;
:** 0x1F710 : &amp;quot;rom0:BALANCE/fixed.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #11&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 298,048 bytes&lt;br /&gt;
:* Description: Most likely the script engine for the game !&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #12&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #13&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,904 bytes&lt;br /&gt;
:* Description: Controls the personality test, including the available partners and playable Pokémon.  Personality test questions are stored in the MESSAGE folder.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #14&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 15,072 bytes&lt;br /&gt;
:* Description: Probably what runs the gatekeeper mini-game(String search returned mention of footprints). &lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #15&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 4,192 bytes&lt;br /&gt;
:* Description: Possibly has to do with Duskull&#039;s bank. Got this &amp;quot;Menu_Bank_Mode_Cancel&amp;quot; at 0xFB4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #16&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,552 bytes&lt;br /&gt;
:* Description: Possibly linked to the Chimecho&#039;s assembly menu. Got this string &amp;quot;menuMonsterPictureBook_IsBusy busy&amp;quot; at 0x2CC4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #17&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 7,392 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #18&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 13,568 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #19&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 16,960 bytes&lt;br /&gt;
:* Description: Possibly linked to Spinda&#039;s cafe.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #20&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 12,288 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #21&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,808 bytes&lt;br /&gt;
:* Description: Most likely for the swap shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #22&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 19,264 bytes&lt;br /&gt;
:* Description: Most likely for the Keckleon shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #23&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 14,208 bytes&lt;br /&gt;
:* Description: Most likely for the Kangashkan storage menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #24&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 9,440 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #25&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 5,312 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #26&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,648 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #27&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,616 bytes&lt;br /&gt;
:* Description: Most likely another menu for item handling storage..&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #28&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,168 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #29&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 488,992 bytes&lt;br /&gt;
:* Description: Possibly having to do with running the in-dungeon game. Spotted strings for the in-dungeon menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #30&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 14,496 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #31&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 31,360 bytes&lt;br /&gt;
:* Description: Possibly the tactics menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #32&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #33&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #34&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 3,680 bytes&lt;br /&gt;
:* Description: Possibly having to do with launching the game. There are mention in the strings of the ERSB logo and the &amp;quot;n_logo&amp;quot; logo.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #35&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Time/Darkness ==&lt;br /&gt;
Data Specific to Explorers of Time/Darkness. Those two games have some significant differences with Explorers of Sky in the way data is stored.&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
A detailed list of the file structure of the ROM&#039;s nitro-fs filesystem. The three games share a pretty similar file structure. The differences between the three file structures will be indicated as such.&lt;br /&gt;
&lt;br /&gt;
*Note: A lot of files in the ROM have an identifier that correspond to which level/event/cutscene/etc, they&#039;re used in. Something like: &amp;quot;s17p01&amp;quot; for example.&lt;br /&gt;
&lt;br /&gt;
First/Second level directories:&lt;br /&gt;
: &#039;&#039;&#039;/BACK/&#039;&#039;&#039;&lt;br /&gt;
:: Contains large compressed [[pmd2_BGP|BGP]] images. Some of those appear on the main menu, some later during the game.&lt;br /&gt;
:: In Explorers of Sky, the backgrounds from Explorers of Time and Darkness are present but unused.&lt;br /&gt;
: &#039;&#039;&#039;/BALANCE/&#039;&#039;&#039;&lt;br /&gt;
:: Contain data about entities/Pokemon, moves, items, and dungeons data.&lt;br /&gt;
: &#039;&#039;&#039;/DUNGEON/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be some dungeon tiles.&lt;br /&gt;
: &#039;&#039;&#039;/DWC/&#039;&#039;&#039;&lt;br /&gt;
:: Data for the standard NDS Wifi setup screen.&lt;br /&gt;
: &#039;&#039;&#039;/EFFECT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains some of the effect sprites.&lt;br /&gt;
: &#039;&#039;&#039;/FONT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains fonts, UI element resources, palettes, and the portraits for the talking pokemon during the game.&lt;br /&gt;
: &#039;&#039;&#039;/GROUND/&#039;&#039;&#039;&lt;br /&gt;
:: Contains various sprites, map props, cutscene elements, some effects, and more.&lt;br /&gt;
: &#039;&#039;&#039;/MAP_BG/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be map tiles.&lt;br /&gt;
: &#039;&#039;&#039;/MESSAGE/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the text strings for most of the game!&lt;br /&gt;
: &#039;&#039;&#039;/MONSTER/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the pokemon sprites for battle and the &amp;quot;overworld&amp;quot;. &lt;br /&gt;
: &#039;&#039;&#039;/RESCUE/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly linked to SOS code generation, and the interactive online rescues.&lt;br /&gt;
: &#039;&#039;&#039;/SCRIPT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the scripts for the whole game. Each directories has an identifier related to the context it takes place in. &lt;br /&gt;
: &#039;&#039;&#039;/SOUND/BGM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the main instrument sounds bank, &amp;quot;bgm.swd&amp;quot;, and all the music in the game. With each tracks being a pair of a [[dse_smdl|SMD]] and [[dse_swdl|SWD]] file. Those files are used by the game&#039;s [[Digital_Sound_Elements|DSE sound driver]].&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/ME/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the jingles that plays when obtaining items and etc..&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SE/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SWD/&#039;&#039;&#039;&lt;br /&gt;
:: A bunch of sound effects stored as [[dse_swdl|SWD]]s&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly menu related sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SYNTH/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly data for the swap cauldron.&lt;br /&gt;
: &#039;&#039;&#039;/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the demo roms for DS Download play, along with the icons and other resources related to that.&lt;br /&gt;
: &#039;&#039;&#039;/TABLEDAT/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly recycle shop data.&lt;br /&gt;
: &#039;&#039;&#039;/TOP/&#039;&#039;&#039;&lt;br /&gt;
:: Contains [[pmd2_BGP|BGP]] files for the backgrounds used in Pokémon Mystery Dungeon: Blue Rescue Team.&lt;br /&gt;
:: It can be deleted with no immediately apparent side effects, as the backgrounds are unused.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
A list of all the file/data formats used in the game.&lt;br /&gt;
&lt;br /&gt;
;Graphics Formats:&lt;br /&gt;
: [[pmd2_BGP|BGP]]&lt;br /&gt;
: [[pmd2_WAN|WAN/WAT]]&lt;br /&gt;
: [[pmd2_WBA|WBA]]&lt;br /&gt;
: [[pmd2_W16|W16]]&lt;br /&gt;
: [[pmd2_WTE_and_WTU|WTE and WTU]]&lt;br /&gt;
: [[pmd2_CHR|CHR]]&lt;br /&gt;
: [[pmd2_PAL|PAL]]&lt;br /&gt;
: [[pmd2_BMA|BMA]]&lt;br /&gt;
: [[pmd2_BPC|BPC]]&lt;br /&gt;
: [[pmd2_BPL|BPL]]&lt;br /&gt;
: [[pmd2_BPA|BPA]]&lt;br /&gt;
: [[pmd2_smd_img|SMD(image)]]&lt;br /&gt;
: [[pmd2_sma|SMA]]&lt;br /&gt;
;Audio Formats (The files the [[Digital_Sound_Elements|DSE sound driver]] uses):&lt;br /&gt;
: [[dse_swdl|SWD]]&lt;br /&gt;
: [[dse_smdl|SMD(Music Sequence)]]&lt;br /&gt;
: [[dse_sedl|SED]]&lt;br /&gt;
;Data Formats:&lt;br /&gt;
: [[pmd2_BIN|BIN]]&lt;br /&gt;
: [[pmd2_DAT|DAT]]&lt;br /&gt;
: [[pmd2_monster.md|MD]]&lt;br /&gt;
: [[pmd2_tbl_talk.tlk|TLK]]&lt;br /&gt;
: [[pmd2_text_strings|STR]]&lt;br /&gt;
;Script Engine Formats&lt;br /&gt;
: [[pmd2_SSB|SSB]]&lt;br /&gt;
: [[pmd2_SSA|SSA]]&lt;br /&gt;
: [[pmd2_SSA|SSS]]&lt;br /&gt;
: [[pmd2_SSA|SSE]]&lt;br /&gt;
: [[pmd2_LSD|LSD]]&lt;br /&gt;
;Container Formats:&lt;br /&gt;
: [[pmd2_BIN_pack|BIN]](pack files)&lt;br /&gt;
: [[pmd2_kaomado.kao|KAO]]&lt;br /&gt;
: [[pmd2_SIR0|SIR0]]&lt;br /&gt;
;Compressed Container Formats:&lt;br /&gt;
: [[pmd2_AT4PX|AT4PX]]&lt;br /&gt;
: [[pmd2_AT4PN|AT4PN]]&lt;br /&gt;
: [[pmd2_PKDPX|PKDPX]]&lt;br /&gt;
;Font Data:&lt;br /&gt;
: [[pmd2_fontdata|DAT (from in the /FONT/ directory)]]&lt;br /&gt;
: [[pmd2_DIC|DIC]]&lt;br /&gt;
;Misc:&lt;br /&gt;
: [[pmd2_SRL|SRL]]&lt;br /&gt;
&lt;br /&gt;
Additionally, several files have a file extension that doesn&#039;t match their content. For example, &amp;quot;/SYSTEM/hsd_jap.dat&amp;quot; and &amp;quot;/SYSTEM/hsd_eng.dat&amp;quot; are AT4PX files, but their extension is &amp;quot;.dat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Files with Unique Formats ==&lt;br /&gt;
A list of files that have their own unique format.&lt;br /&gt;
&lt;br /&gt;
* /BALANCE/[[pmd2_monster.md|monster.md]]&lt;br /&gt;
* /BALANCE/[[pmd2_monster.mnd|monster.mnd]] &amp;lt;div style=&amp;quot;color: blue; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Time/Darkness only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_item_p.bin|item_p.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_item_s_p.bin|item_s_p.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_m_level.bin|m_level.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_waza_p.bin|waza_p.bin/waza_p2.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa.bin|mappa_s.bin/mappa_t.bin/mappa_y.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa_g.bin|mappa_gs.bin/mappa_gt.bin/mappa_gy.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_gwdparam.bin|gwdparam.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_fixed.bin|fixed.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_i2n_j.bin|st_i2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_m2n_j.bin|st_m2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_n2m_j.bin|st_n2m_j.bin]]&lt;br /&gt;
* /DUNGEON/[[pmd2_dungeon.bin|dungeon.bin]]&lt;br /&gt;
* /FONT/[[pmd2_kaomado.kao|kaomado.kao]]&lt;br /&gt;
* /MAP_BG/[[pmd2_bg_list.dat|bg_list.dat]] &lt;br /&gt;
* /MESSAGE/[[pmd2_tbl_talk.tlk|tbl_talk.tlk]]&lt;br /&gt;
* /MESSAGE/[[pmd2_text_strings|text_*.str]]&lt;br /&gt;
* /RESCUE/[[pmd2_rescue.bin|rescue.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /SYNTH/[[pmd2_synth.bin|synth.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /TABLEDAT/[[pmd2_tabledat|item00.dat to item15.dat]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Details ==&lt;br /&gt;
Articles on the various inner working of specific aspects of the game.&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Sound_Elements|DSE sound driver]]: Explanation of the sound driver used in all 3 PMD2 games.&lt;br /&gt;
* [[pmd2_Level_System|Level System]]: Explanation on how the game picks a level to load and all the various sub-systems involved.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Wonder Mail S Tools, research notes. The &amp;quot;items_p_Sky.xlsx&amp;quot; excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [http://apointlessplace.net/wms/] &lt;br /&gt;
* Pokemon Explorers of Sky research thread on GameFaqs: [http://www.gamefaqs.com/boards/955859-pokemon-mystery-dungeon-explorers-of-sky/51698562] (lots of great info spread around all those pages)&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_Level_System&amp;diff=5369</id>
		<title>Pmd2 Level System</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_Level_System&amp;diff=5369"/>
		<updated>2016-12-13T00:40:37Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: initial commit of the page on the level system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Level System in the PMD Explorers Games}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
This article will try to describe how levels work in the pmd2 games.&lt;br /&gt;
&lt;br /&gt;
== Engine Modes ==&lt;br /&gt;
There are essentially 2 modes that the game can run levels as. In-dungeon, referred to as simply &amp;quot;Dungeon&amp;quot;, and out-of-dungeon, referred to as &amp;quot;Ground&amp;quot;.&lt;br /&gt;
Ground mode is the default mode. Dungeon mode is triggered from scripts run by the Ground engine.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Dungeon:&#039;&#039;&#039; The dungeon mode is run as soon as a script from the &amp;quot;ground&amp;quot; engine calls the command to run a dungeon. And once a dungeon concludes, execution returns to the line after the command to run the dungeon, and the game falls back into &amp;quot;ground&amp;quot; mode. Scripts aren&#039;t executed at all during dungeon mode, since the overlay running scripts is unloaded and replaced with the dungeon engine overlay.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ground:&#039;&#039;&#039; The game runs in this mode as soon as the chunsoft logo pops up on screen. Game scripts are executed only in this mode.&lt;br /&gt;
&lt;br /&gt;
== The Level Table ==&lt;br /&gt;
Table associating a level ID to level related data. Every &amp;quot;Ground&amp;quot; levels in the game have an entry in this table.&lt;br /&gt;
&lt;br /&gt;
=== Location in the Binaries ===&lt;br /&gt;
The table is always inside the arm9 binary, and never in an overlay.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Game&lt;br /&gt;
! Game Code&lt;br /&gt;
! Table Offset&lt;br /&gt;
! Nb Entries&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;North American Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SE&lt;br /&gt;
| 0xA5488&lt;br /&gt;
| 431&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;European Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SP&lt;br /&gt;
| 0xA5BE0&lt;br /&gt;
| 459&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Japanese Explorers of Sky&#039;&#039;&#039;&lt;br /&gt;
| C2SJ&lt;br /&gt;
| 0xA689C&lt;br /&gt;
| 436&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Format ===&lt;br /&gt;
Each entry is 12 bytes and is laid out this way.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| mapty&lt;br /&gt;
| Type of the map. A value from 0 to 11 defining how a map is loaded and displayed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown value. (0 to 306)&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| mapid&lt;br /&gt;
| ID number of the map. Most likely used in the [[pmd2_bg_list.dat|bg_list.dat]] file to look up the level&#039;s resources files.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| int16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown value. (-1 to 7) &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| ptrstring&lt;br /&gt;
| Pointer to a null terminated string, containing the internal name of the level. Is used as directory name for the script to run, and for debugging.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Level Constants and Map Types ==&lt;br /&gt;
Depending on the map type, and on the command used to load a level, a different set of constant will be used by the game.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: red; text-decoration: bold;&amp;quot;&amp;gt;TODO&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5368</id>
		<title>Pokémon Mystery Dungeon Explorers</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5368"/>
		<updated>2016-12-13T00:18:14Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Files with Unique Formats */ Added bg_list.dat file to the unique file list!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
This page contains data on the Pokémon Mystery Dungeon: Explorers of Sky/Time/Darkness games.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Sky ==&lt;br /&gt;
Data Specific to Explorers of Sky&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #00&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 395,680 bytes&lt;br /&gt;
:* Description: Possibly contains data and code related to wifi multiplayer, in addition to the root menu.  It mentions several files from the BACK folder that are known backgrounds for the root menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #01&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 77,088 bytes&lt;br /&gt;
:* Description: Seems related to wifi rescue. It mentions several files from the GROUND and BACK folders:&lt;br /&gt;
:** 0x11ab8 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b00 : &amp;quot;BACK/s07p02a.bgp&amp;quot;&lt;br /&gt;
:** 0x11b38 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b70 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b84 : &amp;quot;GROUND/s18p01a4.wan&amp;quot;&lt;br /&gt;
:** 0x11b98 : &amp;quot;GROUND/s18p01a2.wan&amp;quot;&lt;br /&gt;
:** 0x11bac : &amp;quot;GROUND/s18p01a3.wan&amp;quot;&lt;br /&gt;
:** 0x11be4 : &amp;quot;GROUND/s18p01a1.wan&amp;quot;&lt;br /&gt;
:** 0x11bf8 : &amp;quot;BACK/s18p01a.bgp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #02&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 176,032 bytes&lt;br /&gt;
:* Description: Most likely code for the Nintendo wifi setup.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #03&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 41,312 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0xA078.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #04&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,232 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0x2BA4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #05&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 12,864 bytes&lt;br /&gt;
:* Description: Unknown so far. Contain a single line of dialog formated text &amp;quot;[CS:X][string:0][CR][CLUM_SET:88][rank:0]&amp;quot; at 0x31EC&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #06&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 9,312 bytes&lt;br /&gt;
:* Description: Probably linked to WiFi rescue. Found those strings:&lt;br /&gt;
:** 0x2354 : &amp;quot;Mysterious WiFi: Illegal Identifier&amp;quot;&lt;br /&gt;
:** 0x237C : &amp;quot;Mysterious WiFi: Difference Version&amp;quot;&lt;br /&gt;
:** 0x23A4 : &amp;quot;Mysterious WiFi: Difference Language&amp;quot;&lt;br /&gt;
:** 0x23CC : &amp;quot;Mysterious WiFi: Difference Check Sum: 0x%08x 0x%08x&amp;quot;&lt;br /&gt;
:** 0x2404 : &amp;quot;Mysterious WiFi: Illegal Data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #07&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 20,736 bytes&lt;br /&gt;
:* Description: Unknown so far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #08&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 8,704 bytes&lt;br /&gt;
:* Description: Seems related to WiFi communications, from the string search results.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #09&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,648 bytes&lt;br /&gt;
:* Description: Unknown this far. Has a single mention of &amp;quot;BACK/s18p02a.bgp&amp;quot; at 0x2D00&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #10&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 128,928 bytes&lt;br /&gt;
:* Description: Unknown this far. Some interesting strings:&lt;br /&gt;
:** 0x1F58C : &amp;quot;Lv. %d&amp;quot;&lt;br /&gt;
:** 0x1F594 : &amp;quot;[value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5AC : &amp;quot;Lv. %d [CLUM_SET:44][value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5D8 : &amp;quot;%s[CLUM_SET:70]%s&amp;quot;&lt;br /&gt;
:** 0x1F5EC : &amp;quot;/DUNGEON/sub2.bgp&amp;quot;&lt;br /&gt;
:** 0x1F600 : &amp;quot;/DUNGEON/sub.bgp&amp;quot;&lt;br /&gt;
:** 0x1F614 : &amp;quot;MainGame enter dungeon mode %d %d&amp;quot;&lt;br /&gt;
:** 0x1F638 : &amp;quot;dungeon fade out mode %d&amp;quot;&lt;br /&gt;
:** 0x1F654 : &amp;quot;dungeon getout result %d&amp;quot;&lt;br /&gt;
:** 0x1F694 : &amp;quot;rom0:BALANCE/mappa_gs.bin&amp;quot;&lt;br /&gt;
:** 0x1F6B0 : &amp;quot;dungeon map index %3d floor %3d -&amp;gt; dg index %3d floor max %3d -&amp;gt; bg index %3d table index %3d&amp;quot;&lt;br /&gt;
:** 0x1F710 : &amp;quot;rom0:BALANCE/fixed.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #11&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 298,048 bytes&lt;br /&gt;
:* Description: Most likely the script engine for the game !&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #12&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #13&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,904 bytes&lt;br /&gt;
:* Description: Controls the personality test, including the available partners and playable Pokémon.  Personality test questions are stored in the MESSAGE folder.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #14&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 15,072 bytes&lt;br /&gt;
:* Description: Probably what runs the gatekeeper mini-game(String search returned mention of footprints). &lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #15&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 4,192 bytes&lt;br /&gt;
:* Description: Possibly has to do with Duskull&#039;s bank. Got this &amp;quot;Menu_Bank_Mode_Cancel&amp;quot; at 0xFB4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #16&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,552 bytes&lt;br /&gt;
:* Description: Possibly linked to the Chimecho&#039;s assembly menu. Got this string &amp;quot;menuMonsterPictureBook_IsBusy busy&amp;quot; at 0x2CC4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #17&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 7,392 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #18&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 13,568 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #19&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 16,960 bytes&lt;br /&gt;
:* Description: Possibly linked to Spinda&#039;s cafe.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #20&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 12,288 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #21&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,808 bytes&lt;br /&gt;
:* Description: Most likely for the swap shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #22&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 19,264 bytes&lt;br /&gt;
:* Description: Most likely for the Keckleon shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #23&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 14,208 bytes&lt;br /&gt;
:* Description: Most likely for the Kangashkan storage menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #24&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 9,440 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #25&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 5,312 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #26&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,648 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #27&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,616 bytes&lt;br /&gt;
:* Description: Most likely another menu for item handling storage..&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #28&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,168 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #29&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 488,992 bytes&lt;br /&gt;
:* Description: Possibly having to do with running the in-dungeon game. Spotted strings for the in-dungeon menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #30&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 14,496 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #31&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 31,360 bytes&lt;br /&gt;
:* Description: Possibly the tactics menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #32&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #33&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #34&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 3,680 bytes&lt;br /&gt;
:* Description: Possibly having to do with launching the game. There are mention in the strings of the ERSB logo and the &amp;quot;n_logo&amp;quot; logo.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #35&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Time/Darkness ==&lt;br /&gt;
Data Specific to Explorers of Time/Darkness. Those two games have some significant differences with Explorers of Sky in the way data is stored.&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
A detailed list of the file structure of the ROM&#039;s nitro-fs filesystem. The three games share a pretty similar file structure. The differences between the three file structures will be indicated as such.&lt;br /&gt;
&lt;br /&gt;
*Note: A lot of files in the ROM have an identifier that correspond to which level/event/cutscene/etc, they&#039;re used in. Something like: &amp;quot;s17p01&amp;quot; for example.&lt;br /&gt;
&lt;br /&gt;
First/Second level directories:&lt;br /&gt;
: &#039;&#039;&#039;/BACK/&#039;&#039;&#039;&lt;br /&gt;
:: Contains large compressed [[pmd2_BGP|BGP]] images. Some of those appear on the main menu, some later during the game.&lt;br /&gt;
:: In Explorers of Sky, the backgrounds from Explorers of Time and Darkness are present but unused.&lt;br /&gt;
: &#039;&#039;&#039;/BALANCE/&#039;&#039;&#039;&lt;br /&gt;
:: Contain data about entities/Pokemon, moves, items, and dungeons data.&lt;br /&gt;
: &#039;&#039;&#039;/DUNGEON/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be some dungeon tiles.&lt;br /&gt;
: &#039;&#039;&#039;/DWC/&#039;&#039;&#039;&lt;br /&gt;
:: Data for the standard NDS Wifi setup screen.&lt;br /&gt;
: &#039;&#039;&#039;/EFFECT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains some of the effect sprites.&lt;br /&gt;
: &#039;&#039;&#039;/FONT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains fonts, UI element resources, palettes, and the portraits for the talking pokemon during the game.&lt;br /&gt;
: &#039;&#039;&#039;/GROUND/&#039;&#039;&#039;&lt;br /&gt;
:: Contains various sprites, map props, cutscene elements, some effects, and more.&lt;br /&gt;
: &#039;&#039;&#039;/MAP_BG/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be map tiles.&lt;br /&gt;
: &#039;&#039;&#039;/MESSAGE/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the text strings for most of the game!&lt;br /&gt;
: &#039;&#039;&#039;/MONSTER/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the pokemon sprites for battle and the &amp;quot;overworld&amp;quot;. &lt;br /&gt;
: &#039;&#039;&#039;/RESCUE/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly linked to SOS code generation, and the interactive online rescues.&lt;br /&gt;
: &#039;&#039;&#039;/SCRIPT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the scripts for the whole game. Each directories has an identifier related to the context it takes place in. &lt;br /&gt;
: &#039;&#039;&#039;/SOUND/BGM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the main instrument sounds bank, &amp;quot;bgm.swd&amp;quot;, and all the music in the game. With each tracks being a pair of a [[dse_smdl|SMD]] and [[dse_swdl|SWD]] file. Those files are used by the game&#039;s [[Digital_Sound_Elements|DSE sound driver]].&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/ME/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the jingles that plays when obtaining items and etc..&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SE/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SWD/&#039;&#039;&#039;&lt;br /&gt;
:: A bunch of sound effects stored as [[dse_swdl|SWD]]s&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly menu related sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SYNTH/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly data for the swap cauldron.&lt;br /&gt;
: &#039;&#039;&#039;/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the demo roms for DS Download play, along with the icons and other resources related to that.&lt;br /&gt;
: &#039;&#039;&#039;/TABLEDAT/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly recycle shop data.&lt;br /&gt;
: &#039;&#039;&#039;/TOP/&#039;&#039;&#039;&lt;br /&gt;
:: Contains [[pmd2_BGP|BGP]] files for the backgrounds used in Pokémon Mystery Dungeon: Blue Rescue Team.&lt;br /&gt;
:: It can be deleted with no immediately apparent side effects, as the backgrounds are unused.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
A list of all the file/data formats used in the game.&lt;br /&gt;
&lt;br /&gt;
;Graphics Formats:&lt;br /&gt;
: [[pmd2_BGP|BGP]]&lt;br /&gt;
: [[pmd2_WAN|WAN/WAT]]&lt;br /&gt;
: [[pmd2_WBA|WBA]]&lt;br /&gt;
: [[pmd2_W16|W16]]&lt;br /&gt;
: [[pmd2_WTE_and_WTU|WTE and WTU]]&lt;br /&gt;
: [[pmd2_CHR|CHR]]&lt;br /&gt;
: [[pmd2_PAL|PAL]]&lt;br /&gt;
: [[pmd2_BMA|BMA]]&lt;br /&gt;
: [[pmd2_BPC|BPC]]&lt;br /&gt;
: [[pmd2_BPL|BPL]]&lt;br /&gt;
: [[pmd2_BPA|BPA]]&lt;br /&gt;
: [[pmd2_smd_img|SMD(image)]]&lt;br /&gt;
: [[pmd2_sma|SMA]]&lt;br /&gt;
;Audio Formats (The files the [[Digital_Sound_Elements|DSE sound driver]] uses):&lt;br /&gt;
: [[dse_swdl|SWD]]&lt;br /&gt;
: [[dse_smdl|SMD(Music Sequence)]]&lt;br /&gt;
: [[dse_sedl|SED]]&lt;br /&gt;
;Data Formats:&lt;br /&gt;
: [[pmd2_BIN|BIN]]&lt;br /&gt;
: [[pmd2_DAT|DAT]]&lt;br /&gt;
: [[pmd2_monster.md|MD]]&lt;br /&gt;
: [[pmd2_tbl_talk.tlk|TLK]]&lt;br /&gt;
: [[pmd2_text_strings|STR]]&lt;br /&gt;
;Script Engine Formats&lt;br /&gt;
: [[pmd2_SSB|SSB]]&lt;br /&gt;
: [[pmd2_SSA|SSA]]&lt;br /&gt;
: [[pmd2_SSA|SSS]]&lt;br /&gt;
: [[pmd2_SSA|SSE]]&lt;br /&gt;
: [[pmd2_LSD|LSD]]&lt;br /&gt;
;Container Formats:&lt;br /&gt;
: [[pmd2_BIN_pack|BIN]](pack files)&lt;br /&gt;
: [[pmd2_kaomado.kao|KAO]]&lt;br /&gt;
: [[pmd2_SIR0|SIR0]]&lt;br /&gt;
;Compressed Container Formats:&lt;br /&gt;
: [[pmd2_AT4PX|AT4PX]]&lt;br /&gt;
: [[pmd2_AT4PN|AT4PN]]&lt;br /&gt;
: [[pmd2_PKDPX|PKDPX]]&lt;br /&gt;
;Font Data:&lt;br /&gt;
: [[pmd2_fontdata|DAT (from in the /FONT/ directory)]]&lt;br /&gt;
: [[pmd2_DIC|DIC]]&lt;br /&gt;
;Misc:&lt;br /&gt;
: [[pmd2_SRL|SRL]]&lt;br /&gt;
&lt;br /&gt;
Additionally, several files have a file extension that doesn&#039;t match their content. For example, &amp;quot;/SYSTEM/hsd_jap.dat&amp;quot; and &amp;quot;/SYSTEM/hsd_eng.dat&amp;quot; are AT4PX files, but their extension is &amp;quot;.dat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Files with Unique Formats ==&lt;br /&gt;
A list of files that have their own unique format.&lt;br /&gt;
&lt;br /&gt;
* /BALANCE/[[pmd2_monster.md|monster.md]]&lt;br /&gt;
* /BALANCE/[[pmd2_monster.mnd|monster.mnd]] &amp;lt;div style=&amp;quot;color: blue; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Time/Darkness only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_item_p.bin|item_p.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_item_s_p.bin|item_s_p.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_m_level.bin|m_level.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_waza_p.bin|waza_p.bin/waza_p2.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa.bin|mappa_s.bin/mappa_t.bin/mappa_y.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa_g.bin|mappa_gs.bin/mappa_gt.bin/mappa_gy.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_gwdparam.bin|gwdparam.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_fixed.bin|fixed.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_i2n_j.bin|st_i2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_m2n_j.bin|st_m2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_n2m_j.bin|st_n2m_j.bin]]&lt;br /&gt;
* /DUNGEON/[[pmd2_dungeon.bin|dungeon.bin]]&lt;br /&gt;
* /FONT/[[pmd2_kaomado.kao|kaomado.kao]]&lt;br /&gt;
* /MAP_BG/[[pmd2_bg_list.dat|bg_list.dat]] &lt;br /&gt;
* /MESSAGE/[[pmd2_tbl_talk.tlk|tbl_talk.tlk]]&lt;br /&gt;
* /MESSAGE/[[pmd2_text_strings|text_*.str]]&lt;br /&gt;
* /RESCUE/[[pmd2_rescue.bin|rescue.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /SYNTH/[[pmd2_synth.bin|synth.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /TABLEDAT/[[pmd2_tabledat|item00.dat to item15.dat]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Details ==&lt;br /&gt;
Articles on the various inner working of specific aspects of the game.&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Sound_Elements|DSE sound driver]]: Explanation of the sound driver used in all 3 PMD2 games.&lt;br /&gt;
* [[pmd2_Level_System|Level System]]: Explanation on how the game picks a level to load and all the various sub-systems involved.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Wonder Mail S Tools, research notes. The &amp;quot;items_p_Sky.xlsx&amp;quot; excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [http://apointlessplace.net/wms/] &lt;br /&gt;
* Pokemon Explorers of Sky research thread on GameFaqs: [http://www.gamefaqs.com/boards/955859-pokemon-mystery-dungeon-explorers-of-sky/51698562] (lots of great info spread around all those pages)&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5367</id>
		<title>Pokémon Mystery Dungeon Explorers</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5367"/>
		<updated>2016-12-12T23:47:08Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added a new section for articles describing specific system/processes/etc in the pmd2 games&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
This page contains data on the Pokémon Mystery Dungeon: Explorers of Sky/Time/Darkness games.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Sky ==&lt;br /&gt;
Data Specific to Explorers of Sky&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #00&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 395,680 bytes&lt;br /&gt;
:* Description: Possibly contains data and code related to wifi multiplayer, in addition to the root menu.  It mentions several files from the BACK folder that are known backgrounds for the root menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #01&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 77,088 bytes&lt;br /&gt;
:* Description: Seems related to wifi rescue. It mentions several files from the GROUND and BACK folders:&lt;br /&gt;
:** 0x11ab8 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b00 : &amp;quot;BACK/s07p02a.bgp&amp;quot;&lt;br /&gt;
:** 0x11b38 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b70 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b84 : &amp;quot;GROUND/s18p01a4.wan&amp;quot;&lt;br /&gt;
:** 0x11b98 : &amp;quot;GROUND/s18p01a2.wan&amp;quot;&lt;br /&gt;
:** 0x11bac : &amp;quot;GROUND/s18p01a3.wan&amp;quot;&lt;br /&gt;
:** 0x11be4 : &amp;quot;GROUND/s18p01a1.wan&amp;quot;&lt;br /&gt;
:** 0x11bf8 : &amp;quot;BACK/s18p01a.bgp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #02&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 176,032 bytes&lt;br /&gt;
:* Description: Most likely code for the Nintendo wifi setup.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #03&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 41,312 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0xA078.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #04&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,232 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0x2BA4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #05&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 12,864 bytes&lt;br /&gt;
:* Description: Unknown so far. Contain a single line of dialog formated text &amp;quot;[CS:X][string:0][CR][CLUM_SET:88][rank:0]&amp;quot; at 0x31EC&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #06&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 9,312 bytes&lt;br /&gt;
:* Description: Probably linked to WiFi rescue. Found those strings:&lt;br /&gt;
:** 0x2354 : &amp;quot;Mysterious WiFi: Illegal Identifier&amp;quot;&lt;br /&gt;
:** 0x237C : &amp;quot;Mysterious WiFi: Difference Version&amp;quot;&lt;br /&gt;
:** 0x23A4 : &amp;quot;Mysterious WiFi: Difference Language&amp;quot;&lt;br /&gt;
:** 0x23CC : &amp;quot;Mysterious WiFi: Difference Check Sum: 0x%08x 0x%08x&amp;quot;&lt;br /&gt;
:** 0x2404 : &amp;quot;Mysterious WiFi: Illegal Data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #07&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 20,736 bytes&lt;br /&gt;
:* Description: Unknown so far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #08&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 8,704 bytes&lt;br /&gt;
:* Description: Seems related to WiFi communications, from the string search results.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #09&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,648 bytes&lt;br /&gt;
:* Description: Unknown this far. Has a single mention of &amp;quot;BACK/s18p02a.bgp&amp;quot; at 0x2D00&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #10&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 128,928 bytes&lt;br /&gt;
:* Description: Unknown this far. Some interesting strings:&lt;br /&gt;
:** 0x1F58C : &amp;quot;Lv. %d&amp;quot;&lt;br /&gt;
:** 0x1F594 : &amp;quot;[value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5AC : &amp;quot;Lv. %d [CLUM_SET:44][value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5D8 : &amp;quot;%s[CLUM_SET:70]%s&amp;quot;&lt;br /&gt;
:** 0x1F5EC : &amp;quot;/DUNGEON/sub2.bgp&amp;quot;&lt;br /&gt;
:** 0x1F600 : &amp;quot;/DUNGEON/sub.bgp&amp;quot;&lt;br /&gt;
:** 0x1F614 : &amp;quot;MainGame enter dungeon mode %d %d&amp;quot;&lt;br /&gt;
:** 0x1F638 : &amp;quot;dungeon fade out mode %d&amp;quot;&lt;br /&gt;
:** 0x1F654 : &amp;quot;dungeon getout result %d&amp;quot;&lt;br /&gt;
:** 0x1F694 : &amp;quot;rom0:BALANCE/mappa_gs.bin&amp;quot;&lt;br /&gt;
:** 0x1F6B0 : &amp;quot;dungeon map index %3d floor %3d -&amp;gt; dg index %3d floor max %3d -&amp;gt; bg index %3d table index %3d&amp;quot;&lt;br /&gt;
:** 0x1F710 : &amp;quot;rom0:BALANCE/fixed.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #11&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 298,048 bytes&lt;br /&gt;
:* Description: Most likely the script engine for the game !&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #12&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #13&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,904 bytes&lt;br /&gt;
:* Description: Controls the personality test, including the available partners and playable Pokémon.  Personality test questions are stored in the MESSAGE folder.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #14&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 15,072 bytes&lt;br /&gt;
:* Description: Probably what runs the gatekeeper mini-game(String search returned mention of footprints). &lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #15&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 4,192 bytes&lt;br /&gt;
:* Description: Possibly has to do with Duskull&#039;s bank. Got this &amp;quot;Menu_Bank_Mode_Cancel&amp;quot; at 0xFB4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #16&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,552 bytes&lt;br /&gt;
:* Description: Possibly linked to the Chimecho&#039;s assembly menu. Got this string &amp;quot;menuMonsterPictureBook_IsBusy busy&amp;quot; at 0x2CC4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #17&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 7,392 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #18&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 13,568 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #19&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 16,960 bytes&lt;br /&gt;
:* Description: Possibly linked to Spinda&#039;s cafe.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #20&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 12,288 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #21&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,808 bytes&lt;br /&gt;
:* Description: Most likely for the swap shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #22&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 19,264 bytes&lt;br /&gt;
:* Description: Most likely for the Keckleon shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #23&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 14,208 bytes&lt;br /&gt;
:* Description: Most likely for the Kangashkan storage menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #24&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 9,440 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #25&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 5,312 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #26&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,648 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #27&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,616 bytes&lt;br /&gt;
:* Description: Most likely another menu for item handling storage..&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #28&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,168 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #29&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 488,992 bytes&lt;br /&gt;
:* Description: Possibly having to do with running the in-dungeon game. Spotted strings for the in-dungeon menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #30&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 14,496 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #31&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 31,360 bytes&lt;br /&gt;
:* Description: Possibly the tactics menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #32&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #33&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #34&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 3,680 bytes&lt;br /&gt;
:* Description: Possibly having to do with launching the game. There are mention in the strings of the ERSB logo and the &amp;quot;n_logo&amp;quot; logo.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #35&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Time/Darkness ==&lt;br /&gt;
Data Specific to Explorers of Time/Darkness. Those two games have some significant differences with Explorers of Sky in the way data is stored.&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
A detailed list of the file structure of the ROM&#039;s nitro-fs filesystem. The three games share a pretty similar file structure. The differences between the three file structures will be indicated as such.&lt;br /&gt;
&lt;br /&gt;
*Note: A lot of files in the ROM have an identifier that correspond to which level/event/cutscene/etc, they&#039;re used in. Something like: &amp;quot;s17p01&amp;quot; for example.&lt;br /&gt;
&lt;br /&gt;
First/Second level directories:&lt;br /&gt;
: &#039;&#039;&#039;/BACK/&#039;&#039;&#039;&lt;br /&gt;
:: Contains large compressed [[pmd2_BGP|BGP]] images. Some of those appear on the main menu, some later during the game.&lt;br /&gt;
:: In Explorers of Sky, the backgrounds from Explorers of Time and Darkness are present but unused.&lt;br /&gt;
: &#039;&#039;&#039;/BALANCE/&#039;&#039;&#039;&lt;br /&gt;
:: Contain data about entities/Pokemon, moves, items, and dungeons data.&lt;br /&gt;
: &#039;&#039;&#039;/DUNGEON/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be some dungeon tiles.&lt;br /&gt;
: &#039;&#039;&#039;/DWC/&#039;&#039;&#039;&lt;br /&gt;
:: Data for the standard NDS Wifi setup screen.&lt;br /&gt;
: &#039;&#039;&#039;/EFFECT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains some of the effect sprites.&lt;br /&gt;
: &#039;&#039;&#039;/FONT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains fonts, UI element resources, palettes, and the portraits for the talking pokemon during the game.&lt;br /&gt;
: &#039;&#039;&#039;/GROUND/&#039;&#039;&#039;&lt;br /&gt;
:: Contains various sprites, map props, cutscene elements, some effects, and more.&lt;br /&gt;
: &#039;&#039;&#039;/MAP_BG/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be map tiles.&lt;br /&gt;
: &#039;&#039;&#039;/MESSAGE/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the text strings for most of the game!&lt;br /&gt;
: &#039;&#039;&#039;/MONSTER/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the pokemon sprites for battle and the &amp;quot;overworld&amp;quot;. &lt;br /&gt;
: &#039;&#039;&#039;/RESCUE/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly linked to SOS code generation, and the interactive online rescues.&lt;br /&gt;
: &#039;&#039;&#039;/SCRIPT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the scripts for the whole game. Each directories has an identifier related to the context it takes place in. &lt;br /&gt;
: &#039;&#039;&#039;/SOUND/BGM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the main instrument sounds bank, &amp;quot;bgm.swd&amp;quot;, and all the music in the game. With each tracks being a pair of a [[dse_smdl|SMD]] and [[dse_swdl|SWD]] file. Those files are used by the game&#039;s [[Digital_Sound_Elements|DSE sound driver]].&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/ME/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the jingles that plays when obtaining items and etc..&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SE/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SWD/&#039;&#039;&#039;&lt;br /&gt;
:: A bunch of sound effects stored as [[dse_swdl|SWD]]s&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly menu related sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SYNTH/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly data for the swap cauldron.&lt;br /&gt;
: &#039;&#039;&#039;/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the demo roms for DS Download play, along with the icons and other resources related to that.&lt;br /&gt;
: &#039;&#039;&#039;/TABLEDAT/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly recycle shop data.&lt;br /&gt;
: &#039;&#039;&#039;/TOP/&#039;&#039;&#039;&lt;br /&gt;
:: Contains [[pmd2_BGP|BGP]] files for the backgrounds used in Pokémon Mystery Dungeon: Blue Rescue Team.&lt;br /&gt;
:: It can be deleted with no immediately apparent side effects, as the backgrounds are unused.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
A list of all the file/data formats used in the game.&lt;br /&gt;
&lt;br /&gt;
;Graphics Formats:&lt;br /&gt;
: [[pmd2_BGP|BGP]]&lt;br /&gt;
: [[pmd2_WAN|WAN/WAT]]&lt;br /&gt;
: [[pmd2_WBA|WBA]]&lt;br /&gt;
: [[pmd2_W16|W16]]&lt;br /&gt;
: [[pmd2_WTE_and_WTU|WTE and WTU]]&lt;br /&gt;
: [[pmd2_CHR|CHR]]&lt;br /&gt;
: [[pmd2_PAL|PAL]]&lt;br /&gt;
: [[pmd2_BMA|BMA]]&lt;br /&gt;
: [[pmd2_BPC|BPC]]&lt;br /&gt;
: [[pmd2_BPL|BPL]]&lt;br /&gt;
: [[pmd2_BPA|BPA]]&lt;br /&gt;
: [[pmd2_smd_img|SMD(image)]]&lt;br /&gt;
: [[pmd2_sma|SMA]]&lt;br /&gt;
;Audio Formats (The files the [[Digital_Sound_Elements|DSE sound driver]] uses):&lt;br /&gt;
: [[dse_swdl|SWD]]&lt;br /&gt;
: [[dse_smdl|SMD(Music Sequence)]]&lt;br /&gt;
: [[dse_sedl|SED]]&lt;br /&gt;
;Data Formats:&lt;br /&gt;
: [[pmd2_BIN|BIN]]&lt;br /&gt;
: [[pmd2_DAT|DAT]]&lt;br /&gt;
: [[pmd2_monster.md|MD]]&lt;br /&gt;
: [[pmd2_tbl_talk.tlk|TLK]]&lt;br /&gt;
: [[pmd2_text_strings|STR]]&lt;br /&gt;
;Script Engine Formats&lt;br /&gt;
: [[pmd2_SSB|SSB]]&lt;br /&gt;
: [[pmd2_SSA|SSA]]&lt;br /&gt;
: [[pmd2_SSA|SSS]]&lt;br /&gt;
: [[pmd2_SSA|SSE]]&lt;br /&gt;
: [[pmd2_LSD|LSD]]&lt;br /&gt;
;Container Formats:&lt;br /&gt;
: [[pmd2_BIN_pack|BIN]](pack files)&lt;br /&gt;
: [[pmd2_kaomado.kao|KAO]]&lt;br /&gt;
: [[pmd2_SIR0|SIR0]]&lt;br /&gt;
;Compressed Container Formats:&lt;br /&gt;
: [[pmd2_AT4PX|AT4PX]]&lt;br /&gt;
: [[pmd2_AT4PN|AT4PN]]&lt;br /&gt;
: [[pmd2_PKDPX|PKDPX]]&lt;br /&gt;
;Font Data:&lt;br /&gt;
: [[pmd2_fontdata|DAT (from in the /FONT/ directory)]]&lt;br /&gt;
: [[pmd2_DIC|DIC]]&lt;br /&gt;
;Misc:&lt;br /&gt;
: [[pmd2_SRL|SRL]]&lt;br /&gt;
&lt;br /&gt;
Additionally, several files have a file extension that doesn&#039;t match their content. For example, &amp;quot;/SYSTEM/hsd_jap.dat&amp;quot; and &amp;quot;/SYSTEM/hsd_eng.dat&amp;quot; are AT4PX files, but their extension is &amp;quot;.dat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Files with Unique Formats ==&lt;br /&gt;
A list of files that have their own unique format.&lt;br /&gt;
&lt;br /&gt;
* /BALANCE/[[pmd2_monster.md|monster.md]]&lt;br /&gt;
* /BALANCE/[[pmd2_monster.mnd|monster.mnd]] &amp;lt;div style=&amp;quot;color: blue; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Time/Darkness only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_item_p.bin|item_p.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_item_s_p.bin|item_s_p.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_m_level.bin|m_level.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_waza_p.bin|waza_p.bin/waza_p2.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa.bin|mappa_s.bin/mappa_t.bin/mappa_y.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa_g.bin|mappa_gs.bin/mappa_gt.bin/mappa_gy.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_gwdparam.bin|gwdparam.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_fixed.bin|fixed.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_i2n_j.bin|st_i2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_m2n_j.bin|st_m2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_n2m_j.bin|st_n2m_j.bin]]&lt;br /&gt;
* /DUNGEON/[[pmd2_dungeon.bin|dungeon.bin]]&lt;br /&gt;
* /FONT/[[pmd2_kaomado.kao|kaomado.kao]]&lt;br /&gt;
* /MESSAGE/[[pmd2_tbl_talk.tlk|tbl_talk.tlk]]&lt;br /&gt;
* /MESSAGE/[[pmd2_text_strings|text_*.str]]&lt;br /&gt;
* /RESCUE/[[pmd2_rescue.bin|rescue.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /SYNTH/[[pmd2_synth.bin|synth.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /TABLEDAT/[[pmd2_tabledat|item00.dat to item15.dat]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Internal Details ==&lt;br /&gt;
Articles on the various inner working of specific aspects of the game.&lt;br /&gt;
&lt;br /&gt;
* [[Digital_Sound_Elements|DSE sound driver]]: Explanation of the sound driver used in all 3 PMD2 games.&lt;br /&gt;
* [[pmd2_Level_System|Level System]]: Explanation on how the game picks a level to load and all the various sub-systems involved.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Wonder Mail S Tools, research notes. The &amp;quot;items_p_Sky.xlsx&amp;quot; excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [http://apointlessplace.net/wms/] &lt;br /&gt;
* Pokemon Explorers of Sky research thread on GameFaqs: [http://www.gamefaqs.com/boards/955859-pokemon-mystery-dungeon-explorers-of-sky/51698562] (lots of great info spread around all those pages)&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5331</id>
		<title>Pokémon Mystery Dungeon Explorers</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pok%C3%A9mon_Mystery_Dungeon_Explorers&amp;diff=5331"/>
		<updated>2016-05-18T20:26:45Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* File Structure */ fixed some of the links to dse pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
This page contains data on the Pokémon Mystery Dungeon: Explorers of Sky/Time/Darkness games.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Sky ==&lt;br /&gt;
Data Specific to Explorers of Sky&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #00&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 395,680 bytes&lt;br /&gt;
:* Description: Possibly contains data and code related to wifi multiplayer, in addition to the root menu.  It mentions several files from the BACK folder that are known backgrounds for the root menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #01&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 77,088 bytes&lt;br /&gt;
:* Description: Seems related to wifi rescue. It mentions several files from the GROUND and BACK folders:&lt;br /&gt;
:** 0x11ab8 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b00 : &amp;quot;BACK/s07p02a.bgp&amp;quot;&lt;br /&gt;
:** 0x11b38 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b70 : &amp;quot;BACK/expback.bgp&amp;quot;&lt;br /&gt;
:** 0x11b84 : &amp;quot;GROUND/s18p01a4.wan&amp;quot;&lt;br /&gt;
:** 0x11b98 : &amp;quot;GROUND/s18p01a2.wan&amp;quot;&lt;br /&gt;
:** 0x11bac : &amp;quot;GROUND/s18p01a3.wan&amp;quot;&lt;br /&gt;
:** 0x11be4 : &amp;quot;GROUND/s18p01a1.wan&amp;quot;&lt;br /&gt;
:** 0x11bf8 : &amp;quot;BACK/s18p01a.bgp&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #02&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02329520&lt;br /&gt;
:* Length in RAM: 176,032 bytes&lt;br /&gt;
:* Description: Most likely code for the Nintendo wifi setup.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #03&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 41,312 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0xA078.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #04&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,232 bytes&lt;br /&gt;
:* Description: Unknown so far. Contains a single mention of &amp;quot;TABLEDAT/item00.dat&amp;quot; at 0x2BA4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #05&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 12,864 bytes&lt;br /&gt;
:* Description: Unknown so far. Contain a single line of dialog formated text &amp;quot;[CS:X][string:0][CR][CLUM_SET:88][rank:0]&amp;quot; at 0x31EC&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #06&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 9,312 bytes&lt;br /&gt;
:* Description: Probably linked to WiFi rescue. Found those strings:&lt;br /&gt;
:** 0x2354 : &amp;quot;Mysterious WiFi: Illegal Identifier&amp;quot;&lt;br /&gt;
:** 0x237C : &amp;quot;Mysterious WiFi: Difference Version&amp;quot;&lt;br /&gt;
:** 0x23A4 : &amp;quot;Mysterious WiFi: Difference Language&amp;quot;&lt;br /&gt;
:** 0x23CC : &amp;quot;Mysterious WiFi: Difference Check Sum: 0x%08x 0x%08x&amp;quot;&lt;br /&gt;
:** 0x2404 : &amp;quot;Mysterious WiFi: Illegal Data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #07&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 20,736 bytes&lt;br /&gt;
:* Description: Unknown so far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #08&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 8,704 bytes&lt;br /&gt;
:* Description: Seems related to WiFi communications, from the string search results.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #09&#039;&#039;&#039;: &lt;br /&gt;
:* RAM Load address: 0x0233CA80&lt;br /&gt;
:* Length in RAM: 11,648 bytes&lt;br /&gt;
:* Description: Unknown this far. Has a single mention of &amp;quot;BACK/s18p02a.bgp&amp;quot; at 0x2D00&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #10&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 128,928 bytes&lt;br /&gt;
:* Description: Unknown this far. Some interesting strings:&lt;br /&gt;
:** 0x1F58C : &amp;quot;Lv. %d&amp;quot;&lt;br /&gt;
:** 0x1F594 : &amp;quot;[value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5AC : &amp;quot;Lv. %d [CLUM_SET:44][value:0:3]/[value:1:3]&amp;quot;&lt;br /&gt;
:** 0x1F5D8 : &amp;quot;%s[CLUM_SET:70]%s&amp;quot;&lt;br /&gt;
:** 0x1F5EC : &amp;quot;/DUNGEON/sub2.bgp&amp;quot;&lt;br /&gt;
:** 0x1F600 : &amp;quot;/DUNGEON/sub.bgp&amp;quot;&lt;br /&gt;
:** 0x1F614 : &amp;quot;MainGame enter dungeon mode %d %d&amp;quot;&lt;br /&gt;
:** 0x1F638 : &amp;quot;dungeon fade out mode %d&amp;quot;&lt;br /&gt;
:** 0x1F654 : &amp;quot;dungeon getout result %d&amp;quot;&lt;br /&gt;
:** 0x1F694 : &amp;quot;rom0:BALANCE/mappa_gs.bin&amp;quot;&lt;br /&gt;
:** 0x1F6B0 : &amp;quot;dungeon map index %3d floor %3d -&amp;gt; dg index %3d floor max %3d -&amp;gt; bg index %3d table index %3d&amp;quot;&lt;br /&gt;
:** 0x1F710 : &amp;quot;rom0:BALANCE/fixed.bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #11&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 298,048 bytes&lt;br /&gt;
:* Description: Most likely the script engine for the game !&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #12&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #13&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,904 bytes&lt;br /&gt;
:* Description: Controls the personality test, including the available partners and playable Pokémon.  Personality test questions are stored in the MESSAGE folder.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #14&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 15,072 bytes&lt;br /&gt;
:* Description: Probably what runs the gatekeeper mini-game(String search returned mention of footprints). &lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #15&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 4,192 bytes&lt;br /&gt;
:* Description: Possibly has to do with Duskull&#039;s bank. Got this &amp;quot;Menu_Bank_Mode_Cancel&amp;quot; at 0xFB4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #16&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,552 bytes&lt;br /&gt;
:* Description: Possibly linked to the Chimecho&#039;s assembly menu. Got this string &amp;quot;menuMonsterPictureBook_IsBusy busy&amp;quot; at 0x2CC4.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #17&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 7,392 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #18&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 13,568 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #19&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 16,960 bytes&lt;br /&gt;
:* Description: Possibly linked to Spinda&#039;s cafe.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #20&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 12,288 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #21&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,808 bytes&lt;br /&gt;
:* Description: Most likely for the swap shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #22&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 19,264 bytes&lt;br /&gt;
:* Description: Most likely for the Keckleon shop menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #23&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 14,208 bytes&lt;br /&gt;
:* Description: Most likely for the Kangashkan storage menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #24&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 9,440 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #25&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 5,312 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #26&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,648 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #27&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 11,616 bytes&lt;br /&gt;
:* Description: Most likely another menu for item handling storage..&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #28&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x0238A140&lt;br /&gt;
:* Length in RAM: 3,168 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #29&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 488,992 bytes&lt;br /&gt;
:* Description: Possibly having to do with running the in-dungeon game. Spotted strings for the in-dungeon menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #30&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 14,496 bytes&lt;br /&gt;
:* Description: Unknown this far.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #31&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 31,360 bytes&lt;br /&gt;
:* Description: Possibly the tactics menu.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #32&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #33&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x02382820&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #34&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022DC240&lt;br /&gt;
:* Length in RAM: 3,680 bytes&lt;br /&gt;
:* Description: Possibly having to do with launching the game. There are mention in the strings of the ERSB logo and the &amp;quot;n_logo&amp;quot; logo.&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Overlay #35&#039;&#039;&#039;:&lt;br /&gt;
:* RAM Load address: 0x022BCA80&lt;br /&gt;
:* Length in RAM: 32 bytes&lt;br /&gt;
:* Description: Empty, 32 bytes of zeros.&lt;br /&gt;
&lt;br /&gt;
== Explorers of Time/Darkness ==&lt;br /&gt;
Data Specific to Explorers of Time/Darkness. Those two games have some significant differences with Explorers of Sky in the way data is stored.&lt;br /&gt;
&lt;br /&gt;
=== NDS9/ARM9 Overlays: ===&lt;br /&gt;
A list of all the overlays, and what they&#039;re used for.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
A detailed list of the file structure of the ROM&#039;s nitro-fs filesystem. The three games share a pretty similar file structure. The differences between the three file structures will be indicated as such.&lt;br /&gt;
&lt;br /&gt;
*Note: A lot of files in the ROM have an identifier that correspond to which level/event/cutscene/etc, they&#039;re used in. Something like: &amp;quot;s17p01&amp;quot; for example.&lt;br /&gt;
&lt;br /&gt;
First/Second level directories:&lt;br /&gt;
: &#039;&#039;&#039;/BACK/&#039;&#039;&#039;&lt;br /&gt;
:: Contains large compressed [[pmd2_BGP|BGP]] images. Some of those appear on the main menu, some later during the game.&lt;br /&gt;
:: In Explorers of Sky, the backgrounds from Explorers of Time and Darkness are present but unused.&lt;br /&gt;
: &#039;&#039;&#039;/BALANCE/&#039;&#039;&#039;&lt;br /&gt;
:: Contain data about entities/Pokemon, moves, items, and dungeons data.&lt;br /&gt;
: &#039;&#039;&#039;/DUNGEON/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be some dungeon tiles.&lt;br /&gt;
: &#039;&#039;&#039;/DWC/&#039;&#039;&#039;&lt;br /&gt;
:: Data for the standard NDS Wifi setup screen.&lt;br /&gt;
: &#039;&#039;&#039;/EFFECT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains some of the effect sprites.&lt;br /&gt;
: &#039;&#039;&#039;/FONT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains fonts, UI element resources, palettes, and the portraits for the talking pokemon during the game.&lt;br /&gt;
: &#039;&#039;&#039;/GROUND/&#039;&#039;&#039;&lt;br /&gt;
:: Contains various sprites, map props, cutscene elements, some effects, and more.&lt;br /&gt;
: &#039;&#039;&#039;/MAP_BG/&#039;&#039;&#039;&lt;br /&gt;
:: Contains what seems to be map tiles.&lt;br /&gt;
: &#039;&#039;&#039;/MESSAGE/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the text strings for most of the game!&lt;br /&gt;
: &#039;&#039;&#039;/MONSTER/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the pokemon sprites for battle and the &amp;quot;overworld&amp;quot;. &lt;br /&gt;
: &#039;&#039;&#039;/RESCUE/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly linked to SOS code generation, and the interactive online rescues.&lt;br /&gt;
: &#039;&#039;&#039;/SCRIPT/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the scripts for the whole game. Each directories has an identifier related to the context it takes place in. &lt;br /&gt;
: &#039;&#039;&#039;/SOUND/BGM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the main instrument sounds bank, &amp;quot;bgm.swd&amp;quot;, and all the music in the game. With each tracks being a pair of a [[dse_smdl|SMD]] and [[dse_swdl|SWD]] file. Those files are used by the game&#039;s [[Digital_Sound_Elements|DSE sound driver]].&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/ME/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the jingles that plays when obtaining items and etc..&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SE/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SWD/&#039;&#039;&#039;&lt;br /&gt;
:: A bunch of sound effects stored as [[dse_swdl|SWD]]s&lt;br /&gt;
: &#039;&#039;&#039;/SOUND/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Possibly menu related sound effects.&lt;br /&gt;
: &#039;&#039;&#039;/SYNTH/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly data for the swap cauldron.&lt;br /&gt;
: &#039;&#039;&#039;/SYSTEM/&#039;&#039;&#039;&lt;br /&gt;
:: Contains the demo roms for DS Download play, along with the icons and other resources related to that.&lt;br /&gt;
: &#039;&#039;&#039;/TABLEDAT/&#039;&#039;&#039; &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
:: Possibly recycle shop data.&lt;br /&gt;
: &#039;&#039;&#039;/TOP/&#039;&#039;&#039;&lt;br /&gt;
:: Contains [[pmd2_BGP|BGP]] files for the backgrounds used in Pokémon Mystery Dungeon: Blue Rescue Team.&lt;br /&gt;
:: It can be deleted with no immediately apparent side effects, as the backgrounds are unused.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
A list of all the file/data formats used in the game.&lt;br /&gt;
&lt;br /&gt;
;Graphics Formats:&lt;br /&gt;
: [[pmd2_BGP|BGP]]&lt;br /&gt;
: [[pmd2_WAN|WAN/WAT]]&lt;br /&gt;
: [[pmd2_WBA|WBA]]&lt;br /&gt;
: [[pmd2_W16|W16]]&lt;br /&gt;
: [[pmd2_WTE_and_WTU|WTE and WTU]]&lt;br /&gt;
: [[pmd2_CHR|CHR]]&lt;br /&gt;
: [[pmd2_PAL|PAL]]&lt;br /&gt;
: [[pmd2_BMA|BMA]]&lt;br /&gt;
: [[pmd2_BPC|BPC]]&lt;br /&gt;
: [[pmd2_BPL|BPL]]&lt;br /&gt;
: [[pmd2_BPA|BPA]]&lt;br /&gt;
: [[pmd2_smd_img|SMD(image)]]&lt;br /&gt;
: [[pmd2_sma|SMA]]&lt;br /&gt;
;Audio Formats (The files the [[Digital_Sound_Elements|DSE sound driver]] uses):&lt;br /&gt;
: [[dse_swdl|SWD]]&lt;br /&gt;
: [[dse_smdl|SMD(Music Sequence)]]&lt;br /&gt;
: [[dse_sedl|SED]]&lt;br /&gt;
;Data Formats:&lt;br /&gt;
: [[pmd2_BIN|BIN]]&lt;br /&gt;
: [[pmd2_DAT|DAT]]&lt;br /&gt;
: [[pmd2_monster.md|MD]]&lt;br /&gt;
: [[pmd2_tbl_talk.tlk|TLK]]&lt;br /&gt;
: [[pmd2_text_strings|STR]]&lt;br /&gt;
;Script Engine Formats&lt;br /&gt;
: [[pmd2_SSB|SSB]]&lt;br /&gt;
: [[pmd2_SSA|SSA]]&lt;br /&gt;
: [[pmd2_SSA|SSS]]&lt;br /&gt;
: [[pmd2_SSA|SSE]]&lt;br /&gt;
: [[pmd2_LSD|LSD]]&lt;br /&gt;
;Container Formats:&lt;br /&gt;
: [[pmd2_BIN_pack|BIN]](pack files)&lt;br /&gt;
: [[pmd2_kaomado.kao|KAO]]&lt;br /&gt;
: [[pmd2_SIR0|SIR0]]&lt;br /&gt;
;Compressed Container Formats:&lt;br /&gt;
: [[pmd2_AT4PX|AT4PX]]&lt;br /&gt;
: [[pmd2_AT4PN|AT4PN]]&lt;br /&gt;
: [[pmd2_PKDPX|PKDPX]]&lt;br /&gt;
;Font Data:&lt;br /&gt;
: [[pmd2_fontdata|DAT (from in the /FONT/ directory)]]&lt;br /&gt;
: [[pmd2_DIC|DIC]]&lt;br /&gt;
;Misc:&lt;br /&gt;
: [[pmd2_SRL|SRL]]&lt;br /&gt;
&lt;br /&gt;
Additionally, several files have a file extension that doesn&#039;t match their content. For example, &amp;quot;/SYSTEM/hsd_jap.dat&amp;quot; and &amp;quot;/SYSTEM/hsd_eng.dat&amp;quot; are AT4PX files, but their extension is &amp;quot;.dat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Files with Unique Formats ==&lt;br /&gt;
A list of files that have their own unique format.&lt;br /&gt;
&lt;br /&gt;
* /BALANCE/[[pmd2_monster.md|monster.md]]&lt;br /&gt;
* /BALANCE/[[pmd2_monster.mnd|monster.mnd]] &amp;lt;div style=&amp;quot;color: blue; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Time/Darkness only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_item_p.bin|item_p.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_item_s_p.bin|item_s_p.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_m_level.bin|m_level.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_waza_p.bin|waza_p.bin/waza_p2.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa.bin|mappa_s.bin/mappa_t.bin/mappa_y.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_mappa_g.bin|mappa_gs.bin/mappa_gt.bin/mappa_gy.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_gwdparam.bin|gwdparam.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /BALANCE/[[pmd2_fixed.bin|fixed.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_i2n_j.bin|st_i2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_m2n_j.bin|st_m2n_j.bin]]&lt;br /&gt;
* /BALANCE/[[pmd2_st_n2m_j.bin|st_n2m_j.bin]]&lt;br /&gt;
* /DUNGEON/[[pmd2_dungeon.bin|dungeon.bin]]&lt;br /&gt;
* /FONT/[[pmd2_kaomado.kao|kaomado.kao]]&lt;br /&gt;
* /MESSAGE/[[pmd2_tbl_talk.tlk|tbl_talk.tlk]]&lt;br /&gt;
* /MESSAGE/[[pmd2_text_strings|text_*.str]]&lt;br /&gt;
* /RESCUE/[[pmd2_rescue.bin|rescue.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /SYNTH/[[pmd2_synth.bin|synth.bin]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
* /TABLEDAT/[[pmd2_tabledat|item00.dat to item15.dat]] &amp;lt;div style=&amp;quot;color: red; display:inline;&amp;quot;&amp;gt;&#039;&#039;(Explorers of Sky only)&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Wonder Mail S Tools, research notes. The &amp;quot;items_p_Sky.xlsx&amp;quot; excel sheet contains a comprehensive list of item names/types, pokemon names/types, moves names, etc, along with their associated index values in-game : [http://apointlessplace.net/wms/] &lt;br /&gt;
* Pokemon Explorers of Sky research thread on GameFaqs: [http://www.gamefaqs.com/boards/955859-pokemon-mystery-dungeon-explorers-of-sky/51698562] (lots of great info spread around all those pages)&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5329</id>
		<title>Digital Sound Elements</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5329"/>
		<updated>2016-05-05T04:14:47Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Known Versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:Procyon Studios Digital Sound Elements}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The &#039;&#039;Digital Sound Elements&#039;&#039; sound driver is an audio engine for games on the Nintendo DS, and Wii. It supports sequenced music and streamed audio. &lt;br /&gt;
It was used by several games on the NDS including &#039;&#039;Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This article will focus mainly on the implementation in PMD2 however.&lt;br /&gt;
&lt;br /&gt;
== Known Versions ==&lt;br /&gt;
So far, two versions of the DSE engine have been spotted in NDS games.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Version Number&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x415&lt;br /&gt;
| Most common version. Used in all versions of PMD2.&lt;br /&gt;
|-&lt;br /&gt;
| 0x402&lt;br /&gt;
| Much rarer version. Used only in the game Luminous Arc this far.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the format of SWDL containers seems to differs significantly between versions this far.&lt;br /&gt;
&lt;br /&gt;
== Inner Workings ==&lt;br /&gt;
The sound driver adds a few layers of extra processing over the data fed to the audio registers of the NDS. &lt;br /&gt;
&lt;br /&gt;
=== Memory Structure ===&lt;br /&gt;
The system creates 2 chunks in memory, the &amp;quot;mseq&amp;quot;, and &amp;quot;mdev&amp;quot; chunks. They&#039;re only labeled as such in a few games using DSE, like PMD2. In other games, like &#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2&#039;&#039; and &#039;&#039;Professor Layton and the Last Specter&#039;&#039;, the labels are not there in memory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mseq&amp;quot; chunk contains a set of sequencer wide variables, like counters and such, along with data structs for holding the state of each tracks during playback.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mdev&amp;quot; chunk contains a set of channels wide variables, and data structs for every sound channels the driver has. Those structs hold the state for each channels during playback.&lt;br /&gt;
&lt;br /&gt;
Apart from this, the smdl and swdl for a track currently playing are copied once to memory. And then the entries in the swdl for samples, and program splits are copied and any overridable properties samples have are overriden by the program split&#039;s shared properties, like volume envelope and etc..(See swdl structure)&lt;br /&gt;
&lt;br /&gt;
=== Code Structure ===&lt;br /&gt;
(Offsets are from the North American Explorers of Sky game&#039;s disassembled game code, not the ROM !!!)&lt;br /&gt;
&lt;br /&gt;
The channels state are updated at line 0x0207448C. A loop begins further down. And the track&lt;br /&gt;
Volume envelopes are updated here: 0x02074E0C&lt;br /&gt;
&lt;br /&gt;
The function that updates the sequencer tracks begins at 0x020713E8. The actual loop begins at 02071648.&lt;br /&gt;
The function that parses DSE events begins at 0x02071224.&lt;br /&gt;
The table containing the function pointers for all DSE events begins at 0x020B0B90.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
The system uses the following formats:&lt;br /&gt;
* [[dse_swdl|swdl]] : Container for programs/presets data, and optionally sample data, used by the sequencer engine.&lt;br /&gt;
* [[dse_smdl|smdl]] : Container for sequenced music.&lt;br /&gt;
* [[dse_sedl|sedl]] : Container for sequenced sound effects, and sound presets/programs.&lt;br /&gt;
* [[dse_sadl|sadl]] : Container for streamed audio.&lt;br /&gt;
&lt;br /&gt;
== File Layout ==&lt;br /&gt;
Game using DSE can store the various container formats in many different ways. Here are some of the known approaches:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;PMD2 :&#039;&#039;&#039; There is a main sample bank called bgm.swd, which is referred to by the SWDL files accompanying every SMDL music sequences file. Each SWDL contains only program/presets data, and refers to samples from the main bank. &lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2 - Sabaku no Majou :&#039;&#039;&#039;  Here, the SMDL and SWDL are stored in their own separate folder. They&#039;re loaded in pair, just like PMD2, but there is no main bank. Instead sample data is stored within every SWDL. Which result in lots of duplicate samples throughout all SWDL.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Zombi Daisuki:&#039;&#039;&#039; This game uses SMDL+SWDL pairs as well, without a main bank. But instead of having the SMDL and SWDL for a single music track stored in their own respective file, they&#039;re both stored within a [[pmd2_SIR0|SIR0]] container, with the extension &amp;quot;.sd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Professor Layton and the Last Specter :&#039;&#039;&#039; This game works like PMD2, it has a main bank, however, all its SMDL + SWDL pairs are stored within an archive &amp;quot;ll_common.darc&amp;quot;. And oddly enough, there are 2 copies of the main bank! One is named &amp;quot;bgm_common.SWD&amp;quot; and is stored outside the &amp;quot;ll_common.darc&amp;quot; archive, while the other is named &amp;quot;BG.SWD&amp;quot; and stored within the archive.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Official Website (in Japanese) [http://www.procyon-studio.co.jp/dse/]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5328</id>
		<title>Digital Sound Elements</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5328"/>
		<updated>2016-05-05T04:12:49Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added a short section about the various DSE versions.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:Procyon Studios Digital Sound Elements}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The &#039;&#039;Digital Sound Elements&#039;&#039; sound driver is an audio engine for games on the Nintendo DS, and Wii. It supports sequenced music and streamed audio. &lt;br /&gt;
It was used by several games on the NDS including &#039;&#039;Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This article will focus mainly on the implementation in PMD2 however.&lt;br /&gt;
&lt;br /&gt;
== Known Versions ==&lt;br /&gt;
So far, two versions of the DSE engine have been spotted in NDS games.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Version Number&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x415&lt;br /&gt;
| 0x402&lt;br /&gt;
|-&lt;br /&gt;
| Most common version. Used in all versions of PMD2.&lt;br /&gt;
| Much rarer version. Used only in the game Luminous Arc this far.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Only the format of SWDL containers seems to differs significantly between versions this far. &lt;br /&gt;
&lt;br /&gt;
== Inner Workings ==&lt;br /&gt;
The sound driver adds a few layers of extra processing over the data fed to the audio registers of the NDS. &lt;br /&gt;
&lt;br /&gt;
=== Memory Structure ===&lt;br /&gt;
The system creates 2 chunks in memory, the &amp;quot;mseq&amp;quot;, and &amp;quot;mdev&amp;quot; chunks. They&#039;re only labeled as such in a few games using DSE, like PMD2. In other games, like &#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2&#039;&#039; and &#039;&#039;Professor Layton and the Last Specter&#039;&#039;, the labels are not there in memory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mseq&amp;quot; chunk contains a set of sequencer wide variables, like counters and such, along with data structs for holding the state of each tracks during playback.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mdev&amp;quot; chunk contains a set of channels wide variables, and data structs for every sound channels the driver has. Those structs hold the state for each channels during playback.&lt;br /&gt;
&lt;br /&gt;
Apart from this, the smdl and swdl for a track currently playing are copied once to memory. And then the entries in the swdl for samples, and program splits are copied and any overridable properties samples have are overriden by the program split&#039;s shared properties, like volume envelope and etc..(See swdl structure)&lt;br /&gt;
&lt;br /&gt;
=== Code Structure ===&lt;br /&gt;
(Offsets are from the North American Explorers of Sky game&#039;s disassembled game code, not the ROM !!!)&lt;br /&gt;
&lt;br /&gt;
The channels state are updated at line 0x0207448C. A loop begins further down. And the track&lt;br /&gt;
Volume envelopes are updated here: 0x02074E0C&lt;br /&gt;
&lt;br /&gt;
The function that updates the sequencer tracks begins at 0x020713E8. The actual loop begins at 02071648.&lt;br /&gt;
The function that parses DSE events begins at 0x02071224.&lt;br /&gt;
The table containing the function pointers for all DSE events begins at 0x020B0B90.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
The system uses the following formats:&lt;br /&gt;
* [[dse_swdl|swdl]] : Container for programs/presets data, and optionally sample data, used by the sequencer engine.&lt;br /&gt;
* [[dse_smdl|smdl]] : Container for sequenced music.&lt;br /&gt;
* [[dse_sedl|sedl]] : Container for sequenced sound effects, and sound presets/programs.&lt;br /&gt;
* [[dse_sadl|sadl]] : Container for streamed audio.&lt;br /&gt;
&lt;br /&gt;
== File Layout ==&lt;br /&gt;
Game using DSE can store the various container formats in many different ways. Here are some of the known approaches:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;PMD2 :&#039;&#039;&#039; There is a main sample bank called bgm.swd, which is referred to by the SWDL files accompanying every SMDL music sequences file. Each SWDL contains only program/presets data, and refers to samples from the main bank. &lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2 - Sabaku no Majou :&#039;&#039;&#039;  Here, the SMDL and SWDL are stored in their own separate folder. They&#039;re loaded in pair, just like PMD2, but there is no main bank. Instead sample data is stored within every SWDL. Which result in lots of duplicate samples throughout all SWDL.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Zombi Daisuki:&#039;&#039;&#039; This game uses SMDL+SWDL pairs as well, without a main bank. But instead of having the SMDL and SWDL for a single music track stored in their own respective file, they&#039;re both stored within a [[pmd2_SIR0|SIR0]] container, with the extension &amp;quot;.sd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Professor Layton and the Last Specter :&#039;&#039;&#039; This game works like PMD2, it has a main bank, however, all its SMDL + SWDL pairs are stored within an archive &amp;quot;ll_common.darc&amp;quot;. And oddly enough, there are 2 copies of the main bank! One is named &amp;quot;bgm_common.SWD&amp;quot; and is stored outside the &amp;quot;ll_common.darc&amp;quot; archive, while the other is named &amp;quot;BG.SWD&amp;quot; and stored within the archive.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Official Website (in Japanese) [http://www.procyon-studio.co.jp/dse/]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5327</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5327"/>
		<updated>2016-04-20T00:37:06Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Others(0x90 to 0xFF) */ fixed the amount of paramters for the byte skipping functions, since those aren&amp;#039;t really parameters, they&amp;#039;re just ignored bytes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips the next byte in the track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- &lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes2&lt;br /&gt;
| Skips the next 2 bytes in the track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;br /&gt;
* The unknown Japanese author of the &amp;quot;smd2mid v0.10&amp;quot; utility floating around the web.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5326</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5326"/>
		<updated>2016-04-20T00:30:57Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added the missing skip2bytes event to the list!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- &lt;br /&gt;
| 0xF8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes2&lt;br /&gt;
| Skips processing the next 2 bytes. &lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;br /&gt;
* The unknown Japanese author of the &amp;quot;smd2mid v0.10&amp;quot; utility floating around the web.&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5324</id>
		<title>Digital Sound Elements</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Digital_Sound_Elements&amp;diff=5324"/>
		<updated>2016-04-12T19:01:50Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Code Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:Procyon Studios Digital Sound Elements}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The &#039;&#039;Digital Sound Elements&#039;&#039; sound driver is an audio engine for games on the Nintendo DS, and Wii. It supports sequenced music and streamed audio. &lt;br /&gt;
It was used by several games on the NDS including &#039;&#039;Pokémon Mystery Dungeon : Explorers of Sky/Time/Darkness&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This article will focus mainly on the implementation in PMD2 however.&lt;br /&gt;
&lt;br /&gt;
== Inner Workings ==&lt;br /&gt;
The sound driver adds a few layers of extra processing over the data fed to the audio registers of the NDS. &lt;br /&gt;
&lt;br /&gt;
=== Memory Structure ===&lt;br /&gt;
The system creates 2 chunks in memory, the &amp;quot;mseq&amp;quot;, and &amp;quot;mdev&amp;quot; chunks. They&#039;re only labeled as such in a few games using DSE, like PMD2. In other games, like &#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2&#039;&#039; and &#039;&#039;Professor Layton and the Last Specter&#039;&#039;, the labels are not there in memory.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mseq&amp;quot; chunk contains a set of sequencer wide variables, like counters and such, along with data structs for holding the state of each tracks during playback.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;mdev&amp;quot; chunk contains a set of channels wide variables, and data structs for every sound channels the driver has. Those structs hold the state for each channels during playback.&lt;br /&gt;
&lt;br /&gt;
Apart from this, the smdl and swdl for a track currently playing are copied once to memory. And then the entries in the swdl for samples, and program splits are copied and any overridable properties samples have are overriden by the program split&#039;s shared properties, like volume envelope and etc..(See swdl structure)&lt;br /&gt;
&lt;br /&gt;
=== Code Structure ===&lt;br /&gt;
(Offsets are from the North American Explorers of Sky game&#039;s disassembled game code, not the ROM !!!)&lt;br /&gt;
&lt;br /&gt;
The channels state are updated at line 0x0207448C. A loop begins further down. And the track&lt;br /&gt;
Volume envelopes are updated here: 0x02074E0C&lt;br /&gt;
&lt;br /&gt;
The function that updates the sequencer tracks begins at 0x020713E8. The actual loop begins at 02071648.&lt;br /&gt;
The function that parses DSE events begins at 0x02071224.&lt;br /&gt;
The table containing the function pointers for all DSE events begins at 0x020B0B90.&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
The system uses the following formats:&lt;br /&gt;
* [[dse_swdl|swdl]] : Container for programs/presets data, and optionally sample data, used by the sequencer engine.&lt;br /&gt;
* [[dse_smdl|smdl]] : Container for sequenced music.&lt;br /&gt;
* [[dse_sedl|sedl]] : Container for sequenced sound effects, and sound presets/programs.&lt;br /&gt;
* [[dse_sadl|sadl]] : Container for streamed audio.&lt;br /&gt;
&lt;br /&gt;
== File Layout ==&lt;br /&gt;
Game using DSE can store the various container formats in many different ways. Here are some of the known approaches:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;PMD2 :&#039;&#039;&#039; There is a main sample bank called bgm.swd, which is referred to by the SWDL files accompanying every SMDL music sequences file. Each SWDL contains only program/presets data, and refers to samples from the main bank. &lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Fushigi no Dungeon - Fuurai no Shiren DS 2 - Sabaku no Majou :&#039;&#039;&#039;  Here, the SMDL and SWDL are stored in their own separate folder. They&#039;re loaded in pair, just like PMD2, but there is no main bank. Instead sample data is stored within every SWDL. Which result in lots of duplicate samples throughout all SWDL.&lt;br /&gt;
  &lt;br /&gt;
* &#039;&#039;&#039;Zombi Daisuki:&#039;&#039;&#039; This game uses SMDL+SWDL pairs as well, without a main bank. But instead of having the SMDL and SWDL for a single music track stored in their own respective file, they&#039;re both stored within a [[pmd2_SIR0|SIR0]] container, with the extension &amp;quot;.sd&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Professor Layton and the Last Specter :&#039;&#039;&#039; This game works like PMD2, it has a main bank, however, all its SMDL + SWDL pairs are stored within an archive &amp;quot;ll_common.darc&amp;quot;. And oddly enough, there are 2 copies of the main bank! One is named &amp;quot;bgm_common.SWD&amp;quot; and is stored outside the &amp;quot;ll_common.darc&amp;quot; archive, while the other is named &amp;quot;BG.SWD&amp;quot; and stored within the archive.&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;br /&gt;
* Official Website (in Japanese) [http://www.procyon-studio.co.jp/dse/]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5313</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5313"/>
		<updated>2015-12-10T20:34:38Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* pcmd Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey2&lt;br /&gt;
| A copy of lowkey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hikey2&lt;br /&gt;
| A copy of hikey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| lovel2&lt;br /&gt;
| A copy of lovel, for unknown purpose. Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel2&lt;br /&gt;
| A copy of hivel, for unknown purpose. Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s a picture of a single program/preset entry in the prgi chunk:&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
[[File:PMD2DSE annotated prgi chunk entry.png|framed|left|Layout of a DSE program/preset entry]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples.&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
The durations in the tables are in milliseconds, conveniently!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5312</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5312"/>
		<updated>2015-12-10T20:33:35Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Duration Lookup Tables */ Added a mention that the durations in the tables are in milliseconds&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey2&lt;br /&gt;
| A copy of lowkey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hikey2&lt;br /&gt;
| A copy of hikey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| lovel2&lt;br /&gt;
| A copy of lovel, for unknown purpose. Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel2&lt;br /&gt;
| A copy of hivel, for unknown purpose. Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s a picture of a single program/preset entry in the prgi chunk:&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
[[File:PMD2DSE annotated prgi chunk entry.png|framed|left|Layout of a DSE program/preset entry]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
The durations in the tables are in milliseconds, conveniently!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pokemon_Super_Mystery_Dungeon&amp;diff=5311</id>
		<title>Pokemon Super Mystery Dungeon</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pokemon_Super_Mystery_Dungeon&amp;diff=5311"/>
		<updated>2015-12-03T20:39:47Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Initial publish of the PSMD hub page!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:Pokémon Super Mystery Dungeon}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
This page contains data on the Pokémon Super Mystery Dungeon game.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
== Script Engine Details ==&lt;br /&gt;
The Script engine of PSMD uses compiled lua 5.1 scripts. &lt;br /&gt;
* List of all function, objects, and globals : [[psmd_script_globals|Here]]&lt;br /&gt;
&lt;br /&gt;
== File/Data Formats ==&lt;br /&gt;
Most files formats are identical to the ones found in [[Pokemon_Mystery_Dungeon_Gates_to_Infinity|Pokémon Mystery Dungeon : Gates to Infinity]]. However, some have been updated, added, or differ slightly. &lt;br /&gt;
&lt;br /&gt;
;Container Format&lt;br /&gt;
:[[pmdgti_FARC|BIN(FARC)]]&lt;br /&gt;
;Image Data&lt;br /&gt;
:[[pmdgti_IMG|IMG]]&lt;br /&gt;
;Game Strings&lt;br /&gt;
:[[pmdgti_TextDb|BIN(GameStrings)]]&lt;br /&gt;
;Script Engine Formats:&lt;br /&gt;
:[https://en.wikipedia.org/wiki/Lua_%28programming_language%29 LUA]&lt;br /&gt;
&lt;br /&gt;
== Files with Unique Formats ==&lt;br /&gt;
&lt;br /&gt;
== External Resources ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5304</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5304"/>
		<updated>2015-10-22T21:25:02Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* SplitEntry */ Fixed a serious mistake I did when transcribing my notes. I labeled the wrong field as being the lowest velocity and highest velocity possible for a given sample.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey2&lt;br /&gt;
| A copy of lowkey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hikey2&lt;br /&gt;
| A copy of hikey, for unknown purpose.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| lovel2&lt;br /&gt;
| A copy of lovel, for unknown purpose. Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel2&lt;br /&gt;
| A copy of hivel, for unknown purpose. Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s a picture of a single program/preset entry in the prgi chunk:&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
[[File:PMD2DSE annotated prgi chunk entry.png|framed|left|Layout of a DSE program/preset entry]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5303</id>
		<title>Pmd2 text strings</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5303"/>
		<updated>2015-10-20T21:11:22Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* More Details */ Fixed a brain fart about unicode encoding I had..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:text_*.str File Format}}&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;text_e.str&amp;quot; file contains a table of pointers to null terminated strings contained further down in the file. &lt;br /&gt;
In other languages versions of the game, the letter &amp;quot;e&amp;quot; is changed to indicate the language. For example, &amp;quot;text_j.str&amp;quot; is the name of the file for the Japanese version of the game.&lt;br /&gt;
&lt;br /&gt;
== More Details ==&lt;br /&gt;
In addition to the characters from the character sets used, the game sometimes uses [[#Special Characters|unprintable character sequences]] to represent special characters in-game. &lt;br /&gt;
The game also uses several [[#Tags|square brackets enclosed tags]] that can trigger a wide range of things, going from replacing the tag with a value or string, adding a pause for input, changing the text formatting, playing a sound/music, etc..&lt;br /&gt;
&lt;br /&gt;
The file also appears to be somehow linked to the &amp;quot;[[Pmd2_tbl_talk.tlk|tbl_talk.tlk]]&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
:* The number of strings varies by game and region.  The US version of Explorers of Sky the English file contains 18,452 strings.  Each language in the European version contains 18,482.  The Japanese version contains 19,010.&lt;br /&gt;
:* In Explorers of Time/Darkness the English file contains 13,666 strings.&lt;br /&gt;
&lt;br /&gt;
==== Known Character Encoding ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!File&lt;br /&gt;
!Encoding&lt;br /&gt;
|-&lt;br /&gt;
| text_e.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/ISO/IEC_8859-1 ISO 8859-1] aka Windows-28591, or [http://en.wikipedia.org/wiki/Windows-1252 Windows-1252]&lt;br /&gt;
|-&lt;br /&gt;
| text_j.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/Shift_JIS Shift JIS] or [http://en.wikipedia.org/wiki/Code_page_932 Windows-31J] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Warning:&#039;&#039;&#039; There is also a possibility the strings are actually stored as multi-byte [https://en.wikipedia.org/wiki/UTF-8 utf-8] strings! Considering special characters like the music note are made of several characters, and also considering that ASCII characters are interpreted correctly.&lt;br /&gt;
&lt;br /&gt;
== File Structure == &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
A quick overview of the main parts of the file.&lt;br /&gt;
Note that there is no padding between the Pointer Table and the Strings Block!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Endianness &lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Pointer Table|Pointer Table]]&lt;br /&gt;
| A table of pointers to every null-terminate strings in the [[#Strings Block|Strings Block]].&lt;br /&gt;
|-&lt;br /&gt;
| After Pointer Table&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Strings Block|Strings Block]]&lt;br /&gt;
| A block containing null-terminated strings of characters one after the other. The last pointer points to the end of the file, after the last string.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pointer Table ===&lt;br /&gt;
A very straightforward list of 4 bytes pointers to every strings in the file. Pointers are all little endian, as usual.&lt;br /&gt;
* &#039;&#039;&#039;NOTE:&#039;&#039;&#039; The last pointer in the table must points to the end of the file, after the last string.&lt;br /&gt;
&lt;br /&gt;
=== Strings Block ===&lt;br /&gt;
Again, this is very straightforward. All null-terminated strings are simply stored one after the other. There is no padding at the end of the file.&lt;br /&gt;
&lt;br /&gt;
== Special Characters ==&lt;br /&gt;
As mentioned above, the game uses several special sequences of unprintable characters for displaying some in-game characters or pictogram. &lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Sequence&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
As mentioned above the game uses square brackets enclosed expressions for runtime text replacement, formatting, or triggering various events.&lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Expression&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5302</id>
		<title>Pmd2 text strings</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5302"/>
		<updated>2015-10-20T21:07:29Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Known Character Encoding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:text_*.str File Format}}&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;text_e.str&amp;quot; file contains a table of pointers to null terminated strings contained further down in the file. &lt;br /&gt;
In other languages versions of the game, the letter &amp;quot;e&amp;quot; is changed to indicate the language. For example, &amp;quot;text_j.str&amp;quot; is the name of the file for the Japanese version of the game.&lt;br /&gt;
&lt;br /&gt;
== More Details ==&lt;br /&gt;
In addition to the characters from the character sets used, the game sometimes uses [[#Special Characters|unprintable character sequences]] to represent special characters in-game. &lt;br /&gt;
The game also uses several [[#Tags|square brackets enclosed tags]] that can trigger a wide range of things, going from replacing the tag with a value or string, adding a pause for input, changing the text formatting, playing a sound/music, etc..&lt;br /&gt;
&lt;br /&gt;
The file also appears to be somehow linked to the &amp;quot;[[Pmd2_tbl_talk.tlk|tbl_talk.tlk]]&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
:* The number of strings varies by game and region.  The US version of Explorers of Sky the English file contains 18,452 strings.  Each language in the European version contains 18,482.  The Japanese version contains 19,010.&lt;br /&gt;
:* In Explorers of Time/Darkness the English file contains 13,666 strings.&lt;br /&gt;
&lt;br /&gt;
==== Known Character Encoding ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!File&lt;br /&gt;
!Encoding&lt;br /&gt;
|-&lt;br /&gt;
| text_e.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/ISO/IEC_8859-1 ISO 8859-1] aka Windows-28591, or [http://en.wikipedia.org/wiki/Windows-1252 Windows-1252]&lt;br /&gt;
|-&lt;br /&gt;
| text_j.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/Shift_JIS Shift JIS] or [http://en.wikipedia.org/wiki/Code_page_932 Windows-31J] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Warning:&#039;&#039;&#039; There is also a possibility the strings are actually stored as multi-byte utf8/utf16/utf32 strings! Considering special characters like the music note are made of several characters, and also considering that ASCII characters are interpreted correctly.&lt;br /&gt;
&lt;br /&gt;
== File Structure == &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
A quick overview of the main parts of the file.&lt;br /&gt;
Note that there is no padding between the Pointer Table and the Strings Block!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Endianness &lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Pointer Table|Pointer Table]]&lt;br /&gt;
| A table of pointers to every null-terminate strings in the [[#Strings Block|Strings Block]].&lt;br /&gt;
|-&lt;br /&gt;
| After Pointer Table&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Strings Block|Strings Block]]&lt;br /&gt;
| A block containing null-terminated strings of characters one after the other. The last pointer points to the end of the file, after the last string.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pointer Table ===&lt;br /&gt;
A very straightforward list of 4 bytes pointers to every strings in the file. Pointers are all little endian, as usual.&lt;br /&gt;
* &#039;&#039;&#039;NOTE:&#039;&#039;&#039; The last pointer in the table must points to the end of the file, after the last string.&lt;br /&gt;
&lt;br /&gt;
=== Strings Block ===&lt;br /&gt;
Again, this is very straightforward. All null-terminated strings are simply stored one after the other. There is no padding at the end of the file.&lt;br /&gt;
&lt;br /&gt;
== Special Characters ==&lt;br /&gt;
As mentioned above, the game uses several special sequences of unprintable characters for displaying some in-game characters or pictogram. &lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Sequence&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
As mentioned above the game uses square brackets enclosed expressions for runtime text replacement, formatting, or triggering various events.&lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Expression&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5301</id>
		<title>Pmd2 text strings</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Pmd2_text_strings&amp;diff=5301"/>
		<updated>2015-10-20T21:07:14Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Known Character Encoding */ Just added a word of caution after realizing something while working on parsing the text.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
{{DISPLAYTITLE:text_*.str File Format}}&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;text_e.str&amp;quot; file contains a table of pointers to null terminated strings contained further down in the file. &lt;br /&gt;
In other languages versions of the game, the letter &amp;quot;e&amp;quot; is changed to indicate the language. For example, &amp;quot;text_j.str&amp;quot; is the name of the file for the Japanese version of the game.&lt;br /&gt;
&lt;br /&gt;
== More Details ==&lt;br /&gt;
In addition to the characters from the character sets used, the game sometimes uses [[#Special Characters|unprintable character sequences]] to represent special characters in-game. &lt;br /&gt;
The game also uses several [[#Tags|square brackets enclosed tags]] that can trigger a wide range of things, going from replacing the tag with a value or string, adding a pause for input, changing the text formatting, playing a sound/music, etc..&lt;br /&gt;
&lt;br /&gt;
The file also appears to be somehow linked to the &amp;quot;[[Pmd2_tbl_talk.tlk|tbl_talk.tlk]]&amp;quot; file.&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
:* The number of strings varies by game and region.  The US version of Explorers of Sky the English file contains 18,452 strings.  Each language in the European version contains 18,482.  The Japanese version contains 19,010.&lt;br /&gt;
:* In Explorers of Time/Darkness the English file contains 13,666 strings.&lt;br /&gt;
&lt;br /&gt;
==== Known Character Encoding ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!File&lt;br /&gt;
!Encoding&lt;br /&gt;
|-&lt;br /&gt;
| text_e.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/ISO/IEC_8859-1 ISO 8859-1] aka Windows-28591, or [http://en.wikipedia.org/wiki/Windows-1252 Windows-1252]&lt;br /&gt;
|-&lt;br /&gt;
| text_j.str&lt;br /&gt;
| 8-bits, [http://en.wikipedia.org/wiki/Shift_JIS Shift JIS] or [http://en.wikipedia.org/wiki/Code_page_932 Windows-31J] &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Warning: There is also a possibility the strings are actually stored as multi-byte utf8/utf16/utf32 strings! Considering special characters like the music note are made of several characters, and also considering that ASCII characters are interpreted correctly.&lt;br /&gt;
&lt;br /&gt;
== File Structure == &lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
A quick overview of the main parts of the file.&lt;br /&gt;
Note that there is no padding between the Pointer Table and the Strings Block!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Endianness &lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Pointer Table|Pointer Table]]&lt;br /&gt;
| A table of pointers to every null-terminate strings in the [[#Strings Block|Strings Block]].&lt;br /&gt;
|-&lt;br /&gt;
| After Pointer Table&lt;br /&gt;
| Varies&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| [[#Strings Block|Strings Block]]&lt;br /&gt;
| A block containing null-terminated strings of characters one after the other. The last pointer points to the end of the file, after the last string.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Pointer Table ===&lt;br /&gt;
A very straightforward list of 4 bytes pointers to every strings in the file. Pointers are all little endian, as usual.&lt;br /&gt;
* &#039;&#039;&#039;NOTE:&#039;&#039;&#039; The last pointer in the table must points to the end of the file, after the last string.&lt;br /&gt;
&lt;br /&gt;
=== Strings Block ===&lt;br /&gt;
Again, this is very straightforward. All null-terminated strings are simply stored one after the other. There is no padding at the end of the file.&lt;br /&gt;
&lt;br /&gt;
== Special Characters ==&lt;br /&gt;
As mentioned above, the game uses several special sequences of unprintable characters for displaying some in-game characters or pictogram. &lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Sequence&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tags ==&lt;br /&gt;
As mentioned above the game uses square brackets enclosed expressions for runtime text replacement, formatting, or triggering various events.&lt;br /&gt;
&lt;br /&gt;
Here are some of the known ones:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Expression&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5300</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5300"/>
		<updated>2015-10-20T20:50:02Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Fixed the layout breaking because of the image!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s a picture of a single program/preset entry in the prgi chunk:&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
[[File:PMD2DSE annotated prgi chunk entry.png|framed|left|Layout of a DSE program/preset entry]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5299</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5299"/>
		<updated>2015-10-20T20:45:36Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* prgi Chunk */  Tried adding a picture taken from an hex editor to better illustrate the format of the chunk!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
Here&#039;s a picture of a single program/preset entry in the prgi chunk:&lt;br /&gt;
&lt;br /&gt;
[[File:PMD2DSE annotated prgi chunk entry.png|framed|left|Layout of a DSE program/preset entry]]&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=File:PMD2DSE_annotated_prgi_chunk_entry.png&amp;diff=5298</id>
		<title>File:PMD2DSE annotated prgi chunk entry.png</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=File:PMD2DSE_annotated_prgi_chunk_entry.png&amp;diff=5298"/>
		<updated>2015-10-20T20:42:49Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: A visual breakdown of a program/preset entry the &amp;quot;prgi&amp;quot; chunk used in PMD2&amp;#039;s/DSE&amp;#039;s SWDL file format in a hex editor, with annotations and highlighting. 

Just a bit of a visual aid, as its a bit hard to visualize everything with only the tables.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A visual breakdown of a program/preset entry the &amp;quot;prgi&amp;quot; chunk used in PMD2&#039;s/DSE&#039;s SWDL file format in a hex editor, with annotations and highlighting. &lt;br /&gt;
&lt;br /&gt;
Just a bit of a visual aid, as its a bit hard to visualize everything with only the tables.  &lt;br /&gt;
== Copyright status: ==&lt;br /&gt;
&lt;br /&gt;
== Licensing ==&lt;br /&gt;
{{PD-self}}&lt;br /&gt;
== Source: ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5279</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5279"/>
		<updated>2015-10-18T19:56:02Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* kgrp Chunk */  forgot to modify the description!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Keygroups are used to allow finer control on how the audio engine allocates the limited amount of voices to the presets. They define a per group priority and a range of voice channel available to each, along with the maximum number of simultaneous voice channels each can used.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5268</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5268"/>
		<updated>2015-10-16T21:01:30Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Keygroup */  can&amp;#039;t decide on how to bring this up..&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, lets say that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5267</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5267"/>
		<updated>2015-10-16T21:00:36Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Keygroup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, consider that a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5266</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5266"/>
		<updated>2015-10-16T20:58:21Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* SplitEntry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~10 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, if a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5265</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5265"/>
		<updated>2015-10-16T20:55:18Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* LFOEntry */  rewording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO, its frequency, depth, delay, fade-out. And possibly more.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. Most of the time, this value is 1 when the LFO is in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, if a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5264</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5264"/>
		<updated>2015-10-16T20:49:43Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* ProgramInfo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to the program ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO. The frequency, the depth, the delay, the fade-out. And what might be a resonance parameter(Q) with what might possibly be a low-pass filter.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. (Posibly boolean to confirm its enabled) If is set to 0, the LFO corresponding to the entry is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, if a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5263</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5263"/>
		<updated>2015-10-16T20:39:12Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added a lot of missing details and fixed a lot of typos. Added explanation of how the envelopes work,&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| The pitch fine tuning in cents(?).&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning, possibly in semitones(?). Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) It doesn&#039;t seems to have any effect in the game.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60. &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| volume&lt;br /&gt;
| The volume of the sample. (0-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| pan&lt;br /&gt;
| The pan of the sample. (0-64-127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Possibly Keygroup parameter for the sample. Always 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk58&lt;br /&gt;
| Unknown. Always 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk59&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored. &lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol&lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x3F&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk57&lt;br /&gt;
| Unknown. Usually 0xFF. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to instrument ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO. The frequency, the depth, the delay, the fade-out. And what might be a resonance parameter(Q) with what might possibly be a low-pass filter.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. (Posibly boolean to confirm its enabled) If is set to 0, the LFO corresponding to the entry is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly &amp;quot;bend range&amp;quot; according to assumptions made from the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. &lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Fine tune. The fine tune in cents.&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Coarse tuning. Default is -7.&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ktps&lt;br /&gt;
| Key Transpose. Is basically the difference between rootkey and 60.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag. Usually 0x02.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are for the volume envelope. They override the sample&#039;s original volume envelope!&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. &lt;br /&gt;
&lt;br /&gt;
This is meant to mitigate issues with the limited polyphony of the NDS. &lt;br /&gt;
Basically, this is used to tell what sets of instruments gets to play notes over the others.&lt;br /&gt;
(Wikipedia has an excellent article on synthesizer polyphony here: https://en.wikipedia.org/wiki/Polyphony_and_monophony_in_instruments )&lt;br /&gt;
&lt;br /&gt;
* The polyphony parameter allows to set how many simultaneous voices a member of the keygroup may use.&lt;br /&gt;
* The vc high and vc low parameters defines the range out of all the available voice channels that members of the group may use.&lt;br /&gt;
* The priority parameter is meant to tell which keygroups has priority over using a voice channel. &lt;br /&gt;
&lt;br /&gt;
For example, if a split &amp;quot;splitA&amp;quot; is a member of a priority 1 keygroup, and another split &amp;quot;splitB&amp;quot; of a priority 15 keygroups, and there is no voice channel available to use as they&#039;re all being used. SplitB needs to play a note, but splitA is currently playing one. Then SplitA will be cut abruptly, and its voice channel will be reassigned to splitB so it can play its note!&lt;br /&gt;
&lt;br /&gt;
Keygroup 0 is the global keygroup everything uses by default, and its always there.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous notes played. 0 to 15. -1 means disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority over the assignment of a voice channel for the members of this group. A value from 0 to possibly 99. Default is 8. Lower values means lower priority, while higher means higher priority.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest voice channel of the range this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest voice channel this group may use. Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Volume Envelopes ==&lt;br /&gt;
Here is some more information on how volume envelopes are parsed.&lt;br /&gt;
&lt;br /&gt;
In PMD2 Explorers of Sky, the north american version, here are the routines at runtime in memory that handle parsing the envelopes:&lt;br /&gt;
* 0x02074E0C : Code that picks an envelope&#039;s starting phase.&lt;br /&gt;
* 0x02074F54 : Code that handles updating the envelope&#039;s state.&lt;br /&gt;
* 0x02074D58 : Code handling lerping the volume values for any of the envelope parameters indicating a duration.&lt;br /&gt;
&lt;br /&gt;
The parameters indicating a duration in the envelopes are used as indices in one of 2 lookup tables to get an actual duration.&lt;br /&gt;
If the &amp;quot;envmult&amp;quot; parameter of the envelope is not 0, the 16 bits lookup table is used, while if its 0, the 32 bits lookup table is used.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a heavily commented and re-organized assembly snippet to demonstrate how the duration lookup tables are used, and how a single parameter is parsed:&lt;br /&gt;
&lt;br /&gt;
    Fun_02074D58( R0(SplitEnvelopeAddress), R1(TargetVolume), R2(EnvelopeParam) )&lt;br /&gt;
    {&lt;br /&gt;
        02074D58 E92D4038 push    r3-r5,r14&lt;br /&gt;
        02074D5C E1A05000 mov     r5,r0&lt;br /&gt;
        02074D60 E1A04001 mov     r4,r1&lt;br /&gt;
        02074D64 E352007F cmp     r2,7Fh    //See if the envelope parameter is == 0x7F&lt;br /&gt;
        02074D68 1A000004 bne     02074D80&lt;br /&gt;
        if( EnvelopeParam != 0x7F )&lt;br /&gt;
        {&lt;br /&gt;
            02074D80 E5C5401D strb    r4,[r5,1Dh]   //Put the TargetVolume here&lt;br /&gt;
            02074D84 E5D53001 ldrb    r3,[r5,1h]    //Load envmult&lt;br /&gt;
            02074D88 E3530000 cmp     r3,0h&lt;br /&gt;
            02074D8C 1A000007 bne     02074DB0&lt;br /&gt;
            if( envmult != 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DB0 E59F0050 ldr     r0,=20B0F50h      //16 bits lookup table for durations&lt;br /&gt;
                02074DB4 E1A01082 mov     r1,r2,lsl 1h      //R1 = EnvelopeParam &amp;lt;&amp;lt; 1 (Basically, multiply by 2 the envelope param, so that we get a byte offset in a 16bits integer array)&lt;br /&gt;
                02074DB8 E19020B1 ldrh    r2,[r0,r1]        //Get the duration from the table&lt;br /&gt;
                02074DBC E59F1040 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074DC0 E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DC4 E0020293 mul     r2,r3,r2          //We multiply the duration with envmult (the envelope duration multiplier)&lt;br /&gt;
                02074DC8 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DCC E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DD0 EB006C33 bl      0208FEA4          //(Division signed R0 = R0 / R1)&lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                02074D90 E59F0068 ldr     r0,=20B1050h      //32 bits lookup table for durations&lt;br /&gt;
                02074D94 E59F1068 ldr     r1,=22B7330h      //That&#039;s the static address of DSE driver&#039;s memory&lt;br /&gt;
                02074D98 E7902102 ldr     r2,[r0,r2,lsl 2h] //Multiply the EnvelopeParam by 4( EnvelopeParam &amp;lt;&amp;lt; 2 ) to get the byte offset in a int32 array&lt;br /&gt;
                02074D9C E3A00FFA mov     r0,3E8h           &lt;br /&gt;
                02074DA0 E0000092 mul     r0,r2,r0          //We multiply our duration by 1000&lt;br /&gt;
                02074DA4 E1D112F8 ldrsh   r1,[r1,28h]       //This address always contains the value 10000&lt;br /&gt;
                02074DA8 EB006CC0 bl      020900B0          //(Unsigned division R0 = R0 / R1) &lt;br /&gt;
                02074DAC EA000008 b       02074DD4          &lt;br /&gt;
                //Continues to 02074DD4..&lt;br /&gt;
            }&lt;br /&gt;
            02074DD4 E5850018 str     r0,[r5,18h]           //Put EnvelopePhaseTimeLeft here&lt;br /&gt;
            02074DD8 E5951018 ldr     r1,[r5,18h]           //Read it back into R1&lt;br /&gt;
            02074DDC E3510000 cmp     r1,0h                 &lt;br /&gt;
            if( EnvelopePhaseTimeLeft == 0 )&lt;br /&gt;
            {&lt;br /&gt;
                02074DE0 03A00000 moveq   r0,0h&lt;br /&gt;
                02074DE4 05850014 streq   r0,[r5,14h]   //Set VolumeIncrement to 0&lt;br /&gt;
                02074DE8 08BD8038 popeq   r3-r5,r15     //Return&lt;br /&gt;
            }&lt;br /&gt;
            02074DEC E5950010 ldr     r0,[r5,10h]       //Load EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF0 E0600B84 rsb     r0,r0,r4,lsl 17h  // (TargetVolume &amp;lt;&amp;lt; 0x17) - EnvPhaseCurrentVolume, or (2^23 * TargetVolume) - EnvPhaseCurrentVolume&lt;br /&gt;
            02074DF4 EB006C2A bl      0208FEA4          //(Division signed R0 = R0 / R1) Divide volume difference between TargetVolume and EnvPhaseCurrentVolume by the EnvelopePhaseTimeLeft &lt;br /&gt;
            02074DF8 E5850014 str     r0,[r5,14h]       //Set VolumeIncrement &lt;br /&gt;
            02074DFC E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //Envelope param disabled&lt;br /&gt;
            02074D6C E3A00000 mov     r0,0h&lt;br /&gt;
            02074D70 E5850014 str     r0,[r5,14h]       //Set the VolumeIncrement to 0&lt;br /&gt;
            02074D74 E2400106 sub     r0,r0,80000001h   //This basically puts 0x7FFFFFFF into R0 (Aka the maximum signed, positive value for a signed 16bits integer )&lt;br /&gt;
            02074D78 E5850018 str     r0,[r5,18h]       //Put 0x7FFFFFFF as EnvelopePhaseTimeLeft&lt;br /&gt;
            02074D7C E8BD8038 pop     r3-r5,r15&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
==== Duration Lookup Tables ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;16 bits table located at 0x020B0F50:&#039;&#039;&#039;&lt;br /&gt;
    const int16_t Lookup_Table_20B0F50 [128] = &lt;br /&gt;
    {&lt;br /&gt;
        0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, &lt;br /&gt;
        0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, &lt;br /&gt;
        0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, &lt;br /&gt;
        0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, &lt;br /&gt;
        0x0020, 0x0023, 0x0028, 0x002D, 0x0033, 0x0039, 0x0040, 0x0048, &lt;br /&gt;
        0x0050, 0x0058, 0x0062, 0x006D, 0x0078, 0x0083, 0x0090, 0x009E, &lt;br /&gt;
        0x00AC, 0x00BC, 0x00CC, 0x00DE, 0x00F0, 0x0104, 0x0119, 0x012F, &lt;br /&gt;
        0x0147, 0x0160, 0x017A, 0x0196, 0x01B3, 0x01D2, 0x01F2, 0x0214, &lt;br /&gt;
        0x0238, 0x025E, 0x0285, 0x02AE, 0x02D9, 0x0307, 0x0336, 0x0367, &lt;br /&gt;
        0x039B, 0x03D1, 0x0406, 0x0442, 0x047E, 0x04C4, 0x0500, 0x0546, &lt;br /&gt;
        0x058C, 0x0622, 0x0672, 0x06CC, 0x071C, 0x0776, 0x07DA, 0x0834, &lt;br /&gt;
        0x0898, 0x0906, 0x096A, 0x09D8, 0x0A50, 0x0ABE, 0x0B40, 0x0BB8, &lt;br /&gt;
        0x0C3A, 0x0CBC, 0x0D48, 0x0DDE, 0x0E6A, 0x0F00, 0x0FA0, 0x1040, &lt;br /&gt;
        0x10EA, 0x1194, 0x123E, 0x12F2, 0x13B0, 0x146E, 0x1536, 0x15FE, &lt;br /&gt;
        0x16D0, 0x17A2, 0x187E, 0x195A, 0x1A40, 0x1B30, 0x1C20, 0x1D1A, &lt;br /&gt;
        0x1E1E, 0x1F22, 0x2030, 0x2148, 0x2260, 0x2382, 0x2710, 0x7FFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;32 bits table located at 0x20B1050:&#039;&#039;&#039;&lt;br /&gt;
    const int32_t Lookup_Table_20B1050 [128] =&lt;br /&gt;
    {&lt;br /&gt;
        0x00000000, 0x00000004, 0x00000007, 0x0000000A, &lt;br /&gt;
        0x0000000F, 0x00000015, 0x0000001C, 0x00000024, &lt;br /&gt;
        0x0000002E, 0x0000003A, 0x00000048, 0x00000057, &lt;br /&gt;
        0x00000068, 0x0000007B, 0x00000091, 0x000000A8, &lt;br /&gt;
        0x00000185, 0x000001BE, 0x000001FC, 0x0000023F, &lt;br /&gt;
        0x00000288, 0x000002D6, 0x0000032A, 0x00000385, &lt;br /&gt;
        0x000003E5, 0x0000044C, 0x000004BA, 0x0000052E, &lt;br /&gt;
        0x000005A9, 0x0000062C, 0x000006B5, 0x00000746, &lt;br /&gt;
        0x00000BCF, 0x00000CC0, 0x00000DBD, 0x00000EC6, &lt;br /&gt;
        0x00000FDC, 0x000010FF, 0x0000122F, 0x0000136C, &lt;br /&gt;
        0x000014B6, 0x0000160F, 0x00001775, 0x000018EA, &lt;br /&gt;
        0x00001A6D, 0x00001BFF, 0x00001DA0, 0x00001F51, &lt;br /&gt;
        0x00002C16, 0x00002E80, 0x00003100, 0x00003395, &lt;br /&gt;
        0x00003641, 0x00003902, 0x00003BDB, 0x00003ECA, &lt;br /&gt;
        0x000041D0, 0x000044EE, 0x00004824, 0x00004B73, &lt;br /&gt;
        0x00004ED9, 0x00005259, 0x000055F2, 0x000059A4, &lt;br /&gt;
        0x000074CC, 0x000079AB, 0x00007EAC, 0x000083CE, &lt;br /&gt;
        0x00008911, 0x00008E77, 0x000093FF, 0x000099AA, &lt;br /&gt;
        0x00009F78, 0x0000A56A, 0x0000AB80, 0x0000B1BB, &lt;br /&gt;
        0x0000B81A, 0x0000BE9E, 0x0000C547, 0x0000CC17, &lt;br /&gt;
        0x0000FD42, 0x000105CB, 0x00010E82, 0x00011768, &lt;br /&gt;
        0x0001207E, 0x000129C4, 0x0001333B, 0x00013CE2, &lt;br /&gt;
        0x000146BB, 0x000150C5, 0x00015B02, 0x00016572, &lt;br /&gt;
        0x00017015, 0x00017AEB, 0x000185F5, 0x00019133, &lt;br /&gt;
        0x0001E16D, 0x0001EF07, 0x0001FCE0, 0x00020AF7, &lt;br /&gt;
        0x0002194F, 0x000227E6, 0x000236BE, 0x000245D7, &lt;br /&gt;
        0x00025532, 0x000264CF, 0x000274AE, 0x000284D0, &lt;br /&gt;
        0x00029536, 0x0002A5E0, 0x0002B6CE, 0x0002C802, &lt;br /&gt;
        0x000341B0, 0x000355F8, 0x00036A90, 0x00037F79, &lt;br /&gt;
        0x000394B4, 0x0003AA41, 0x0003C021, 0x0003D654, &lt;br /&gt;
        0x0003ECDA, 0x000403B5, 0x00041AE5, 0x0004326A, &lt;br /&gt;
        0x00044A45, 0x00046277, 0x00047B00, 0x7FFFFFFF&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5253</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5253"/>
		<updated>2015-10-15T02:02:11Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Keygroup */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Affect sample&#039;s tuning.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Always 0x7F40.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Always 0x0002.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk18&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown. Usually 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk24&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk26&lt;br /&gt;
| Unknown. Usually 0x28FF (little endian)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to instrument ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO. The frequency, the depth, the delay, the fade-out. And what might be a resonance parameter(Q) with what might possibly be a low-pass filter.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. (Posibly boolean to confirm its enabled) If is set to 0, the LFO corresponding to the entry is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly labelled &amp;quot;B.Rn&amp;quot; on the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. Possibly labelled &amp;quot;K.Tps&amp;quot; in the DSE screenshots&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Possibly used to tune the sample&#039;s pitch. Fine tuning ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctunetrk&lt;br /&gt;
| Sets coarse tuning based on a strange unit where 249 is no tuning.. Might have to do with the track&#039;s pitch bending?&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Another parameter affecting pitch in a quantity similar to ctunetrk.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are a perfect copy of last 16 bytes of the sample&#039;s entry in the &amp;quot;wavi&amp;quot; chunk.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
A single entry in the Keygroups table. The name and purpose of each was extrapolated from the screenshots of the DSE software from the official website. Its unclear what each parameters really do, and in what context, at this time.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous voices. 0 to 255.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority. A value from 0 to possibly 99. Default is 8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest Vc possible ? Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest Vc possible ? Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5252</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5252"/>
		<updated>2015-10-15T01:58:43Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Added most of the missing info!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Affect sample&#039;s tuning.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Always 0x7F40.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Always 0x0002.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length ! (For ADPCM samples, the 4 bytes preamble is counted in the loopbeg!)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk18&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown. Usually 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk24&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk26&lt;br /&gt;
| Unknown. Usually 0x28FF (little endian)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to instrument ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO. The frequency, the depth, the delay, the fade-out. And what might be a resonance parameter(Q) with what might possibly be a low-pass filter.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. (Posibly boolean to confirm its enabled) If is set to 0, the LFO corresponding to the entry is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly labelled &amp;quot;B.Rn&amp;quot; on the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. Possibly labelled &amp;quot;K.Tps&amp;quot; in the DSE screenshots&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Possibly used to tune the sample&#039;s pitch. Fine tuning ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctunetrk&lt;br /&gt;
| Sets coarse tuning based on a strange unit where 249 is no tuning.. Might have to do with the track&#039;s pitch bending?&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Another parameter affecting pitch in a quantity similar to ctunetrk.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are a perfect copy of last 16 bytes of the sample&#039;s entry in the &amp;quot;wavi&amp;quot; chunk.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The kgrp chunk contains a list of all the keygroups in use in this SWDL.&lt;br /&gt;
Its not known yet how keygroups work, but it appears its a set of properties that can be assigned to splits of every programs that overrides some of those splits&#039; parameters, determine their max polyphony, their volume, their &amp;quot;priority&amp;quot; and a few other things.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;kgrp&amp;quot; {0x6B, 0x67, 0x72, 0x70}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Keygroup|Keygroup]][]&lt;br /&gt;
| Keygroups&lt;br /&gt;
| A table containing all the keygroups used in the SWDL. The first entry is usually the global Keygroup, of which most splits are part of.&lt;br /&gt;
|-&lt;br /&gt;
| After Keygroups&lt;br /&gt;
| 0 or 8&lt;br /&gt;
| -&lt;br /&gt;
| Padding?&lt;br /&gt;
| When there is an odd number of Keygroup entry, it appears there is some garbage(?) inserted here to make the next chunk start on an offset divisible by 16. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Keygroup ====&lt;br /&gt;
The name and purpose of each was extrapolated from the screenshots of the DSE software from the official website. Its unclear what each parameters really do, and in what context, at this time.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 8 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index/ID of the keygroup. &lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| poly&lt;br /&gt;
| Polyphony. AKA max number of simultaneous voices. 0 to 255.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1 &lt;br /&gt;
| uint8&lt;br /&gt;
| priority&lt;br /&gt;
| Priority. A value from 0 to possibly 99. Default is 8.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vclow&lt;br /&gt;
| Lowest Vc possible ? Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| vchigh&lt;br /&gt;
| Highest Vc possible ? Usually between 0 to 15.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk50&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk51&lt;br /&gt;
| Unknown.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The pcmd chunk contains the sample data for every samples. Each samples is stored one after the other, regardless of the sample type or sample rate, without headers or delimiters of any sort! Each samples is located by using the sample entries in the wavi chunk.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;pcmd&amp;quot; {0x70, 0x63, 0x6D, 0x64}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| SampleDataBlob&lt;br /&gt;
| Contains the sample data for all the samples used in the SWDL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The data can be stored in any of the compatible formats:&lt;br /&gt;
* The NDS&#039;s 4 bits IMA ADPCM encoding (Same as official IMA ADPCM. Even uses the same tables. only the way sample values are clamped when converting back to PCM16 differ a tiny bit, which might not even be noticeable.)&lt;br /&gt;
* raw PCM16 samples.&lt;br /&gt;
* raw PCM8 samples ?&lt;br /&gt;
* Possibly PSG or something else ?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note About ADPCM:&#039;&#039;&#039;&lt;br /&gt;
* Each ADPCM sample begins with the initial value of the &amp;quot;predictor&amp;quot; on 16 bits. Then the &amp;quot;step index&amp;quot;, also on 16 bits. Afterwards, comes the actual sample data.&lt;br /&gt;
* The ADPCM preamble is included in the value of the &amp;quot;loopbeg&amp;quot; parameter of the sample!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
This chunk marks the the end of the SWDL container/file. There is nothing past the chunk header!&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;eod\20&amp;quot; {0x65, 0x6F, 0x64, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field. Always 0 for eod chunk!&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5251</id>
		<title>Dse swdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_swdl&amp;diff=5251"/>
		<updated>2015-10-15T01:26:30Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Initial publish of the SWDL page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SWDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
SWDL containers are used to contain sample and programs/presets information for any accompanying [[dse_sedl|SEDL]] or [[dse_smdl|SMDL]] files.&lt;br /&gt;
&lt;br /&gt;
They can be used in a few ways. &lt;br /&gt;
* To accompany a SMDL, and contain both the samples it uses and the data for the programs it uses.&lt;br /&gt;
* To accompany a SMDL, and contain only the program/preset data while referring to a main sample bank for the samples it uses.&lt;br /&gt;
* As a sample bank.&lt;br /&gt;
&lt;br /&gt;
When used in the second manner, it allows the game to only load the samples it actually uses from the main bank, and it keeps redundancy to a minimum. SWDLs also seems to override some of the data they contains. So, if a sample has its rootkey set to 60 in the main bank, and it was set to 80 in another SWDL referring to it, the rootkey actually used after loading that last SWDL would be 80. This works with a lot more parameters however.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
The file format is based around chunks, a bit like the RIFF file format. There doesn&#039;t seem to be a particular order to the chunks other than the header and the eod chunk.&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 80&lt;br /&gt;
| [[#SWDL Header|SWDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#wavi Chunk|wavi Chunk]]&lt;br /&gt;
| Contains details on all the samples contained, or referred to by the SWDL container.&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#prgi Chunk|prgi Chunk]]&lt;br /&gt;
| The prgi chunk contains the programs/presets used by the SMDL files. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#kgrp Chunk|kgrp Chunk]]&lt;br /&gt;
| The kgrp chunk contains information on every keygroups used in the SWDL by the programs/presets. (It may be omitted in SWDL purely for storing sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#pcmd Chunk|pcmd Chunk]]&lt;br /&gt;
| The pcmd chunk contains the raw sample data for every samples contained in the file. (It may be omitted if the SWDL refers to a main bank for its sample data.)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eod Chunk|End of Data Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SWDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SWDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 80 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;swdl&amp;quot; {0x73, 0x77, 0x64, 0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk18&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk10&lt;br /&gt;
| Always 0x00AA AAAA&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk11&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk12&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk13&lt;br /&gt;
| So far always 0x10&lt;br /&gt;
|-&lt;br /&gt;
| 0x40 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| pcmdlen&lt;br /&gt;
| Length of &amp;quot;pcmd&amp;quot; chunk if there is one. If not, is null! If set to 0xAAAA0000 (The 0000 may contains something else), the file refers to samples inside an external &amp;quot;pcmd&amp;quot; chunk, inside another SWDL !&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 &lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk14&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x46 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbwavislots&lt;br /&gt;
| Numbers of sample pointer slots, empty or not, in the &amp;quot;wavi&amp;quot; chunk&#039;s &amp;quot;WavTable&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbprgislots&lt;br /&gt;
| Numbers of presets pointer slots , empty or not, in the &amp;quot;prgi&amp;quot; chunk&#039;s &amp;quot;TablA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown &lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| wavilen&lt;br /&gt;
| Length of &amp;quot;wavi&amp;quot; chunk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== wavi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The wavi chunk contains information on all the samples. Its what links the prgi chunk to the sample data within the local or external pcmd chunk.&lt;br /&gt;
Its made up of two main parts:&lt;br /&gt;
* A pointer table, with a slot for every samples used globally.&lt;br /&gt;
* A table of sample information.&lt;br /&gt;
Each non-null pointers in the first table points to a single sample information entry in the second table. Null pointers indicate unused, or missing samples, depending on the context.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;wavi&amp;quot; {0x77, 0x61, 0x76, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| Varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#WavTable|WabTable]]&lt;br /&gt;
| Array containing 2 bytes offsets from the beginning offset of WavTable to an entry in the SampleInfoTbl table! It may be null.&lt;br /&gt;
|-&lt;br /&gt;
| After WavTable&lt;br /&gt;
| 0-15&lt;br /&gt;
| -&lt;br /&gt;
| Padding Bytes&lt;br /&gt;
| 0xAA padding bytes to align the next part on 16 bytes. &lt;br /&gt;
|-&lt;br /&gt;
| After Padding&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| [[#SampleInfoTbl|SampleInfoTbl]]&lt;br /&gt;
| This table contains details on each sample entries in the &amp;quot;WavTable&amp;quot;. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== WavTable ====&lt;br /&gt;
The table of pointers to the sample info. Each pointers is 16 bits, and may be null. The nb of entries is set in the SWDL header.&lt;br /&gt;
&lt;br /&gt;
==== SampleInfoTbl ====&lt;br /&gt;
The table made up of sample info entries. Each entries are 64 bytes, thus no padding is ever needed between entries.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the format of a sample info entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Entry marker? Always 0x01AA.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index number from WavTable. Empty/null entries in WavTable are counted!&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Affect sample&#039;s tuning.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rootkey&lt;br /&gt;
| The MIDI note associated to the sample. (The note that the instrument sampled is playing) &lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Always 0x7F40.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Always 0x0002.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk6&lt;br /&gt;
| Always 0x0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 0xAA padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| smplfmt&lt;br /&gt;
| Sample format. &lt;br /&gt;
* 0x0000 : Possibly 8 bits PCM &lt;br /&gt;
* 0x0100 : 16 bits PCM &lt;br /&gt;
* 0x0200 : 4 bits ADPCM &lt;br /&gt;
* 0x0300 : Possibly PSG ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Often 0x09&lt;br /&gt;
|-&lt;br /&gt;
| 0x15&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| smplloop&lt;br /&gt;
| Flag indicating whether the sample should be looped or not ! (1 = looped, 0 = not looped)&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Often 0x0108 &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Often 0004. &lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk12&lt;br /&gt;
| Often 0x0101.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk13&lt;br /&gt;
| Often 0x0000 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplrate&lt;br /&gt;
| Sample rate in hertz. &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| smplpos&lt;br /&gt;
| The offset of the sound sample in the &amp;quot;pcmd&amp;quot; chunk when there is one. Otherwise, possibly offset of the exact sample among all the sample data loaded in memory? (The value usually doesn&#039;t match the main bank&#039;s)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| loopbeg&lt;br /&gt;
| The position in bytes divided by 4, the loop begins at, from smplpos. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| looplen&lt;br /&gt;
| The length of the loop in bytes, divided by 4. ( multiply by 4 to get size in bytes ) Adding loopbeg + looplen gives the sample&#039;s length !&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk17&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x31&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk18&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x32&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk19&lt;br /&gt;
| Unknown. Usually 0x1&lt;br /&gt;
|-&lt;br /&gt;
| 0x33&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk20&lt;br /&gt;
| Unknown. Usually 0x3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk21&lt;br /&gt;
| Unknown. Usually 0x03FF ( Little endian -253)&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown. Usually 0xFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown. Usually 0x0000&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk24&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Usually 0x007F (little endian)&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk26&lt;br /&gt;
| Unknown. Usually 0x28FF (little endian)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== prgi Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The prgi chunk contains programs/presets that the SMDL music sequences use as instrument presets in their tracks.&lt;br /&gt;
Its made up of :&lt;br /&gt;
* A table of pointers to all the programs info entries. Some may be null.&lt;br /&gt;
* A table containing program info entries.&lt;br /&gt;
&lt;br /&gt;
The pointer table works in the exact same way as it does in the wavi chunk. 16 bits offsets from the beginning of the table to a program info entry.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| &amp;quot;prgi&amp;quot; {0x70, 0x72, 0x67, 0x69}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk1&lt;br /&gt;
| Always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk2&lt;br /&gt;
| Always 0x1504.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunkbeg&lt;br /&gt;
| Seems to always be 0x10, possibly the start of the chunk data.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the chunk data. Begins counting right after this field&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nbprgislots * 2) + padding&lt;br /&gt;
| -&lt;br /&gt;
| ProgramPtrTbl&lt;br /&gt;
| A table of 16 bits pointers to entries in the ProgramInfoTbl. Some may be null. It usually has 128 slots. Like General Midi. If the nb of presets were to change, its possible there would be a need for padding bytes, seeing how the wavi chunk works.&lt;br /&gt;
|-&lt;br /&gt;
| After ProgramPtrTbl&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#ProgramInfo|ProgramInfo]][nbprgislots]&lt;br /&gt;
| [[#ProgramInfoTbl|ProgramInfoTbl]]&lt;br /&gt;
| A table containing information on all the presets available in the current SWDL.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfoTbl ====&lt;br /&gt;
This table contains entries for every single presets available in the SWDL. Each entry is pointed to by a pointer in the ProgramPtrTbl. &lt;br /&gt;
&lt;br /&gt;
It contains ProgramInfo entries:&lt;br /&gt;
&lt;br /&gt;
==== ProgramInfo ====&lt;br /&gt;
A ProgramInfo entry is minimum 144 bytes long.&lt;br /&gt;
Its made of 3 parts:&lt;br /&gt;
* The program info header.&lt;br /&gt;
* The LFO table.&lt;br /&gt;
* The split table.&lt;br /&gt;
&lt;br /&gt;
The program info header contains details for identifying the preset, and the size of the LFO and split table.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| ID&lt;br /&gt;
| Index of the pointer in &amp;quot;TableA&amp;quot; that points to this entry. Also correspond to instrument ID used in the corresponding SMDL file!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| nbsplits&lt;br /&gt;
| Nb of samples mapped to this presets, in the split table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgvol&lt;br /&gt;
| Volume of the entire program.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| prgpan&lt;br /&gt;
| Pan of the entire program. (0-127, 64 is middle, 127 is full right, 0 is full left )&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk3&lt;br /&gt;
| Most of the time 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| thatFbyte&lt;br /&gt;
| Most of the time 0x0F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Most of the time is 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk5&lt;br /&gt;
| Most of the time is 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nblfos&lt;br /&gt;
| Nb of entries in the LFO Table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| PadByte&lt;br /&gt;
| Most of the time is 0xAA, or 0x0. The value here is used as the delimiter and padding !&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk7&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk8&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk9&lt;br /&gt;
| Most of the time is 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| (nblfos * 16)&lt;br /&gt;
| [[#LFOEntry|LFOEntry]][nblfos]&lt;br /&gt;
| LFOTbl&lt;br /&gt;
| Table that contains details on how to use the 4 LFOs with this preset.&lt;br /&gt;
|-&lt;br /&gt;
| After LFOTbl&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| Delimiter&lt;br /&gt;
| 16 bytes of &amp;quot;PadByte&amp;quot; padding bytes, possibly to delimit the start of the section below. Uses the value of PadByte as padding value!&lt;br /&gt;
|-&lt;br /&gt;
| After Delimiter&lt;br /&gt;
| (nbsplits * 48)&lt;br /&gt;
| [[#SplitEntry|SplitEntry]][nbsplits]&lt;br /&gt;
| SplitsTbl&lt;br /&gt;
| Table of samples splits mapped to this program.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LFOEntry ====&lt;br /&gt;
These determine how to configure the 4 Low Frquency Oscillators (LFO) linked to this program.&lt;br /&gt;
It allows to set the shape of the waveform/the function that generate the value. The output of the LFO. The frequency, the depth, the delay, the fade-out. And what might be a resonance parameter(Q) with what might possibly be a low-pass filter.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s the structure of an entry:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total Length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk34&lt;br /&gt;
| Unknown, usually 0x00. It does seems to have an effect with a certain combination of other values in the other parameters.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk52&lt;br /&gt;
| Unknown, usually 0x00. (Posibly boolean to confirm its enabled) If is set to 0, the LFO corresponding to the entry is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| dest&lt;br /&gt;
| The destination of the LFO&#039;s output. &lt;br /&gt;
* 0x0 : none/disabled&lt;br /&gt;
* 0x1 : pitch&lt;br /&gt;
* 0x2 : volume&lt;br /&gt;
* 0x3 : pan&lt;br /&gt;
* 0x4 : lowpass/cutoff filter?&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| wshape&lt;br /&gt;
| The shape/function of the waveform. (When the LFO is disabled, its always 1) &lt;br /&gt;
# Square &lt;br /&gt;
# Triangle? &lt;br /&gt;
# Sinus? &lt;br /&gt;
# ? &lt;br /&gt;
# Saw? &lt;br /&gt;
# Noise?&lt;br /&gt;
# Random&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| rate&lt;br /&gt;
| Rate at which the LFO &amp;quot;oscillate&amp;quot;. May or may not be in Hertz.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 2?&lt;br /&gt;
| uint16?&lt;br /&gt;
| unk29&lt;br /&gt;
| Changing the value seems to induce feedback or resonance. (Or perhaps its because it ended up corrupting the sound engine state when messing with the parameter?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| depth&lt;br /&gt;
| The depth parameter of the LFO.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| delay&lt;br /&gt;
| Delay in milliseconds before the LFO effect is applied after the sample begins playing.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk32&lt;br /&gt;
| Unknown, usually 0x0000. Possibly fade-out in milliseconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk33&lt;br /&gt;
| Unknown, usually 0x0000. Possibly an extra parameter? Or a cutoff/lowpass filter&#039;s frequency cutoff?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== SplitEntry ====&lt;br /&gt;
This represents a sample mapped to the preset. Those are played depending on certain conditions when a playnote event is received by the sequencer for that particular preset/program.&lt;br /&gt;
Some samples may be played only for a certain range of keys or velocities for example. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| -&lt;br /&gt;
| unk10&lt;br /&gt;
| A leading 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| id&lt;br /&gt;
| The Index of the sample in the SplitsTbl!&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Is always the same value as offset 0x1A below ! (Possibly labelled &amp;quot;B.Rn&amp;quot; on the DSE screenshots)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk25&lt;br /&gt;
| Unknown. Possibly a boolean. Possibly labelled &amp;quot;K.Tps&amp;quot; in the DSE screenshots&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lowkey&lt;br /&gt;
| Usually 0x00. Lowest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x05&lt;br /&gt;
| 1&lt;br /&gt;
| int8 &lt;br /&gt;
| hikey&lt;br /&gt;
| Usually 0x7F. Highest MIDI Key this sample can play on.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| lovel&lt;br /&gt;
| Lowest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hivel&lt;br /&gt;
| Highest note velocity the sample is played on.(0 - 127)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk14&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk47&lt;br /&gt;
| Usually 7F. If smaller than 0x7F the sample won&#039;t play...&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| 2&lt;br /&gt;
| int16 &lt;br /&gt;
| unk15&lt;br /&gt;
| Usually 0x00.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk48&lt;br /&gt;
| Usually 0x7F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk16&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk17 &lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| SmplID&lt;br /&gt;
| The ID/index of sample in the &amp;quot;wavi&amp;quot; chunk&#039;s lookup table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ftune&lt;br /&gt;
| Possibly used to tune the sample&#039;s pitch. Fine tuning ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctunetrk&lt;br /&gt;
| Sets coarse tuning based on a strange unit where 249 is no tuning.. Might have to do with the track&#039;s pitch bending?&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| rootkey&lt;br /&gt;
| Note at which the sample is sampled at !&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| ctune&lt;br /&gt;
| Another parameter affecting pitch in a quantity similar to ctunetrk.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplvol&lt;br /&gt;
| Volume of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x19&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| smplpan&lt;br /&gt;
| Pan of the sample.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| kgrpid&lt;br /&gt;
| Keygroup ID of the keygroup this split belongs to!&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk22&lt;br /&gt;
| Unknown, possibly a flag.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk23&lt;br /&gt;
| Unknown, usually 0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| unk24&lt;br /&gt;
| Usually the same value as &amp;quot;PadByte&amp;quot;, or 0. Possibly padding ?&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot;| &#039;&#039;&#039;Those last 16 bytes are a perfect copy of last 16 bytes of the sample&#039;s entry in the &amp;quot;wavi&amp;quot; chunk.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envon&lt;br /&gt;
| If not == 0, the volume envelope is processed. Otherwise its ignored.&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| envmult&lt;br /&gt;
| If not == 0, is used as multiplier for envelope paramters, and the 16bits lookup table is used for parameter durations. If 0, the 32bits duration lookup table is used instead. This value has no effects on volume parameters, like sustain, and atkvol.&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk37&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk38&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk39&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk40&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-          &lt;br /&gt;
| 0x28 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| atkvol &lt;br /&gt;
| Sample volume envelope Attack Level.(0 to 127) Higher values towards 0x7F means the volume at which the attack phase begins at is louder. Doesn&#039;t shorten the attack time.&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| attack&lt;br /&gt;
| Sample volume envelope Attack.(0 to 127) Higher values towards 0x7F means the attack phase takes longer to reach full volume! 126 is ~10 seconds.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay&lt;br /&gt;
| Sample volume envelope Decay. (0 to 127) The duration the note has to be held until the volume is smoothly decreased to the value of &amp;quot;Sustain Volume&amp;quot;. Higher values towards 0x7F means it takes longer before the held note&#039;s volume changes to &amp;quot;Sustain Volume&amp;quot;. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| sustain&lt;br /&gt;
| Sample volume envelope Sustain.(0 to 127) The volume at which the held note will stay at. (Default 0x7F)&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| hold&lt;br /&gt;
| Sample volume envelope Hold (0 to 127). Higher values towards 0x7F means the note is held at full volume longer after the attack phase. 126 is ~10 seconds. 0x7F, does the same as 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| decay2&lt;br /&gt;
| Sample volume envelope Decay2 (0 to 127). Higher values towards 0x7F means longer fade-out. 0x7F means never fade-out. (Default 0x7F) At 0x7E, it takes ~8 seconds for the volume to reach 0. &lt;br /&gt;
|-&lt;br /&gt;
| 0x2E&lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| release&lt;br /&gt;
| Sample volume envelope Release parameter(0 to 127). Higher values towards 0x7F means longer release. Negative values mirror positive range. (Default is 0x28(40))&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| 1&lt;br /&gt;
| int8&lt;br /&gt;
| unk53&lt;br /&gt;
| Usually 0xFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== kgrp Chunk ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== pcmd Chunk ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Eod Chunk ===&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5250</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5250"/>
		<updated>2015-10-14T22:11:07Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Eoc Chunk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The EoC chunk marks the end of the SMDL file/container. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5249</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5249"/>
		<updated>2015-10-14T22:09:50Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* DSE Events */  reworded a bit the part about the event codes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with events. Each event starts by a single byte containing a code, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Values from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Values from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Values from 0x90 to 0xFF all have their unique event assigned to them.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5232</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5232"/>
		<updated>2015-09-26T23:10:33Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Song Chunk */  fixed ambiguity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note? Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.) Or possibly just the tick rate..&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5231</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5231"/>
		<updated>2015-09-26T23:05:57Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Example */  fixed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5229</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5229"/>
		<updated>2015-09-25T02:25:46Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (In short, it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes [[#Fixed Duration Pause(0x80 to 0x8F)|fixed duration pauses]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5228</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5228"/>
		<updated>2015-09-25T02:21:53Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Fixed Duration Pause(0x80 to 0x8F) */  Added mention of some note durations possibly matching a note&amp;#039;s duration as part of a triplet.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (In short, it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note (Half Note as part of a triplet?)&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note (Quarter Note as part of a triplet?)&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note (8th Note as part of a triplet?)&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note (16th Note as part of a triplet?)&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note (32th Note as part of a triplet?)&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5227</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5227"/>
		<updated>2015-09-25T02:13:38Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
Here&#039;s an example &amp;quot;Events&amp;quot; section (In short, it does not include the preamble and header):&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5226</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5226"/>
		<updated>2015-09-25T02:12:15Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* Events */ added a little example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events themselves are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Example =====&lt;br /&gt;
This is a complete event section for example:&lt;br /&gt;
  E3 73 A4 82 93 E0 1F 98 &lt;br /&gt;
It ends on an offset divisible by 4, so there is only a single 0x98 event at the end.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what would happen if we&#039;d add an extra events. Lets copy the 0xE3 event and its parameter once:&lt;br /&gt;
  E3 73 E3 73 A4 82 93 E0 1F 98 98 98&lt;br /&gt;
..we needed to add 2 extra 0x98 events to make the track end on an offset divisible by 4!&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5225</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5225"/>
		<updated>2015-09-25T02:01:50Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
----&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
----&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
:The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
:Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
:All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
:{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
----&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5224</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5224"/>
		<updated>2015-09-25T01:53:43Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: /* File Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Preamble ====&lt;br /&gt;
Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Events ====&lt;br /&gt;
All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes. Events are not aligned on 4 bytes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| After Preamble&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5223</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5223"/>
		<updated>2015-09-25T01:48:55Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Filled up track chunk details&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
The song chunk is made of a single header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Song Chunk Header ( Total length 64 bytes )&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
Track chunks contain the events for each individual tracks of the music sequence. They work much like MIDI tracks.&lt;br /&gt;
&lt;br /&gt;
==== Header ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Track chunk label &amp;quot;trk\0x20&amp;quot; {0x74,0x72,0x6B,0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param1&lt;br /&gt;
| Unknown. Usually 0x01000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| param2&lt;br /&gt;
| Unknown. Usually 0x0000FF04.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| chunklen&lt;br /&gt;
| Length of the trk chunk. Starting after this field, to the first 0x98 event encountered in the track. The length is in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The content begins immediately after the header!&lt;br /&gt;
&lt;br /&gt;
==== Content ====&lt;br /&gt;
Each tracks has a short preamble after the header, and before the actual events. That preamble indicates the channel and the track id assigned to the track.&lt;br /&gt;
&lt;br /&gt;
All tracks must have a 0x98 event at their end. And the size of a track is counted up to that event, ignoring the padding bytes.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| trkid&lt;br /&gt;
| The track ID of the track. A number between 0 and 0x11.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| chanid&lt;br /&gt;
| The channel ID of the track. A number between 0 and 0x0F?.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Often 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| varies&lt;br /&gt;
| -&lt;br /&gt;
| events&lt;br /&gt;
| Track events begin here.&lt;br /&gt;
|-&lt;br /&gt;
| After Events&lt;br /&gt;
| 0-3&lt;br /&gt;
| -&lt;br /&gt;
| Padding&lt;br /&gt;
| Padding to align the end of the track on 4 bytes. The value is usually the terminating 0x98 byte repeated as needed, up to 3 extra times.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
	<entry>
		<id>https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5222</id>
		<title>Dse smdl</title>
		<link rel="alternate" type="text/html" href="https://projectpokemon.org/wiki/index.php?title=Dse_smdl&amp;diff=5222"/>
		<updated>2015-09-25T01:24:19Z</updated>

		<summary type="html">&lt;p&gt;Psy commando: Filled Song chunk header&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Incomplete Articles]]&lt;br /&gt;
[[Category:ROM Hacking]]&lt;br /&gt;
[[Category:Technical References]]&lt;br /&gt;
[[Category:Pokemon Mystery Dungeon Series]]&lt;br /&gt;
[[Category:Audio]]&lt;br /&gt;
{{DISPLAYTITLE:DSE SMDL Format}}&lt;br /&gt;
&lt;br /&gt;
== General Information ==&lt;br /&gt;
The SMDL format is a container for sequenced music. Its very close to the MIDI format, similarly to the [[SSEQ]] format normally used in most NDS games.&lt;br /&gt;
&lt;br /&gt;
== File Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 64&lt;br /&gt;
| [[#SMDL Header|SMDLHeader]]&lt;br /&gt;
| The container&#039;s header.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| 64&lt;br /&gt;
| [[#Song Chunk|Song Chunk]]&lt;br /&gt;
| Information on the entire sequence.&lt;br /&gt;
|-&lt;br /&gt;
| After Song Chunk&lt;br /&gt;
| Varies&lt;br /&gt;
| [[#Trk Chunk|Trk Chunk]]&lt;br /&gt;
| The first Track of the sequence. Its role is to set the tempo.&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot;|..Additional tracks here..&lt;br /&gt;
|-&lt;br /&gt;
| After all Track Chunks&lt;br /&gt;
| 16&lt;br /&gt;
| [[#Eoc Chunk|End of Content Chunk]]&lt;br /&gt;
| This empty chunk marks the end of the SMDL container.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SMDL Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| magicn&lt;br /&gt;
| The 4 characters &amp;quot;smdl&amp;quot; {0x73,0x6D,0x64,0x6C}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk7&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| flen&lt;br /&gt;
| File length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| version?&lt;br /&gt;
| Version number? ( 0x1504 )&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. &lt;br /&gt;
|-&lt;br /&gt;
| 0x0F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk3&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| unk4&lt;br /&gt;
| 4 bytes of zeroes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| year&lt;br /&gt;
| Year the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| month&lt;br /&gt;
| Month the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| day&lt;br /&gt;
| Day the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| hour&lt;br /&gt;
| Hour the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| minute&lt;br /&gt;
| Minute the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| second&lt;br /&gt;
| Second the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| centisecond?&lt;br /&gt;
| Could possibly be the centisecond that the file was last modified.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 16&lt;br /&gt;
| char[16]&lt;br /&gt;
| fname&lt;br /&gt;
| Filename, ASCII null terminated string. Any extra space after the 0 on the total 16 bytes, is padded with 0xAA. &lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown, usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown, usually 0xFFFFFFFF.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Song Chunk ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 64 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00&lt;br /&gt;
| 4&lt;br /&gt;
| char[4]&lt;br /&gt;
| label&lt;br /&gt;
| Song chunk label &amp;quot;song&amp;quot; {0x73,0x6F,0x6E,0x67}&lt;br /&gt;
|-&lt;br /&gt;
| 0x04&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk1&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk2&lt;br /&gt;
| Unknown. Usually 0xFF10.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk3&lt;br /&gt;
| Unknown. Usually 0xFFFFFFB0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk4&lt;br /&gt;
| Unknown. Usually 0x1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x12&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| tpqn&lt;br /&gt;
| Ticks Per Quarter Note. Usually 0x30 or 48 ticks per quarter note. (Works like MIDI clock ticks it seems.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk5&lt;br /&gt;
| Unknown. Usually 0xFF01&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbtrks&lt;br /&gt;
| Number of track(trk) chunks&lt;br /&gt;
|-&lt;br /&gt;
| 0x17&lt;br /&gt;
| 1&lt;br /&gt;
| uint8&lt;br /&gt;
| nbchans&lt;br /&gt;
| Number of channels. (Unsure how channels works with DSE)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk6&lt;br /&gt;
| Unknown. Usually 0x0F000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk7&lt;br /&gt;
| Unknown. Usually 0xFFFFFFFF&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk8&lt;br /&gt;
| Unknown. Usually 0x40000000&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| unk9&lt;br /&gt;
| Unknown. Usually 0x00404000&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk10&lt;br /&gt;
| Unknown. Usually 0x0200&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| 2&lt;br /&gt;
| uint16&lt;br /&gt;
| unk11&lt;br /&gt;
| Unknown. Usually 0x0800&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| 4&lt;br /&gt;
| uint21&lt;br /&gt;
| unk12&lt;br /&gt;
| Unknown. Usually 0xFFFFFF00&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| 16&lt;br /&gt;
| -&lt;br /&gt;
| unkpad&lt;br /&gt;
| Unknown sequence of 16, 0xFF bytes. Possibly padding? &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Trk Chunk ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Eoc Chunk ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Total length 16 bytes&lt;br /&gt;
! Offset&lt;br /&gt;
! Length&lt;br /&gt;
! Type&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| 4&lt;br /&gt;
| -&lt;br /&gt;
| ChunkID&lt;br /&gt;
| The chunk ID &amp;quot;eoc\0x20&amp;quot; {0x65, 0x6F, 0x63, 0x20}&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param1&lt;br /&gt;
| Unknown meaning, is often 0x00000001.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Param2&lt;br /&gt;
| Unknown meaning, is often 0x04FF0000.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Length&lt;br /&gt;
| Always 0, for end of content chunks.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DSE Events ==&lt;br /&gt;
Tracks are filled with event codes, which indicates to the sequencer what to do. &lt;br /&gt;
* Their value ranges from 0x0 to 0xFF. &lt;br /&gt;
* Events from 0x0 to 0x7F are reserved for the PlayNote event.&lt;br /&gt;
* Events from 0x80 to 0x8F are reserved for fixed duration pause events.&lt;br /&gt;
* Events from 0x90 to 0xFF all have their unique meaning.&lt;br /&gt;
&lt;br /&gt;
=== PlayNote(0x0 to 0x7F) ===&lt;br /&gt;
The play note event is special in that its format is particular.&lt;br /&gt;
* The event code itself is the velocity(0x0 - 0x7F) of the note to be played.&lt;br /&gt;
* The first parameter byte is obligatory, and it contains info on whether we modify the track&#039;s current octave, how many extra parameters are there, and what note to play.&lt;br /&gt;
* The second parameter is optional, and its length varies depending on the length specified in the obligatory parameter. It contains the duration the key is &amp;quot;held down&amp;quot; before being released.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a breakdown of the NoteData byte:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bits&lt;br /&gt;
! Name&lt;br /&gt;
! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 1100 0000 &lt;br /&gt;
| OctaveMod&lt;br /&gt;
| A value from 0 to 3 from which 2 is subtracted. The result is a signed value that we add to the track&#039;s current octave.&lt;br /&gt;
|-&lt;br /&gt;
| 0011 0000&lt;br /&gt;
| NbParamBytes&lt;br /&gt;
| A value from 0 to 3 which indicates the amount of extra parameter bytes that should be read.&lt;br /&gt;
|-&lt;br /&gt;
| 0000 1111&lt;br /&gt;
| Note&lt;br /&gt;
| The [[#Note List|Note]] that should be played at the track&#039;s current octave(after OctaveMod).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Note List ====&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Note Name&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| C&lt;br /&gt;
|-&lt;br /&gt;
| 0x1&lt;br /&gt;
| C#&lt;br /&gt;
|-&lt;br /&gt;
| 0x2&lt;br /&gt;
| D&lt;br /&gt;
|-&lt;br /&gt;
| 0x3&lt;br /&gt;
| D#&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| E&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| F&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| F#&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| G&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| G#&lt;br /&gt;
|-&lt;br /&gt;
| 0x9&lt;br /&gt;
| A&lt;br /&gt;
|-&lt;br /&gt;
| 0xA&lt;br /&gt;
| A#&lt;br /&gt;
|-&lt;br /&gt;
| 0xB&lt;br /&gt;
| B&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Example Event ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Velocity&lt;br /&gt;
! NoteData&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|(Opt)KeyDownDuration&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F&lt;br /&gt;
| 0x65&lt;br /&gt;
| 0x20&lt;br /&gt;
| 0x01&lt;br /&gt;
| 0x10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This event will play the note F, at the current track octave with no modifications, and hold the note for 0x100120 ticks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Fixed Duration Pause(0x80 to 0x8F) ===&lt;br /&gt;
The fixed duration pause is a pause event based on the duration of common musical time intervals. Its event code goes from 0x80-0x8F.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a table of the possible durations:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Musical Time Interval&lt;br /&gt;
! Duration in Ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| Half Note&lt;br /&gt;
| 96&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| Dotted Quarter Note&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| 2/3 of a Half Note&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| 0x83&lt;br /&gt;
| Quarter Note&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| Dotted 8th Note&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| 2/3 of a Quarter Note&lt;br /&gt;
| 32&lt;br /&gt;
|- &lt;br /&gt;
| 0x86&lt;br /&gt;
| 8th Note&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| 0x87&lt;br /&gt;
| Dotted 16th Note&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 2/3 of a 8th Note&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| 16th Note&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| Dotted 32nd Note&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 0x8B&lt;br /&gt;
| 2/3 of a 16th Note&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| 32nd Note&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 0x8D&lt;br /&gt;
| Dotted 64th Note&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| 2/3 of a 32nd Note&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 0x8F&lt;br /&gt;
| 64th Note&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Others(0x90 to 0xFF) ===&lt;br /&gt;
Here is a list of all known events :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code&lt;br /&gt;
! Parameter Length&lt;br /&gt;
! Parameters&lt;br /&gt;
! Name&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| RepeatLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x91&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| AddToLastPause&lt;br /&gt;
| Pause the track processing for the duration of the last pause + the duration in ticks specified.(Includes fixed duration pauses)&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Duration&lt;br /&gt;
| Pause8Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x93&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Duration&lt;br /&gt;
| Pause16Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 3&lt;br /&gt;
| (uint24)Duration&lt;br /&gt;
| Pause24Bits&lt;br /&gt;
| Pause the track processing for the duration in ticks.&lt;br /&gt;
|-&lt;br /&gt;
| 0x95&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)CheckInterval&lt;br /&gt;
| PauseUntilRelease&lt;br /&gt;
| Pause the track processing as long as a note is held down. Will wait for at least &amp;quot;CheckInterval&amp;quot; ticks, then checks every &amp;quot;CheckInterval&amp;quot; ticks if all notes have been released on the current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x96&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x97&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| EndOfTrack&lt;br /&gt;
| Marks the end of the track. Is also used as padding to align the end of the track on 4 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x99&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| LoopPoint&lt;br /&gt;
| Marks the point the track will loop to after the end of track is reached.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9A&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9B&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9D&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0x9E&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0x9F&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| SetTrackOctave&lt;br /&gt;
| Sets the current track&#039;s octave to the value specified. Valid range is 0 - 9.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA1&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)Octave&lt;br /&gt;
| AddToTrackOctave&lt;br /&gt;
| Adds the value specified to the current track octave.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA3&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA5&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)TempoBPM&lt;br /&gt;
| SetTempo&lt;br /&gt;
| Sets the track&#039;s tempo in beats per minute? (The code is identical to 0xA4)&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xA7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xA9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAA&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xAB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| SkipNextByte&lt;br /&gt;
| Skips processing the next byte.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 1&lt;br /&gt;
| (uint8)ProgramID&lt;br /&gt;
| SetProgram&lt;br /&gt;
| Change the track&#039;s program(Instrument Preset) to the one specified.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xAE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xAF&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB5&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xB6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xB9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xBD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBE&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xBF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC1&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC2&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xC3&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC8&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xC9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCB&lt;br /&gt;
| 2&lt;br /&gt;
| -&lt;br /&gt;
| SkipNext2Bytes&lt;br /&gt;
| Skip processing the next 2 bytes.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xCF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD0&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD2&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD3&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD5&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD6&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xD7&lt;br /&gt;
| 2&lt;br /&gt;
| (uint16)Bend&lt;br /&gt;
| PitchBend&lt;br /&gt;
| Bend the pitch of the note.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xD9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDB&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDD&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xDE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xDF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackVolume&lt;br /&gt;
| SetTrackVolume&lt;br /&gt;
| Change the track&#039;s volume to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE1&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE2&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE3&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)TrackExpression&lt;br /&gt;
| SetTrackExpression&lt;br /&gt;
| Change the track&#039;s expression(secondary volume) to the value specified. (0x0-0x7F)&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE5&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xE6&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE7&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 1&lt;br /&gt;
| (int8)Pan&lt;br /&gt;
| SetTrackPan&lt;br /&gt;
| Change the track&#039;s pan to the value specified. (0x0-0x7F. 0x40 is middle, 0x0 full left, and 0x7F full right )&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xE9&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEA&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xED&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 5&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 4&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF2&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF3&lt;br /&gt;
| 3&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF4&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF5&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF6&lt;br /&gt;
| 1&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF7&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEDE4;&amp;quot;&lt;br /&gt;
| 0xF8&lt;br /&gt;
| 2&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
| ??&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFA&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFB&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFC&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFD&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFE&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|- style=&amp;quot;background-color:#D1D1D1;&amp;quot; &lt;br /&gt;
| 0xFF&lt;br /&gt;
| 0&lt;br /&gt;
| -&lt;br /&gt;
| INVALID&lt;br /&gt;
| Disable current track.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Credits ==&lt;br /&gt;
* TruePikachu for some of the details on the SMDL format! [http://projectpokemon.org/forums/member.php?51393-TruePikachu]&lt;/div&gt;</summary>
		<author><name>Psy commando</name></author>
	</entry>
</feed>