Slightly optimize BRR loading
This commit is contained in:
parent
3a9c4baa78
commit
009e6933ef
|
@ -48,20 +48,6 @@ func process_sample(mantissa: int, exponent: int) -> int:
|
||||||
var unsigned = (mantissa << exponent) & 0xFFFF
|
var unsigned = (mantissa << exponent) & 0xFFFF
|
||||||
return unsigned16_to_signed(unsigned)
|
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:
|
func clamp_short(i: int) -> int:
|
||||||
if i < -0x8000:
|
if i < -0x8000:
|
||||||
return -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 samples = PoolIntArray([0, 0]) # Start with two zero samples for filter purposes, strip them from the actual output
|
||||||
var i := 2
|
var i := 2
|
||||||
for pkt in num_packets:
|
for pkt in num_packets:
|
||||||
var data = decode_brr(rom.get_buffer(9))
|
# Decode a single 9byte BRR packet
|
||||||
samples.append_array(data[0])
|
var header_byte := rom.get_8()
|
||||||
#var loop = data[1]
|
var exponent := header_byte >> 4
|
||||||
var end = data[2]
|
var filter := (header_byte >> 2) & 0x03
|
||||||
var filter = data[3]
|
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:
|
match filter:
|
||||||
1:
|
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)
|
samples[j] = clamp_short(samples[j] + (samples[j-1]*15)/16)
|
||||||
2:
|
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)
|
samples[j] = clamp_short(samples[j] + (samples[j-1]*61)/32 - (samples[j-2]*15)/16)
|
||||||
3:
|
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)
|
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')
|
||||||
|
@ -202,12 +195,12 @@ func load_bgms(rom: File):
|
||||||
|
|
||||||
var player := AudioStreamPlayer.new() # Make one for each channel, later
|
var player := AudioStreamPlayer.new() # Make one for each channel, later
|
||||||
func play_sample(id: int):
|
func play_sample(id: int):
|
||||||
print('Playing sample #%02X' % id)
|
print('Playing inst sample #%02X' % id)
|
||||||
player.stream = instrument_samples[id]
|
player.stream = instrument_samples[id]
|
||||||
player.play()
|
player.play()
|
||||||
|
|
||||||
func play_sfx(id: int):
|
func play_sfx(id: int):
|
||||||
print('Playing sample #%02X' % id)
|
print('Playing sfx sample #%02X' % id)
|
||||||
player.stream = sfx_samples[id]
|
player.stream = sfx_samples[id]
|
||||||
player.play()
|
player.play()
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,10 @@ func _create_sfx_buttons():
|
||||||
var disable_btn := !SoundLoader.has_loaded_audio_samples
|
var disable_btn := !SoundLoader.has_loaded_audio_samples
|
||||||
for i in SoundLoader.INST_NUM:
|
for i in SoundLoader.INST_NUM:
|
||||||
var btn = Button.new()
|
var btn = Button.new()
|
||||||
btn.text = 'Play #%02X' % i
|
btn.text = 'Inst #%02X' % i
|
||||||
btn.align = Button.ALIGN_CENTER
|
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)
|
add_child(btn)
|
||||||
btn.connect('pressed', SoundLoader, 'play_sample', [i])
|
btn.connect('pressed', SoundLoader, 'play_sample', [i])
|
||||||
inst_buttons.append(btn)
|
inst_buttons.append(btn)
|
||||||
|
@ -18,7 +19,8 @@ func _create_sfx_buttons():
|
||||||
var btn = Button.new()
|
var btn = Button.new()
|
||||||
btn.text = 'SFX #%02X' % i
|
btn.text = 'SFX #%02X' % i
|
||||||
btn.align = Button.ALIGN_CENTER
|
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)
|
add_child(btn)
|
||||||
btn.connect('pressed', SoundLoader, 'play_sfx', [i])
|
btn.connect('pressed', SoundLoader, 'play_sfx', [i])
|
||||||
sfx_buttons.append(btn)
|
sfx_buttons.append(btn)
|
||||||
|
|
Loading…
Reference in New Issue