Beiträge von Dragonsphere

    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:

    Code
    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ößeWertBedeutung
    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
    02Bei allen ADL Dateien 2, eventuell Dateiformatversion?
    0x11 - 1 Byte
    00Bei allen ADL Dateien 0. Eventuell auch Version, also 2.0?
    0x12 - 1 Byte
    08Bei den Soundeffekten in der .ADX steht hier 1. Also wohl Anzahl der verwendeten Kanäle/Tracks
    0x13 - 1 Byte
    00Noch zu klären...
    0x14 - 1 Byte
    5FNoch zu klären....
    0x15 - 1 Byte
    8BNoch zu klären...
    0x16 - 1 Byte
    A4Noch zu klären..
    0x17 - 1 Byte
    01Noch 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
    E9Timing / 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. :)

    Ja, die Mapview.cpp ist schleet portierbar. Wie gesagt, hatte ich dafür jetzt erstmal einfach Visual Studios Windows API Vorlage genommen, um ein bisschen auszuprobieren. War auch erstmal mehr als Test für die beiden Header-Dateien gedacht, die bis auf Verweise auf HDCs auch keinen Win32 API Code beinhalten, was ja leicht durch entsprechende Screenbuffer bzw. Pointer/Handle ersetzt werden kann.

    Den ganzen "Fenster-Kram" bräuchte man ja für DOS sowieso nicht. :D Da brauchen wir ja sowie eine andere Oberfläche und damit ein eigenes Hauptprogramm.

    Um für DOS das Speichermanagement mit möglichst geringem Aufwand anzupassen, würde ich einfach mit dem oberen Speicherbereich arbeiten und XMS verwenden.


    Mit Qt habe ich noch nichts gemacht, gucke ich mir aber natürlich gerne an.

    Code
    //Ein Hexfeld hat einen Durchmesser von 24 Pixeln

    ist das nicht eher die Seiten/Kantenlänge?

    Es ist eine Seitenlänge der quadratischen Tile-Grafik und damit der Durchmesser des Felds von einer Außenkannte zur anderen:


    baut



    hab noch byte durch byte_t ersetzt - beisst sich mit std::byte wenn man aktuellere C++ Standards verwendet und das böse "using namespace std" macht :)

    Dieser "böse" Code macht aber vieles auch lesbarer und stand damals sogar als quasi Standard für den Beginn jedes C Programs in meinem Lehrbuch. Würde man heute vermutlich nicht mehr so in ein Tutorial schreiben.

    Den und die 16 Bit Datentypen habe ich aus Faulheit, beim kopieren des unter DOS mit Borland C++ geschriebenen Codes, mitgenommen. Ist sonst ja auch ein bisschen schwierig, wenn ein int auf einem anderen System plötzlich deutlich größer ist.

    Daher kam übrigens auch die cpp Dateiendung für eigentlichen C Code, die du hier mal angemerkt hast. Wenn ich in der alten Borland IDE im Code IOSTREAM verwende, ist es für den alten Compiler sofort C++ und er kann das nur verarbeiten, wenn die Dateiendung auch cpp ist.

    Ich sollte mir wohl mal einen moderneren Compiler unter DOS installieren :D

    Habe am Wochende die Zeit gefunden mal Visual Studio einzurichten und etwas Code zu schreiben :)

    sollten Map.x und Map.y auf dem Screenshot nicht eher width und height sein?

    Da postet man einmal einen Screenshot und schon werden hier die paar Zeilen Code im Hintergrund analysiert :D

    Aber ja, width und height wäre hier natürlich korrekt. Werde ich entsprechend anpassen. Wie geschrieben habe ich erstmal nur etwas rumprobieren wollen und da war ich an der Stelle wohl etwas schreibfaul.

    Das ganze basiert auch auf den Standarddateien, die Visual Studio für eine Windows Desktopanwendung generiert und hat noch so einige Macken.


    Zitat

    Ich habe erstmal nur etwas rumprobiert. Ist auch mein erstes Windows-Projekt seit bestimmt 10 Jahren, da musste ich mich erstmal wieder etwas reindenken.

    stell einfach mal ein Zip ein dann kann ich das CMaken und auch linuxen

    llm, hier, wie gewünscht, der aktuell Stand mit allen Dateien als ZIP. Ich habe inzwischen noch 2x Skalierung der Bitmaps und Scrollen ergänzt.

    Damit es funktioniert, muss in der MapViewer.cpp bei den globalen Variablen den Pfad zu HL1914-1918 angepasst werden. Einen Datei-Öffnen-Dialog gibt es aktuell noch nicht. :)


    lib.h enthält alles, um die Bitmaps für Gelände und Einheiten einzulesen und zu zeichnen.

    fin.h entsprechend alles, um eine Karte zu lesen und zu zeichnen.

    Der Code in den beiden Dateien sollte sich auch recht problemlos für andere Systeme verwenden lassen.


    Edit: Die kompilierte EXE im x64\Debug Ordner funktioniert natürlich nicht, da sie meine Pfadangaben verwendet. Ich habe hier aber zum Testen auch nochmal die Spieldateien in gepackter und ungepackter Form abgelegt.

    hast du auch ein Github Projekt oder sowas?

    Kommt :)

    Ich habe erstmal nur etwas rumprobiert. Ist auch mein erstes Windows-Projekt seit bestimmt 10 Jahren, da musste ich mich erstmal wieder etwas reindenken.

    Beruflich brauche ich nur ab und an etwas SQL, ansonsten ist Programmieren bei mir inzwischen reines Hobby und da hauptsächlich unter DOS :D

    Werde den Code in den nächsten Tagen mal etwas aufhübschen und dann bei Github einstellen.

    Bei der Musik bin ich wieder ein kleines bisschen weiter:

    Alles nach der TRCK-ID und der seltsamen Größenangabe, zu der ja llm schon etwas schrieb, scheint sich als Stream aus einem Befehlsbyte, dem dann unterschiedlich viele Datenbytes folgen, interpretieren zu lassen.

    In der MNU.ADL beginnen die TRCK Daten mit 0x40 gefolgt von den Instrument-Registerdaten für Channel 0, dann 0x41 und die Instrument-Daten für Channel 1 usw.

    0x40 + Channel scheint also der Code für "Set instrument data" zu sein.Generell scheinen 10er Hexzahlen für die Kommandos zu stehen.


    Was dann kommt, versuche ich mal als Tabelle darzustellen (alle Zahlen in Hex):

    Daten in der ADL
    Ergibt OPL-2 Befehle (aus der RAW)
    Bedeutung
    60 06 A9
    War nicht zu finden...
    Eventuell Timing über den PIT und daher nicht in den OPL-2 Befehlen?
    30 D6
    Schreibe 7F in Register 43
    Setze Lautstärke für Channel 0
    10 CA 29
    Schreibe CA in Register A0
    Schreibe 29 in Register B0
    Spiele Note F-2 auf Channel 0
    31 FE
    Schreibe FF in Register 44
    Setze Lautstärke für Channel 1
    32 A2
    Schreibe 3F in Register 45
    Setze Lautstärke für Channel 2
    12 CA 2D
    Schreibe CA in Register A2
    Schreibe 2D in Register B2
    Spiele Note F-3 auf Channel 3
    33 FE
    Schreibe 3F in Register 4B
    Setze Lautstärke für Channel 3
    13 CA 2DSchreibe CA in Register A3
    Schreibe 2D in Register B3
    Spiele Note F-3 auf Channel 4
    34 7E
    Schreibe BF in Register 4C
    Setze Lautstärke für Channel 4
    14 CA 31
    Schreibe CA in Register A4
    Schreibe 31 in Register B4
    Spiele Note C-4 auf Channel 5
    35 BE
    Schreibe 3F ind Register 4D
    Setze Lautstärke für Channel 5
    36 BE
    Schreibe 3F in Register 53Setze Lautstärke für Channel 6
    37 BE
    Schreibe 3F in Register 54Setze Lautstärke für Channel 7
    E9 23 24
    Timer des OPL-2 wird programmiert und Register 43 -54 erhalten neue Werte
    Scheint ein Volume Slide Effekt o.ä. auf allen Channeln zu sein
    E9 22Schreibe 0D an Register B3,11 an Register B4, 2x neue Werte für Register 43 -54
    Key-off Channel 4, geänderte Frequenz Channel 5, Volume slide geht weiter
    12 CA 2D
    Schreibe CA in Register A2
    Schreibe 2D in Register B2
    Spiele Note F-3 auf Channel 3
    14 57 31
    Schreibe 57 in Register A4
    Schreibe 31 in Register B4
    Spiele Note C-4 auf Channel 5
    ...



    Das sieht schon mal sehr vielversprechend aus. Allerdings gibt es haufenweise offene Fragen und von einem Player bin ich noch weit entfernt.

    Unklar sind zum Beispiel die Registerwerte. Wenn eine Note gespielt werden soll, stehen die entsprechenden Werte für die OPL-Register korrekt in der ADL-Datei.

    Bei einem "35 BE" in der ADL Datei, wird aber zum Beispiel 3F geschrieben, nicht BE. Die Lautstärkeangaben passen aber durchgehend nicht. Schon beim setzen der Instrumentendaten werden vom Spiel andere Lautstärkeangaben verwendet, als in der ADL Datei stehen.

    Und wenn Ex komplexe Effekte, wie bei einem Tracker, auslöst, wird es natürlich richtig spaßig. Auch das auf E9 anscheinend unterschiedlich viele Datenbytes folgen können, macht es nicht leichter.


    Und generell ist noch völlig offen, wie das Timing funktioniert. Auch die Angaben im Header sind noch ein großes Rätsel.

    Mir ist aufgefallen, dass die Datei erst geladen wird, wenn eine Karte geladen wird. Wenn man DosBox und einen Hexeditor nebeneinander offen hat, muss man also nicht nach jeder Änderung das Spiel komplett neu starten, es reicht zurück ins Hauptmenü zu gehen, die Datei im anderen Fenster zu ändern und dann in HL wieder ein Spiel zu starten und zu gucken, was das Spiel draus macht.

    Ich habe für meine bisherigen Tests TROLL genommen, da hat man den Spähpanzer direkt neben dem HQ stehen und als 2-Spieler Karte kann man sie schnell beenden, ohne die alten Zeitungsartikel o.ä. überspringen zu müssen.

    ich hab keine Ahnung - gibt es eine Möglichkeit die "Stärken" irgendwo im Spiel zu sehen

    Einheit anklicken und Maus bei gedrückter Maustaste nach unten ziehen. Dann erscheint ein ? und wenn die Maustaste los gelassen wird ein Fenster mit den Einheitendetails.

    Das Handbuch ist natürlich praktisch, wenn man die Werte mehrerer Einheiten in der Datei schnell abgleichen will.

    Was ich in deinem Screenshot gerade sehe: Einheiten, die über zwei Felder gehen, stehen (wie auch bei der Nummeriereung) zweimal drin. Das bedeutet ja, man könnte z.B. dem Bug des Schlachtschiffs andere Angriffswerte geben, als dem Heck... Das muss ich nachher dringend mal ausprobieren :D

    Zitat

    Die UNIT.DAT im Hauptverzeichnis des Spiels mit den Wertden der einzelnen Einheiten!

    Ist die auch in so einem Lib-Format?

    Es gibt zwei Dateien mit dem Namen! Einmal im Unterverzeichnis "LIB", die enthält die IDs aus UNIT.LIB in der für die Nummerierung im Spiel passenden Reihenfolge.

    Und noch einmal im Hauptverzeichnis des Spiels. Das ist die, die ich hier meine.


    Die ist nicht im LIB Format. Es scheinen einfach Datenblöcke von etwa 70 Byte pro Einheit zu sein. Direkt die Bytes an den Offsets 0 und 1 der Datei ändern Reichweite/Geschwindingkeit des Spähpanzers.

    Für den geplanten Editor sind aber andere Infos ja eigentlich noch viel wichtiger: Die UNIT.DAT im Hauptverzeichnis des Spiels mit den Wertden der einzelnen Einheiten!

    Hat vielleich jemand, auch von denen ohne Programmiererfahrung :), gerade Zeit und Lust ein bisschen mit einemHexeditor und dem Spiel auszuprobieren, wofür die einzelnen Bytes stehen?


    Der Anfang der (entpackten) Datei sieht so aus:

    Es gibt also auf jeden Fall Datensätze, die mit einem Kategorienamen und dem Namen der Einheit enden. Der erste Datensatz ist also der Spähpanzer.


    Laut Handbuch hat der folgende Werte:


    Angriffswerte:

    gegen Luftziele 0/0

    gegen Landziele 1/35 (in Hex 01/23)

    gegen Wasserziele 1/35


    Verteidigungswert 30 (1E als Hexwert)

    Geschwindigkeit 6

    Gewicht 3

    Gruppenstärke 6

    Produktionskosten 55 (37 als Hexwert)


    Das zweite Byte könnte also die Geschwindgkeit oder die Gruppenstärke sein. Das dritte ist höchstwahrscheinlich der Verteidigungswert.

    Die Bytes 11,12,13 sind wohl die Angriffswerte.....


    Also probiert doch mal aus, ob ihr durch Ändern einen Super-Spähpanzer erschaffen könnt :D

    Ich hänge die entpackte UNIT.DAT mal mit an, dann könnt ihr euch die einfach runterladen und editieren.

    das hab ich doch schon vor Tagen gepostet :)

    Ich werde wohl blind und vergesslich...:D Hatte deinen Beitrag dazu sogar kürzlich nochmal gelesen und jetzt beim Tippen war's weg. Das kommt davon, wenn ich neben Arbeit und Familie immer nur hier und da mal ein bisschen Zeit dafür finde.

    Leider bekommt es mir wohl nicht sonderlich gut, wenn ich meinem Arbeitgeber sage, ich brauche mehr Freizeit um ein DOS-Spiel auseinandernehmen zu können und meiner Frau mit derselben Begründung bei Kindern und Haushalt komme.... ;)



    sieht ja auch fast so aus als wenn das beinhahe klar wäre wie es läuft


    könntest du deinen alten Player drauf ummodeln oder unterscheidet sich das doch zu stark?

    Ich habe jetzt eine Anhnung wo und wie die einzelnen Instrumente definiert werden. Aber leider noch absolut keinen Plan, was die Noten angeht.

    Ich weiß noch nicht, ob die Daten ähnlich einer Midi-Datei gespeichert sind (wie CMF z.B.) oder in Pattern, wobei das ja eigentlich erst später mit der Demo scene aufkam.

    Es könnte theoretisch sogar ein Stream aus den Registerwerten sein, denn vergleicht man die Werte aus der RAW oder DRO Datei mit denen in der ADL gibt es schon Ähnlichkeiten, aber auch große Unterschiede.

    Eventuell kommen hier erst nur Daten für Channel 0, dann für 1 usw.

    Die 14 gleichen Noten am Anfang von Track 2 suche ich aber noch.

    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 :D


    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:

    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:

    Code: 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:

    Code: 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:

    Code: BEEP1 in MNU.AFX
    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 :)

    Ergänzend hier auch nochmal die ersten ca. 25 Sekunden der Menümusik als RAW mit RDOS Adlib Catcher gespeichert.

    Das Format ist noch etwas simpler aufgebaut als DRO, da hier die Register direkt mit drin stehen.

    In der Datei wird an Offset 0x144 zum ersten Mal eine Frequenz auf Kanal 0 ausgegeben. Hierfür wird 0xCA an Register 0xA0 und 0x29 an Register 0xB0 geschrieben.


    Binär sieht das dann ja so aus:


    Register 0xA0: 11001010

    Register 0xB0: 00101001


    Gemäß der oben von mir zietierten Abbildung aus dem alten Programmer's guide ergibt das also:


    F-Nummer: 000111001010 (= 458)

    Block: 010 (= 2)


    Die F-Nummern können zwar nicht direkt als Frequenz in Herz gelesen werden, aber die "Blöcke" recht gut als Oktaven. Damit bekommt man dann ja auch die F-Nummern für die Noten:

    Code
    Note          C      C#       D      D#      E       F       F#       G       G#     A       A#       B
    F-number     342     363     385     408     432     458     485     514     544     577     611     647

    Und da haben wir ja auch unsere 458 aus den Daten, direkt in der Mitte. Auf Kanal 0 wird also als erste Note ein F in Oktave 2 gespielt, oder F-2, wie es im Tracker aussehen würde. :)


    Die nächste Note für Kanal 0 dann an Offset 0x2EC, hier werden 0x41 und 0x2A in die Register geschrieben, was F-Nummer 577 und Block 2 ergibt. Also ein A-2.

    Und dann, an Offset 0x458 wieder 0xCA und 0xA0, also wieder ein F-2.


    Für Track 0 sähe also der Anfang eines Pattern etwa so aus:

    A-2

    ......

    F-2

    ......

    A-2


    Jetzt müssen wir die Sequenz nur noch irgendwie in der ADL-Datei wiederfinden....



    Nachtrag:

    Richtig viel los ist auf Kanal 2, also bei den Registern 0xA2 und 0xB2. Die ersten 14 (!) Noten sind hier alle F-3.

    (Einfach mal mit dem Hexeditor nach der Bytefolge "CAA22DB2" suchen).


    Das müsste sich doch auch in der ADL erkennen lassen.

    Ja, das DRO-Format meinte ich. Jetzt muss man nur bedenken, dass Yamaha ja diese F-Nummern für die Frequenz nutzte....



    Aus:

    Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer

    Written by Vladimir Arnost, QA-Software



    Und aus einem uralten Player von mir habe ich noch diese Funktion, die die aktuell gespielte Frequenz eines Kanals ermittelt:






    wenn man vom trck_value die trck_data.size abzieht kommt immer 33 oder 34 als Rest raus fuer alle adl/afx Dateien

    in den Daten selber sehe ich aber keine Bezug dazu

    Die 34 Byte könnten doch die Instrumentdefinition für den jeweilgen Channel/Track sein.

    Rein für die benötigten Register des OPL-2 braucht man mindestens 12 Byte, oft sind es in Instrument-Dateien aber mehr, wenn einzelne Nibble oder sonstige Bit-Bereiche eines Registers in mehreren Byte gespeichert sind.

    Wenn wir mal vom Adlib Visual Composer von Adlib selbst als Standard ausgehen, dann besteht ein Instrument aus mindestens 17 Werten.

    Adlib selbst hat das in den früheren Versionen als Words gespeichert, was mich sehr gewundert hat, als ich mal einen Player für *.ROL/*.MUS geschrieben habe. Da BlueByte ja bei HL aber auch dazu neigte, kleine Zahlen in Words zu speichern, kann das hier aber auch sehr gut passen.

    Und mit 2x17 wären wir genau bei den 34 Byte. Die 33 Byte könnten vielleicht Instrumente für den Percussion Mode sein, da braucht man nicht alle Register.


    AdLib Instrument Format - ModdingWiki