tabcnn-onnx / README.md
cstr's picture
docs: provenance — mixed authorship, GPAI status
886ead7 verified
|
Raw
History Blame Contribute Delete
7.02 kB
---
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.