[BGM] Fix off-by-one in curve interpolator
This commit is contained in:
parent
ac03db778b
commit
5fed1672c9
|
@ -40,6 +40,12 @@ class TrackCurve: # built-in Curve class is too restrictive for this
|
||||||
self.entries.insert(i, entry)
|
self.entries.insert(i, entry)
|
||||||
break
|
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
|
var last_pulse_block_get: int = -1 # Cache previous position for sequential lookups
|
||||||
func get_pulse(pulse: float) -> float:
|
func get_pulse(pulse: float) -> float:
|
||||||
var l := len(self.entries)
|
var l := len(self.entries)
|
||||||
|
@ -47,7 +53,7 @@ class TrackCurve: # built-in Curve class is too restrictive for this
|
||||||
return self.default
|
return self.default
|
||||||
if pulse >= self.entries[-1].x:
|
if pulse >= self.entries[-1].x:
|
||||||
return self.entries[-1].y
|
return self.entries[-1].y
|
||||||
for i in l-2:
|
for i in l-1:
|
||||||
# Find first entry beyond
|
# Find first entry beyond
|
||||||
if pulse < self.entries[i+1].x:
|
if pulse < self.entries[i+1].x:
|
||||||
if self.entries[i].z > 0: # ramp_to_next
|
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])
|
var new_tempo = music.tempo_to_seconds_per_pulse(event[1])
|
||||||
curve_master_tempo.add_point(p, new_tempo, false)
|
curve_master_tempo.add_point(p, new_tempo, false)
|
||||||
EventType.TEMPO_SLIDE:
|
EventType.TEMPO_SLIDE:
|
||||||
var old_tempo = curve_master_tempo.get_pulse(p)
|
|
||||||
var new_tempo = music.tempo_to_seconds_per_pulse(event[2])
|
var new_tempo = music.tempo_to_seconds_per_pulse(event[2])
|
||||||
var slide_duration: int = event[1] # TODO: work out how this is scaled
|
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_slide(p, slide_duration, new_tempo)
|
||||||
curve_master_tempo.add_point(p + slide_duration, new_tempo, false)
|
|
||||||
EventType.NOTE:
|
EventType.NOTE:
|
||||||
var note = event[1]
|
var note = event[1]
|
||||||
var duration = event[2]
|
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
|
var new_velocity: float = event[1]/255.0
|
||||||
curve_velocity.add_point(p, new_velocity, false)
|
curve_velocity.add_point(p, new_velocity, false)
|
||||||
EventType.VOLUME_SLIDE: # TODO: implement slides
|
EventType.VOLUME_SLIDE: # TODO: implement slides
|
||||||
var old_velocity = curve_velocity.get_pulse(p)
|
|
||||||
var slide_duration: int = event[1]
|
var slide_duration: int = event[1]
|
||||||
var new_velocity: float = event[2]/255.0
|
var new_velocity: float = event[2]/255.0
|
||||||
curve_velocity.add_point(p, old_velocity, true)
|
curve_velocity.add_slide(p, slide_duration, new_velocity)
|
||||||
curve_velocity.add_point(p + slide_duration, new_velocity, false)
|
|
||||||
EventType.PAN:
|
EventType.PAN:
|
||||||
var new_pan = 1.0 - event[1]/127.5
|
var new_pan = 1.0 - event[1]/127.5
|
||||||
curve_pan.add_point(p, new_pan, false)
|
curve_pan.add_point(p, new_pan, false)
|
||||||
EventType.PAN_SLIDE: # TODO: implement slides
|
EventType.PAN_SLIDE: # TODO: implement slides
|
||||||
var old_pan = curve_pan.get_pulse(p)
|
|
||||||
var new_pan = 1.0 - event[2]/127.5
|
var new_pan = 1.0 - event[2]/127.5
|
||||||
var slide_duration: int = event[1] # TODO: work out how slides are scaled
|
var slide_duration: int = event[1] # TODO: work out how slides are scaled
|
||||||
curve_pan.add_point(p, old_pan, true)
|
curve_pan.add_slide(p, slide_duration, new_pan)
|
||||||
curve_pan.add_point(p + slide_duration, new_pan, false)
|
|
||||||
EventType.PITCH_SLIDE: # TODO: implement slides
|
EventType.PITCH_SLIDE: # TODO: implement slides
|
||||||
var slide_duration: int = event[1]
|
var slide_duration: int = event[1]
|
||||||
var target_pitch: int = event[2] # Signed
|
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])
|
curve_echo_volume.add_point(p, event[1])
|
||||||
EventType.ECHO_VOLUME_SLIDE:
|
EventType.ECHO_VOLUME_SLIDE:
|
||||||
var slide_duration: int = event[1] # TODO: work out how slides are scaled
|
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]
|
var new_echo_volume = event[2]
|
||||||
curve_echo_volume.add_point(p, old_echo_volume, true)
|
curve_echo_volume.add_slide(p, slide_duration, new_echo_volume)
|
||||||
curve_echo_volume.add_point(p + slide_duration, new_echo_volume)
|
|
||||||
EventType.ECHO_FEEDBACK_FIR: # TODO
|
EventType.ECHO_FEEDBACK_FIR: # TODO
|
||||||
var feedback: int = event[1]
|
var feedback: int = event[1]
|
||||||
var filterIndex: int = event[2]
|
var filterIndex: int = event[2]
|
||||||
|
|
Loading…
Reference in New Issue