From fd520944e475dad338f4f752d244172232670900 Mon Sep 17 00:00:00 2001 From: yaw-man Date: Fri, 13 Jan 2023 12:43:12 -0400 Subject: [PATCH] Add autorhythm --- .gitignore | 1 + chime8.ogg | Bin 0 -> 33218 bytes main.lua | 141 +++++++++++++++++++++++++++++++++-------------------- 3 files changed, 88 insertions(+), 54 deletions(-) create mode 100644 .gitignore create mode 100644 chime8.ogg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d163863 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ \ No newline at end of file diff --git a/chime8.ogg b/chime8.ogg new file mode 100644 index 0000000000000000000000000000000000000000..96174b9ddd772d0dc351847747f356c536b9c1a3 GIT binary patch literal 33218 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 S+OGq?Ui0|cdB{vCODPMjCnW#? literal 0 HcmV?d00001 diff --git a/main.lua b/main.lua index ed23c41..5d51ff0 100644 --- a/main.lua +++ b/main.lua @@ -1,8 +1,15 @@ local love = love -local sound +local sounds = { + + + +} local state = { isGameStarted = false, + beatScoreThreshold = 1.0, + currentBeat = 1, + startTime = 0.0, particle = { x = 0.0, @@ -35,9 +42,7 @@ local state = { beat = { t = nil, - dt = nil, mu = nil, - score = 0, }, } @@ -45,74 +50,102 @@ local state = { --Reset game state. local function NewGame() state.beat = {} - state.wave.Reset() + state.startTime = love.timer.getTime() + state.currentBeat = 1 end -local beat = { } -local function IsOnBeat( t ) +local function BeatScore( t ) + local beat = state.beat + + --Base case 1: first tap. if not beat.t then beat.t = t - return true + return 2.0 end - if not beat.dt then + local dt = t - beat.t + beat.t = t - - local WEIGHT = 0.25 - beat.mu = ( 1.0 - WEIGHT ) * beat.mu + WEIGHT * dt - - - if beat.score >= 1.0 then - beat.score = 0 - return true - end - - return false + --Base case 2: second tap. + if not beat.mu then + beat.mu = dt + return 2.0 end - local function OnImpact( impact ) - --Update beat timer. - if not beat then - beat = { mu = - end - local dt = impact.t - beat.t - beat.t = impact.t + --General case: update average beat length. + local WEIGHT = 0.25 --High number makes the last beat more significant. + local mu = ( 1.0 - WEIGHT ) * beat.mu + WEIGHT * dt + beat.mu = mu + --Safety: avoid a dbz. + if mu < 0.001 or dt < 0.001 then + error( "DBZ! Beat length too small." ) + end + --Calculate beat score. + local score = dt * dt / ( mu * mu ) + local TOLERANCE = 1.15 + if dt < mu then + return 1.15 * score + else + return 1.15 / score + end +end +local function OnVictory() - --Handle sound. - love.audio.play(sound) +end + +local function OnImpact( impact ) + + local score = BeatScore( impact.t ) + if score > state.beatScoreThreshold then + + state.beatScoreThreshold = 1.0 + state.currentBeat = state.currentBeat + 1 + if state.currentBeat >= 120 then + return OnVictory() end - local function OnVictory() + love.audio.play(sounds.goodPing) - end + else - function love.draw() - love.graphics.setColor(1.0, 1.0, 1.0) - love.graphics.print("Hello World!", 400, 300) - love.graphics.print( beat.t, 0, 0 ) - love.graphics.print( beat.dt, 0, 100 ) - love.graphics.setColor(0, 0.4, 0.4) - --love.graphics.circle("fill", 0, 0, 10) - end - - function love.load() - sound = love.audio.newSource("soundTest.ogg", "static") - - return NewGame() - - end - - function love.update( dt ) - - end + state.beatScoreThreshold = state.beatScoreThreshold - score + love.audio.play(sounds.badPing) + end - function love.keypressed( key, code, isRepeat ) - if key == "escape" then return love.event.quit() end - if key == "w" then return OnImpact( ) end - if key == "enter" then return NewGame() end - end \ No newline at end of file +end + + + +function love.draw() + love.graphics.setColor(1.0, 1.0, 1.0) + love.graphics.print("Hello World!", 400, 300) + love.graphics.print( state.beat.mu or 0, 0, 0, 0, 10, 10 ) + love.graphics.print( state.beat.t or 0, 0, 100, 0, 10, 10 ) + love.graphics.print( state.beatScoreThreshold, 0, 200, 0, 10, 10 ) + love.graphics.setColor(0, 0.4, 0.4) + --love.graphics.circle("fill", 0, 0, 10) +end + +function love.load() + sounds.goodPing = love.audio.newSource("soundTest.ogg", "static") + sounds.badPing = love.audio.newSource("chime8.ogg", "static") + + return NewGame() + +end + +function love.update( dt ) + +end + + +function love.keypressed( key, code, isRepeat ) + if key == "escape" then return love.event.quit() end + if key == "w" then return OnImpact{ t = love.timer.getTime() } end + if key == "enter" then return NewGame() end +end \ No newline at end of file