whistle-tab/lib.typ

64 lines
1.7 KiB
Typst

#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),)
}
}
)
}