Slightly optimize BRR loading

This commit is contained in:
Luke Hubmayer-Werner 2023-08-23 19:38:59 +09:30
parent 3a9c4baa78
commit 009e6933ef
2 changed files with 22 additions and 27 deletions

View File

@ -48,20 +48,6 @@ func process_sample(mantissa: int, exponent: int) -> int:
var unsigned = (mantissa << exponent) & 0xFFFF
return unsigned16_to_signed(unsigned)
func decode_brr(data: PoolByteArray):
# Decodes a single 9byte BRR packet
var exponent := data[0] >> 4
var filter_designation := (data[0] >> 2) & 0x03
var loop := bool(data[0] & 0x02)
var end := bool(data[0] & 0x01)
var samples := PoolIntArray()
for i in range(1, 9):
var b := data[i]
samples.append(process_sample(b >> 4, exponent))
samples.append(process_sample(b & 0x0F, exponent))
return [samples, loop, end, filter_designation]
func clamp_short(i: int) -> int:
if i < -0x8000:
return -0x8000
@ -83,20 +69,27 @@ func make_sample(rom: File, size: int, sample_rate: int) -> AudioStreamSample:
var samples = PoolIntArray([0, 0]) # Start with two zero samples for filter purposes, strip them from the actual output
var i := 2
for pkt in num_packets:
var data = decode_brr(rom.get_buffer(9))
samples.append_array(data[0])
#var loop = data[1]
var end = data[2]
var filter = data[3]
# Decode a single 9byte BRR packet
var header_byte := rom.get_8()
var exponent := header_byte >> 4
var filter := (header_byte >> 2) & 0x03
var loop := bool(header_byte & 0x02)
var end := bool(header_byte & 0x01)
for sample in 8:
var b := rom.get_8()
samples.append(process_sample(b >> 4, exponent))
samples.append(process_sample(b & 0x0F, exponent))
# Apply filter
var l := len(samples)
match filter:
1:
for j in range(samples.size()-16, samples.size()):
for j in range(l-16, l):
samples[j] = clamp_short(samples[j] + (samples[j-1]*15)/16)
2:
for j in range(samples.size()-16, samples.size()):
for j in range(l-16, l):
samples[j] = clamp_short(samples[j] + (samples[j-1]*61)/32 - (samples[j-2]*15)/16)
3:
for j in range(samples.size()-16, samples.size()):
for j in range(l-16, l):
samples[j] = clamp_short(samples[j] + (samples[j-1]*115)/64 - (samples[j-2]*13)/16)
if end:
# print('End flag on packet')
@ -202,12 +195,12 @@ func load_bgms(rom: File):
var player := AudioStreamPlayer.new() # Make one for each channel, later
func play_sample(id: int):
print('Playing sample #%02X' % id)
print('Playing inst sample #%02X' % id)
player.stream = instrument_samples[id]
player.play()
func play_sfx(id: int):
print('Playing sample #%02X' % id)
print('Playing sfx sample #%02X' % id)
player.stream = sfx_samples[id]
player.play()

View File

@ -7,9 +7,10 @@ func _create_sfx_buttons():
var disable_btn := !SoundLoader.has_loaded_audio_samples
for i in SoundLoader.INST_NUM:
var btn = Button.new()
btn.text = 'Play #%02X' % i
btn.text = 'Inst #%02X' % i
btn.align = Button.ALIGN_CENTER
btn.set_position(Vector2((i%8)*72, (i/8)*24))
btn.set_position(Vector2((i%7)*50, (i/7)*24))
btn.rect_min_size.x = 48
add_child(btn)
btn.connect('pressed', SoundLoader, 'play_sample', [i])
inst_buttons.append(btn)
@ -18,7 +19,8 @@ func _create_sfx_buttons():
var btn = Button.new()
btn.text = 'SFX #%02X' % i
btn.align = Button.ALIGN_CENTER
btn.set_position(Vector2((i%8)*72, 128 + (i/8)*24))
btn.set_position(Vector2((i%4)*50, 156 + (i/4)*24))
btn.rect_min_size.x = 48
add_child(btn)
btn.connect('pressed', SoundLoader, 'play_sfx', [i])
sfx_buttons.append(btn)