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"];
}