private List <Pitch> GenerateBassPositions() { List <Pitch> bassPositions = new List <Pitch>(); for (int oct = Pitch.BasLowestOctave(); oct <= Pitch.BasHighestOctave(); ++oct) { Pitch pitch = new Pitch(GetChordLnDegInversion(ct.bassInversion), oct); if (pitch.IsWithinTheRange(Part.Bas)) { bassPositions.Add(pitch); } } return(bassPositions); }
private void GenerateUpper3Step(bool standard, Pitch bas, List <LnDegInversion> upper3, int step, PositionOfAChord positionOfAChord) { for (int i = 0; i < upper3.Count; ++i) { for (int tenOct = Pitch.TenLowestOctave(); tenOct <= Pitch.TenHighestOctave(); ++tenOct) { Pitch ten = new Pitch(upper3[i], tenOct); if (!ten.IsWithinTheRange(Part.Ten)) { continue; } for (int altOct = Pitch.AltLowestOctave(); altOct <= Pitch.AltHighestOctave(); ++altOct) { Pitch alt = new Pitch(upper3[(i + step) % upper3.Count], altOct); if (!alt.IsWithinTheRange(Part.Alt)) { continue; } for (int sopOct = Pitch.SopLowestOctave(); sopOct <= Pitch.SopHighestOctave(); ++sopOct) { Pitch sop = new Pitch(upper3[(i + step * 2) % upper3.Count], sopOct); if (!sop.IsWithinTheRange(Part.Sop)) { continue; } Chord chord = new Chord(ct, standard, bas, ten, alt, sop); if (chord.Verdict != VerdictValue.Delist && chord.IsWithinTheRange() && chord.Upper3PositionIsCorrect() && !chordList.Contains(chord, new ChordEqualityComparer())) { //System.Console.WriteLine("{0} {1} {2}", ten.LetterName.LN, alt.LetterName.LN, sop.LetterName.LN); chordList.Add(chord); } } } } } }
private void GenerateUpper3(bool standard, Pitch bas, List <LnDegInversion> upper3, PositionOfAChord positionOfAChord) { GenerateUpper3Step(standard, bas, upper3, 1, positionOfAChord); GenerateUpper3Step(standard, bas, upper3, 2, positionOfAChord); }
/// <summary> /// rhsとの音程(1度=0) 絶対値。同度=0、1オクターブ=7 /// </summary> /// <returns> /// 0: 完全1度、増一度、重増一度 /// 1: 短二度、長二度、減二度、増二度、重増二度 /// 2: 短3度、長3度、減3度、重減3度、増3度、重増3度 /// 3: 完全4度、増4度、減4度、… /// 4: 5度 /// 7: 8度 /// 8: 9度 /// 11: 12度 /// </returns> public int AbsIntervalNumberWith(Pitch rhs) { return(Math.Abs(HigherIntervalTo(rhs))); }
/// <summary> /// 楽譜の上でrhsの上に来るか下に来るか。 /// 正: rhsのほうが低い 数字は度。 /// 負: rhsのほうが高い 数字は度。 /// 例: ten.HigherIntervalTo(bas) > 0 /// 注:この比較は(フラットやシャープを考慮しているが)あくまで楽譜の上で /// 上か下かを判断するものでCes4よりもHis3のほうが低いと判断する。 /// </summary> /// <param name="rhs">比較対象のピッチ。</param> public int HigherIntervalTo(Pitch rhs) { return(GetIntervalNumberFromC0() - rhs.GetIntervalNumberFromC0()); }
/// <summary> /// rhsとの半音の数(絶対値)。0==同音、12==1オクターブ /// </summary> /// <param name="rhs">比較対象。</param> public int AbsNumberOfSemitonesWith(Pitch rhs) { return(Math.Abs(HigherPitchTo(rhs))); }
/// <summary> /// MIDIで発音したときのピッチを比較する。 /// 正: rhsのほうが低い 数字は半音の数。 /// 負: rhsのほうが高い 数字は半音の数。 /// 例: ten.HigherPitchTo(bas) > 0 /// </summary> public int HigherPitchTo(Pitch rhs) { return(GetMidiPitchValue() - rhs.GetMidiPitchValue()); }
public Pitch(Pitch rhs) { ldi = rhs.ldi; octave = rhs.octave; }