/// <summary> /// Add an interval to this representation. /// </summary> /// <param name="interval">The interval to add.</param> /// <param name="direction">Which direction to go - up or down.</param> /// <returns>Null if there is no supported enharmonically correct representation of the requested interval. For example, /// adding a minor second to a Bb should return a Cb, but this is not supported so the result will be null. If there is /// a valid representation (for example, A# plus a minor second correctly yields B) it will be returned.</returns> public NoteRepresentation AddInterval(Interval interval, IntervalDirection direction = IntervalDirection.Up) { var coefficient = direction == IntervalDirection.Up ? 1 : -1; var newNoteNumber = this.Note.Number + (interval.NumberOfSemitones() * coefficient); var newNoteName = this.Name.AddNoteNames(interval.NumberOfNoteNames() * coefficient); var result = new Note(newNoteNumber).GetRepresentations().SingleOrDefault(r => r.Name == newNoteName); return result; }
/// <summary> /// Creates a representation for a natural. /// </summary> /// <param name="naturalNote">Can't be an accidental.</param> internal NoteRepresentation(Note naturalNote) { if (naturalNote.IsAccidental()) throw new Exception("Only a natural can be passed to this constructor."); Note = naturalNote; Name = GetNaturalNoteName(naturalNote); Accidental = AccidentalType.Natural; }
public static NoteName GetNaturalNoteName(Note naturalNote) { if (naturalNote.IsAccidental()) throw new Exception("Argument must be a natural."); return (NoteName)(Array.IndexOf(Note.GetNaturals(), naturalNote) % 7); }
/// <summary> /// Creates a new note representation. /// </summary> internal NoteRepresentation(Note note, AccidentalType accidental, NoteName name) { Note = note; Accidental = accidental; Name = name; }