Initial commit. Implement music sync features.
This commit is contained in:
75
resource_type/tempo.gd
Normal file
75
resource_type/tempo.gd
Normal file
@@ -0,0 +1,75 @@
|
||||
## 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])
|
||||
Reference in New Issue
Block a user