CoolFace
Datasetpublic

Amourman/inzynierka-synth40-100k

Architektura synth40. tu jest 40 parametrów i inny tryb cech pann_mfcc_hilbert, embedding PANN/Cnn14 zamiast log-mel. Primary key to midi_48 zamiast midi_60 jak w synth37. inzynierka-synth40-100k 100 004 presetów syntezatora synth40, stokenizowane pod trening Transformer-VAE. Rekordy leżą na gładkich i spójnych brzmieniowo trajektoriach w przestrzeni brzmienia, cel modelu to przestrzeń latentna, po której da się organicznie ewoluować brzmienie z seeda w duchu Synplant2 od… See the full description on the dataset page: https://huggingface.co/datasets/Amourman/inzynierka-synth40-100k.

sourceHugging Faceupdated 25d agoView on Hugging Face
0likes101downloads
Dataset Card

Architektura synth40. tu jest 40 parametrów i inny tryb cech pann_mfcc_hilbert, embedding PANN/Cnn14 zamiast log-mel. Primary key to midi_48 zamiast midi_60 jak w synth37.


inzynierka-synth40-100k

100 004 presetów syntezatora synth40, stokenizowane pod trening Transformer-VAE. Rekordy leżą na gładkich i spójnych brzmieniowo trajektoriach w przestrzeni brzmienia, cel modelu to przestrzeń latentna, po której da się organicznie ewoluować brzmienie z seeda w duchu Synplant2 od Sonic Charge.

Fragmenty kodu są od codexa, nakierowanie na poprawne użycie tego repo.


tl;dr

  • —100 004 rekordy: Splity są przygotowane: train 79 885 / validation 10 198 / test 9 921 — nieregularne liczby, bo całe trajektorie trafiają po jednej stronie podziału.
  • —`preset_tokens/`: Preset jako 14 tokenów modułów, teraz 40 parametrów.
  • —`audio_tokens/`: Kody z EnCodeca. Tokenizowany jest tylko widok midi_48, nie midi_60 jak w poprzednim datasecie — synth40 ma inny domyślny ton). Preset renderowany jest na 4 tonach (36/48/60/72) do walidacji DSP w generacji, ale jako tokeny zapisany jest wyłącznie primary. 100 004 wiersze tokenów audio (1/rekord).
  • —`features/` i `manifest.jsonl` nie wchodzą jako input do modelu, to katalog metryk na temat datasetu do późniejszej analizy i metadane rekordów w JSONie, możesz sobie zerknąć.
  • —Wiersz [i] w każdym preset_tokens/*.npy i features/*.npy odpowiada linii [i] w manifest.jsonl. Audio szukasz po (record_id, view_id) w audio_tokens/audio_token_index.jsonl. Wszystko spinane jest kluczem record_id.
  • —EnCodec: 8 codebooks × 1024 symbols, 75 kl/s. Tokenizowany jest tylko primary midi_48: 450 klatek = 6 s, stałe dla każdego rekordu.

co się zmieniło względem inzynierka-transformer-100k

synth37synth40
parametrów syntezatora3740
tryb cech generacjilog_mel_rmspann_mfcc_hilbert - embedding PANN/Cnn14, 2048d
widok primary tokenizowanymidi_60midi_48
global_features.npy(100000, 696)(100004, 2088) — 2048 PANN + 32 statystyki + 8 deskryptorów
local_features.npy(100000, 3555)(100004, 2497) — 2048 PANN + 449 MFCC/Hilbert/poziom
shard audio≤256 widoków/plik≤64 widoków/plik (1563 shardy)
archiwum QD2021/2048 komórek (98.7%)1890/2048 komórek (92.3%)

Warstwa tokenizera presetów (preset_tokens/, 14 modułów × 7 parametrów, 14 × 5 tras jest taka sama


drzewo repo

manifest.jsonl                  katalog: 1 rekord / linia, metadane
preset_tokens/                  **input treningu**: preset jako tensory, 14 tokenów modułów, 40 parametrów
audio_tokens/                   **input treningu**: kody EnCodec w shardach + indeks, widok primary
features/                       Cechy do budowy zbioru (pann_mfcc_hilbert)
audit_report.json               audyt jakości datasetu
generation_summary.json         konfiguracja generacji
render_attempts.jsonl           każda próba renderu, w tym odrzucone 
sound_archive_calibration.json  geometria datasetu: skalowanie + PCA 8D + CVT (Centra Teselacji Woronoja, do wyboru centr nisz dźwiękowych przy ewolucji)
viewer/                         tylko po to żeby HF dobrze robił podgląd datasetu

pliki po kolei

manifest.jsonl

1 obiekt JSON na linię, 100 004 linie. Najważniejsze pola:

poleco to
record_idtrajektoria:krok:próba, np. qd-2843-branch-2-00009292:21:0
splittrain / validation / test
normalized_parameters / physical_parameters40 parametrów: 0–1 oraz nieprzeskalowane
activity_mask40× boolów: które parametry są słyszalnie aktywne, do ważenia straty
trajectory_id, root_seed_id, parent_record_id, step_index, step_sizestruktura trajektorii
local_distance_from_previoussłyszalna odległość od poprzedniego kroku (pann_mfcc_hilbert) ∈ [0.03, 0.10] cały dataset trzyma się tego pasma (p05=0.036, p50=0.065, p95=0.095)
metadata.qd_cell, metadata.qd_coordinates 8Dnisza i deskryptor brzmienia, cała generacja przeprowadzona na 8D PCA nad embeddingiem PANN
sound_profilebrightness/mellowness/…/listenability, quality_band, semantic_cell
python
import json
recs = [json.loads(l) for l in open("manifest.jsonl", encoding="utf-8")]

preset_tokens/

Preset jako 14 tokenów modułów: OSC A/B, szum, mikser źródeł, FM, filtr, obwiednie wzmocnienia i modulacji, LFO, drive/delay/reverb, unison itp. Każdy z ≤7 parametrami i ≤5 trasami modulacji. Pliki statyczne opisują strukturę, per-rekordowe niosą wartości.

plikkształtco to
parameter_values.npy(100004, 14, 7) float3240 parametrów w skali [0,1], ułożone w 14×7
parameter_mask.npy(14, 7) boolstatyczna: które sloty (moduł, param) są realne
parameter_activity.npy(100004, 14, 7) boolper rekord: które parametry słyszalnie aktywne
module_ids.npy(14,) int64statyczna: id modułu w danym slocie
module_activity.npy(100004, 14) boolper rekord: które moduły włączone
module_activity_mask.npy(14,) boolstatyczna: które sloty to realne moduły
route_values.npy(100004, 14, 5) boolper rekord: aktywne trasy modulacji
route_mask.npy(14, 5) boolstatyczna: realne trasy
preset_token_index.jsonl100 004 liniewiersz -> record_id
preset_token_schema.json—który parametr siedzi w którym slocie [moduł, param]
python
import numpy as np
pv  = np.load("preset_tokens/parameter_values.npy", mmap_mode="r")  # (100004,14,7)
mod = np.load("preset_tokens/module_activity.npy",  mmap_mode="r")  # (100004,14)
i = 42
preset_i = pv[i]           # tensor presetu rekordu i (= linia i w manifest.jsonl)

audio_tokens/

Dźwięk skompresowany EnCodekiem 24 kHz do kodów: 8 codebooków, wartości 0–1023. Preset renderowany jest na 4 tonach (36/48/60/72) do walidacji DSP w generacji datasetu, ale jako tokeny zapisany jest wyłącznie widok primary — tu midi_48 (w poprzednim datasecie to było midi_60, bo tamten wariant miał inny domyślny prymarny ton). Model i tak używa wyłącznie primary widoku.

  • —shardy audio_tokens-XXXXX.npz — 1563 pliki, po ≤64 widoków, każdy ma:
  • —codes - (rows, 8, 450) uint16 - kody
  • —lengths - (rows,) int32 - długość dla midi_48 zawsze 450
  • —indeks audio_token_index.jsonl — 100 004 linie: dla każdego record_id podaje shard, row, token_length, split.
  • —codec_metadata.json — konfiguracja kodeka.

Nie ciągniesz shardów ręcznie, tylko przez indeks:

python
import json, numpy as np
idx = {}                                   # (record_id, view) -> (shard, row, len)
for l in open("audio_tokens/audio_token_index.jsonl", encoding="utf-8"):
    e = json.loads(l); idx[(e["record_id"], e["view_id"])] = (e["shard"], e["row"], e["token_length"])

shard, row, T = idx[("qd-2843-branch-2-00009292:21:0", "midi_48")]
codes = np.load(f"audio_tokens/{shard}")["codes"][row][:, :T]   # (8, T) uint16, wartości 0..1023

features/

Cechy z trybu pann_mfcc_hilbert embedding PANN/Cnn14 2048d + trajektoria MFCC + obwiednia Hilberta attack/tail + poziom analityczny dla widoku primary:

  • —local_features.npy (100004, 2497) float32: 2048 PANN + 449 MFCC/Hilbert/poziom — do liczenia słyszalnej odległości między krokami trajektorii.
  • —global_features.npy (100004, 2088) float32: 2048 PANN + 32 statystyki + 8 deskryptorów.

Nie ma tu odpowiednika starej tabelki "3 rozmiary FFT × mel bands" — większość wymiarów to embedding PANN, nie pasma melowe.


jak złożyć jeden przykład treningowy

python
# rekord i:  i = linia w manifest.jsonl = wiersz w preset_tokens/*.npy = wiersz w features/*.npy
rec   = recs[i]
enc_preset = {                              # WEJŚCIE/CEL: preset
    "parameter_values":  pv[i],             # (14,7) float32
    "parameter_activity": pa[i],            # (14,7) bool
    "module_activity":   mod[i],            # (14,)  bool
    # + statyczne: module_ids, module_activity_mask, parameter_mask, route_mask
}
codes  = load_view(rec["record_id"], "midi_48")   # (8, T) — WEJŚCIE/CEL: audio
split  = rec["split"]                              # train / validation / test
weight = rec["activity_mask"]                      # do ważenia straty na parametrach

Enkoder dostaje preset + kody audio midi_48 -> rzutuje do latentu -> dekoder odtwarza z powrotem kody audio, 40 parametrów, aktywność i routing.


trajektorie

record_id = trajektoria:krok:próba. Rekordy jednej trajektorii mają wspólny trajectory_id i rosnący step_index, sąsiednie kroki różnią się małą wartością odległości pann_mfcc_hilbert. prev / current / next mają ten sam trajectory_id. Kolejne step_index to wartości na potencjalną lossfunction pilnującą spójnego kierunku w przestrzeni latentnej.

split train-test-val jak są podzielone

Podział po liniach seedów root_seed_id: cała trajektoria trafia w train lub validation lub test. Weź używaj pola split i nie tasuj tego jeszcze raz, bo byś rozdzielił trajektorie.

jakość / pokrycie archiwum

  • —audit_report.json: 0 warningów, 100 004 unikalnych rekordów, 99 999 unikalnych presetów.
  • —254 linie root (root_lineage_count), efektywnie 235.2 (effective_root_lineage_count) — żadna pojedyncza linia nie dominuje (największa to 0.9% datasetu).
  • —1890 zajętych nisz QSD, 92.3% pokrycia.
  • —7633 trajektorie, 92 117 par kroków, wszystkie w paśmie celu [0.03, 0.10].