76 lines
2.0 KiB
GDScript
76 lines
2.0 KiB
GDScript
## 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])
|