Added EndLoopJump

This commit is contained in:
Luke Hubmayer-Werner 2018-04-18 21:28:31 +09:30
parent 06e914d30c
commit 486880262b
2 changed files with 35 additions and 8 deletions

View File

@ -232,6 +232,7 @@ BGM_Tracks = (
"The Decisive Battle", "The Silent Beyond", "Dear Friends", "Final Fantasy", "The Decisive Battle", "The Silent Beyond", "Dear Friends", "Final Fantasy",
"A New Origin", "Chirping sound" "A New Origin", "Chirping sound"
) )
BGM_Tracks_Safe = [t.replace('/', '-') for t in BGM_Tracks]

View File

@ -25,6 +25,7 @@ Trailing 8 bytes are 16 4bit nibbles that make up the compressed samples.
import sys import sys
from midiutil import MIDIFile from midiutil import MIDIFile
from includes.helpers import indirect, hex from includes.helpers import indirect, hex
from includes.const import BGM_Tracks_Safe
def generate_pointer_set(data): def generate_pointer_set(data):
''' '''
@ -125,7 +126,7 @@ class SPCParser:
(2, 'SlideEchoVel'), # 0xF6 (2, 'SlideEchoVel'), # 0xF6
(2, 'unk2'), # 0xF7 (2, 'unk2'), # 0xF7
(1, 'SetGlobalVel'), # 0xF8 (1, 'SetGlobalVel'), # 0xF8
(3, 'EndLoopJump'), # 0xF9 (3, self._end_loop_jump), # 0xF9
(2, self._jump), # 0xFA (2, self._jump), # 0xFA
(0, 'unk'), # 0xFB does not end track (0, 'unk'), # 0xFB does not end track
(0, self._end_channel), # 0xFC (0, self._end_channel), # 0xFC
@ -173,15 +174,25 @@ class SPCParser:
print('\tStarting loop level {} - repeat x{}'.format(len(self.loop_i), repeats)) print('\tStarting loop level {} - repeat x{}'.format(len(self.loop_i), repeats))
self.loop_i.append(self.i) self.loop_i.append(self.i)
self.loop_repeats.append(repeats) self.loop_repeats.append(repeats)
self.loop_passes.append(1)
def _end_loop(self): def _end_loop(self):
print('\tEnding loop level {} - repeating x{}'.format(len(self.loop_i)-1, self.loop_repeats[-1])) print('\tEnding loop level {} - pass {} of {}'.format(len(self.loop_i)-1, self.loop_passes[-1], self.loop_repeats[-1]+1))
if self.loop_repeats[-1] > 0: if self.loop_passes[-1] < self.loop_repeats[-1]+1:
self.i = self.loop_i[-1] self.i = self.loop_i[-1]
self.loop_repeats[-1] -= 1 self.loop_passes[-1] += 1
else: else:
self.loop_i.pop() self.loop_i.pop()
self.loop_repeats.pop() self.loop_repeats.pop()
self.loop_passes.pop()
def _end_loop_jump(self, loop_pass, *address):
if self.loop_passes[-1] >= loop_pass:
print('\tEnding loop level {} with jump - pass {} of {}'.format(len(self.loop_i)-1, self.loop_passes[-1], self.loop_repeats[-1]+1))
self.loop_i.pop()
self.loop_repeats.pop()
self.loop_passes.pop()
self._jump(*address)
def _jump(self, *address): def _jump(self, *address):
''' '''
@ -207,7 +218,7 @@ class SPCParser:
print('Parsing') print('Parsing')
self.m = MIDIFile(len(tracks)) self.m = MIDIFile(len(tracks))
self.velocity = 100 self.velocity = 100
self.max_full_repeats = 2 self.max_full_repeats = 4
self.track_end = [] self.track_end = []
for track, (t, address) in enumerate(tracks): for track, (t, address) in enumerate(tracks):
print('\nCreating track', track, hex(address, 6)) print('\nCreating track', track, hex(address, 6))
@ -218,6 +229,7 @@ class SPCParser:
self.transpose = 0 self.transpose = 0
self.loop_i = [] self.loop_i = []
self.loop_repeats = [] self.loop_repeats = []
self.loop_passes = []
self.full_repeats = 0 self.full_repeats = 0
self.i = 0 self.i = 0
while self.i < len(t): while self.i < len(t):
@ -251,7 +263,12 @@ def get_song_data(rom, id):
offset = indirect(rom, lookup_offset, 3)-0xC00000 offset = indirect(rom, lookup_offset, 3)-0xC00000
bank = offset & 0xFF0000 bank = offset & 0xFF0000
size = indirect(rom, offset) size = indirect(rom, offset)
track_ptrs = [indirect(rom, offset+i)+bank for i in range(2, 22, 2)] def get_track_ptr(rom, offset, bank, i):
a = indirect(rom, offset+i) + bank
if a < offset:
a += 0x010000 # Bank shift
return a
track_ptrs = [get_track_ptr(rom, offset, bank, i) for i in range(2, 22, 2)]
if track_ptrs[0] != track_ptrs[1]: if track_ptrs[0] != track_ptrs[1]:
print('Master is not channel 1, interesting', track_ptrs) print('Master is not channel 1, interesting', track_ptrs)
tracks = [(rom[i:j], i) for i, j in zip(track_ptrs[1:-1], track_ptrs[2:])] tracks = [(rom[i:j], i) for i, j in zip(track_ptrs[1:-1], track_ptrs[2:])]
@ -270,5 +287,14 @@ def read_rom(filename=filename_jp):
if __name__ == '__main__': if __name__ == '__main__':
#main(sys.argv[1]) #main(sys.argv[1])
tracks = get_song_data(read_rom(), int(sys.argv[1])) if len(sys.argv) > 1 and sys.argv[1]:
make_midi_file(tracks) i = int(sys.argv[1])
filename = 'test {:02d} - {}.mid'.format(i, BGM_Tracks_Safe[i])
tracks = get_song_data(read_rom(), i)
make_midi_file(tracks, filename=filename)
else:
for i, t in enumerate(BGM_Tracks_Safe):
filename = 'test {:02d} - {}.mid'.format(i, t)
print('Creating MIDI {}'.format(filename))
tracks = get_song_data(read_rom(), i)
make_midi_file(tracks, filename=filename)