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; } } }
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); }
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); }
// 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; } } }
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); }
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); } }