Exemple #1
0
        /// <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++;
            }
        }