popelenkow commited on
Commit
fbd620e
·
verified ·
0 Parent(s):

Publish ChordNet 2E1D ONNX classifier and matched CQT plan

Browse files
Files changed (6) hide show
  1. .gitattributes +37 -0
  2. README.md +187 -0
  3. chordnet.onnx +3 -0
  4. config.json +206 -0
  5. cqt-plan.bin +3 -0
  6. cqt-plan.manifest.json +77 -0
.gitattributes ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.json text eol=lf
37
+ *.md text eol=lf
README.md ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ library_name: onnxruntime-web
4
+ pipeline_tag: audio-classification
5
+ tags:
6
+ - audio
7
+ - chord-recognition
8
+ - music-information-retrieval
9
+ - constant-q-transform
10
+ - onnx
11
+ - onnxruntime-web
12
+ - webgpu
13
+ ---
14
+
15
+ # ChordMini ChordNet (2E1D) — classifier + CQT plan (ONNX / WebGPU)
16
+
17
+ ONNX export of the **ChordMini** chord recognizer (ChordNet "2E1D", 170-class
18
+ large vocabulary), packaged for the [`musetric`][musetric] `packages/ai` runtime
19
+ (`onnxruntime-web` on **WebGPU**).
20
+
21
+ The graph is the **classifier only**: it takes log-CQT feature windows and
22
+ returns per-frame chord logits. Feature extraction is deliberately *not* baked
23
+ in — the host computes a recursive constant-Q transform on WebGPU and hands the
24
+ result over as a GPU buffer, so no features cross back to the CPU. This is not a
25
+ drop-in `audio -> chords` model.
26
+
27
+ ```text
28
+ mono PCM @ 22050 Hz (arithmetic-mean downmix — see Limitations)
29
+ -> WebGPU recursive CQT -> log(|CQT| + 1e-6) features [T, 144]
30
+ -> pad/window -> [W, 108, 144]
31
+ -> chordnet.onnx -> logits [W, 108, 170]
32
+ -> WebGPU smoothing + argmax -> chord indices [T]
33
+ ```
34
+
35
+ `cqt-plan.bin` ships with the model because it *defines* the features the graph
36
+ expects: the octave schedule, the sparse per-octave FFT basis and the resampling
37
+ FIR, baked from librosa 0.11.0. Model and plan are a matched pair — a release
38
+ therefore carries a hashable feature-extraction contract instead of an implicit
39
+ one.
40
+
41
+ Normalization (`(x - mean) / (std + 1e-8)`) is inside the graph. CQT, windowing,
42
+ smoothing and argmax stay in the host so their GPU buffers stay reusable.
43
+
44
+ ## Intended uses & limitations
45
+
46
+ **Intended:**
47
+ - Chord recognition over music, as a stage in an audio pipeline.
48
+ - Client/edge inference via WebGPU through `onnxruntime-web`.
49
+
50
+ **Out of scope:**
51
+ - Standalone use without a host that computes librosa-equivalent log-CQT
52
+ features, windows them to 108 frames, and applies smoothing + argmax to the
53
+ logits (see `musetric` `packages/ai` and `packages/cqt`).
54
+ - Use in other training frameworks — this is an inference-only export.
55
+
56
+ **Limitations:**
57
+ - The 108-frame window and 144 CQT bins are fixed model contract; only the
58
+ window count `W` is dynamic. Inputs shorter than 108 frames must be padded to
59
+ one window and trimmed back.
60
+ - **The features must be librosa-equivalent.** Substituting a different CQT is
61
+ not free: an nnAudio `CQT1992v2` stand-in correlates at ~0.998 yet still costs
62
+ ~1.2% of frames end to end. Use the shipped plan.
63
+ - **The model is gain-sensitive.** It was trained on `librosa.load`'s arithmetic
64
+ mean downmix `(L+R)/2`. `ffmpeg -ac 1` uses an energy-preserving rematrix
65
+ `(L+R)/sqrt(2)`, i.e. a factor of √2, which `log(|CQT| + 1e-6)` turns into a
66
+ constant `log(√2) = 0.347` offset on every feature — after `std = 1.719` a
67
+ uniform `+0.20` shift, enough to flip frames near a decision boundary. Downmix
68
+ as the arithmetic mean.
69
+ - Its `idx_to_chord` checkpoint map differs from the reference runner's
70
+ `idx2voca_chord()` on 70 of 170 indices, in enharmonic spelling only
71
+ (`Db:min` vs `C#:min`). `config.json` ships the runner's vocabulary.
72
+ - Training-data provenance of the upstream checkpoint is not documented here.
73
+
74
+ ## How to use
75
+
76
+ The session runs the classifier; the host supplies `features` and consumes
77
+ `logits`.
78
+
79
+ ```ts
80
+ import * as ort from 'onnxruntime-web/webgpu';
81
+ import { createCqt, verifyCqtPlanArtifact } from '@musetric/cqt/gpu';
82
+
83
+ const session = await ort.InferenceSession.create('chordnet.onnx', {
84
+ executionProviders: ['webgpu'],
85
+ preferredOutputLocation: { logits: 'gpu-buffer' },
86
+ });
87
+ const device = await ort.env.webgpu.device;
88
+
89
+ // cqt-plan.bin; verifies the payload against the SHA-256 it carries.
90
+ const plan = await verifyCqtPlanArtifact(new Uint8Array(planBytes));
91
+ const cqt = createCqt(device).get({ input: pcm, output: features, sampleCount, plan });
92
+ // cqt.run(encoder) writes log features [T, 144]; pad T up to a multiple of 108.
93
+
94
+ const input = ort.Tensor.fromGpuBuffer(paddedFeatures, {
95
+ dataType: 'float32',
96
+ dims: [windowCount, 108, 144],
97
+ });
98
+ const { logits } = await session.run({ features: input });
99
+ // logits: float32 [W, 108, 170] -> uniform 9-frame smoothing -> argmax -> indices
100
+ ```
101
+
102
+ See the `musetric` `packages/ai` host code for the full CQT, smoothing/argmax and
103
+ segment-grouping pipeline.
104
+
105
+ ## Files
106
+
107
+ | File | Size | SHA256 |
108
+ |---|---|---|
109
+ | `chordnet.onnx` | 9,604,664 B | `9a6570bf611cdc3f2c36286307af46fb94927fe7f6a2bc22a87c0ebf5f6c082e` |
110
+ | `config.json` | 3,009 B | `1f26c11ebea51ec08f12e813eb213a729fa0ecc407ac7632dfdc7bad67e65aa4` |
111
+ | `cqt-plan.bin` | 23,896 B | `c31f0a6fd2d582d753be6628b5daecdee58acba53cba93b2bc2b5c75dee2ba48` |
112
+ | `cqt-plan.manifest.json` | 1,721 B | `522b178e4f6e8ae5b6bf63b8e2f1a615fe2398592e27f7d9e3e219810081019f` |
113
+
114
+ `config.json` records the I/O contract, checkpoint normalization, the CQT
115
+ configuration and the 170-label vocabulary. `cqt-plan.manifest.json` records the
116
+ plan's generator, configuration and payload hash.
117
+
118
+ **Signature** — float32 weights, opset `ai.onnx` 17:
119
+
120
+ | Tensor | Type | Shape | Meaning |
121
+ |---|---|---|---|
122
+ | `features` (in) | float32 | `[W, 108, 144]` | unnormalized `log(\|CQT\| + 1e-6)` windows; 108 frames, 144 bins |
123
+ | `logits` (out) | float32 | `[W, 108, 170]` | per-frame chord logits, before smoothing and argmax |
124
+
125
+ **CQT plan** — `librosa 0.11.0`, `sr=22050`, `hop=2048`, `fmin=C1`, `n_bins=144`,
126
+ `bins_per_octave=24`, `norm=1`, `sparsity=0.01`, `window='hann'`, `scale=True`,
127
+ `pad_mode='constant'`; 6 octaves after one early downsample, 512-point FFT per
128
+ octave, resampler `kaiser-lowpass-255-cutoff-0.48-beta-12`.
129
+
130
+ ## Validation
131
+
132
+ This export + the WebGPU CQT vs the PyTorch + `librosa.cqt` reference runner:
133
+
134
+ | Metric | Value |
135
+ |---|---|
136
+ | per-frame chord agreement (20 instrumental stems) | **1.0000** |
137
+ | exported logits vs Torch ChordNet, identical inputs | max abs error < `1e-4` |
138
+ | degenerate outputs | 0 |
139
+
140
+ Agreement is exact because the only approximation was removed. The predecessor
141
+ artifact baked the whole pipeline into one graph with nnAudio `CQT1992v2` in
142
+ place of `librosa.cqt`; that stand-in was the entire remaining gap (mean 0.9883,
143
+ worst 0.9410) and cost 70% of inference time and 37.8 of 47.4 MB. Reproducing
144
+ librosa's recursive per-octave transform on WebGPU fixed accuracy and size at
145
+ once.
146
+
147
+ Validate on the material fed in production — the **instrumental stem**.
148
+ Agreement measured on audio where the reference emits a near-constant label (for
149
+ example an isolated vocal, where "no chord" is correct on ~99% of frames)
150
+ carries no information: a stub returning that label scores just as well.
151
+ Re-run the parity gate on the exact published bytes before relying on it.
152
+
153
+ ## Source & lineage
154
+
155
+ Code license and weight license are separate; ONNX conversion does not change the
156
+ weight license. Documented only as far as it is verifiable.
157
+
158
+ - **Architecture:** ChordNet "2E1D" — frequency encoder + time encoder +
159
+ decoder, a small transformer (~2.3 M parameters).
160
+ - **Reference implementation and weights:** [`ptnghia-j/ChordMini`][upstream],
161
+ **MIT** (per its `LICENSE`). Upstream publishes **no Hugging Face repo**, so
162
+ the weights come from the GitHub repository rather than the Hub.
163
+ - **Checkpoint:** [`checkpoints/2e1d_model_best.pth`][ckpt] — 27,523,646 B, git
164
+ blob `b61f6b3a02cc42b87afa38392f80d185a49f719a` — fetched at export time from
165
+ [`raw.githubusercontent.com`][ckpt-raw]. That URL tracks `main` and upstream
166
+ publishes no tagged release, so the fetch follows a moving branch; the blob
167
+ hash above identifies what this export actually used.
168
+ - **Vendored code:** the inference subset lives under
169
+ `musetric_toolkit/chords_audio/chordmini` in [musetric-toolkit][toolkit]; see
170
+ its [`thirdPartyNotices.md`][notices].
171
+ - **Export tooling:** `scripts/onnx/chordmini` in [musetric-toolkit][toolkit].
172
+ - **Host runtime:** `packages/cqt` (the CQT) and `packages/ai` (the session and
173
+ the smoothing/argmax passes) in [`musetric`][musetric].
174
+
175
+ This export preserves the upstream **MIT** license; we do not claim authorship of
176
+ the original weights.
177
+
178
+ ## License
179
+
180
+ MIT, inherited from the upstream weights.
181
+
182
+ [upstream]: https://github.com/ptnghia-j/ChordMini
183
+ [ckpt]: https://github.com/ptnghia-j/ChordMini/blob/main/checkpoints/2e1d_model_best.pth
184
+ [ckpt-raw]: https://raw.githubusercontent.com/ptnghia-j/ChordMini/main/checkpoints/2e1d_model_best.pth
185
+ [toolkit]: https://github.com/popelenkow/musetric-toolkit
186
+ [notices]: https://github.com/popelenkow/musetric-toolkit/blob/main/thirdPartyNotices.md
187
+ [musetric]: https://github.com/popelenkow/musetric
chordnet.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9a6570bf611cdc3f2c36286307af46fb94927fe7f6a2bc22a87c0ebf5f6c082e
3
+ size 9604664
config.json ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "modelType": "chordmini-chordnet-2e1d",
3
+ "input": {
4
+ "name": "features",
5
+ "shape": [
6
+ "windows",
7
+ 108,
8
+ 144
9
+ ],
10
+ "dtype": "float32"
11
+ },
12
+ "output": {
13
+ "name": "logits",
14
+ "shape": [
15
+ "windows",
16
+ 108,
17
+ 170
18
+ ],
19
+ "dtype": "float32"
20
+ },
21
+ "seqLen": 108,
22
+ "sampleRate": 22050,
23
+ "hopLength": 2048,
24
+ "frameDuration": 0.09287981859410431,
25
+ "fmin": 32.70319566257483,
26
+ "nBins": 144,
27
+ "binsPerOctave": 24,
28
+ "smoothingKernel": 9,
29
+ "numChords": 170,
30
+ "mean": -2.2279880046844482,
31
+ "std": 1.719132900238037,
32
+ "normalizationEpsilon": 1e-08,
33
+ "normalizationInGraph": true,
34
+ "chordVocab": [
35
+ "C:min",
36
+ "C",
37
+ "C:dim",
38
+ "C:aug",
39
+ "C:min6",
40
+ "C:maj6",
41
+ "C:min7",
42
+ "C:minmaj7",
43
+ "C:maj7",
44
+ "C:7",
45
+ "C:dim7",
46
+ "C:hdim7",
47
+ "C:sus2",
48
+ "C:sus4",
49
+ "C#:min",
50
+ "C#",
51
+ "C#:dim",
52
+ "C#:aug",
53
+ "C#:min6",
54
+ "C#:maj6",
55
+ "C#:min7",
56
+ "C#:minmaj7",
57
+ "C#:maj7",
58
+ "C#:7",
59
+ "C#:dim7",
60
+ "C#:hdim7",
61
+ "C#:sus2",
62
+ "C#:sus4",
63
+ "D:min",
64
+ "D",
65
+ "D:dim",
66
+ "D:aug",
67
+ "D:min6",
68
+ "D:maj6",
69
+ "D:min7",
70
+ "D:minmaj7",
71
+ "D:maj7",
72
+ "D:7",
73
+ "D:dim7",
74
+ "D:hdim7",
75
+ "D:sus2",
76
+ "D:sus4",
77
+ "D#:min",
78
+ "D#",
79
+ "D#:dim",
80
+ "D#:aug",
81
+ "D#:min6",
82
+ "D#:maj6",
83
+ "D#:min7",
84
+ "D#:minmaj7",
85
+ "D#:maj7",
86
+ "D#:7",
87
+ "D#:dim7",
88
+ "D#:hdim7",
89
+ "D#:sus2",
90
+ "D#:sus4",
91
+ "E:min",
92
+ "E",
93
+ "E:dim",
94
+ "E:aug",
95
+ "E:min6",
96
+ "E:maj6",
97
+ "E:min7",
98
+ "E:minmaj7",
99
+ "E:maj7",
100
+ "E:7",
101
+ "E:dim7",
102
+ "E:hdim7",
103
+ "E:sus2",
104
+ "E:sus4",
105
+ "F:min",
106
+ "F",
107
+ "F:dim",
108
+ "F:aug",
109
+ "F:min6",
110
+ "F:maj6",
111
+ "F:min7",
112
+ "F:minmaj7",
113
+ "F:maj7",
114
+ "F:7",
115
+ "F:dim7",
116
+ "F:hdim7",
117
+ "F:sus2",
118
+ "F:sus4",
119
+ "F#:min",
120
+ "F#",
121
+ "F#:dim",
122
+ "F#:aug",
123
+ "F#:min6",
124
+ "F#:maj6",
125
+ "F#:min7",
126
+ "F#:minmaj7",
127
+ "F#:maj7",
128
+ "F#:7",
129
+ "F#:dim7",
130
+ "F#:hdim7",
131
+ "F#:sus2",
132
+ "F#:sus4",
133
+ "G:min",
134
+ "G",
135
+ "G:dim",
136
+ "G:aug",
137
+ "G:min6",
138
+ "G:maj6",
139
+ "G:min7",
140
+ "G:minmaj7",
141
+ "G:maj7",
142
+ "G:7",
143
+ "G:dim7",
144
+ "G:hdim7",
145
+ "G:sus2",
146
+ "G:sus4",
147
+ "G#:min",
148
+ "G#",
149
+ "G#:dim",
150
+ "G#:aug",
151
+ "G#:min6",
152
+ "G#:maj6",
153
+ "G#:min7",
154
+ "G#:minmaj7",
155
+ "G#:maj7",
156
+ "G#:7",
157
+ "G#:dim7",
158
+ "G#:hdim7",
159
+ "G#:sus2",
160
+ "G#:sus4",
161
+ "A:min",
162
+ "A",
163
+ "A:dim",
164
+ "A:aug",
165
+ "A:min6",
166
+ "A:maj6",
167
+ "A:min7",
168
+ "A:minmaj7",
169
+ "A:maj7",
170
+ "A:7",
171
+ "A:dim7",
172
+ "A:hdim7",
173
+ "A:sus2",
174
+ "A:sus4",
175
+ "A#:min",
176
+ "A#",
177
+ "A#:dim",
178
+ "A#:aug",
179
+ "A#:min6",
180
+ "A#:maj6",
181
+ "A#:min7",
182
+ "A#:minmaj7",
183
+ "A#:maj7",
184
+ "A#:7",
185
+ "A#:dim7",
186
+ "A#:hdim7",
187
+ "A#:sus2",
188
+ "A#:sus4",
189
+ "B:min",
190
+ "B",
191
+ "B:dim",
192
+ "B:aug",
193
+ "B:min6",
194
+ "B:maj6",
195
+ "B:min7",
196
+ "B:minmaj7",
197
+ "B:maj7",
198
+ "B:7",
199
+ "B:dim7",
200
+ "B:hdim7",
201
+ "B:sus2",
202
+ "B:sus4",
203
+ "X",
204
+ "N"
205
+ ]
206
+ }
cqt-plan.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c31f0a6fd2d582d753be6628b5daecdee58acba53cba93b2bc2b5c75dee2ba48
3
+ size 23896
cqt-plan.manifest.json ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "formatVersion": 1,
3
+ "generator": "librosa==0.11.0;numpy==2.4.6;scipy==1.16.3;resampler=kaiser-lowpass-255-cutoff-0.48-beta-12",
4
+ "payloadSha256": "9e233a7935aefc8172b3cead5bea8cbd1379c3f67066de7c8d59137cbc9bba94",
5
+ "artifactSha256": "c31f0a6fd2d582d753be6628b5daecdee58acba53cba93b2bc2b5c75dee2ba48",
6
+ "config": {
7
+ "sampleRate": 22050.0,
8
+ "hopLength": 2048,
9
+ "fmin": 32.70319566257483,
10
+ "nBins": 144,
11
+ "binsPerOctave": 24,
12
+ "output": "logMagnitude"
13
+ },
14
+ "earlyDownsampleCount": 1,
15
+ "octaveCount": 6,
16
+ "coefficientCount": 1818,
17
+ "downsampleTapCount": 255,
18
+ "downsample": {
19
+ "algorithm": "kaiser-lowpass-fir",
20
+ "cutoff": 0.48,
21
+ "kaiserBeta": 12,
22
+ "gain": 1.4142135623730951,
23
+ "delay": 127,
24
+ "boundary": "constant",
25
+ "outputLength": "ceil(input/2)"
26
+ },
27
+ "octaves": [
28
+ {
29
+ "index": 0,
30
+ "sampleRate": 11025.0,
31
+ "hopLength": 1024,
32
+ "fftSize": 512,
33
+ "binStart": 120,
34
+ "binCount": 24
35
+ },
36
+ {
37
+ "index": 1,
38
+ "sampleRate": 5512.5,
39
+ "hopLength": 512,
40
+ "fftSize": 512,
41
+ "binStart": 96,
42
+ "binCount": 24
43
+ },
44
+ {
45
+ "index": 2,
46
+ "sampleRate": 2756.25,
47
+ "hopLength": 256,
48
+ "fftSize": 512,
49
+ "binStart": 72,
50
+ "binCount": 24
51
+ },
52
+ {
53
+ "index": 3,
54
+ "sampleRate": 1378.125,
55
+ "hopLength": 128,
56
+ "fftSize": 512,
57
+ "binStart": 48,
58
+ "binCount": 24
59
+ },
60
+ {
61
+ "index": 4,
62
+ "sampleRate": 689.0625,
63
+ "hopLength": 64,
64
+ "fftSize": 512,
65
+ "binStart": 24,
66
+ "binCount": 24
67
+ },
68
+ {
69
+ "index": 5,
70
+ "sampleRate": 344.53125,
71
+ "hopLength": 32,
72
+ "fftSize": 512,
73
+ "binStart": 0,
74
+ "binCount": 24
75
+ }
76
+ ]
77
+ }