#let open = text(size: 2em, "\u{25CB}") #let close = text(size: 2em, "\u{25CF}") #let half = text(size: 2em, "\u{25D0}") #let note_to_tab = ( "D": ( "A": (close, close, open, open, open, open), "B": (close, open, open, open, open, open), "C": (open, close, close, open, open, open), "C#": (open, open, open, open, open, open), "D": (close, close, close, close, close, close), "E": (close, close, close, close, close, open), //"F": () "F#": (close, close, close, close, open, open), "G": (close, close, close, open, open, open), "A+": (close, close, open, open, open, open), "B+": (close, open, open, open, open, open), "C+": (open, close, close, close, open, open), "C#+": (open, close, close, open, open, open), "D+": (open, close, close, close, close, close), "E+": (close, close, close, close, close, open), "F#+": (close, close, close, close, open, open), "G+": (close, close, close, open, open, open), ) ) #let tabs(key: "D", notes) = { let dic = note_to_tab.at(key) let tab = () let i = 0 while i < notes.len() { let j = i + 1 while j < notes.len() and notes.at(j) in "#+"{ j = j + 1 } let note = notes.slice(i, j) let (name, octave) = if notes.at(j - 1) == "+" { (notes.slice(i, j - 1), "+") } else { (note, " ") } if note == " " { tab.push((" ",)*8) } else { tab.push((..dic.at(note), octave, name)) } i = j } grid( columns: (1.5em,)*tab.len(), rows: (1.2em,)*8, row-gutter: (0em, 0em, .5em, 0em, 0em, .4em, 0em), //stroke: black, align: center+horizon, ..for i in range(8) { for t in tab { (t.at(i),) } } ) }