Added EndLoopJump
This commit is contained in:
parent
06e914d30c
commit
486880262b
|
@ -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]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue