void ExportChordDiagrams(Gpif.Track gpTrack, Track track) { var diagrams = new Property() { Name = "DiagramCollection", Items = new List<Item>() }; var usedChords = track.Bars.SelectMany(b => b.Chords.Where(c => c.ChordId != -1).Select(c => c.ChordId)).Distinct(); foreach (var kvp in track.ChordTemplates) { // only display those with an actual name && used in the current track if (kvp.Value.Name == string.Empty || !usedChords.Contains(kvp.Key)) continue; // first, we need to determine at what base fret to start the chord diagram, // as all fret values are then relative to that int minFret = 100; int maxFret = 0; for (int i = 0; i < 6; ++i) { if (kvp.Value.Frets[i] > 0) { minFret = Math.Min(kvp.Value.Frets[i], minFret); maxFret = Math.Max(kvp.Value.Frets[i], maxFret); } } if (maxFret > 5) minFret = Math.Max(0, minFret - 1); else minFret = 0; var diagram = new Item() { Id = kvp.Value.ChordId, Name = kvp.Value.Name }; diagram.Diagram.StringCount = (track.Instrument == Track.InstrumentType.Bass ? 4 : 6); diagram.Diagram.FretCount = Math.Max(5, maxFret - minFret); diagram.Diagram.BaseFret = minFret; for (int i = 0; i < 6; ++i) { if (kvp.Value.Frets[i] != -1) { diagram.Diagram.Frets.Add(new Diagram.FretType() { String = i, Fret = (kvp.Value.Frets[i] == 0) ? 0 : kvp.Value.Frets[i] - minFret }); } var position = new Diagram.Position() { String = i, Fret = (kvp.Value.Frets[i] == 0) ? 0 : (kvp.Value.Frets[i] == -1) ? -1 : kvp.Value.Frets[i] - minFret }; switch (kvp.Value.Fingers[i]) { case 1: position.Finger = "Index"; break; case 2: position.Finger = "Middle"; break; case 3: position.Finger = "Ring"; break; case 4: position.Finger = "Pinky"; break; default: position.Finger = "None"; break; } diagram.Diagram.Fingering.Add(position); } diagrams.Items.Add(diagram); } gpTrack.Properties.Add(diagrams); }
void ExportChordDiagrams(Gpif.Track gpTrack, Track track) { var diagrams = new Property() { Name = "DiagramCollection", Items = new List <Item>() }; var usedChords = track.Bars.SelectMany(b => b.Chords.Where(c => c.ChordId != -1).Select(c => c.ChordId)).Distinct(); foreach (var kvp in track.ChordTemplates) { // only display those with an actual name && used in the current track if (kvp.Value.Name == string.Empty || !usedChords.Contains(kvp.Key)) { continue; } // first, we need to determine at what base fret to start the chord diagram, // as all fret values are then relative to that int minFret = 100; int maxFret = 0; for (int i = 0; i < 6; ++i) { if (kvp.Value.Frets[i] > 0) { minFret = Math.Min(kvp.Value.Frets[i], minFret); maxFret = Math.Max(kvp.Value.Frets[i], maxFret); } } if (maxFret > 5) { minFret = Math.Max(0, minFret - 1); } else { minFret = 0; } var diagram = new Item() { Id = kvp.Value.ChordId, Name = kvp.Value.Name }; diagram.Diagram.StringCount = (track.Instrument == Track.InstrumentType.Bass ? 4 : 6); diagram.Diagram.FretCount = Math.Max(5, maxFret - minFret); diagram.Diagram.BaseFret = minFret; for (int i = 0; i < 6; ++i) { if (kvp.Value.Frets[i] != -1) { diagram.Diagram.Frets.Add(new Diagram.FretType() { String = i, Fret = (kvp.Value.Frets[i] == 0) ? 0 : kvp.Value.Frets[i] - minFret }); } var position = new Diagram.Position() { String = i, Fret = (kvp.Value.Frets[i] == 0) ? 0 : (kvp.Value.Frets[i] == -1) ? -1 : kvp.Value.Frets[i] - minFret }; switch (kvp.Value.Fingers[i]) { case 1: position.Finger = "Index"; break; case 2: position.Finger = "Middle"; break; case 3: position.Finger = "Ring"; break; case 4: position.Finger = "Pinky"; break; default: position.Finger = "None"; break; } diagram.Diagram.Fingering.Add(position); } diagrams.Items.Add(diagram); } gpTrack.Properties.Add(diagrams); }