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.

Siehe auch

'Persönliche Werkzeuge