Files

76 lines
2.0 KiB
GDScript3
Raw Permalink Normal View History

## Resource for storing BPM data and loading into a SyncTrack.
class_name Tempo extends Resource
## Defines how the BPM changes throughout its length.
enum BPM_TYPE {
HOLD = 0, ## BPM stays constant through the whole length.
LINEAR = 1 ## BPM linearly interpolates to the next BPM.
}
# The data for each BPM is stored in the same index
# across the different arrays.
@export var bpms: Array[float] = []
@export var lengths: Array[float] = []
@export var types: Array[BPM_TYPE] = []
## Get the number of valid BPM changes.
func size() -> int:
return min(bpms.size(), lengths.size() + 1)
## Ensure the arrays obey the following properties:
## all arrays are the same size (every BPM has a length and type),
## last element of BPM Length Beats is -1 (since the
## corresponding BPM is assumed to last the rest of the chart).
## Extra BPM or BPM Length values are truncated.
## If BPM Types must be resized greater, assume every BPM after is
## BPM_TYPE.HOLD.
func normalize() -> void:
var target_size := size()
bpms.resize(target_size)
lengths.resize(target_size)
types.resize(target_size)
if target_size > 0:
_make_bpm_positive()
_make_lengths_positive()
lengths[-1] = -1
types[-1] = BPM_TYPE.HOLD
#----- Static Constructors -----#
static func create_from_arrays(
p_bpms: Array[float],
p_lengths: Array[float],
p_types: Array[BPM_TYPE]
) -> Tempo:
var result: Tempo = Tempo.new()
result.bpms = p_bpms
result.lengths = p_lengths
result.types = p_types
result.normalize()
return result
static func create_from_nodes(_p_nodes: Array[Variant]) -> Tempo:
var result: Tempo = Tempo.new()
# Parse array and add data to result...
# Might not be used?
return result
#----- ------------- -----#
## Makes sure every BPM entry is positive.
## Negative BPMs are inverted.
func _make_bpm_positive() -> void:
for i: int in range(bpms.size()):
bpms[i] = abs(bpms[i])
## Makes sure every length entry is positive.
## Negative lengths are inverted.
func _make_lengths_positive() -> void:
for i: int in range(lengths.size()):
lengths[i] = abs(lengths[i])