/// <summary> /// /// </summary> /// <param name="notes"></param> /// <param name="deviceNoteUpperBound"></param> /// <param name="deviceNoteLowerBound"></param> /// <returns>A boolean value indicating if the transposition was successful</returns> public static TransposeReturnStatus Transpose(Note[] notes, int deviceNoteUpperBound, int deviceNoteLowerBound) { int highestNote = int.MaxValue; int lowestNote = int.MinValue; Offset = 0; foreach (Note note in notes) { if (note.NoteNumber < highestNote) { highestNote = note.NoteNumber; } if (note.NoteNumber > lowestNote) { lowestNote = note.NoteNumber; } } //Console.WriteLine("[Transpose] highestNote={0}, lowestNote={1}", highestNote, lowestNote); // we don't need to transpose if (highestNote >= deviceNoteUpperBound && lowestNote <= deviceNoteLowerBound) { return TransposeReturnStatus.AllNotesAlreadyInRange; } if ((lowestNote - highestNote) > (deviceNoteLowerBound - deviceNoteUpperBound)) { return TransposeReturnStatus.TransposeUnsuccessful; } if (Math.Abs(deviceNoteUpperBound - highestNote) < 12) { return TransposeReturnStatus.TransposeUnsuccessful; } // get minimum offset required to have the highest note be in range int offsetTry = 12*((deviceNoteUpperBound - highestNote + 11)/12); if (lowestNote + offsetTry > deviceNoteLowerBound) { return TransposeReturnStatus.TransposeUnsuccessful; } Offset = offsetTry; foreach (Note note in notes) { note.NoteNumber += Offset; Debug.Assert(note.NoteNumber >= deviceNoteUpperBound && note.NoteNumber <= deviceNoteLowerBound); } return TransposeReturnStatus.TransposeSuccessful; }
public void AllocateNotes(Note[] notes) { foreach (Note note in notes) { AddNote(note); } allocSingleArr = new GuitarNote[notes.Length - NumDroppedNotes]; int j = 0; for (int i = 0; i < alloc.Length; i++) { foreach (GuitarNote guitarNote in alloc[i]) { allocSingleArr[j] = guitarNote; j++; } } Array.Sort(allocSingleArr); }
private void AddNote_Helper(int stringNumber, int fretNumber, Note note) { int i = 0; foreach (GuitarNote guitarNote in alloc[stringNumber]) { if (note.BeginTime < guitarNote.BeginTime) { alloc[stringNumber].Insert(i, new GuitarNote(stringNumber, fretNumber, note)); break; } i++; } if (i == alloc[stringNumber].Count) { alloc[stringNumber].Add(new GuitarNote(stringNumber, fretNumber, note)); } }
public GuitarNote(int stringNumber, int fretNumber, Note note) : base(note.NoteNumber, note.BeginTime, note.EndTime) { StringNumber = stringNumber; FretNumber = fretNumber; }
private void AddNote(Note note) { bool success = false; if (note.NoteNumber >= upperNoteBound && note.NoteNumber <= lowerNoteBound) { for (int i = 0; i < alloc.Length; i++) { if (guitar[i, 0] < note.NoteNumber && note.NoteNumber < guitar[i, 1] && IsFree(i, note.BeginTime, note.EndTime)) { AddNote_Helper(i, note.NoteNumber - guitar[i, 0], note); success = true; break; } } } else { NumOutOfRangeNotes++; } if (!success) { // Note dropped. NumDroppedNotes++; } }