digraph {
IDLE
READY
ACTIVATED
DEACTIVATED
PRESS_FROM_ACTIVE
FINISHED_FROM_ACTIVE
IDLE_IN_DANCE
READY_IN_DANCE
FINISHED
LOCKED
READY_LOCKED
RESTART
IN_ONE_SHOT
// common
FINISHED -> RESTART;
RESTART -> IDLE;
DEACTIVATED -> IDLE_IN_DANCE;
// kill_one_shots()
IN_ONE_SHOT -> RESTART [label="non-one-shot key went through", color="blue"];
// process_finished_dances()
ACTIVATED -> PRESS_FROM_ACTIVE [label="dance timer", color="green"];
IDLE_IN_DANCE -> FINISHED [label="dance timer", color="green"];
PRESS_FROM_ACTIVE -> FINISHED_FROM_ACTIVE [label="dance timer", color="green"];
// remove_subchords()
READY -> IDLE [label="superchord active", color="red"];
READY_IN_DANCE -> IDLE_IN_DANCE [label="superchord active", color="red"];
READY_LOCKED -> LOCKED [label="superchord active", color="red"];
// process_ready_chords()
LOCKED -> READY_LOCKED [label="all keys pressed", color="orange"];
IDLE -> READY [label="all keys pressed", color="orange"];
IDLE_IN_DANCE -> READY_IN_DANCE [label="all keys pressed", color="orange"];
READY_LOCKED -> RESTART [label="chord timer", color="orange"];
READY -> ACTIVATED [label="chord timer", color="orange"];
READY_IN_DANCE -> ACTIVATED [label="chord timer", color="orange"];
ACTIVATED -> PRESS_FROM_ACTIVE [label="lock next", color="orange"];
PRESS_FROM_ACTIVE -> LOCKED [label="lock next", color="orange"];
// deactivate_active_chords()
ACTIVATED -> DEACTIVATED [label="a key lifted", color="purple"];
PRESS_FROM_ACTIVE -> RESTART [label="a key lifted", color="orange"];
FINISHED_FROM_ACTIVE -> DEACTIVATED [label="a key lifted", color="orange"];
}