parseSetupShot (shot) {
    const commands = []
    const music = getSetupMusic(shot)
    if (music) {
      const lastBackgroundMusic = this.undoSystemState.lastBackgroundMusic
      this.undoSystemState.lastBackgroundMusic = _.cloneDeep(music)
      const musicCommand = new SyncFunction(async () => {
        await store.dispatch('audio/stopTrack', 'background')

        const srcFiles = []
        if (music.files.mp3) {
          srcFiles.push(music.files.mp3)
        }
        if (music.files.ogg) {
          srcFiles.push(music.files.ogg)
          if (!music.files.mp3) {
            // We usually have an .mp3 with the same filename, but in many cinematics we didn't specify it.
            // Safari cannot play .ogg, so we need to specify the .mp3 file.
            srcFiles.push(music.files.ogg.replace(/\.ogg$/, '.mp3'))
          }
        }
        await store.dispatch('audio/playSound', {
          track: 'background',
          volume: BACKGROUND_VOLUME,
          src: srcFiles.map(f => `/file/${f}`),
          loop: music.loop
        })
      })
      musicCommand.undoCommandFactory = () => {
        if (lastBackgroundMusic) {
          return new SyncFunction(async () => {
            await store.dispatch('audio/stopTrack', 'background')
            await store.dispatch('audio/playSound', {
              track: 'background',
              src: Object.values(lastBackgroundMusic.files).map(f => `/file/${f}`),
              loop: lastBackgroundMusic.loop
            })
          })
        } else {
          return new SyncFunction(() => store.dispatch('audio/stopTrack', 'background'))
        }
      }
      commands.push(musicCommand)
    }
    return commands
  }
System interface method that CinematicParser calls with
each shot.
@param {Shot} shot
@returns {AbstractCommand[]}