OK so here you are.
First revision (FF4) :
$d2 + 3Xargument : ?, ?, Tempo (first channel only)
$d4 + argument : Echo Volume (first channel only)
$d5 + 2Xargument : Echo Feedback, Echo Lenght (first channel only)
$d6 + 3Xargument : Slide pitch : ?, speed, nouvelle pitch
$d7 + 3Xargument : Slide volume, ?, speed, new volume
$d8 + 3Xargument : Vibrato delay, speed, dept
$d9 + argument : Panning LFO, ?, speed, deot
$da + argument : Set octave #
$db + argument : Set intrument #
$dc + argument : Set software envelopper #
$dd + argument : Sustain rate
$de + argument : related with note releasing faster before their end
$df + argument : Noise frequency.
$e0 + arument : Start repeat section, argument is #of repeats-1, 0 to repeat forever
$e1 : Increase octave
$e2 : Decrease octave
$e8 : Cancel vibrato
$ea : Echo on
$eb : Echo off
$ec : Noise on
$ed : Noise off
$ee : Pitch Modulation on
$ef : Pitch Modulation off
$f0 : End repeat section
$f1 : End track
$f2 + 3Xargument : ?, ?, Volume
$f3 + 3Xargument : ?, ?, Panning
$f4 : Loop track (
)
IMPORTANT : FF4 is a bit different from the others in a few aspects
1) Note lengths 3, 4 and 6, 7 are swapped as opposed to other versions.
2) "Rest" and "Continue note" commands are swapped
3) It uses software enveloppes instead of hardware ones which are defined in a table somewhere. I think FF4 uses values $00-$10, use $0d or $0b to have a "plain" enveloppe.
4) Voices $0x are for SFX, $4x are used for music. In other revisions, $0x is for SFX and $2x for music.
Revision 2 (Romancing SaGa) :
$d2 + argument : Set Tempo
$d3 : Restore "default" tempo
$d4 + argument : Set volume
$d5 + 2Xargument : Fade volume, speed, new volume
$d6 + argument : Set panning
$d7 + argument : Slide panning, speed, new pan
$d8 + argument : Echo Volume
$e1 : Noise frequency
$e2 : Noise On
$e3 : Noise Off
$e4 : Pitch Modulation On
$e5 : Pitch Modulation Off
$e6 + 2Xargument : Echo Feedback, echo delay
$e7 : Echo on
$e8 : Echo off
$eb + argument : Set octave #
$ec : Increase octave
$ed : Decrease octave
$f1 + 2Xargument : Loop, adress to jump
$f2 : Enable legato mode
$f3 + argument : Set instrument #
$f4 + argument : Set software enveloppe (?)
$f5 : Disable legato mode
$f7 + argument : Detune
3rd revision (Final Fantasy 5, Final Fantasy Mystic Quest, Secret of Mana, Hanjuku Hero) :
$d2 + argument : Set volume
$d3 + 2Xargument : Fade volume, speed, new volume
$d4 + argument : Set panning
$d5 + argument : Slide panning, speed, new panning
$d6 + 2Xargument : Slide pitch, speed, new pitch
$d7 + 3Xargument : Vibrato, delay, speed, dept
$d9 + 3Xargument : Tremolo (Volume LFO), delay, speed, dept
$db + 2Xargument : Panning LFO, speed, dept
$d8, $da, $dc : ?
$dd : Noise frequency
$de : Noise On
$df : Noise Off
$e0 : Pitch Modulation on
$e1 : Pitch Modulation off
$e2 : echo on
$e3 : echo off
$e4 + argument : Set octave #
$e5 : increase octave
$e6 : decrease octave
$e7 : Transpose (argument in semitones)
$e8 : Relative transpose (value here is added to previous transpose value)
$e9 : Detune ($10 is a semitone).
$ea + argument : Set instrument # (also set default envelope)
$eb + argument : Set attack rate
$ec + argument : Set decay rate
$ed + argument : Set sustain level
$ee + argument : Set sustain rate
$ef : Restore default envelope for selected instrument
$f0 + argument : Start repeating area, argument = # of repeats - 1, 0 to repeat forever
$f1 : End of repeat area
$f2 : End of track
$f3 + argument : Set tempo
$f4 + 2x argument : Accelerando/raletendo, speed, new tempo
$f5 : Do nothing
$f6 + argument : Do nothing
$f7 + argument : Do nothing
$f8 : ?
$f9 : ?
$fa : Loop (
)
$fe : End track
$ff : End track
4th revision (FF6, Live a Live, Romancing Saga 2, Romancing Saga 3, Chrono Trigger)
$d6 + argument : Set octave #
$dc + argument : Set instrument #
$dd + argument : Set attack rate
$de + argument : Set decay rate
$df + argument : Set sustain level
$e0 + argument :Set sustain rate
$c4 + argument : Set volume
$cb + 3xargument : Tremolo Delay, speed, dept
Note : How the loops works is kinda mysterious. In revision 1 and 2 it's simply the adress in SPC memory to jump to, but in others it seems to not work like that
The amount of times you can nest repeat command without getting bugs depends on the revision. I think earlier revision only allow one repeat, but modern revisions allows more than that... more experiencing should be done.