Fix BRR filter bug, use PoolIntArray in loader (still slow)

This commit is contained in:
Luke Hubmayer-Werner 2023-07-26 22:21:25 +09:30
parent 7a9388bf2b
commit cb7f292e17
1 changed files with 20 additions and 13 deletions

View File

@ -52,7 +52,7 @@ func decode_brr(data: PoolByteArray):
var filter_designation := (data[0] >> 2) & 0x03 var filter_designation := (data[0] >> 2) & 0x03
var loop := bool(data[0] & 0x02) var loop := bool(data[0] & 0x02)
var end := bool(data[0] & 0x01) var end := bool(data[0] & 0x01)
var samples := [] var samples := PoolIntArray()
for i in range(1, 9): for i in range(1, 9):
var b := data[i] var b := data[i]
samples.append(process_sample(b >> 4, exponent)) samples.append(process_sample(b >> 4, exponent))
@ -60,8 +60,12 @@ func decode_brr(data: PoolByteArray):
return [samples, loop, end, filter_designation] return [samples, loop, end, filter_designation]
func clamp_short(i: int): func clamp_short(i: int) -> int:
return min(max(i, -0x8000), 0x7FFF) if i < -0x8000:
return -0x8000
if i > 0x7FFF:
return 0x7FFF
return i
func make_sample(rom: File, size: int, sample_rate: int) -> AudioStreamSample: func make_sample(rom: File, size: int, sample_rate: int) -> AudioStreamSample:
var audio := AudioStreamSample.new() var audio := AudioStreamSample.new()
@ -72,9 +76,11 @@ func make_sample(rom: File, size: int, sample_rate: int) -> AudioStreamSample:
if (size % 9) != 0: if (size % 9) != 0:
print_debug('Oh no! An instrument sample has an invalid size of %d! at $%06X' % [size, rom.get_position()-2]) print_debug('Oh no! An instrument sample has an invalid size of %d! at $%06X' % [size, rom.get_position()-2])
return audio return audio
var num_packets := size/9
var samples = [0, 0] # Two zero samples for filter purposes, strip them from the actual output var samples = PoolIntArray([0, 0]) # Start with two zero samples for filter purposes, strip them from the actual output
for pkt in (size / 9): var i := 2
for pkt in num_packets:
var data = decode_brr(rom.get_buffer(9)) var data = decode_brr(rom.get_buffer(9))
samples.append_array(data[0]) samples.append_array(data[0])
#var loop = data[1] #var loop = data[1]
@ -82,20 +88,21 @@ func make_sample(rom: File, size: int, sample_rate: int) -> AudioStreamSample:
var filter = data[3] var filter = data[3]
match filter: match filter:
1: 1:
for i in range(samples.size()-8, samples.size()): for j in range(samples.size()-16, samples.size()):
samples[i] = clamp_short(samples[i] + (samples[i-1]*15)/16) samples[j] = clamp_short(samples[j] + (samples[j-1]*15)/16)
2: 2:
for i in range(samples.size()-8, samples.size()): for j in range(samples.size()-16, samples.size()):
samples[i] = clamp_short(samples[i] + (samples[i-1]*61)/32 - (samples[i-2]*15)/16) samples[j] = clamp_short(samples[j] + (samples[j-1]*61)/32 - (samples[j-2]*15)/16)
3: 3:
for i in range(samples.size()-8, samples.size()): for j in range(samples.size()-16, samples.size()):
samples[i] = clamp_short(samples[i] + (samples[i-1]*115)/64 - (samples[i-2]*13)/16) samples[j] = clamp_short(samples[j] + (samples[j-1]*115)/64 - (samples[j-2]*13)/16)
if end: if end:
# print('End flag on packet') # print('End flag on packet')
break break
# Convert int array to byte array
var audio_data = PoolByteArray() var audio_data = PoolByteArray()
for i in range(2, samples.size()): for j in range(2, samples.size()):
var b = samples[i] var b = samples[j]
audio_data.append(b & 0xFF) audio_data.append(b & 0xFF)
audio_data.append(b >> 8) audio_data.append(b >> 8)
audio.data = audio_data audio.data = audio_data