function parseTab(tab) {
const lines = tab.trim().split('\n');
let head = 0;
let slice = null;
const reel = [];
function startSlice() {
slice = Array(6).fill();
}
function flushSlice() {
reel.push({ slice, index: head - 1 });
slice = null;
}
function addToSlice(curr) {
curr.forEach((fret, i) => {
if (!slice[i]) {
slice[i] = fret;
} else {
slice[i] += fret;
}
});
}
function readHead() {
const result = lines.map(line => line[head]);
head += 1;
return result;
}
while (lines.some(line => head < line.length)) {
const curr = readHead().map(d => (isInteger(d) ? d : null));
const hasSomeFretInfo = curr.some(Boolean);
if (hasSomeFretInfo) {
if (!slice) {
startSlice();
}
addToSlice(curr);
} else if (slice) {
flushSlice();
}
}
return reel.map(({ index, slice }) =>
slice
.map((fret, string) => ({ fret, string: string + 1, index }))
.filter(d => d.fret != null)
.map(({ fret, string, index }) => ({
fret: Number.parseInt(fret),
string,
index
}))
);
}