kennen mich null mit dem OLP2 aus - also wenig "das kenn ich doch irgendwo her" Momente
Ich habe früher gerne damit experimentiert und mir auch Player für einige Formate geschrieben, da ich z.B. nicht auf die vorkompilierte Object-Datei angewiesen sein wollte, die beim HSC-Tracker dabei war.
Ist alles ewig her, aber ich wusste noch, wo ich die Infos zu den einzelnen Registern finde und habe auch noch meine Quellcodes von vor 20+ Jahren dazu.
Aber Reverse-Engeneering eines Musik-Dateiformats ist für mich komplettes Neuland
Für alle Interessierten hier die Links zu den von mit genutzten Beschreibungen der OPL-2 (und OPL-3) Register:
Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
Programming the AdLib/Sound Blaster
auch bin ich mir nicht sicher welche ADL/AFX Datei abgespielt wird wenn man im Menü ist
Dank der "sprechenden" Dateinamen des Spiels ist das doch ziemlich eindeutig:
MNU.ADL - Musik im Menü
MNUHI.ADL - Musik zur Highscoreliste
Und dann gibt es die drei Stücke, die während des Spiels laufen:
ONGAME1.ADL
ONGAME2.ADL
ONGAME3.ADL
Die MNU.AFX dürfte die "Soundeffekte" im Menü enthalten, die auch über den Adlib/OPL-2 laufen.
Deine DLO-Aufnahme dürfte also den Anfang von MNU.ADL enthalten und dann zum Anfang einer der "ONGAME" ADLs wechseln.
Meine RAW-Aufnahme ist einfach ein etwas längeres Stück von MNU.ADL.
Die MNU.AFX habe ich mir am Wochenende mal näher angesehen und die ist recht interessant, denn sie enthält die Soundeffekte für das Menü und ist wie eine LIB-Datei aufgebaut:
00000000 B4 01 00 00 41 44 4C 58 00 00 00 3F 41 48 44 52 ....ADLX...?AHDR
00000010 00 00 00 0A 02 00 01 00 0A 00 A4 01 8D 05 49 4D ..............IM
00000020 41 50 00 00 00 00 54 52 43 4B 3F 00 00 00 40 82 AP....TRCK?...@.
00000030 7F FA 55 02 92 80 93 57 02 00 30 FE 10 63 2A 10 ..U....W..0..c*.
00000040 63 2A 60 05 8D 00 01 D2 20 4D 77 20 41 44 4C 58 c*`..... Mw ADLX
00000050 00 00 00 3F 41 48 44 52 00 00 00 0A 02 00 01 00 ...?AHDR........
00000060 0A 00 A4 01 8D 05 49 4D 41 50 00 00 00 00 54 52 ......IMAP....TR
00000070 43 4B 3F 00 00 00 40 82 7F FA 55 02 92 80 93 57 CK?...@...U....W
00000080 02 00 30 FE 10 41 2E 10 41 2E 60 05 8D 00 01 D2 ..0..A..A.`.....
00000090 20 4D 77 20 41 44 4C 58 00 00 00 3F 41 48 44 52 Mw ADLX...?AHDR
000000A0 00 00 00 0A 02 00 01 00 1E 57 A4 01 8D 05 49 4D .........W....IM
000000B0 41 50 00 00 00 00 54 52 43 4B 3F 00 00 00 40 B2 AP....TRCK?...@.
000000C0 C0 FF 59 00 91 00 C1 07 00 06 30 FE 10 57 31 10 ..Y.......0..W1.
000000D0 57 31 60 05 8D 00 03 A4 20 4D 77 20 41 44 4C 58 W1`..... Mw ADLX
000000E0 00 00 00 3F 41 48 44 52 00 00 00 0A 02 00 01 00 ...?AHDR........
000000F0 1E 57 A4 01 8D 05 49 4D 41 50 00 00 00 00 54 52 .W....IMAP....TR
00000100 43 4B 3F 00 00 00 40 B2 C0 FF 59 00 91 00 C1 07 CK?...@...Y.....
00000110 00 06 30 FE 10 02 32 10 02 32 60 05 8D 00 03 A4 ..0...2..2`.....
00000120 20 4D 77 20 41 44 4C 58 00 00 00 3F 41 48 44 52 Mw ADLX...?AHDR
00000130 00 00 00 0A 02 00 01 00 1E 57 A4 01 8D 05 49 4D .........W....IM
00000140 41 50 00 00 00 00 54 52 43 4B 3F 00 00 00 40 B6 AP....TRCK?...@.
00000150 C0 FF 8A 00 91 00 C1 07 00 08 30 FE 10 57 31 10 ..........0..W1.
00000160 57 31 60 05 8D 00 03 A4 20 4D 77 20 41 44 4C 58 W1`..... Mw ADLX
00000170 00 00 00 3F 41 48 44 52 00 00 00 0A 02 00 01 00 ...?AHDR........
00000180 1E 57 A4 01 8D 05 49 4D 41 50 00 00 00 00 54 52 .W....IMAP....TR
00000190 43 4B 3F 00 00 00 40 B6 C0 FF 8A 00 91 00 C1 07 CK?...@.........
000001A0 00 08 30 FE 10 02 32 10 02 32 60 05 8D 00 03 A4 ..0...2..2`.....
000001B0 20 4D 77 20 42 45 45 50 31 00 00 00 04 00 00 00 Mw BEEP1.......
000001C0 42 45 45 50 32 00 00 00 4C 00 00 00 43 55 52 53 BEEP2...L...CURS
000001D0 4F 52 31 00 94 00 00 00 43 55 52 53 4F 52 31 42 OR1.....CURSOR1B
000001E0 DC 00 00 00 43 55 52 53 4F 52 32 00 24 01 00 00 ....CURSOR2.$...
000001F0 43 55 52 53 4F 52 32 42 6C 01 00 00 CURSOR2Bl...
Alles anzeigen
Also am Anfang kommt erstmal ein Offset zu einem Index. Hier 01 B4, also Offset 436.
Und dort finden wir dann genau solche 12-Byte Einträge aus Namen + Offset, wie in den LIB Dateien: Der erste Eintrag ist "BEEP1", beginnend an Offset 4.
Die Daten sind dann kleine ADL Dateien, was das Format nochmal sehr anschaulich zeigt. Die Effekte dürften ja eigentlich nur aus den Instrumentdaten und vielleicht ein oder zwei Noten bestehen.
llm , du hattest ja bereits geschrieben, dass hinter den IDs vier Byte mit einer Größenangabe o.ä. folgen, bei unserem BEEP1 blieben so genau 30 Byte Daten über.
Es ist also sehr wahrscheinlichh, dass die TRCK-Chunks der ADL-Dateien mit den Instrumentdaten beginnen.
Das lässt sich ja schnell prüfen:
Hier der Anfang des TRCK Chunks aus der MNU.ADL:
00000022 54 52 43 4B 02 12 00 00 40 B1 8B 71 11 00 61 40 TRCK....@..q..a@
00000032 42 15 01 06 41 64 B...Ad
Nach der ID + 4 Byte (ab Offset 0x2A) folgen hier also 40 B1 8B 71 11....
Gucken wir mal in meine RAW Aufnahme HLMNU.RAW:
00000070 03 00 B1 20 8B 40 71 60 11 80 00 E0 61 23 7F 43 ... .@q`....a#.C
00000080 42 63 15 83 20 01 01 E3 06 C0 7F 43 64 21 DB 41 Bc.. ......Cd!.A
An Offset 0x72 steht, wonach wir suchen: 0xB1 wird an Register 0x20 geschrieben, 0x8B an Register 40, 0x71 an Register 60... Das passt ja schon richtig gut!
Ich habe euch grün markiert, wo es passt und rot, wo es Abweichungen gibt.
Die Abweichungen in den RAW-Daten lassen sich alle mit Blick auf den Programmer's guide zum OPL-2 schnell klären:
0x7F an Register 0x43 stellt Channel 0 auf maximale Lautstärke. Keine Ahnung, warum das hier zwei mal gemacht wird, aber es ist an sich nichts besonderes.
Und 0x20 an Register 0x01 stellt den OPL-2 auf "Waveform select enable", was an dieser Stelle wichtig ist, da als nächstes mit 0x01 an 0xE3 eine neue Waveform programmiert wird.
0x40 und 0x41 scheinen in den ADL-Daten also nicht für Daten zu stehen, die direkt an den OPL-2 geschrieben werden, sondern eine Art Steuerbefehel zu sein.
Geschrieben werden in diesem kurzen Ausschnitt die Register: 0x20,0x40,0x60,0x80,0xE0. Das entspricht den Modulator-Registern für Channel 0.
Mit 0x23,0x63,0x83,0xE3,0xC0 folgen dann die Carrier-Registerwerte.
Damit wird hier ein komplettes Instrument für Channel 0 programmiert und ist in der kleinsmöglichen Form, nämlich den direkten Registerwerten für den OPL-2, in der ADL Datei hinterlegt.
Nur ein Wert für die Instrumentlautstärke fehlt, was der Player als volle Lautstärke interpretiert.
Weiter geht es in der MNU.ADL dann mit einem Intrument für Channel 3. Wieder beginnend mit den Modulator-Registern.
Aber zurück zu BEEP1:
00000026 54 52 43 4B 3F 00 00 00 40 82 7F FA 55 02 92 80 TRCK?...@...U...
00000036 93 57 02 00 30 FE 10 63 2A 10 63 2A 60 05 8D 00 .W..0..c*.c*`...
00000046 01 D2 20 4D 77 20 .. Mw
Wenn wir davon ausgehen, dass es hier auch so ist, dann kennen wir nun die Bedeutung der ersten 11 Byte:
0x40 - Zählt nicht, dann kommen die Werte für fünf Modulator-Register und dann die für fünf der sechs Carrier-Register.
Wenn ich etwas Zeit finde, packe ich die Werte mal in den Instrument-Editor eines Adlib-Trackers und gucke, ob ich dann einen bekannten Ton aus dem HL-Menü bekomme