/// <summary> /// Toggles a riff at the given position. /// </summary> /// <param name="newRiff">Riff to toggle.</param> /// <param name="pos">Measure to toggle.</param> public void ToggleRiff(Riff newRiff, int pos) { SongPiece songPiece = _songPieces[_songPieceIndices[pos]]; Measure measure = _measures[songPiece.MeasureIndices[0]]; // For each riff in measure foreach (int r in measure.RiffIndices) { Riff riff = _riffs[r]; // Skip if riff not the same instrument if (riff.Instrument != newRiff.Instrument) { continue; } // Remove riff if it exists if (newRiff == riff) { measure.RiffIndices.Remove(newRiff.Index); } // Replace riff with new one else { measure.RiffIndices.Remove(riff.Index); measure.RiffIndices.InsertSorted <int>(newRiff.Index, false); } return; } // Riff not already there measure.RiffIndices.InsertSorted <int>(newRiff.Index, false); }
/// <summary> /// Creates a new song piece and registers it. /// </summary> public SongPiece NewSongPiece() { // Create new song piece SongPiece songPiece = new SongPiece(); // Init measures Measure measure = NewMeasure(); songPiece.MeasureIndices.Add(measure.Index); // Register song piece RegisterSongPiece(songPiece); return(songPiece); }
/// <summary> /// Plays all notes at the given beat. /// </summary> /// <param name="pos">Beat at which to play notes.</param> public void PlaySong(int pos) { try { SongPiece songPiece = _songPieces[_songPieceIndices[pos / Riff.MAX_BEATS]]; Measure measure = _measures[songPiece.MeasureIndices[0]]; // Play all notes foreach (int i in measure.RiffIndices) { _riffs[i].PlayRiff(pos % Riff.MAX_BEATS); } } catch (ArgumentOutOfRangeException) { Debug.LogError("Song.PlaySong(): index out of range! " + pos); } }
/// <summary> /// Adds a song piece to the song and assigns it an index. /// </summary> /// <param name="songPiece">Song piece to register.</param> public void RegisterSongPiece(SongPiece songPiece) { songPiece.Index = _songPieces.Count; _songPieces.Add(songPiece); _songPieceIndices.Add(songPiece.Index); }