[BGM] Fix off-by-one in curve interpolator

This commit is contained in:
Luke Hubmayer-Werner 2024-07-28 09:28:34 +09:30 committed by Luke Hubmayer-Werner
parent ac03db778b
commit 5fed1672c9
1 changed files with 11 additions and 13 deletions

View File

@ -40,6 +40,12 @@ class TrackCurve: # built-in Curve class is too restrictive for this
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:
var l := len(self.entries)
@ -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]