File size: 7,020 Bytes
24be4a2
 
 
 
 
 
 
 
 
 
 
 
 
d803b22
24be4a2
 
 
 
 
 
 
d803b22
24be4a2
d803b22
 
 
 
24be4a2
d803b22
 
24be4a2
d803b22
24be4a2
d803b22
 
c15524a
d803b22
 
24be4a2
d803b22
 
24be4a2
d803b22
 
 
24be4a2
d803b22
24be4a2
d803b22
 
 
 
 
24be4a2
d803b22
 
 
 
 
 
 
 
24be4a2
 
 
d803b22
 
 
 
 
 
 
 
 
 
 
24be4a2
 
d803b22
 
 
 
 
24be4a2
c15524a
 
 
 
d803b22
 
 
 
24be4a2
d803b22
24be4a2
d803b22
 
 
 
24be4a2
 
 
d803b22
 
 
 
 
24be4a2
 
d803b22
 
 
24be4a2
d803b22
 
24be4a2
 
d803b22
24be4a2
886ead7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
---
license: cc-by-4.0
language:
- en
tags:
- audio
- music-information-retrieval
- guitar
- tablature
- guitar-tablature-estimation
- onnx
- tabcnn
- guitarset
- guitarprofx
- cqt
pipeline_tag: audio-classification
library_name: onnx
---

# TabCNN (ONNX) — guitar tablature estimation

ONNX exports of **TabCNN** (Wiggins & Kim, ISMIR 2019) — a small CNN that
estimates guitar **tablature** (which fret is played on each of the 6 strings)
from audio, frame by frame. Both exports end in a per-string **LogSoftmax** head
so a decoder can consume log-probs directly, and share the **frozen output
contract**: `[N, 6, 21]`, **class 0 = string silent/closed**, **class k = fret
k−1** (class 1 = open, class 20 = fret 19).

Built for the pure-Dart [`onnx_runtime_dart`](https://github.com/CrispStrobe/onnx_runtime_dart)
runtime (no native ORT / FFI, web-capable), but it's standard ONNX.

## Two models — pick by input

| File | Variant | Best for | EGSet12 (real electric) | Front-end |
|---|---|---|---|---|
| **`tabcnn-gpfx.onnx`** ⭐ | **GuitarProFX-augmented** (Pedroza et al., DAFx-24) | electric guitar, effects, real tones | **F1 ≈ 0.59** | CQT → **dB → [0,1]** |
| `tabcnn.onnx` | vanilla (trained on GuitarSet) | clean / acoustic-ish | ~0.45 zero-shot | CQT → **raw magnitude** |
| `tabcnn-cqt.bin` | — | the shared 192-bin CQT filterbank both need | — | — |

**Use `tabcnn-gpfx.onnx`** unless you specifically want raw-magnitude features —
it's the robust variant (the vanilla model collapses on distorted/electric tones).

- `tabcnn-gpfx.onnx` — sha256 `8d9ce59157bdab37fb4816d32d7f29f3da0cdbf3c7876707c819af4d1f88e6b7`, 833,982 params
- `tabcnn.onnx` — sha256 `15c58000ed2d1deb3d3fc07581aa1823482dad91d913399dc0209ef240ad8a51`
- `tabcnn-cqt.bin` — sha256 `4e5dfa1f10f76545a30cbfd3224431503dbad943b1def78624632284e6df597a`

## Inputs / outputs (both models)

- **Input** `input : float32[N, 192, 9, 1]` — per frame, a 9-frame context window
  of the 192-bin CQT (`bins × context × channel`). `N` = a batch of windows.
- **Output** `output : float32[N, 6, 21]` — per string, a **LogSoftmax** over 21
  classes; **class 0 = closed**, class k = fret k−1.
- **Frame hop** = 512 / 22050 = **0.023220 s** (≈ 43 fps).

## CQT front-end — the #1 correctness risk (differs by variant!)

Both use the same CQT geometry (sr 22050, hop 512, n_bins 192, bins_per_octave
24, fmin C1 = 32.703 Hz), and `tabcnn-cqt.bin` is that 192-bin filterbank
precomputed (banded, n_fft 32768, boxcar STFT) for a `librosa`-free front-end —
it matches `librosa.cqt` at **cosine 0.999947 / median magnitude ratio 0.9999**.

**The normalization after the CQT differs:**

```python
import librosa, numpy as np
C = np.abs(librosa.cqt(y, sr=22050, hop_length=512, n_bins=192, bins_per_octave=24))  # [192, frames]

# tabcnn-gpfx.onnx  (GuitarProFX — recommended):  per-clip dB, then [0,1]
feats = librosa.amplitude_to_db(C, ref=np.max)          # [-80, 0], per clip
feats = (feats - feats.min()) / (feats.max() - feats.min() + 1e-9)

# tabcnn.onnx  (vanilla):  RAW magnitude, no log/norm
# (peak-normalize the *waveform* first: y = librosa.util.normalize(y))
feats = C

repr_ = np.swapaxes(feats, 0, 1)   # [frames, 192]; window = pad 4 each side, [f:f+9] -> [192,9,1]
```

With `tabcnn-cqt.bin`, magnitude = `|Σ band·boxcarSTFT| / √length` (the blob's
`mean`/`std` header fields are 0/1 and unused). Apply the per-variant
normalization above to that magnitude.

## Performance & verification

- `tabcnn-gpfx.onnx`: **EGSet12 (12-track, frame-level tab F1) = 0.59 micro / 0.55
  macro — MEASURED here** (per-track 0.30–0.80), matching the paper's reported
  0.585 for this model; on clean GuitarSet it reaches ~0.77. A big lift over the
  vanilla model's ~0.45 EGSet12 zero-shot.
- `tabcnn.onnx`: held-out GuitarSet tab F1 0.745 (paper 0.748).
- Both run on `onnx_runtime_dart` faithfully vs the reference (per-string argmax
  agreement; standard ops only — Conv/MaxPool/Relu/MatMul/LogSoftmax + a class
  reorder for gpfx).

## Class-layout note (gpfx)

The GuitarProFX (`amt-tools`) model natively uses **class 20 = silence, class k =
fret k**. The export **remaps** that to the shared contract above (class 0 =
silent, class k = fret k−1) with a `roll`, so both `.onnx` files present the
identical `[6,21]` layout to the decoder.

## Licence & attribution (CC BY 4.0)

- Vanilla: trained here on **GuitarSet** (CC BY 4.0). Attribution to GuitarSet required.
- GuitarProFX: weights from **Zenodo 11406378** (`best_TabCNN_tablature_trancription_model`,
  CC BY 4.0), the DAFx-24 GuitarProFX model, built on Cwitkowitz's
  [`amt-tools`](https://github.com/cwitkowitz/amt-tools) (MIT). Attribution to
  GuitarSet + Pedroza et al. required.

```bibtex
@inproceedings{xi2018guitarset, title={GuitarSet: A Dataset for Guitar Transcription},
  author={Xi, Qingyang and Bittner, Rachel M. and Pauwels, Johan and Ye, Xuzhou and Bello, Juan Pablo}, booktitle={ISMIR}, year={2018}}
@inproceedings{wiggins2019tabcnn, title={Guitar Tablature Estimation with a Convolutional Neural Network},
  author={Wiggins, Andrew and Kim, Youngmoo}, booktitle={ISMIR}, year={2019}}
@inproceedings{pedroza2024guitarprofx, title={Leveraging Real Electric Guitar Tones and Effects to Improve Robustness in Guitar Tablature Transcription Modeling},
  author={Pedroza, Hegel and others}, booktitle={DAFx}, year={2024}}
```

Reproduction (vanilla) + export scripts:
[`onnx_runtime_dart/tool/tabcnn/`](https://github.com/CrispStrobe/onnx_runtime_dart/tree/main/tool/tabcnn).

## Provenance — mixed authorship, and outside the GPAI definition

Added 2026-08-02 during an account-wide provenance review.

**This repository holds weights of two different origins**, which is why the
per-file table above matters more here than in a typical conversion repo:
`tabcnn.onnx` (vanilla) was **trained here** on GuitarSet (CC BY 4.0), while the GuitarProFX weights were **re-exported** from Zenodo record 11406378 (Pedroza et al.). Attribution obligations differ between them and are set out above.

Most `cstr/*` repositories are conversions where the upstream research team
remains the provider of the model. That description is only half true here, and
a blanket "format conversion only" statement — of the kind added across the
conversion repos in this review — would have been inaccurate for this one. It is
deliberately not made.

**EU AI Act Art. 53 does not apply.** Art. 53 binds providers of *general-purpose
AI models*, defined by Art. 3(63) as models displaying "significant generality"
and capable of "competently performing a wide range of distinct tasks". A CNN transcribing guitar tablature from audio
does not meet that definition, so the Art. 53(1)(c) copyright-policy and
53(1)(d) training-content duties are not engaged for either set of weights. The
training-data and licence documentation above is published because attribution
is required and because it is useful — not because Art. 53 compels it.