static public string DetermineChordType(SevenChord chordo) { var f = new int[4]; var neuChordo = new SevenChord(chordo.ChordNotes[0], chordo.ChordNotes[1], chordo.ChordNotes[2], chordo.ChordNotes[3], chordo.Mode, chordo.Inversion); int size = neuChordo.GetChordSize(); var notes = neuChordo.ChordNotes.OrderBy(n => n.getNoteNumber()).ToArray(); while (size > 12) { notes = notes.OrderBy(n => n.getNoteNumber()).ToArray(); notes[0] = JustNote.moveNoteBySemitones(notes[0], 12); notes = notes.OrderBy(n => n.getNoteNumber()).ToArray(); size = notes.Last().getNoteNumber() - notes.First().getNoteNumber(); if (size > 12) { notes[3] = JustNote.moveNoteBySemitones(notes[3], -12); notes = notes.OrderBy(n => n.getNoteNumber()).ToArray(); size = notes.Last().getNoteNumber() - notes.First().getNoteNumber(); } } f[0] = notes[1].getNoteNumber() - notes[0].getNoteNumber(); f[1] = notes[2].getNoteNumber() - notes[1].getNoteNumber(); f[2] = notes[3].getNoteNumber() - notes[2].getNoteNumber(); f[3] = 12 - f[0] - f[1] - f[2]; var fTemp = new int[4]; for (int i = 0; i < 4; i++) { fTemp[0] = f[(i + 0) % 4]; fTemp[1] = f[(i + 1) % 4]; fTemp[2] = f[(i + 2) % 4]; fTemp[3] = f[(i + 3) % 4]; if (SevenChordTypes.SevenchordTypes.Select(fff => fff.Value).Any(fo => fo[0] == fTemp[0] && fo[1] == fTemp[1] && fo[2] == fTemp[2] && fo[3] == fTemp[3])) { neuChordo.ChordType = SevenChordTypes.SevenchordTypes.First(fo => fo.Value[0] == fTemp[0] && fo.Value[1] == fTemp[1] && fo.Value[2] == fTemp[2] && fo.Value[3] == fTemp[3]).Key.ToString(); break; } if (i == 3) { neuChordo.ChordType = "undefined"; } } return(neuChordo.ChordType); }
public static List <SevenChordTransformationWithData> CalculateTransDataForSevenChords(List <int[]> sChordsTransformations) { var TransData = new List <SevenChordTransformationWithData>(); int counttt = 0; foreach (var item in sChordsTransformations) { var a = new SevenChordTransformationWithData(); a.Formula = item; a.ApplicationsOnVariosChords = new List <SevenChordTransformationDetailedInfo>(); foreach (var chordtype in SevenChordTypes.SevenchordTypes.Keys) { foreach (SevenChordMode mode in (SevenChordMode[])Enum.GetValues(typeof(SevenChordMode))) { foreach (SevenChordInversion inv in (SevenChordInversion[])Enum.GetValues(typeof(SevenChordInversion))) { var b = new SevenChordTransformationDetailedInfo(); b.InitialChordType = chordtype; b.InitialChordMode = mode; b.InitialChordInversion = inv; var testChord = new SevenChord(JustNote.getNoteFromNumber(48), SevenChordTypes.GetChordFormula(chordtype), mode, inv); b.TheApplications = new List <SevenChordSignature>(); b.TheStepsTransitions = new List <ChordStepsTransition>(); var bb = new SevenChordSignature(); bb.ChordType = testChord.ChordType; bb.Mode = testChord.Mode; bb.Inversion = testChord.Inversion; b.TheApplications.Add(bb); var prevNotes = new JustNote[4]; for (int i = 0; i < 4; i++) { prevNotes[i] = testChord.ChordNotes[i]; } var prevSize = testChord.GetChordSize(); var origSize = testChord.GetChordSize(); int simpleLoopFound = 0; int fullLoopFound = 0; int stepsTaken = 0; while (SevenChordTransformation.ApplyATransformation(testChord, a.Formula) && !b.Cyclic) { var bbb = new SevenChordSignature(); bbb.ChordType = testChord.ChordType; bbb.Mode = testChord.Mode; bbb.Inversion = testChord.Inversion; b.TheApplications.Add(bbb); var bbc = new ChordStepsTransition(); bbc.TonicMoved = testChord.ChordNotes[0].getNoteNumber() - prevNotes[0].getNoteNumber(); bbc.ThirdMoved = testChord.ChordNotes[1].getNoteNumber() - prevNotes[1].getNoteNumber(); bbc.FifthMoved = testChord.ChordNotes[2].getNoteNumber() - prevNotes[2].getNoteNumber(); bbc.SeventhMoved = testChord.ChordNotes[3].getNoteNumber() - prevNotes[3].getNoteNumber(); for (int i = 0; i < 4; i++) { prevNotes[i] = JustNote.moveNoteBySemitones(prevNotes[i], a.Formula[i]); } if (prevNotes[0].getNoteNumber() == testChord.ChordNotes[0].getNoteNumber()) { bbc.TonicInto = SevenChordStep.T; } else if (prevNotes[0].getNoteNumber() == testChord.ChordNotes[1].getNoteNumber()) { bbc.TonicInto = SevenChordStep.III; } else if (prevNotes[0].getNoteNumber() == testChord.ChordNotes[2].getNoteNumber()) { bbc.TonicInto = SevenChordStep.V; } else if (prevNotes[0].getNoteNumber() == testChord.ChordNotes[3].getNoteNumber()) { bbc.TonicInto = SevenChordStep.VII; } if (prevNotes[1].getNoteNumber() == testChord.ChordNotes[0].getNoteNumber()) { bbc.ThirdInto = SevenChordStep.T; } else if (prevNotes[1].getNoteNumber() == testChord.ChordNotes[1].getNoteNumber()) { bbc.ThirdInto = SevenChordStep.III; } else if (prevNotes[1].getNoteNumber() == testChord.ChordNotes[2].getNoteNumber()) { bbc.ThirdInto = SevenChordStep.V; } else if (prevNotes[1].getNoteNumber() == testChord.ChordNotes[3].getNoteNumber()) { bbc.ThirdInto = SevenChordStep.VII; } if (prevNotes[2].getNoteNumber() == testChord.ChordNotes[0].getNoteNumber()) { bbc.FifthInto = SevenChordStep.T; } else if (prevNotes[2].getNoteNumber() == testChord.ChordNotes[1].getNoteNumber()) { bbc.FifthInto = SevenChordStep.III; } else if (prevNotes[2].getNoteNumber() == testChord.ChordNotes[2].getNoteNumber()) { bbc.FifthInto = SevenChordStep.V; } else if (prevNotes[2].getNoteNumber() == testChord.ChordNotes[3].getNoteNumber()) { bbc.FifthInto = SevenChordStep.VII; } if (prevNotes[3].getNoteNumber() == testChord.ChordNotes[0].getNoteNumber()) { bbc.SeventhInto = SevenChordStep.T; } else if (prevNotes[3].getNoteNumber() == testChord.ChordNotes[1].getNoteNumber()) { bbc.SeventhInto = SevenChordStep.III; } else if (prevNotes[3].getNoteNumber() == testChord.ChordNotes[2].getNoteNumber()) { bbc.SeventhInto = SevenChordStep.V; } else if (prevNotes[3].getNoteNumber() == testChord.ChordNotes[3].getNoteNumber()) { bbc.SeventhInto = SevenChordStep.VII; } bbc.SizeDifference = testChord.GetChordSize() - prevSize; prevSize = testChord.GetChordSize(); b.TheStepsTransitions.Add(bbc); for (int i = 0; i < 4; i++) { prevNotes[i] = testChord.ChordNotes[i]; } stepsTaken++; // TODO : More complicated and trusted way to determine exact cycle if (testChord.ChordType == chordtype) { simpleLoopFound++; } if (testChord.ChordType == chordtype && testChord.Mode == mode && testChord.Inversion == inv) { fullLoopFound++; } if (fullLoopFound == 2) { b.Cyclic = true; } if (stepsTaken > 27 && simpleLoopFound < 1) { break; } if (stepsTaken > 55) { break; } } if (b.Cyclic) { b.LoopByTypeDistance = (stepsTaken / 2 + 1) / (simpleLoopFound / 2) - 1; b.FullLoopDistance = stepsTaken / 2; var sum = b.TheStepsTransitions.Sum(st => st.TonicMoved); if (sum == 0) { b.StayInPlace = true; } else if (sum > 0) { b.MovingUp = true; } else { b.MovingDown = true; } b.TheApplications.RemoveRange(b.FullLoopDistance, b.TheApplications.Count - b.FullLoopDistance - 1); b.TheStepsTransitions.RemoveRange((b.FullLoopDistance - 1), b.TheStepsTransitions.Count - b.FullLoopDistance); if (origSize - prevSize == 0) { b.SizeKept = true; } a.ApplicationsOnVariosChords.Add(b); } } } } if (a.ApplicationsOnVariosChords.Count > 0) { TransData.Add(a); } counttt++; Console.WriteLine(TransData.Count + " :: " + counttt + " :: " + " [" + a.Formula[0] + " " + a.Formula[1] + " " + a.Formula[2] + " " + a.Formula[3] + "] " + a.ApplicationsOnVariosChords.Count); } return(TransData); }