public ScaleBase(string name, Note rootNote, ScaleFamily scaleFamily, ScaleFamilyMode mode) { Name = name; RootNote = rootNote; ScaleFamily = scaleFamily; Mode = mode; ChromaticNotes = GetChromaticNotes(); Notes = ChromaticNotes.Where(x => x.IsPresent).ToArray(); }
private ScaleNote[] GetChromaticNotes() { var naturalNote = RootNote.Natural != null ? RootNote.Natural : RootNote; var naturalIndex = Array.IndexOf(MusicNotes.NaturalNotes, naturalNote); var naturalNotes = GetScaleNaturals(naturalIndex); var intervals = ScaleFamily.GetModeIntervals(Mode); var noteCount = intervals.Count(x => x); var noteIndex = 0; IntervalTableItem interval; var notes = new List <ScaleNote>(); for (int i = 0; i < 12; i++) { var isIntervalPresent = intervals[i]; if (isIntervalPresent && ScaleFamily.IsSevenNoteScale) { interval = Intervals.IntervalTable.GetRow(i).First(x => x.ScaleDegree == noteIndex); noteIndex = (noteIndex + 1) % noteCount; } else { interval = Intervals.IntervalTable.GetRow(i)[0]; } naturalNote = naturalNotes[interval.ScaleDegree]; var index = (RootNote.Index + i) % 12; var note = MusicNotes.Notes.First(x => x.Name == naturalNote.Name && x.Index == index); var scaleNote = new ScaleNote(this, note, i, isIntervalPresent, interval); notes.Add(scaleNote); } return(notes.ToArray()); }