Esempio n. 1
0
    //so PLAYMODE + REC pattern, REC pattern might not exist, we would want to load AUTO or CUstom selected pattern, without saving afterwards
    private void loadYT(SongData songData, SongReady songReady, int lanes, SongData.PatternType patternType, Settings.PlayMode playMode)// = Settings.PlayMode.PLAY)
    {
        patternType = SongData.PatternType.CUSTOM;
        Debug.Log("************* SONGLOADER.loadSong, youtube " + songData + ", " + patternType + " " + playMode);
        state             = State.PREPARING;
        this.songReady    = songReady;
        this.patternLanes = lanes;
        this.patternType  = patternType;
        this.playMode     = playMode;
        //this.recordingMode = playMode == Settings.PlayMode.RECORD_PATTERN;

        songFromFile = false;
        isLoading    = true;

        isLoading = false;
        Dictionary <string, string> patternFilePaths = new Dictionary <string, string>();

        SongData.findPatterns(patternFilePaths, songData.name);
        string suffix = SongData.getPatternSuffix(patternLanes, patternType);

        Debug.Log("youtube songloader, suffix " + suffix);
        Debug.Log("youtube songloader, suffix " + suffix.Length + " " + "4_".Length + " " + (suffix.Length - 1));

        foreach (string p in patternFilePaths.Keys)
        {
            Debug.Log("******* " + p + " " + patternFilePaths[p]);
        }
        //TODO non hardcoded
        //aaaa
        //Debug.Log("******* " + "4_" + patternFilePaths[suffix.Substring("4_".Length)]);
        loadPattern(patternFilePaths[suffix]);
        //loadPattern("/boxmaniaResources/patterns/QmXotvtA_po_4_CUSTOM.ptn");


        Dictionary <SongRow.Type, List <SongRow> > rows = new Dictionary <SongRow.Type, List <SongRow> >();

        rows.Add(SongRow.Type.BPM, rowsBpm);
        rows.Add(SongRow.Type.BOX, rowsBox);
        rows.Add(SongRow.Type.BEAT, rowsBeat);
        rows.Add(SongRow.Type.LANE_POS, rowsLanePositions);

        songData.rows = rows;

        bool patternExists = patternFilePaths.ContainsKey(suffix);

        if (!patternExists)
        {
            Debug.Log("No existing pattern (" + suffix + "), will create");
        }

        if (!Settings.instance.patternOverwriteAuto && patternExists)
        {
            songReady(songData);
        }
        else
        {
            Debug.Log("TODO switch to record mode when no yt pattern found");
            songReady(songData);
        }
    }
Esempio n. 2
0
    private void loadIncluded(SongData songData, SongReady songReady, int lanes, SongData.PatternType patternType, Settings.PlayMode playMode)// = Settings.PlayMode.PLAY)
    {
        Debug.Log("************* SONGLOADER.loadSong, clip " + songData + ", " + patternType + " " + playMode);
        state             = State.PREPARING;
        this.songReady    = songReady;
        this.patternLanes = lanes;
        this.patternType  = patternType;
        this.playMode     = playMode;
        //this.recordingMode = playMode == Settings.PlayMode.RECORD_PATTERN;

        songFromFile = false;
        isLoading    = true;
        songLoaded(songData.getClip());
    }
Esempio n. 3
0
    private void loadCustom(SongData songData, SongReady songReady, int lanes, SongData.PatternType patternType, Settings.PlayMode playMode)// = Settings.PlayMode.PLAY)
    {
        Debug.Log("************* SONGLOADER.loadSong, path " + songData + ", " + patternType + " " + playMode);
        state             = State.PREPARING;
        this.songReady    = songReady;
        this.patternLanes = lanes;
        this.patternType  = patternType;
        this.playMode     = playMode;
        //this.recordingMode = playMode == Settings.PlayMode.RECORD_PATTERN;

        songFromFile = true;
        isLoading    = true;
        importer.Import(songData.path);
    }
Esempio n. 4
0
    public bool begin(SongData songData, Settings.PlayMode playMode)// = Settings.PlayMode.PLAY)
    {
        state         = State.INIT;
        this.playMode = playMode;
        this.songData = songData;
        //currentRow = 0;
        frameSeekOffset = 0;
        mediaSource.stop();
        bpmRowIndex        = 0;
        boxRowIndex        = 0;
        beatRowIndex       = 0;
        lanPosRowIndex     = 0;// 1;//skip the first lane defining lane pose changes
        recordingStartFlag = true;
        activatedLaneIndex = 0;
        lastHoldBox        = new BeatBox[AssetManager.MAX_LANES];
        lastRegularBox     = new BeatBox[AssetManager.MAX_LANES];
        playStartOffset    = 0;

        mediaSource.loadData(songData, mediaPrepared);

        return(true);
    }
Esempio n. 5
0
    public void mediaPrepared()
    {
        //TODO Settings.instance.isSongPatternOverridesLanePositions() ignore lane_POS if not doing override
        //TODO if overrides, who handles number of lanes... should be user set, but if set to 4 and lane_pos has 6 pos, should we switch numlanes... mmm, yeah, if override, check first lane_pos length to change ui set
        Debug.Log("Media prepared");
        if (playMode == Settings.PlayMode.RECORD_PATTERN)
        {
            processedRecordedBeats.Clear();
            lanePosChanges.Clear();
        }

        if (playMode == Settings.PlayMode.TEST_PATTERN_PLAY)
        {//only thing needed to play test is replace loaded box type items to recordedBeats, then act as regular play
            Debug.Log("Skipping loaded BOXes (" + songData.rows[SongRow.Type.BOX].Count + ") to use previously recorded pattern (" + processedRecordedBeats.Count + ")");
            songData.rows[SongRow.Type.BOX]      = processedRecordedBeats;
            songData.rows[SongRow.Type.LANE_POS] = lanePosChanges;//THIS IS RELATED TO THE FUTURE POS ISSUE
            playMode = Settings.PlayMode.PLAY;
        }

        Debug.Log("Spawner.play " + mediaSource.getName());
        Debug.Log(songData.rows[SongRow.Type.BEAT].Count + " beats, " + songData.rows[SongRow.Type.BOX].Count + " boxes, " + songData.rows[SongRow.Type.BPM].Count + " bpms, " + songData.rows[SongRow.Type.LANE_POS].Count + " lanePositions");

        foreach (HitChecker hc in lanesEnd)
        {
            hc.reset();
        }

        int firstBPMIndex  = 0; // getFirstRowIndex(SongRow.Type.BPM);
        int firstBeatIndex = 0; // getFirstRowIndex(SongRow.Type.BOX);

        if (songData.rows[SongRow.Type.BPM].Count == 0)
        {
            songData.rows[SongRow.Type.BPM].Add(new SongRow(0, 160));//set default bpm if there's none in the pattern (should not happen but...)
        }
        //if (firstBPMIndex < 0 || firstBeatIndex < 0){
        if (songData.rows[SongRow.Type.BPM].Count == 0 || songData.rows[SongRow.Type.BOX].Count == 0)
        //if (songRows[SongRow.Type.BOX].Count == 0)
        {
            Debug.LogError("Can't play song, BOX types missing " + firstBPMIndex + " " + firstBeatIndex);
            state = State.STOPPED;
        }
        else
        {
            //SongRow firstBpm = songRows[firstBPMIndex];
            //SongRow firstBpm = songRows[SongRow.Type.BPM][0];

            float maxBpm = 80;
            foreach (SongRow row in songData.rows[SongRow.Type.BPM])
            {
                if (row.bpm > maxBpm)
                {
                    maxBpm = row.bpm;
                }
            }
            calculateTimeToLaneEnd(Mathf.Min(maxBpm, 240));
            //working assumption that first beat will reach lane end first (it won't if other lanes timeToEnd + second beat timestamp < first beat)
            //TODO a thourough check to find which songRow and lane is the first to end

            float soonestTimeToEnd = 100000;
            //SongRow firstBeat = songRows[firstBeatIndex];
            SongRow firstBeat = songData.rows[SongRow.Type.BOX][0];
            firstBeatTimestamp = firstBeat.timestamp;

            //TODO problem here is a beat on L8 is not registering on a layout 4 config
            for (int lane = 0; lane < timeToLaneEnd.Length; lane++)
            {
                //if (firstBeat.activeLanes[lane] > 0 && soonestTimeToEnd > timeToLaneEnd[lane])
                //if (firstBeat.activeLanes[lane] > 0 && soonestTimeToEnd > timeToLaneEnd[lane])
                if (soonestTimeToEnd > timeToLaneEnd[lane])
                {
                    soonestTimeToEnd = timeToLaneEnd[lane];
                }
            }

            Debug.Log("Soonest time to end " + soonestTimeToEnd + " " + firstBeat + " frameSeekOffset: " + frameSeekOffset);

            seekOffset = soonestTimeToEnd;
            state      = State.SEEK_TO_PLAY;
        }

        if (state == State.SEEK_TO_PLAY)
        {
            if (songData.rows[SongRow.Type.LANE_POS].Count > 0 && Settings.instance.isSongPatternOverridesLanePositions())
            {//if first lane_pos row exists and has timestamp 0, and song pattern overrides lane pos, we init lane positions with its parameter
                SongRow firstLanePos = songData.rows[SongRow.Type.LANE_POS][0];
                if (firstLanePos.timestamp <= 0)
                {
                    //Debug.Log("7777777777777777777777777777777777 TO " + firstLanePos.lanePositions);
                    setLanesPosition(firstLanePos.lanePositions, true);
                }
            }
        }

        prevRegisteredBeats = new HitChecker.RegisteredBeat[lanesEnd.Length];
        for (int i = 0; i < lanesEnd.Length; i++)
        {
            prevRegisteredBeats[i] = new HitChecker.RegisteredBeat(0, SongRow.BoxType.NONE);
        }

        //audioSource.PlayDelayed(seekOffset);

        //return state == State.SEEK_TO_PLAY;
    }
Esempio n. 6
0
 public void beginSongRecord()
 {
     this.playMode = Settings.PlayMode.RECORD_SONG;
 }
Esempio n. 7
0
 public void loadSong(SongData songData, SongReady songReady, int lanes, SongData.PatternType patternType, Settings.PlayMode playMode)
 {
     this.songData = songData;
     if (songData.isYoutube)
     {
         loadYT(songData, songReady, lanes, patternType, playMode);
     }
     else
     {
         loadIncluded(songData, songReady, lanes, patternType, playMode);
     }
 }