YI MusikHack
aus RHWiki, der freien Romhacking-Enzyklopädie
Hier wird kurz erklärt wie man in Yoshi's Island die Musik in dem ROM findet und wie man sie bearbeiten kann.
| Inhaltsverzeichnis |
Musik finden
Zunächst sollte man sich für ein Liedstück entscheiden. 0x23 ist Beispielsweise das Lied für die Startinsel. Die Liedstückauswahl geht bis 0x3C, wobei manche Lieder auch nur sehr kurz sind und sich nichtmal wiederholen.
In dem ROM befindet sich eine Liederliste an Offset 0x083A9C9C (Im Hexeditor einfach die 08 am Anfang weglassen). Dort gibt es zunächst eine Liste mit jeweils 4 Byte großen Einträgen, die die relative Position zum Lied ab 0x083A9C9C angeben. Um es einfacher auszudrücken:
Zunächst multipliziert man seine Liednummer mit 4. Dann addiert man 0x083A9C9C dazu und schaut in dem ROM welcher 4 Byte Wert dort steht. (Achtung: Je nach Hexeditor muss man aus 12 02 01 00 auch 00010212 machen (Bytes andersrum lesen)). Diesen Wert nimmt man dann und addiert 0x083A9C9C hinzu. Danach hat man die Position des Liedes in dem ROM.
Beispiel an Hand von Lied 0x23:
Lied 0x23 mal 4 = 0x8C 0x083A9C9C + 0x8C = 0x083A9D28 An dieser Stelle steht in dem ROM 94 44 01 00. Entspricht also der Zahl 0x00014494 0x083A9C9C + 0x00014494 = 0x083BE130 Das Lied befindet sich also an 0x083BE130.
Aufbau des Liedes
Das Lied selber ist in Form eines Scriptes gespeichert. Es gibt mehrere Kanäle die zeitgleich abgespielt werden können und dann durch den Mixer zusammengesetzt werden.
Das erste WORD bei dem Lied entspricht der Anzahl der Kanäle. Direkt danach steht für jeden Kanal ein WORD mit der Position, an der dieser Kanal im Script anfängt abzuspielen (relativ zur Anfangsposition der Lieddaten).
Beispiel an Hand von Lied 0x23:
08 00 12 00 39 00 F1 01 FF 02 ... \ / \ / \ / \ / \ / Anzahl Kanal Kanal Kanal Kanal Kanäle 1 2 3 4 Insgesammt 8 Kanäle. Anfangsposition: Kanal 1: 0x0012 + 0x083BE130 = 0x083BE142
Alles was danach folgt ist das Liedscript.
Funktionsreferenz
Hier eine kleine unvollständige Liste der Befehle im Script, die als Beispiel dienen sollen:
(VARIANT bedeutet in dieser Liste, dass es entweder 1 oder 2 Byte groß sein kann. Ist das erste
Byte >= 0x80 wird es mit 0x7F AND genommen und dann wird ein zweites Byte gelesen)
0x00 bis 0x5F Spiele einen Ton ab (Dauer und Lautstärke vom letzten Ton nehmen)
0x00: Niedrige Tonlage bis 0x5F: Hohe Tonlage
0x60 bis 0xBF Spiele einen Ton ab. Gefolgt von 1 VARIANT für die Dauer und 1 Byte für die Lautstärke.
0xC0 Wartet eine gewisse Zeit ab (Dauer von der letzten Pause nehmen)
0xC1 Wartet eine gewisse Zeit ab. Gefolgt von 1 VARIANT für die Dauer.
0xC2 Legt fest welcher Sound als nächstes abgespielt wird. Parameter: 1 Byte
0xC3 Legt die Balance fest. Parameter: 1 Byte
0xE0 Lautstärke dieses Kanales ändern. Parameter: 1 Byte
0xE4 Legt die Geschwindigkeit des Liedes fest. Parameter: 1 VARIANT
0xEA Lautstärke des kompletten Liedes ändern. Parameter: 1 Byte
0xF0 Springt an eine andere Position im Script. Parameter: 1 WORD (Relative Position vom Liedanfang)
0xF4 Ruft ein Scriptabschnitt bis zum 0xFF auf. Parameter: 1 WORD (Relative Position vom Liedanfang)
0xFF Ende des Scriptes/Scriptabschnittes
Möglicherweise gibt es aber auch bald ein kleines Tool zum Bearbeiten der Musik.

