mirror of
https://github.com/godotengine/godot-demo-projects.git
synced 2026-01-07 16:30:06 +01:00
Also fix Viewport error in 3D scaling demo, add an icon to Multiplayer Bomber, and rename BPM sync files.
58 lines
1.4 KiB
GDScript
58 lines
1.4 KiB
GDScript
extends Panel
|
|
|
|
const BPM = 116
|
|
const BARS = 4
|
|
|
|
var playing = false
|
|
const COMPENSATE_FRAMES = 2
|
|
const COMPENSATE_HZ = 60.0
|
|
|
|
const SYNC_SOURCE_SYSTEM_CLOCK = 0
|
|
const SYNC_SOURCE_SOUND_CLOCK = 1
|
|
|
|
var sync_source = SYNC_SOURCE_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 (!playing or !$Player.playing):
|
|
return
|
|
|
|
var time = 0.0
|
|
if (sync_source == SYNC_SOURCE_SYSTEM_CLOCK):
|
|
# Obtain from ticks.
|
|
time = (OS.get_ticks_usec() - time_begin) / 1000000.0
|
|
# Compensate.
|
|
time -= time_delay
|
|
elif (sync_source == SYNC_SOURCE_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 = SYNC_SOURCE_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 = SYNC_SOURCE_SOUND_CLOCK
|
|
playing = true
|
|
$Player.play()
|