godot-genre-rhythm
Installation
SKILL.md
NEVER Do (Expert Anti-Patterns)
Audio Sync & Logic
- NEVER use
Time.get_ticks_msec()/Time.get_ticks_usec()as the song clock; strictly useAudioStreamPlayer.get_playback_position() + AudioServer.get_time_since_last_mix() - AudioServer.get_output_latency()(see rhythm_conductor.gd). - NEVER process song logic in
_process(); strictly use_physics_process()or a conductor loop to ensure deterministic timing regardless of render frames. - NEVER use
_process()to capture hit inputs; strictly use_input(event)to record the exact timestamp of the button press event. - NEVER scale engine time_scale for song speed; strictly use
AudioStreamPlayer.pitch_scaleto adjust speed and avoid globally breaking physics logic. - NEVER neglect Audio Latency calibration; strictly provide a tool for players to adjust for hardware/Bluetooth delays (~30-100ms) to prevent "unplayable" sync issues.
- NEVER use
_processdelta as the song clock; strictly read the conductor'sget_song_time()(playback + mix − output latency). - NEVER move thousands of note sprites on the CPU; strictly use a Shader-Based Highway (UV scrolling) to offload track movement to the GPU.
- NEVER use
yieldorawaitfor beat timing; strictly use a sample-accurate Delta Accumulator tied to the audio clock. - NEVER assume a constant BPM; strictly build your conductor to handle a Tempo Map for complex track changes.