From 5fed1672c906d7221069527c05d79c33494776e5 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Sun, 28 Jul 2024 09:28:34 +0930 Subject: [PATCH] [BGM] Fix off-by-one in curve interpolator --- scripts/MusicRenderer.gd | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/scripts/MusicRenderer.gd b/scripts/MusicRenderer.gd index f8b6719..cee5ca1 100644 --- a/scripts/MusicRenderer.gd +++ b/scripts/MusicRenderer.gd @@ -39,6 +39,12 @@ class TrackCurve: # built-in Curve class is too restrictive for this elif self.entries[i].x > pulse: self.entries.insert(i, entry) break + + func add_slide(pulse_start: int, duration: int, value: float) -> void: + if duration == 0: + duration = 256 + self.add_point(pulse_start, self.get_pulse(pulse_start), true) + self.add_point(pulse_start + duration, value) var last_pulse_block_get: int = -1 # Cache previous position for sequential lookups func get_pulse(pulse: float) -> float: @@ -47,7 +53,7 @@ class TrackCurve: # built-in Curve class is too restrictive for this return self.default if pulse >= self.entries[-1].x: return self.entries[-1].y - for i in l-2: + for i in l-1: # Find first entry beyond if pulse < self.entries[i+1].x: if self.entries[i].z > 0: # ramp_to_next @@ -202,11 +208,9 @@ static func render_channels(tracks: Array, inst_map: Array, _debug_name := 'none var new_tempo = music.tempo_to_seconds_per_pulse(event[1]) curve_master_tempo.add_point(p, new_tempo, false) EventType.TEMPO_SLIDE: - var old_tempo = curve_master_tempo.get_pulse(p) var new_tempo = music.tempo_to_seconds_per_pulse(event[2]) var slide_duration: int = event[1] # TODO: work out how this is scaled - curve_master_tempo.add_point(p, old_tempo, true) - curve_master_tempo.add_point(p + slide_duration, new_tempo, false) + curve_master_tempo.add_slide(p, slide_duration, new_tempo) EventType.NOTE: var note = event[1] var duration = event[2] @@ -237,20 +241,16 @@ static func render_channels(tracks: Array, inst_map: Array, _debug_name := 'none var new_velocity: float = event[1]/255.0 curve_velocity.add_point(p, new_velocity, false) EventType.VOLUME_SLIDE: # TODO: implement slides - var old_velocity = curve_velocity.get_pulse(p) var slide_duration: int = event[1] var new_velocity: float = event[2]/255.0 - curve_velocity.add_point(p, old_velocity, true) - curve_velocity.add_point(p + slide_duration, new_velocity, false) + curve_velocity.add_slide(p, slide_duration, new_velocity) EventType.PAN: var new_pan = 1.0 - event[1]/127.5 curve_pan.add_point(p, new_pan, false) EventType.PAN_SLIDE: # TODO: implement slides - var old_pan = curve_pan.get_pulse(p) var new_pan = 1.0 - event[2]/127.5 var slide_duration: int = event[1] # TODO: work out how slides are scaled - curve_pan.add_point(p, old_pan, true) - curve_pan.add_point(p + slide_duration, new_pan, false) + curve_pan.add_slide(p, slide_duration, new_pan) EventType.PITCH_SLIDE: # TODO: implement slides var slide_duration: int = event[1] var target_pitch: int = event[2] # Signed @@ -335,10 +335,8 @@ static func render_channels(tracks: Array, inst_map: Array, _debug_name := 'none curve_echo_volume.add_point(p, event[1]) EventType.ECHO_VOLUME_SLIDE: var slide_duration: int = event[1] # TODO: work out how slides are scaled - var old_echo_volume = curve_echo_volume.get_pulse(p) var new_echo_volume = event[2] - curve_echo_volume.add_point(p, old_echo_volume, true) - curve_echo_volume.add_point(p + slide_duration, new_echo_volume) + curve_echo_volume.add_slide(p, slide_duration, new_echo_volume) EventType.ECHO_FEEDBACK_FIR: # TODO var feedback: int = event[1] var filterIndex: int = event[2]