#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)
}