Example #1
0
    public void PlayLoop(double[][] loopBeats, AudioSource[] originalAudioSources, int loopNumber)
    {
        RemoveLoop(loopNumber);

        Loop loopToAdd = new Loop();

        loopToAdd.noteBeats = new List <List <double> >();
        for (int i = 0; i < loopBeats.Length; i++)
        {
            List <double> loopBeatList = new List <double>(loopBeats[i]);
            loopToAdd.noteBeats.Add(loopBeatList);
        }

        loops[loopNumber] = loopToAdd;
        Loop fixedLoop = GetLoopWithRedundantNotesRemoved(loopToAdd);

        for (int trackNumber = 0; trackNumber < fixedLoop.noteBeats.Count; trackNumber++)
        {
            if (fixedLoop.noteBeats[trackNumber].Count > 0)
            {
                // Clean up old beats and loop sources
                // TODO: Recycle loop sources when possible


                // Setup next note time
                TrackLoopInfo track = AddNoteBeatsToTrack(fixedLoop.noteBeats[trackNumber].ToArray(), tracks [trackNumber], originalAudioSources [trackNumber]);
                track.currentNoteIndex = 0;
                double startOfMeasure = SongController.GetNextStartOfMeasure();
                track.nextNoteTime   = startOfMeasure + track.noteBeats [0] / SongController.GetBPM() * 60.0;
                tracks [trackNumber] = track;
            }
        }
    }
Example #2
0
    TrackLoopInfo RemoveNoteBeatsFromTrack(TrackLoopInfo track, List <double> noteBeats)
    {
        // Remove note beats
        // TODO: Efficiency improvements
        for (int i = 0; i < noteBeats.Count; i++)
        {
            for (int trackNoteBeatIndex = 0; trackNoteBeatIndex < track.noteBeats.Count; trackNoteBeatIndex++)
            {
                if (Mathf.Approximately((float)track.noteBeats[trackNoteBeatIndex], (float)noteBeats[i]))
                {
                    track.noteBeats.RemoveAt(trackNoteBeatIndex);
                    Object.Destroy(track.audioSources[trackNoteBeatIndex]);
                    track.audioSources.RemoveAt(trackNoteBeatIndex);
                    break;
                }
            }
        }

        // Recalculate next note stuff for track
        if (track.noteBeats.Count > 0)
        {
            track.currentNoteIndex = 0;
            double startOfMeasure = SongController.GetNextStartOfMeasure();
            track.nextNoteTime = startOfMeasure + track.noteBeats[0] / SongController.GetBPM() * 60.0;
        }

        return(track);
    }
Example #3
0
    private TrackLoopInfo AddNoteBeatsToTrack(double[] noteBeats, TrackLoopInfo track, AudioSource originalAudioSource)
    {
        int insertionIndex = 0;

        for (int i = 0; i < noteBeats.Length; i++)
        {
            double newNoteBeat = noteBeats [i];

            // Find the index to insert this note beat at
            while (insertionIndex < track.noteBeats.Count && track.noteBeats [insertionIndex] < newNoteBeat)
            {
                insertionIndex++;
            }

            // Now that it's been found, we need to insert it into the arrays
            track.noteBeats.Insert(insertionIndex, newNoteBeat);
            track.audioSources.Insert(insertionIndex, AddLoopPlayerWithOriginal(originalAudioSource));

            // For now, don't recalculate the current note, just make sure it points to the same note it was pointing to.
            if (track.currentNoteIndex > insertionIndex)
            {
                track.currentNoteIndex++;
            }
        }

        return(track);
    }
Example #4
0
 // Update is called once per frame
 void Update()
 {
     for (int i = 0; i < tracks.Count; i++)
     {
         TrackLoopInfo track = tracks[i];
         while (track.noteBeats.Count > 0 && AudioSettings.dspTime >= track.nextNoteTime + preScheduleNextNoteTime)
         {
             blockBreaker.PlayInstrumentInSeconds(i, (float)(track.nextNoteTime - AudioSettings.dspTime));
             track     = ScheduleNextNoteForTrack(track);
             tracks[i] = track;
         }
     }
 }
Example #5
0
    TrackLoopInfo ScheduleNextNoteForTrack(TrackLoopInfo track)
    {
        // Schedule the note to play
        track.audioSources[track.currentNoteIndex].PlayScheduled(track.nextNoteTime);

        // When the next note plays
        track.currentNoteIndex++;
        if (track.currentNoteIndex >= track.noteBeats.Count)
        {
            track.currentNoteIndex = 0;
            track.nextNoteTime    += (4 - track.noteBeats[track.noteBeats.Count - 1] + track.noteBeats[0]) / SongController.GetBPM() * 60;
        }
        else
        {
            track.nextNoteTime += (track.noteBeats[track.currentNoteIndex] - track.noteBeats[track.currentNoteIndex - 1]) / SongController.GetBPM() * 60;
        }

        return(track);
    }
Example #6
0
    void Start()
    {
        tracks = new List <TrackLoopInfo>();
        for (int i = 0; i < numInstruments; i++)
        {
            TrackLoopInfo track = new TrackLoopInfo();
            track.audioSources = new List <AudioSource>();
            track.noteBeats    = new List <double>();
            tracks.Add(track);
        }

        loops = new List <Loop>();
        for (int i = 0; i < numLoops; i++)
        {
            Loop newLoop = new Loop();
            newLoop.noteBeats = new List <List <double> >();
            for (int inNum = 0; inNum < numInstruments; inNum++)
            {
                newLoop.noteBeats.Add(new List <double>());
            }
            loops.Add(newLoop);
        }
    }