CCCPaste

PEAK - Bugle Ode To Joy AHK

#Persistent
#SingleInstance Force

global startX, startY, keyMap := {}, tempo := 1.0  ; tempo multiplier

; Build key -> offset map
InitKeyMap() {
    global keyMap
    keys := ["q","Q","w","W","e","E","r","R","t","T","y","Y","u","U","i","I","o","O","p","P","a","A","s","S","d","D","f","F"]
    step := 115
    Loop % keys.MaxIndex() {
        key := keys[A_Index]
        keyMap[key] := (A_Index-1) * step
    }
}

; Hotkey: press F1 to run sequence, make sure to be looking all the way down before pressing F1
; https://virtualpiano.net/music-sheet-difficulty/super-easy
F1::
    MouseGetPos, startX, startY
    InitKeyMap()

    tempo := 0.4  ; adjust speed: smaller = faster, bigger = slower

    sheet := "a a s d d s a p o o p a a|pp| a a s d d s a p o o p a p|oo| p p a o p asa o p asa p o p d| a a s d d s a p o o p a p|oo"

    Loop, Parse, sheet
    {
        char := A_LoopField

        if (char = " ") {
            Sleep, Round(300 * tempo)   ; short pause for space
            continue
        }

        if (char = "|") {
            Sleep, Round(1000 * tempo)  ; wait key (1 sec × tempo)
            continue
        }

        if (keyMap.HasKey(char)) {
            playKey(char)
        }
    }
return

; Kill switch
F2::ExitApp


; -------- Functions --------

playKey(char) {
    global startX, startY, keyMap, tempo
    offset := keyMap[char]

    ; Reset baseline
    MouseMove, startX, startY, 0
    Sleep, Round(5 * tempo)

    ; Move up by mapped offset
    MouseMove, startX, startY - offset, 0

    ; Hold mouse for 1 second × tempo
    Click, Down
    Sleep, Round(100 * tempo)
    Click, Up

    ; Small gap before next note
    Sleep, Round(200 * tempo)
}