title: Play a random sequence of 4 sounds while a video is played in Psychopy?
body: <p>I'm trying to create an experiment using Psychopy.
  In the specific I'm trying to create a routine ("trial") where a video ("movie1") is presented and at the same time I would like to play a sequence of 4 sounds (one per second) randomly chosen from a list of 10 in an excel file (sounds.routine.xlsx).
  Here's what I have done so far:</p>
  
  <pre><code>
  from __future__ import absolute_import, division
  
  from psychopy import locale_setup
  from psychopy import prefs
  from psychopy import sound, gui, visual, core, data, event, logging, clock
  from psychopy.constants import (NOT_STARTED, STARTED, PLAYING, PAUSED,
                                  STOPPED, FINISHED, PRESSED, RELEASED, FOREVER)
  
  import numpy as np  # whole numpy lib is available, prepend 'np.'
  from numpy import (sin, cos, tan, log, log10, pi, average,
                     sqrt, std, deg2rad, rad2deg, linspace, asarray)
  from numpy.random import random, randint, normal, shuffle
  import os  # handy system and path functions
  import sys  # to get file system encoding
  
  from psychopy.hardware import keyboard
  
  # Ensure that relative paths start from the same directory as this script
  _thisDir = os.path.dirname(os.path.abspath(__file__))
  os.chdir(_thisDir)
  
  # Store info about the experiment session
  psychopyVersion = '3.2.4'
  expName = 'dsffdsfads'  # from the Builder filename that created this script
  expInfo = {'participant': '', 'session': '001'}
  dlg = gui.DlgFromDict(dictionary=expInfo, sortKeys=False, title=expName)
  if dlg.OK == False:
      core.quit()  # user pressed cancel
  expInfo['date'] = data.getDateStr()  # add a simple timestamp
  expInfo['expName'] = expName
  expInfo['psychopyVersion'] = psychopyVersion
  
  # Data file name stem = absolute path + name; later add .psyexp, .csv, .log, etc
  filename = _thisDir + os.sep + u'data/%s_%s_%s' % (expInfo['participant'], expName, expInfo['date'])
  
  # An ExperimentHandler isn't essential but helps with data saving
  thisExp = data.ExperimentHandler(name=expName, version='',
      extraInfo=expInfo, runtimeInfo=None,
      originPath='/Users/Documents/dsffdsfads.py',
      savePickle=True, saveWideText=True,
      dataFileName=filename)
  # save a log file for detail verbose info
  logFile = logging.LogFile(filename+'.log', level=logging.EXP)
  logging.console.setLevel(logging.WARNING)  # this outputs to the screen, not a file
  
  endExpNow = False  # flag for 'escape' or other condition =&gt; quit the exp
  frameTolerance = 0.001  # how close to onset before 'same' frame
  
  # Start Code - component code to be run before the window creation
  
  # Setup the Window
  win = visual.Window(
      size=(1024, 768), fullscr=True, screen=0, 
      winType='pyglet', allowGUI=False, allowStencil=False,
      monitor='testMonitor', color=[0,0,0], colorSpace='rgb',
      blendMode='avg', useFBO=True, 
      units='height')
  # store frame rate of monitor if we can measure it
  expInfo['frameRate'] = win.getActualFrameRate()
  if expInfo['frameRate'] != None:
      frameDur = 1.0 / round(expInfo['frameRate'])
  else:
      frameDur = 1.0 / 60.0  # could not measure, so guess
  
  # create a default keyboard (e.g. to check for escape)
  defaultKeyboard = keyboard.Keyboard()
  
  # Initialize components for Routine "trial"
  trialClock = core.Clock()
  sound1 = sound.Sound(Sounds, secs=-1, stereo=True, hamming=True,
      name='sound1')
  sound1.setVolume(1)
  movie1 = visual.MovieStim3(
      win=win, name='movie1',
      noAudio = True,
      filename='Movies/Random_4.mp4',
      ori=0, pos=(0, 0), opacity=1,
      loop=False,
      depth=-1.0,
      )
  from np.random import choice
  
  # Create some handy timers
  globalClock = core.Clock()  # to track the time since experiment started
  routineTimer = core.CountdownTimer()  # to track time remaining of each (non-slip) routine 
  
  # set up handler to look after randomisation of conditions etc
  trials = data.TrialHandler(nReps=1, method='random', 
      extraInfo=expInfo, originPath=-1,
      trialList=data.importConditions('../Desktop/Countingpuppet/sounds_routine.xlsx', selection=choice(10, size = 4, replace = False)),
      seed=None, name='trials')
  thisExp.addLoop(trials)  # add the loop to the experiment
  thisTrial = trials.trialList[0]  # so we can initialise stimuli with some values
  # abbreviate parameter names if possible (e.g. rgb = thisTrial.rgb)
  if thisTrial != None:
      for paramName in thisTrial:
          exec('{} = thisTrial[paramName]'.format(paramName))
  
  for thisTrial in trials:
      currentLoop = trials
      # abbreviate parameter names if possible (e.g. rgb = thisTrial.rgb)
      if thisTrial != None:
          for paramName in thisTrial:
              exec('{} = thisTrial[paramName]'.format(paramName))
  
      # ------Prepare to start Routine "trial"-------
      # update component parameters for each repeat
      sound1.setSound(Sounds, hamming=True)
      sound1.setVolume(1, log=False)
      # keep track of which components have finished
      trialComponents = [sound1, movie1]
      for thisComponent in trialComponents:
          thisComponent.tStart = None
          thisComponent.tStop = None
          thisComponent.tStartRefresh = None
          thisComponent.tStopRefresh = None
          if hasattr(thisComponent, 'status'):
              thisComponent.status = NOT_STARTED
      # reset timers
      t = 0
      _timeToFirstFrame = win.getFutureFlipTime(clock="now")
      trialClock.reset(-_timeToFirstFrame)  # t0 is time of first possible flip
      frameN = -1
      continueRoutine = True
  
      # -------Run Routine "trial"-------
      while continueRoutine:
          # get current time
          t = trialClock.getTime()
          tThisFlip = win.getFutureFlipTime(clock=trialClock)
          tThisFlipGlobal = win.getFutureFlipTime(clock=None)
          frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
          # update/draw components on each frame
          # start/stop sound1
          if sound1.status == NOT_STARTED and tThisFlip &gt;= 0.0-frameTolerance:
              # keep track of start time/frame for later
              sound1.frameNStart = frameN  # exact frame index
              sound1.tStart = t  # local t and not account for scr refresh
              sound1.tStartRefresh = tThisFlipGlobal  # on global time
              sound1.play(when=win)  # sync with win flip
  
          # *movie1* updates
          if movie1.status == NOT_STARTED and tThisFlip &gt;= 0.0-frameTolerance:
              # keep track of start time/frame for later
              movie1.frameNStart = frameN  # exact frame index
              movie1.tStart = t  # local t and not account for scr refresh
              movie1.tStartRefresh = tThisFlipGlobal  # on global time
              win.timeOnFlip(movie1, 'tStartRefresh')  # time at next scr refresh
              movie1.setAutoDraw(True)
  
          # check for quit (typically the Esc key)
          if endExpNow or defaultKeyboard.getKeys(keyList=["escape"]):
              core.quit()
  
          # check if all components have finished
          if not continueRoutine:  # a component has requested a forced-end of Routine
              break
          continueRoutine = False  # will revert to True if at least one component still running
          for thisComponent in trialComponents:
              if hasattr(thisComponent, "status") and thisComponent.status != FINISHED:
                  continueRoutine = True
                  break  # at least one component has not yet finished
  
          # refresh the screen
          if continueRoutine:  # don't flip if this routine is over or we'll get a blank screen
              win.flip()
  
      # -------Ending Routine "trial"-------
      for thisComponent in trialComponents:
          if hasattr(thisComponent, "setAutoDraw"):
              thisComponent.setAutoDraw(False)
      sound1.stop()  # ensure sound has stopped at end of routine
      trials.addData('sound1.started', sound1.tStartRefresh)
      trials.addData('sound1.stopped', sound1.tStopRefresh)
      trials.addData('movie1.started', movie1.tStartRefresh)
      trials.addData('movie1.stopped', movie1.tStopRefresh)
      # the Routine "trial" was not non-slip safe, so reset the non-slip timer
      routineTimer.reset()
      thisExp.nextEntry()
  
  # completed 1 repeats of 'trials'
  
  
  # Flip one final time so any remaining win.callOnFlip() 
  # and win.timeOnFlip() tasks get executed before quitting
  win.flip()
  
  # these shouldn't be strictly necessary (should auto-save)
  thisExp.saveAsWideText(filename+'.csv')
  thisExp.saveAsPickle(filename)
  logging.flush()
  # make sure everything is closed down
  thisExp.abort()  # or data files will save again on exit
  win.close()
  core.quit()
  
  </code></pre>
  
  <p>The problem is that using np.choice only one number is reproduced and not the entire sequence of four randomly chosen numbers without repetitions. How can I do this?</p>
  
  <p>Thanks in advance</p>