mirror of
https://github.com/Relintai/pandemonium_demo_projects.git
synced 2024-12-21 13:56:50 +01:00
60 lines
1.4 KiB
GDScript3
60 lines
1.4 KiB
GDScript3
|
extends Panel
|
||
|
|
||
|
const BPM = 116
|
||
|
const BARS = 4
|
||
|
|
||
|
var playing = false
|
||
|
const COMPENSATE_FRAMES = 2
|
||
|
const COMPENSATE_HZ = 60.0
|
||
|
|
||
|
enum SyncSource {
|
||
|
SYSTEM_CLOCK,
|
||
|
SOUND_CLOCK,
|
||
|
}
|
||
|
|
||
|
var sync_source = SyncSource.SYSTEM_CLOCK
|
||
|
|
||
|
# Used by system clock.
|
||
|
var time_begin
|
||
|
var time_delay
|
||
|
|
||
|
|
||
|
func strsec(secs):
|
||
|
var s = str(secs)
|
||
|
if (secs < 10):
|
||
|
s = "0" + s
|
||
|
return s
|
||
|
|
||
|
|
||
|
func _process(_delta):
|
||
|
if not playing or not $Player.playing:
|
||
|
return
|
||
|
|
||
|
var time = 0.0
|
||
|
if sync_source == SyncSource.SYSTEM_CLOCK:
|
||
|
# Obtain from ticks.
|
||
|
time = (OS.get_ticks_usec() - time_begin) / 1000000.0
|
||
|
# Compensate.
|
||
|
time -= time_delay
|
||
|
elif sync_source == SyncSource.SOUND_CLOCK:
|
||
|
time = $Player.get_playback_position() + AudioServer.get_time_since_last_mix() - AudioServer.get_output_latency() + (1 / COMPENSATE_HZ) * COMPENSATE_FRAMES
|
||
|
|
||
|
var beat = int(time * BPM / 60.0)
|
||
|
var seconds = int(time)
|
||
|
var seconds_total = int($Player.stream.get_length())
|
||
|
$Label.text = str("BEAT: ", beat % BARS + 1, "/", BARS, " TIME: ", seconds / 60, ":", strsec(seconds % 60), " / ", seconds_total / 60, ":", strsec(seconds_total % 60))
|
||
|
|
||
|
|
||
|
func _on_PlaySystem_pressed():
|
||
|
sync_source = SyncSource.SYSTEM_CLOCK
|
||
|
time_begin = OS.get_ticks_usec()
|
||
|
time_delay = AudioServer.get_time_to_next_mix() + AudioServer.get_output_latency()
|
||
|
playing = true
|
||
|
$Player.play()
|
||
|
|
||
|
|
||
|
func _on_PlaySound_pressed():
|
||
|
sync_source = SyncSource.SOUND_CLOCK
|
||
|
playing = true
|
||
|
$Player.play()
|