def load_tmu(infile,song): index = 0 with open(infile,"rb") as file: data = file.read() file.close() val = data[index] index += 1 song.set_version(val & 0x0f) # version song.set_type(val >> 4) # type str = data[index:index+32] # name index += 32 song.name = str.decode('utf-8') str = data[index:index+32] # by index += 32 song.by = str.decode('utf-8') val = data[index] index += 1 song.set_speed(val) #speed val = data[index] index += 1 song.restart = val #order restart val = data[index] index += 1 song.set_length(val) #order length lst = data[index:index+song.length] index += song.length song.order_list = lst # order list for i in range(0,31): # set 16 instrument names. ins = Instrument(i+1) str = data[index:index+16] index += 16 try: ins.name = str.decode('utf-8') except: raise SystemExit(f"Error reading instrument name. Invalid data!") i += 1 song.ins.append(ins) for i in range(0,31): ins = song.ins[i] l = data[index] # length ins.set_length(l) index += 1 r = data[index] # restart ins.restart = r index += 1 if song.type == "SCC": w = data[index] # waveform ins.waveform = w else: v = data[index] # voice ins.voice = v index += 1 ins_data = data[index:index+(l*4)] r = 0 for r in range(0,l): row = ins_data[r*4:(r*4)+4] ins.rows.append(row) r+=1 index += (l*4) i += 1 if song.type == "SCC": # Waveform data for x in range(0,32): waveform = Waveform(x) waveform.data = data[index:index+32] song.waveforms.append(waveform) index +=32 else: for x in range(0,16): # Custom FM voices voice = Voice(x+178) voice.data = data[index:index+8] song.voices.append(voice) index +=8 # Drum names for d in range(0,20): drum = Drum(d) str = data[index:index+16] drum.name = str.decode('utf-8') d+=1 index+=16 song.drums.append(drum) #drum macros for d in range(0,20): drum = song.drums[d] l = data[index] drum.set_length(l) index+=1 drm_data = data[index:index+(l*7)] index+=l*7 r=0 for r in range(0,l): row = drm_data[r*7:(r*7)+7] drum.rows.append(row) r+=1 d+=1 # THIS IS TO OVERCOME AN ERROR IN THE FILES index = index -1 p = 0 # Patterns t = 0 while p != -1: num = data[index] if num == 255: break index+=1 l = data[index] l += ord(data[index+1:index+2])*256 index+=2 # decompress pattern cmp_pat = data[index:index+l] pat = decompress_pattern(cmp_pat) index+=l # store pattern pattern = Pattern(num,t) song.patterns.append(pattern) #print (pattern.tracks) # store tracks chan = 0 for chan in range(0,8): #print(f"Pat:{num} Track: {t}") track = Track(t) row = 0 for row in range(0,64): note = pat[(chan*4+row*32)+0] ins = pat[(chan*4+row*32)+1] tmp = int(pat[(chan*4+row*32)+2]) par = pat[(chan*4+row*32)+3] vol = tmp >> 4 cmd = tmp & 0x0f track.rows.append([note,ins,vol,cmd,par]) row += 1 chan += 1 t += 1 song.tracks.append(track)