Zur Musik habe ich auch noch ein paar neue Erkenntnisse:
Nach dem Setzen der Instrumentdaten beginnt die eigentliche Musiksequenz in der MNU.ADL ja mit einem Befehl, der im OPL-2 Output nicht zu finden war:
60 06 A9
War nicht zu finden...
Eventuell Timing über den PIT und daher nicht in den OPL-2 Befehlen?
Im Header der ADL Dateien findet sich in den letzten beiden Byte (also Offset 0x18 und 0x19) allerdings dazu passend auch der Wert A9 06
An späterer Stelle findet sich in den ADL folgender Befehl.
E9 23 24
Timer des OPL-2 wird programmiert und Register 43 -54 erhalten neue Werte
Das Programmieren des Timers sieht in der RAW so aus:
00 02 = Clock change Befehl im RAW Format
A9 06 = Wert der geschrieben wird, wieder unsere A9 06!
Die Modding Wiki verrät uns:
To convert the clock speed to a Hertz measurement (Hertz is cycles per second, and the delays are in units of one cycle), use this formula:
iHertz = 1193180.0 / iClockSpeed
0xA906 = 43.270
1193180 /43270 = 27 Hz
60 ist also wohl der Befehl für "Change Timer" in den ADL Dateien und zu Beginn der Sequenz wird hier das Timing auf 27 Hz geändert, was zudem die vorgesehene Timerfrequenz laut Header ist.
Der Playercode im Spiel scheint diesen Befehl aber zunächst zu ignorieren, aber an späterer Stelle, beim ersten E9 Befehl auszuführen.
Der E9 Befehl bzw. was dazu in den RAW Daten steht, war mir ja eh noch ein Rätsel. Es scheint aber schlichtweg eine Art Wartebefehl für das Timing zu sein.
Nach diesem Befehl folgen im Raw-OPL-Code auch mehrere Delays, aber gerade bei den ersrten auch eine Verringerung der Lautstärke, weshalb ich zunächst an einen Effekt wie Volume Slide gedacht habe.
Insgesamt wird nach jedem Befehl E9 aber 105 Ticks (in der MNU.ADL) gewartet, bevor ein Note-Off Befehl folgt. Was ja Sinn macht.
Die Programmierung des Timers würde dann beim ersten Wartebefehl erfolgen. Auch das macht ja Sinn.
E9 wäre dann das Pendant zur "delta time" bei Midi. Allerdings finde ich in den Musikstücken immer nur E9, nie E8 o.ä. und es folgt auch kein Datenbyte darauf. Und der Player würde dann in "Wartezeiten" von sich aus die Lautstärke verringern, also so eine Art Fade out starten...
Was wir jetzt aber über das ADL Dateiformat von BlueByte wissen:
Header
(hier von MNU.ADL)
Offset / Größe | Wert | Bedeutung |
---|
0x00 - 4 Byte
| "ADLX" | ID Datei
|
0x04 - 4 Byte
| 00 00 12 02
| Dateigröße in big endian (4610 Byte)
|
0x08 - 4 Byte
| "AHDR" | ID Header
|
0x0C - 4 Byte
| 00 00 00 0A
| Größe des Header-Chunks in big endian (10 Byte)
|
0x10 - 1 Byte
| 02 | Bei allen ADL Dateien 2, eventuell Dateiformatversion?
|
0x11 - 1 Byte
| 00 | Bei allen ADL Dateien 0. Eventuell auch Version, also 2.0?
|
0x12 - 1 Byte
| 08 | Bei den Soundeffekten in der .ADX steht hier 1. Also wohl Anzahl der verwendeten Kanäle/Tracks
|
0x13 - 1 Byte
| 00 | Noch zu klären...
|
0x14 - 1 Byte
| 5F | Noch zu klären....
|
0x15 - 1 Byte
| 8B | Noch zu klären...
|
0x16 - 1 Byte
| A4 | Noch zu klären..
|
0x17 - 1 Byte
| 01 | Noch zu klären..
|
0x18 - 2 Byte
| A9 06
| Initialer Wert für den Timer in big endian (43270 = 27 Hz)
|
Es fehlen uns noch die Angaben zur Geschwindigkeit des Songs, neben dem Timer-Wert. So etwas wie BPM oder, analog zu Midi, ticks per quarter-note. Diese Infos dürften hinter den noch zu klärenden Bytes stecken.
Die Musiksequenz funktioniert ähnlich wie Midi, allerdings mit eigenen Befehlen und eng angepasst an den OPL-2:
ADL "Befehl"
| Bedeutung | |
---|
1x <Registerwert Ax> <Registerwert Bx>
| Note on - Spiele Note/Frequenz auf Channel x
| |
2x
| Note off - Key-Off Befehl für Channel x,
| |
3x <Registerwert>
| Setze Lautstärke für Channel x
| |
4x <11 Byte Registerwerte>
| Setze Instrumentdaten für Channel x
| |
6x <2 Byte Wert für Timer>
| Timerfrequenz ändern
| |
E9 | Timing / Wait, in MNU.ADL wird 105 Ticks (bei 27 Hz also 3,8 Sekunden) gewartet, bevor der nächste Befehl ausgeführt wird.
| |
Ich versuche mich demnächst mal an einem Player.