// if participant state is empty, generate the complete list of sounds that compose a run
// the length os this state is 2 (two sounds to be compared for each trial) * TrialsPerBlock * BlocksPerXp
if participant state is empty, generate the complete list of sounds that compose a run
the length os this state is 2 (two sounds to be compared for each trial) * TrialsPerBlock * BlocksPerXp
// if participant state is empty generate the complete list of sounds that compose a run // the length os this state is 2 ( two sounds to be compared for each trial ) * TrialsPerBlock * BlocksPerXp
func generateTodo(es ExperimentSettings, participantId string) (todos []string) {
	length := 2 * es.TrialsPerBlock * es.BlocksPerXp
	allSoundsPath := "data/" + es.Id + "/sounds"
	sounds := helpers.FindFilesUnder(allSoundsPath, ".wav")
	todos = truncatedInPlaceShuffle(sounds, length)
	if es.AddRepeatBlock {
		repeat := todos[length-(2*es.TrialsPerBlock):]
		todos = append(todos, repeat...)
	}
	return
}
func generateTodo ( es ExperimentSettings , participantId string ) ( todos [ ] string ) { length := 2 * es . TrialsPerBlock * es . BlocksPerXp allSoundsPath := " " + es . Id + " " sounds := helpers . FindFilesUnder ( allSoundsPath , " " ) todos = truncatedInPlaceShuffle ( sounds , length ) if es . AddRepeatBlock { repeat := todos [ length - ( 2 * es . TrialsPerBlock ) : ] todos = append ( todos , repeat ... ) } return }
if participant state is empty, generate the complete list of sounds that compose a run
the length os this state is 2 (two sounds to be compared for each trial) * TrialsPerBlock * BlocksPerXp
if participant state is empty generate the complete list of sounds that compose a run the length os this state is 2 ( two sounds to be compared for each trial ) * TrialsPerBlock * BlocksPerXp
// duplicate trials from last block