public static string GenerateTab(Phrase phrase, string tuning = "E,B,G,D,A,E", bool oneLineIfPossible = false) { phrase = phrase.Clone(); while (PhraseHelper.IsPhraseDuplicated(phrase)) { PhraseHelper.TrimPhrase(phrase, phrase.PhraseLength / 2); } var tabParser = new TabParser(tuning); while (phrase.Elements.Min(x => x.Note) > tabParser.TabLines.Last().Number) { NoteHelper.ShiftNotesDirect(phrase, 1, Interval.Octave, Direction.Down); } while (phrase.Elements.Min(x => x.Note) < tabParser.TabLines.Last().Number) { NoteHelper.ShiftNotesDirect(phrase, 1, Interval.Octave); } tabParser.LoadTabFromPhrase(phrase, oneLineIfPossible); return(BuildTab(tabParser)); }
private static string BuildTab(TabParser parser) { var builder = new StringBuilder(); foreach (var tabLine in parser.TabLines) { var line = parser.TabLines.IndexOf(tabLine); builder.Append(NoteHelper.NumberToNoteOnly(tabLine.Number).PadRight(3)); foreach (var tabNote in parser.TabNotes) { builder.Append(tabNote.Line == line ? tabNote.Fret.ToString().PadRight(tabNote.LengthInCharacters) : string.Empty.PadRight(tabNote.LengthInCharacters)); } builder.AppendLine(); } builder.Append(" "); foreach (var tabNote in parser.TabNotes) { builder.Append(tabNote.Note.PadRight(tabNote.LengthInCharacters)); } builder.AppendLine(); return(builder.ToString()); }
public static Phrase ParseTab(string tabText) { var tab = new TabParser(); tab.LoadTabFromTabText(tabText); var phrase = new Phrase { Elements = tab .TabNotes .Select(x => new PhraseElement { Note = x.Number, Duration = x.Length }) .ToList() }; PhraseHelper.UpdatePositionsFromDurations(phrase); return(phrase); }