BMS (File Format): Difference between revisions

From Luma's Workshop
Jump to navigation Jump to search
(Added ADSR)
(added some instruction descriptions)
 
(One intermediate revision by one other user not shown)
Line 15: Line 15:
|-
|-
| 00<br />01<br />02<br />...<br />7D<br />7E<br />7F
| 00<br />01<br />02<br />...<br />7D<br />7E<br />7F
|  
| JASSeqParser::parseNoteOn
| {OpCode[1]} {Voice[1]} {Velocity[1]}<br />OpCode: one byte with range 0x00 through 0x7F. 0x00 = C-1, 0x3C = C4 (middle C), 0x7F = G9.<br />Voice: one byte with range 0x01 through 0x07 (needs testing/verification). Each Voice can only hold one Note.<br />Velocity: one byte with range 0x00 through 0x7F. 0x00 = 0, 0x7F = 127.<br/><br/>If the Voice is not 1 - 7, the game will treat this note as a Midi Gate note, and will expect a 4th value that is one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. It is unknown what effects this has on the output.
| {OpCode[1]} {Voice[1]} {Velocity[1]}<br />OpCode: one byte with range 0x00 through 0x7F. 0x00 = C-1, 0x3C = C4 (middle C), 0x7F = G9.<br />Voice: one byte with range 0x01 through 0x07 (needs testing/verification). Each Voice can only hold one Note.<br />Velocity: one byte with range 0x00 through 0x7F. 0x00 = 0, 0x7F = 127.<br/><br/>If the Voice is not 1 - 7, the game will treat this note as a Midi Gate note, and will expect a 4th value that is one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. It is unknown what effects this has on the output.
| 64 02 68<br /><br />64: Key E4<br />02: Voice 2<br />68: Velocity 104
| 64 02 68<br /><br />64: Key E4<br />02: Voice 2<br />68: Velocity 104
Line 21: Line 21:
|-
|-
| 80
| 80
| Unknown.
| JASSeqParser::cmdWaitByte
|  
|  
|  
|  
Line 27: Line 27:
|-
|-
| 81<br />...<br />87
| 81<br />...<br />87
|  
| JASSeqParser::parseNoteOff
| {OpCode[1]}<br />OpCode: one byte with range 0x81 through 0x87. 0x81 = Close Voice 1, 0x87 = Close Voice 7.
| {OpCode[1]}<br />OpCode: one byte with range 0x81 through 0x87. 0x81 = Close Voice 1, 0x87 = Close Voice 7.
|  
| 81: Stop voice ID 1
| Stops playing a Note.
| Stops playing a Note.
|-
|-
Line 190: Line 190:
| B8
| B8
| JASSeqParser::cmdParamE
| JASSeqParser::cmdParamE
| {OpCode[1]} {Unknown[1]} {Volume[1]}<br />OpCode: one byte, B8.<br />Unknown: one byte with unknown range and purpose.<br />Volume: one byte with range 0x00 through 0x7F. 0x7F = Full volume (100%), 0x00 = Silent (0%).
| {OpCode[1]} {Target[1]} {Parameter[1]}<br/>OpCode: one byte, B8.<br/>Target: one byte with range 0x00 through 0x03.<br/>Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:
| B8 00 64<br/><br/>B8: OpCode<br/>00: Unknown<br/>64: ~78% volume
* Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).
| Sets the volume of the Track
* Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.
* Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.
* Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.
| B8 00 64<br/><br/>B8: OpCode<br/>00: Target (Volume)<br/>64: ~78% volume
| Allows different operations onto the music track
|-
|-
| B9
| B9
| JASSeqParser::cmdParamI
| JASSeqParser::cmdParamI
| {OpCode[1]} {Unknown[1]} {Pitch Wheel Value[2]}<br />OpCode: one byte, B9.<br />Unknown: always 01, other values do nothing or glitching sounds.<br />Pitch Wheel Value: Value seeminlgy equals the midi pitch value divided by 8. Minus values start at FFFF and then decreases. Can also have higher/lower values than regular Midi Pitch Wheel, which has a maximum of +8191 (03FF) and minimum of -8192 (FC00).
| {OpCode[1]} {Target[1]} {Parameter[2]}<br/>OpCode: one byte, B9.<br/>Target: one byte with range 0x00 through 0x03.<br/>Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:
| B9 01 02 4B<br/><br/>B9: OpCode<br/>01: Unknown<br/>02 4B: Pitch Wheel of 4701
* Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).
| Sets the Pitch Wheel
* Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.
* Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.
* Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.
| B9 01 04 00<br/><br/>B9: OpCode<br/>01: Target (Pitch)<br/>04 00: Pitch of 4 keys
| Allows different operations with higher precision onto the music track
|-
|-
| BA
| BA
| JASSeqParser::cmdParamEI
| JASSeqParser::cmdParamEI
|  
| {OpCode[1]} {Target[1]} {Parameter[1]} {Fade time[2]}<br/>OpCode: one byte, BA.<br/>Target: one byte with range 0x00 through 0x03.<br/>Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:
|  
* Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).
|  
* Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.
* Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.
* Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.
Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.
| BA 02 22 01 68<br/><br/>BA: OpCode<br/>02: Target (Reverb)<br/>22: Reverb of strength 34<br/>01 68: 360 Ticks
| Allows different operations with fade time onto the music track
|-
|-
| BB
| BB
| JASSeqParser::cmdParamII
| JASSeqParser::cmdParamII
|  
| {OpCode[1]} {Target[1]} {Parameter[2]} {Fade time[2]}<br/>OpCode: one byte, BB.<br/>Target: one byte with range 0x00 through 0x03.<br/>Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:
|  
* Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).
|  
* Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.
* Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.
* Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.
Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.
| BA 03 7F FF 02 00<br/><br/>BB: OpCode<br/>03: Target (Panning)<br/>7F FF: Panned to right channel<br/>02 00: 512 Ticks
| Allows different operations with higher precision and fade time onto the music track
|-
|-
| BC
| BC
Line 334: Line 352:
| D0
| D0
| JASSeqParser::cmdReadPort
| JASSeqParser::cmdReadPort
| {OpCode[1]} {Source[1]} {Destination[1]}
Opcode: One byte, D0
Source: One byte, 0-15 , source port
Destination: One byte, 0-32, destination register
|  
|  
|  
| Imports the value from sequence port Source and writes it to destination register 'Destination', the value is also written to register 3
|
|-
|-
| D1
| D1
| JASSeqParser::cmdWritePort
| JASSeqParser::cmdWritePort
| {OpCode[1]} {Source[1]} {Destination[1]}
Opcode: One byte, D1
Source: One byte, source register, 0-32
Destination: One Byte, destination port, 0-15
|  
|  
|  
| Writes the value in register 'Source' and saves it to register 3, as well as port 'Destination'
|
|-
|-
| D2
| D2
Line 406: Line 430:
| DC
| DC
| JASSeqParser::cmdRegTblLoad
| JASSeqParser::cmdRegTblLoad
|  
| {OpCode[1]} {AccessMode[1]} {Destination[1]} {Offset[3]} {Index[1]}
OpCode: One Byte, 0xDC
AccessMode: Determines how the sequence accesses the table.
Destination: 24-bit offset of table
Index: Register target index into table
|  
|  
|  
|  
Line 532: Line 560:
| F1
| F1
| JASSeqParser::cmdWaitByte
| JASSeqParser::cmdWaitByte
|  
| {OpCode[1]} {WaitTime[1]}
Waits for WaitTime ticks
|  
|  
|  
|  

Latest revision as of 04:45, 28 May 2025

File Format

BMS files are Binary Music Sequences that store commands for the audio engine to play notes, similar to the MIDI file format.

Data

BMS files contain raw instructions for the audio engine. There are no headers or filesize checks. Each instruction (OpCode) stands for its own function in the engine. The following table lists all JAudio2 OpCodes that have functions in SMG2:

OpCode Function (SMG/SMG2) Usage Example Description
00
01
02
...
7D
7E
7F
JASSeqParser::parseNoteOn {OpCode[1]} {Voice[1]} {Velocity[1]}
OpCode: one byte with range 0x00 through 0x7F. 0x00 = C-1, 0x3C = C4 (middle C), 0x7F = G9.
Voice: one byte with range 0x01 through 0x07 (needs testing/verification). Each Voice can only hold one Note.
Velocity: one byte with range 0x00 through 0x7F. 0x00 = 0, 0x7F = 127.

If the Voice is not 1 - 7, the game will treat this note as a Midi Gate note, and will expect a 4th value that is one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. It is unknown what effects this has on the output.
64 02 68

64: Key E4
02: Voice 2
68: Velocity 104
Starts playing a Note with the previously defined Instrument (see E1, E2 and E3).
80 JASSeqParser::cmdWaitByte Seems to do nothing based on the code.
81
...
87
JASSeqParser::parseNoteOff {OpCode[1]}
OpCode: one byte with range 0x81 through 0x87. 0x81 = Close Voice 1, 0x87 = Close Voice 7.
81: Stop voice ID 1 Stops playing a Note.
88
...
8F
Unknown
90
...
9F
Unknown
A0 NULL
A1 NULL
A2 NULL
A3 NULL
A4 NULL
A5 NULL
A6 NULL
A7 NULL
A8 NULL
A9 NULL
AA NULL
AB NULL
AC NULL
AD NULL
AE NULL
AF NULL
B0 Extended Opcode Indicator See B000 or B001.
B1 JASSeqParser::cmdNoteOn
B2 JASSeqParser::cmdNoteOff
B3 JASSeqParser::cmdNote
B4 JASSeqParser::cmdSetLastNote
B5 NULL
B6 NULL
B7 NULL
B8 JASSeqParser::cmdParamE {OpCode[1]} {Target[1]} {Parameter[1]}
OpCode: one byte, B8.
Target: one byte with range 0x00 through 0x03.
Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:
  • Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).
  • Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.
  • Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.
  • Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.
B8 00 64

B8: OpCode
00: Target (Volume)
64: ~78% volume
Allows different operations onto the music track
B9 JASSeqParser::cmdParamI {OpCode[1]} {Target[1]} {Parameter[2]}
OpCode: one byte, B9.
Target: one byte with range 0x00 through 0x03.
Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:
  • Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).
  • Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.
  • Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.
  • Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.
B9 01 04 00

B9: OpCode
01: Target (Pitch)
04 00: Pitch of 4 keys
Allows different operations with higher precision onto the music track
BA JASSeqParser::cmdParamEI {OpCode[1]} {Target[1]} {Parameter[1]} {Fade time[2]}
OpCode: one byte, BA.
Target: one byte with range 0x00 through 0x03.
Parameter: one byte with range 0x00 through 0xFF (Int8), whichs purpose depends on the target:
  • Target 0: Volume. 0x7F = Full volume (100%), 0x00 = Silent (0%). 0x80 through 0xFF are treated the same as silence (0%).
  • Target 1: Pitch. Adding one (0x01) or subtracting one (0xFF) increases/decreases pitch by one key, like from D#4 to E4.
  • Target 2: Reverb. 0x7F = Strong reverb, 0x00 = no reverb. 0x80 through 0xFF are treated the same as no reverb.
  • Target 3: Panning. 0x7F = right channel, 0x00 = center, 0x80 = left channel.

Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.

BA 02 22 01 68

BA: OpCode
02: Target (Reverb)
22: Reverb of strength 34
01 68: 360 Ticks
Allows different operations with fade time onto the music track
BB JASSeqParser::cmdParamII {OpCode[1]} {Target[1]} {Parameter[2]} {Fade time[2]}
OpCode: one byte, BB.
Target: one byte with range 0x00 through 0x03.
Parameter: two bytes with range 0x0000 through 0xFFFF (Int16), whichs purpose depends on the target:
  • Target 0: Volume. 0x7FFF = Full volume (100%), 0x0000 = Silent (0%). 0x8000 through 0xFFFF are treated the same as silence (0%).
  • Target 1: Pitch. Adding one (0x0100) or subtracting one (0xFF00) increases/decreases pitch by one key, like from D#4 to E4. Values inbetween can be used for fine-tuning.
  • Target 2: Reverb. 0x7FFF = Strong reverb, 0x0000 = no reverb. 0x8000 through 0xFFFF are treated the same as no reverb.
  • Target 3: Panning. 0x7FFF = right channel, 0x0000 = center, 0x8000 = left channel.

Fade time: two bytes with range 0x0000 through 0xFFFF. The amount of time in ticks until the Parameter value is met.

BA 03 7F FF 02 00

BB: OpCode
03: Target (Panning)
7F FF: Panned to right channel
02 00: 512 Ticks
Allows different operations with higher precision and fade time onto the music track
BC NULL
BD NULL
BE NULL
BF NULL
C0 NULL
C1 JASSeqParser::cmdOpenTrack {OpCode[1]} {TrackNumber[1]} {Pointer[3]}
OpCode: one byte, C1.
TrackNumber: one byte with range 0x00 through 0x0F. 0x00 = Track 0, 0x0F = Track 15.
Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.
C1 04 05 B4 73

C1: OpCode
04: Track 4
05 B4 73: Offset
Creates a Track which can play Notes. Track 15 is usually reserved for Yoshi Drums.
C2 JASSeqParser::cmdCloseTrack
C3 JASSeqParser::cmdCall {OpCode[1]} {Pointer[3]}
OpCode: one byte, C3.
Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.
C3 00 00 40

C3: OpCode
00 00 40: Offset
Redirects execution to the defined offset. Execution can return with C5.
C4 JASSeqParser::cmdCallF
C5 JASSeqParser::cmdRet {OpCode[1]}
OpCode: one byte, C5.
Returns redirected execution (like from C3) to the initial call.
C6 JASSeqParser::cmdRetF
C7 JASSeqParser::cmdJmp {OpCode[1]} {Pointer[3]}
OpCode: one byte, C7.
Pointer: three bytes with range 0x000000 through 0xFFFFFF. Defines an offset in the file.
C7 08 02 34

C7: OpCode
08 02 34: Offset
Redirects execution to the defined offset, used for Loops.
C8 JASSeqParser::cmdJmpF
C9 JASSeqParser::cmdJmpTable
CA JASSeqParser::cmdCallTable
CB JASSeqParser::cmdLoopS
CC JASSeqParser::cmdLoopE
CD NULL
CE NULL
CF NULL
D0 JASSeqParser::cmdReadPort {OpCode[1]} {Source[1]} {Destination[1]}

Opcode: One byte, D0 Source: One byte, 0-15 , source port Destination: One byte, 0-32, destination register

Imports the value from sequence port Source and writes it to destination register 'Destination', the value is also written to register 3
D1 JASSeqParser::cmdWritePort {OpCode[1]} {Source[1]} {Destination[1]}

Opcode: One byte, D1 Source: One byte, source register, 0-32 Destination: One Byte, destination port, 0-15

Writes the value in register 'Source' and saves it to register 3, as well as port 'Destination'
D2 JASSeqParser::cmdCheckPortImport
D3 JASSeqParser::cmdCheckPortExport
D4 JASSeqParser::cmdParentWritePort
D5 JASSeqParser::cmdChildWritePort
D6 JASSeqParser::cmdParentReadPort
D7 JASSeqParser::cmdChildReadPort
D8 JASSeqParser::cmdRegLoad {OpCode[1]} {Setting[1]} {Unknown[1]} {Variable[1]}
OpCode: one byte, D8.
Setting: one byte with unknown range. Different bytes will trigger different effects:
- 0x62: set PPQN (seen in BMS)
- 0x6B: set PPQN (seen in SC)
Unknown: one byte with unknown range and purpose.
Variable: one byte with different range and purpose depending on the Setting byte.
D8 62 00 78

D8: OpCode
62: set PPQN
00: Unknown
78: PPQN 120
Different purposes.
D9 JASSeqParser::cmdReg
DA JASSeqParser::cmdReg
DB JASSeqParser::cmdRegUni
DC JASSeqParser::cmdRegTblLoad {OpCode[1]} {AccessMode[1]} {Destination[1]} {Offset[3]} {Index[1]}

OpCode: One Byte, 0xDC AccessMode: Determines how the sequence accesses the table. Destination: 24-bit offset of table Index: Register target index into table

DD NULL
DE NULL
DF NULL
E0 JASSeqParser::cmdTempo {OpCode[1]} {Unknown[1]} {BPM[1]}
OpCode: one byte, E0.
Unknown: one byte with unknown range and purpose.
BPM: one byte with range 0x00 through 0xFF. 0x78 = 120, F0 = 240.
E0 00 90

E0: OpCode
00: Unknown
90: BPM 144
Defines the tempo (playback speed) of the BMS file.
E1 JASSeqParser::cmdBankPrg {OpCode[1]} {Bank[1]} {Program[1]}
OpCode: one byte, E1.
Bank: one byte with range 0x00 through 0xFF. This byte represents a WSYS ID.
Program: one byte ranging from 0x00 through 0xFF. This byte represents a LIST entry in the IBNK belonging to the defined WSYS ID.
E1 01 0F

E1: OpCode
01: WSYS ID 1
0F: IBNK LIST entry 15
(01 0F is the percussion set for Yoshi Drums)
Defines the Instrument to be used in a Track.
E2 JASSeqParser::cmdBank {OpCode[1]} {Bank[1]}
OpCode: one byte, E2.
Bank: one byte with range 0x00 through 0xFF. This byte represents a WSYS ID.
E2 53

E2: OpCode
53: WSYS ID 83
(This bank holds sounds for Megahammer)
Defines the WSYS/IBNK whose sounds are to be used in a Track.
E3 JASSeqParser::cmdPrg {OpCode[1]} {Program[1]}
OpCode: one byte, E3.
Program: one byte with range 0x00 through 0xFF. This byte represents a LIST entry in the IBNK belonging to the defined WSYS ID.
E3 0B

E3: OpCode
0B: IBNK LIST entry 11
(In relation to Megahammer, this Program holds movement related sounds)
Defines the Keyboard which holds more specific sounds to an IBNK.
E4 NULL
E5 NULL
E6 NULL
E7 JASSeqParser::cmdEnvScaleSet
E8 JASSeqParser::cmdEnvSet
E9 JASSeqParser::cmdSimpleADSR {OpCode[1]} {Attack[2]} {Sustain[2]} {Decay[2]} {Amplitude[2]} {Release[2]}
OpCode: one byte, E9.
Attack: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade-in in ticks.
Sustain: two bytes with range 0x0000 through 0x7FFF. Define the duration for how long the wave is kept at maximum amplitude in ticks.
Decay: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade between maximum and controlled amplitude in ticks.
Amplitude: two bytes with range 0x0000 through 0x7FFF. Define the volume of the wave for the 2nd sustain duration.
Release: two bytes with range 0x0000 through 0x7FFF. Define the duration of fade-out in ticks.

If Amplitude is set to 0x7FFF, Sustain and Decay won't have an audible effect to the wave.

The Attack, Decay and Release operations affect the volume of the wave linearly.
E9 00 80 01 00 00 80 5F FF 00 3C

E9: OpCode
00 80: Attack (fade-in) for 128 ticks
01 00: Sustain for 256 ticks
00 80: Decay for 128 ticks
5F FF: Amplitude of 75% compared to maximum
00 3C: Release (fade-out) for 60 ticks
Perform ADSR operations on a key. Must be placed before the actual key presses. See this image for a visual representation of the ADSR operations.
EA JASSeqParser::cmdBusConnect {OpCode[1]} {Unknown[1]} {Unknown[1]} {Unknown[1]}
OpCode: one byte, EA.
Unknown: one byte with unknown range and purpose.
EA 00 FF FF

EA: OpCode
00: Unknown
FF: Unknown
FF: Unknown
Unknown purpose, only seen in SC.
EB JASSeqParser::cmdIIRCutOff
EC JASSeqParser::cmdIIRSet
ED JASSeqParser::cmdFIRSet
EE NULL
EF NULL
F0 JASSeqParser::cmdWait {OpCode[1]} {WaitTime[n]}
OpCode: one byte, 0xF0.
WaitTime: one or more bytes with range 0x00 through 0xFF. If the leading byte is 0x80 (bit 7 = 1) or greater, another following byte will be taken into account. Time is measured in ticks here.
F0 60 (96 Ticks)
F0 81 56 (214 Ticks)
F0 83 81 30 (49328 Ticks)
Creates a delay, used to define the length of a Note or gap between Notes.
F1 JASSeqParser::cmdWaitByte {OpCode[1]} {WaitTime[1]}

Waits for WaitTime ticks

F2 NULL
F3 JASSeqParser::cmdSetIntTable
F4 JASSeqParser::cmdSetInterrupt
F5 JASSeqParser::cmdDisInterrupt
F6 JASSeqParser::cmdRetI
F7 JASSeqParser::cmdClrI
F8 JASSeqParser::cmdIntTimer
F9 JASSeqParser::cmdSyncCPU
FA NULL
FB NULL
FC NULL
FD JASSeqParser::cmdPrintf {OpCode[1]} {Message[n]} {NullTerminator[1]}
OpCode: one byte, FD.
Message: ASCII string of undefined length, ending with \n.
NullTerminator: one byte, 00.
FD 48 65 6C 6C 6F 5C 6E 00

FD: OpCode
48 65 6C 6C 6F 5C 6E: "Hello\n"
00: Null-terminator
Prints a specified message to OSReport.
FE JASSeqParser::cmdNop
FF JASSeqParser::cmdFinish {OpCode[1]}
OpCode: one byte, 0xFF.
Stops execution of a Track.
B000 NULL
B001 JASSeqParser::cmdDump

Tools

BMS_DEC (converts BMS to MIDI)
JaiSeqX (playback for JAudio1 and JAudio2 BMS files)