| 159 | } |
| 160 | |
| 161 | void Beat::updatePhase(u32 timestamp) { |
| 162 | if (mBeatInterval == 0) { |
| 163 | mPhase = 0.0f; |
| 164 | return; |
| 165 | } |
| 166 | |
| 167 | u32 timeSinceLastBeat = timestamp - mLastBeatTime; |
| 168 | mPhase = static_cast<float>(timeSinceLastBeat) / static_cast<float>(mBeatInterval); |
| 169 | |
| 170 | // Wrap phase to [0, 1) using fmod for proper wrapping |
| 171 | // when beats are missed (phase exceeds 1.0) |
| 172 | if (mPhase >= 1.0f) { |
| 173 | mPhase = fl::fmodf(mPhase, 1.0f); |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | void Beat::fireCallbacks() { |
| 178 | if (mBeatDetected) { |