public override int GetHashCode() { unchecked { var result = 17; result = result * 23 + IntervalNumber.GetHashCode(); result = result * 23 + Alteration.GetHashCode(); return(result); } }
public Key GetByIntervalNumber(Key startKey, IntervalNumber intervalNumber) { var outKey = startKey; for (int i = 0; i < (int)intervalNumber; i++) { outKey = GetNextKey(outKey); } return(outKey); }
private static int GetSemitones(IntervalNumber number, IntervalQuality quality, sbyte multiplicity) { int semitones = s_numberToSemitones[number - IntervalNumber.Unison]; if (quality == IntervalQuality.Minor || quality == IntervalQuality.Diminished && !number.IsPerfect()) { semitones--; } if (multiplicity > 0) { if (quality == IntervalQuality.Augmented) { semitones += multiplicity; } else { semitones -= multiplicity; } } return(semitones); }
public static Interval operator +(Interval interval1, Interval interval2) { int absoluteNumber = interval1._absoluteNumber + interval2._absoluteNumber; int semitones = (interval1.Semitones + interval2.Semitones) % SemitonesPerOctave; IntervalNumber number = (IntervalNumber)Math.Abs(absoluteNumber % NumbersPerOctave); IntervalQuality quality; if (number.IsPerfect()) { quality = IntervalQuality.Perfect; semitones -= GetSemitones(number, quality, 0); } else { quality = IntervalQuality.Major; semitones -= GetSemitones(number, quality, 0); if (semitones < 0) { quality = IntervalQuality.Minor; semitones++; } } if (semitones > 0) { quality = IntervalQuality.Augmented; } else if (semitones < 0) { quality = IntervalQuality.Diminished; } return(new Interval(absoluteNumber, quality, (sbyte)Math.Abs(semitones))); }
public KeyViewModel Get(Key startKey, IntervalNumber intervalNumber) { return(_keyService.GetByIntervalNumber(startKey, intervalNumber)); }
public void Test_GetByIntervalNumber(Key inputKey, IntervalNumber interval, Key expectedKey) { var key = _keyService.GetByIntervalNumber(inputKey, interval); Assert.That(key, Is.EqualTo(expectedKey)); }
public static bool IsPerfect(this IntervalNumber number) { return(number == IntervalNumber.Unison || number == IntervalNumber.Fourth || number == IntervalNumber.Fifth || number == IntervalNumber.Octave); }
public Interval(IntervalNumber number, IntervalQuality quality, sbyte multiplicity = 0) : this(IntervalNumber.Unison <= number && number <= IntervalNumber.Octave ? number - IntervalNumber.Unison : throw new ArgumentOutOfRangeException(nameof(number)), quality, multiplicity) { }