diff --git a/.gitignore b/.gitignore index 2269967..e50f305 100644 --- a/.gitignore +++ b/.gitignore @@ -89,4 +89,8 @@ backend/app/priors/grooves/*.json # Raw MIDI datasets must never be committed (song-transcription corpora are # copyrighted; keep the repo data-free). *.mid -*.midi \ No newline at end of file +*.midi + +# Source WAVs downloaded by scripts/build_velocity_samples.py. Only the converted +# MP3s under frontend/public/samples/ are committed; the bulky source cache is not. +.sample-cache/ \ No newline at end of file diff --git a/DATA_LICENSES.md b/DATA_LICENSES.md index 626b7ba..cab8740 100644 --- a/DATA_LICENSES.md +++ b/DATA_LICENSES.md @@ -60,6 +60,36 @@ artifacts derived from permissively-licensed (CC-BY, public-domain) sources, and set bundled at `frontend/public/samples/piano/` (the Tone.js-hosted subset) is derived from this work. https://archive.org/details/SalamanderGrandPianoV3 +## Bundled instrument samples (`frontend/public/samples/`) + +These are the audio one-shots the app plays. Samples are **data**, licensed +separately from the GPL-3.0 code. **Everything shipped now has a confirmed license:** + +| Set | Source | License | Notes | +|---|---|---|---| +| **Piano** (`piano/`) | Salamander Grand Piano (Alexander Holm) | **CC-BY 3.0** | Attributed above. Clean to ship. | +| **Vibraphone** (`melodic/vibraphone/`) | **VCSL** — Versilian Community Sample Library | **CC0 / public domain** | Velocity-layered (soft/hard mallets) via `scripts/build_velocity_samples.py`. No attribution required; kept here as courtesy. https://github.com/sgossner/VCSL | + +Every other instrument is **synthesized** in the app (no shipped samples), so there is +nothing else to license. A **Samples / Synth toggle** in the transport bar switches +between the sampled voices above and full synthesis. + +> **Removed for licensing (2026-07-23).** The following sets were deleted because their +> redistribution rights were **not confirmed** — see `docs/LICENSE_AUDIT.md`: +> - **MusyngKite** (all `bass/` + 7 `melodic/` voices: electric pianos, clavinet, +> accordion, drawbar organ, nylon guitar, string ensemble). The redistributor labels +> it CC-BY-SA 3.0, but the soundfont's original author says it is "free to use but +> **not meant to be redistributed**… or used for commercial purposes." Those voices +> now synthesize. +> - **Tone.js drum samples** (`drums/`). No LICENSE on the source repo; and the app +> already synthesizes its drum kit, so the samples were unused. Deleted. +> +> **Adding samples back cleanly:** use `scripts/build_velocity_samples.py` with a +> confirmed **CC0 / public-domain** (VCSL) or **CC-BY** (with attribution) source only. +> Note that University of Iowa MIS, despite being widely called "free," carries **no +> explicit license grant**, so it is *not* used here. VCSL is acoustic/orchestral and +> does not cover the electric/synth voices, which is why they remain synthesized. + ## Note on the GPL and data The GPL-3.0 covers this project's source code. It does **not** attempt to license diff --git a/docs/LICENSE_AUDIT.md b/docs/LICENSE_AUDIT.md new file mode 100644 index 0000000..2c30380 --- /dev/null +++ b/docs/LICENSE_AUDIT.md @@ -0,0 +1,106 @@ +# License compliance audit — 2026-07-23 + +A full pass over everything GenreGrid ships, to confirm we (a) respect third-party +licenses and (b) correctly assert our own (GPL-3.0). Companion to +[`DATA_LICENSES.md`](../DATA_LICENSES.md), which covers mined corpora and priors. + +**Scope:** bundled audio samples, frontend (npm) and backend (pip) dependencies, +fonts/icons, and our own license declaration + source headers. + +--- + +## Verdict + +| Area | Status | +|---|---| +| Our license declaration (GPL-3.0) | ✅ after fixing one metadata mismatch | +| Frontend npm dependencies | ✅ all GPL-3.0-compatible | +| Backend pip dependencies | ✅ all GPL-3.0-compatible | +| Fonts | ✅ none bundled (system font stacks) | +| Icons | ✅ first-party | +| Piano samples | ✅ Salamander, CC-BY 3.0 (attributed) | +| Vibraphone samples | ✅ VCSL, CC0 | +| **Drum samples** | ✅ unconfirmed license + **unused** — deleted | +| **Bass + melodic samples** | ✅ MusyngKite removed — those voices now synthesize | + +**Result: the app ships no asset with unconfirmed redistribution rights.** Remaining +sampled voices are piano (CC-BY 3.0) and vibraphone (CC0); everything else synthesizes, +toggleable via the transport bar's Samples / Synth control. + +--- + +## 1. Our own license (GPL-3.0) + +- `LICENSE` at repo root is the full GPL-3.0 text. ✅ +- Every frontend `src/**/*.{ts,vue}` and backend `backend/app/**/*.py` file carries the + GPL header granting "version 3 … or (at your option) any later version." Only empty + `__init__.py` package markers lack it (no copyrightable content). ✅ +- **Mismatch (fixed):** `frontend/package.json` declared `"license": "GPL-3.0-only"`, but + the source headers grant **or-later**. Corrected to `GPL-3.0-or-later` so the metadata + matches the actual grant. The backend has no package metadata license field to set. + +## 2. Frontend dependencies (npm) + +49 production dependencies, by license: MIT (39), ISC (3), BSD-2-Clause (1), +BSD-3-Clause (1), Apache-2.0 (1), 0BSD (1), BlueOak-1.0.0 (1), Python-2.0 (1). All are +permissive and **GPL-3.0-compatible**. The only `UNLICENSED` entry is our own root +package (`genregrid-frontend`), not a third party. + +Dev-only dependencies additionally include a few MPL-2.0 packages (build tooling); MPL-2.0 +is GPL-compatible and, regardless, dev tooling is **not distributed** in the packaged app. + +_Re-check: `cd frontend && npx license-checker-rseidelsohn --production --summary`._ + +## 3. Backend dependencies (pip) + +fastapi, starlette, httpx (BSD-3), pydantic, mido, uvicorn, python-multipart, idna, +pytest, pytest-asyncio (MIT/BSD). All permissive and **GPL-3.0-compatible**. + +## 4. Fonts & icons + +- **Fonts:** none bundled — the UI uses system font stacks, so nothing to license. ✅ +- **Icons:** `frontend/public/icon.{png,ico}` are first-party GenreGrid artwork. ✅ + +## 5. Bundled audio samples + +Samples are **data**, licensed separately from the GPL code. Detail in +[`DATA_LICENSES.md`](../DATA_LICENSES.md → "Bundled instrument samples"). + +- ✅ **Piano** — Salamander Grand Piano, **CC-BY 3.0**, attributed. +- ✅ **Vibraphone** — **VCSL, CC0**, velocity-layered (migrated 2026-07-23). +- ✅ **Drums** (`samples/drums/`, 8 kits) — from Tone.js `audio` repo, which has **no + LICENSE file** (unconfirmed rights on vintage drum-machine samples). The app plays a + **synthesized** kit (`makeSynthKit`); `getDrumKit`/the sampled kits had **no callers**. + **Deleted** (dead weight — zero sound impact), along with the dead code. +- ✅ **Bass** (6 sets) **+ Melodic** (7 sets: electric pianos, clavinet, accordion, drawbar + organ, nylon guitar, string ensemble) — from gleitz `midi-js-soundfonts` → **MusyngKite**. + The redistributor labels it CC-BY-SA 3.0, but the soundfont's original author states it is + "free to use but **not meant to be redistributed** … or used for commercial purposes" — + so our redistribution rights are **not confirmed**. **Deleted; those voices now synthesize.** + +### How the MusyngKite removal was done + +Goal: ship **no** MusyngKite-derived audio, achieved as follows: + +1. Deleted all MusyngKite sample sets. Sampled voices are gated behind confirmed-license + allowlists (`SAMPLED_VOICES`, `SAMPLED_BASS_VOICES`); voices not on them synthesize. +2. Added a **Samples / Synth toggle** (`sampleMode`, persisted) so users can A/B the sampled + voices against full synthesis — and the seam a future "bring your own samples" feature uses. +3. Removed `scripts/download_samples.py` (it only fetched the now-banned sources). + +**Sources considered and rejected for re-sourcing:** +- **University of Iowa MIS** — widely called "free," but the site carries **no explicit + license grant** (same ambiguity as MusyngKite), so it is *not* used. +- **Freesound** — many CC0 samples exist, but the API requires auth unavailable in the + automation environment; a manual, per-sample CC0 curation pass remains a future option. + +Confirmed-clean, direct-download sources that *were* usable: **VCSL (CC0)** and **Salamander +(CC-BY)** — which only cover piano + vibraphone among GenreGrid's voices. + +--- + +## Maintenance + +Re-run this audit when adding any dependency, sample set, font, or icon. Never bundle audio +without a confirmed CC0 / public-domain / CC-BY (with attribution) license. Keep the repo +free of any asset whose redistribution rights are unconfirmed. diff --git a/docs/custom-instruments-design.md b/docs/custom-instruments-design.md new file mode 100644 index 0000000..ef8ebaa --- /dev/null +++ b/docs/custom-instruments-design.md @@ -0,0 +1,156 @@ +# Design: User-uploaded custom instruments + +**Status (2026-07-23): MVP IMPLEMENTED (needs desktop runtime testing).** Design for +letting users add their own samples, map them to notes/velocities, and pick which +instrument plays each part. Fleshes out the Phase 2 roadmap item "Custom soundfont / +SF2 upload + per-part instrument picker." + +**Shipped (T1 + T2 tier):** pure mapping core (`customInstruments.ts`, unit-tested), +library store (`useCustomInstruments.ts`), Electron storage IPC + preload (list/save/ +remove/read under `userData/instruments/`, played back as blob: URLs — no custom +scheme, per the Linux Web-Audio note below), engine integration (every part resolves a +custom instrument first in `useMidiPlayer.ts`), and the Instruments panel UI + a 🎹 +transport-bar button. **Not yet done:** velocity-layer preview, SF2/SFZ import (T4), +auto pitch-detection, per-style-override UI, web/OPFS storage. **Untested at runtime** +(automation can't launch Electron / play audio) — needs a desktop pass: import a file, +assign it to a part, play, and delete. + +## Why now + +The July 2026 license pass removed the MusyngKite bass/melodic samples, so 13 voices +now synthesize (see [`LICENSE_AUDIT.md`](LICENSE_AUDIT.md)). Letting users bring their +own samples both restores instrument realism **and sidesteps the licensing problem** — +user-supplied audio is the user's to use, nothing we ship. It also builds directly on +the two seams already in place: the `LayeredSampler` **manifest format** and the +**registry** (`voiceFor(styleId, part)`) that resolves each part to a voice id. + +## Core concept + +> A **Custom Instrument** is just a `LayeredSampler` manifest + its audio files, given a +> voice id, that the user can select for any part. + +**Every part/voice is user-samplable — no exceptions.** Chords, melody, arpeggio, bass, +pads, and counter-melody can each be driven by a user instrument, including the voices +that currently synthesize. There is no "these are sampled, those are synth-only" split at +the user level: the per-part picker offers a user instrument for *any* part, and a user +instrument can replace a built-in voice entirely. (Custom drum *kits* use a pitch→one-shot +mapping rather than a chromatic range, so they get a dedicated editor in a later phase, but +they are still in scope as user-uploadable.) + +Nothing new in the audio engine — `LayeredSampler` already plays a `velocity.json` +manifest (note → file(s), velocity layers, round-robins). A custom instrument is that +same structure, sourced from user files instead of `/samples/`. The registry's job +("what voice does this part use?") gains a third answer: built-in sample set, synth +family, **or a user instrument**. + +--- + +## Key decisions (with options + recommendation) + +### 1. Upload format & note mapping — *how do files become a playable instrument?* + +The hard part of "easy and manageable" is note/velocity mapping. Recommend a **tiered** +approach so the easy case is trivial and quality scales up, all producing one manifest: + +| Tier | User does | We do | For | +|---|---|---|---| +| **T1 — one shot** | Drop **one** audio file | Map it across the keyboard, pitch-shifted (single-zone `Tone.Sampler`) | Casual: "make an instrument from this sound" | +| **T2 — named files** | Drop files named by note (`C4.wav`, `A#3.wav`, `Fs3…`) | Parse note from filename → multi-zone manifest | Better realism, minimal effort | +| **T3 — velocity/RR** | Files with velocity/RR suffix or in `soft/`,`hard/` subfolders (our pipeline's convention) | Build layered manifest | Full dynamics — matches `build_velocity_samples.py` output | +| **T4 — soundfont** | Upload `.sf2` / `.sfz` | Parse zones/velocity splits → manifest (+ decode samples) | Import existing libraries | + +- **Recommendation:** ship **T1 + T2** as the MVP (covers "easy and manageable" and + reuses the manifest 1:1), then **T3** (already produced by our own pipeline), then + **T4** last (SF2/SFZ parsing is the heaviest — needs a parser + sample decode; SFZ is + text-simple, SF2 is binary and benefits from a lib like `soundfont2`). +- A drag-drop **zip or folder** import wraps T2/T3 (one gesture, many files). +- **Optional polish:** auto pitch-detection (detect fundamental) to relax the filename + requirement in T1/T2 — nice, not required for MVP. + +### 2. Assignment model — *which instrument belongs to which part?* + +- **Option A — Instrument-first (recommended):** the user creates a named, reusable + instrument ("My Rhodes") in a library, then assigns it to parts via a **per-part + instrument picker**. One instrument, usable across styles/parts. +- **Option B — Part-first:** the user opens a part ("Bass") and uploads for it directly. + Simpler mental model but not reusable; leads to re-uploading the same sound per style. +- **Recommendation: A.** It matches the registry (voices are reusable identities) and + makes the per-part picker a pure selection surface. The picker for each part + (chords / melody / arpeggio / bass / pads / counter-melody) offers: **Synth · Built-in + sample · [user instruments…]**, extending today's `sampleMode` toggle from a global + 2-way switch into a per-part source choice. + +### 3. Storage & serving — *where do the files live and how does Tone load them?* + +Uploaded audio is **user data**, never bundled. `Tone.Sampler` needs a fetchable URL. + +- **Electron (primary):** store under `app.getPath('userData')/instruments//` with a + `manifest.json` per instrument + a top-level `index.json`. Serve to the renderer via a + **custom protocol** (`protocol.handle('gginstr', …)`) → stable, cacheable URLs + (`gginstr:///`) that `LayeredSampler` fetches like `/samples/…`. Cleaner than + IPC-read → object URLs, and respects `contextIsolation` + CSP (add the scheme to CSP). +- **Web build (fallback):** **OPFS** (Origin Private File System) for the bytes + object + URLs, or IndexedDB blobs. Same manifest shape. +- **Recommendation:** custom protocol in Electron; OPFS in the browser. Both hand + `LayeredSampler` a URL, so the engine is storage-agnostic. + +### 4. Persistence of assignments + +A small user settings object (persisted like `sampleMode`): a default per-part +instrument map, with optional per-style overrides. Resolution order at play time: +**per-style user override → global user default → registry `voiceFor` → synth fallback.** + +--- + +## Data model + +```ts +interface CustomInstrument { + id: string // uuid; also the voice id and storage folder + name: string // "My Rhodes" + kind: 'melodic' | 'bass' | 'drums' + manifest: LayeredSamplerManifest // note → file(s), velocity layers, RR + createdAt: number +} +// index.json: CustomInstrument[] (without the audio bytes) + +interface InstrumentAssignments { + defaults: Partial> // part → instrument id + perStyle?: Record>> +} +``` + +## Integration points (all already exist) + +- **Engine:** `LayeredSampler` (`layeredSampler.ts`) — unchanged; loads a user manifest + by base URL. `loadLayeredSampler` already fetches `velocity.json`; a user instrument + supplies the same shape. +- **Resolution:** extend the `voiceFor(...)` consumers in `useMidiPlayer.ts` to first + consult `InstrumentAssignments`, then fall through to the registry, then synth. +- **Mode:** generalize `sampleMode` (`useMidiPlayer.ts`) — 'synth' | 'samples' stays as + the global default; the per-part picker overrides it per part. +- **UI:** a new **Instruments** drawer/panel (library CRUD + upload + mapping preview) + and a compact per-part picker on `PartCard.vue` / the transport. +- **Electron:** custom protocol registration + an IPC surface for import/list/delete + (reuse the `save-temp-file` basename-hardening pattern for uploaded filenames). + +## Phased delivery + +1. **MVP** — Instruments library (list/add/delete) + T1 (one-shot) & T2 (note-named) + import + Electron protocol storage + per-part picker wired into playback. Piano/ + vibraphone remain the built-in sampled voices; users fill the rest. +2. **Velocity layers (T3)** + a light mapping preview (mini keyboard, hear each zone). +3. **SF2/SFZ import (T4)** — start with SFZ (text), then SF2 via a parser. +4. **Polish** — auto pitch-detection, per-style overrides UI, export/share an instrument + as a zip (round-trips with `build_velocity_samples.py` output). + +## Open questions / risks + +- **Formats to accept:** wav/mp3/ogg/flac? (Web Audio decodes all; storage size varies — + maybe transcode-to-ogg on import to bound footprint.) +- **CSP:** the custom scheme must be allowed for media without weakening the existing + localhost-only policy. +- **Large libraries:** memory/CPU if a user loads many big multisamples — lazy-load per + style, cap total decoded buffers. +- **Drums:** custom drum *kits* map pitch→one-shot, not a chromatic range — likely a + separate, later editor from the melodic flow. diff --git a/docs/roadmap.md b/docs/roadmap.md index 926338b..6d51396 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -3,9 +3,11 @@ A living, prioritized roadmap from the July 2026 project survey. Check items off as they land; add new findings under the right phase so nothing gets lost. -**Status legend:** `[ ]` todo · `[~]` in progress · `[x]` done · `[-]` won't do / obsolete +**Status legend:** `[ ]` todo · `[~]` in progress · `[x]` done · `[-]` won't do / obsolete · +`[→]` moved to another phase -_Last updated: 2026-07-23 — Phase 1 complete (see Done log)._ +_Last updated: 2026-07-23 — Phase 1 complete; Phase 2 nearly done (limiter, per-style FX, +loudness norm, velocity-layer engine landed; multi-velocity sample sourcing open)._ --- @@ -43,17 +45,61 @@ _Last updated: 2026-07-23 — Phase 1 complete (see Done log)._ ## Phase 2 — Sound polish -- [ ] **Master bus glue/limiting** — master is a unity `Gain` (a `DynamicsCompressor` - renders silence on Linux Electron), so a full arrangement can peak/clip with nothing - catching it. Add a Linux-safe JS soft-clip / look-ahead limiter. - → `frontend/src/soundfonts/loader.ts:39` -- [ ] **Velocity layers / round-robins in sample sets** — ~4 MB total, ~one mp3 per - note-zone; wide pitch-shifting sounds synthetic. More velocity layers = fastest - realism gain. → `frontend/public/samples/` -- [ ] **Loudness normalization across styles** — target an LUFS level per style so - perceived volume doesn't jump between styles. -- [ ] **Per-style FX presets** — reverb/chorus/delay are currently shared and fixed. - → `frontend/src/soundfonts/loader.ts` (buses) +- [x] **Master bus glue/limiting** — added a Linux-safe soft-clip limiter on the master: + a `WaveShaper` (static transfer curve, not a `DynamicsCompressor` — that renders silence + on Linux Electron) that's transparent below −4.4 dBFS, bends through a gentle quadratic + knee, and holds peaks under a −0.13 dBFS ceiling. Wired into all three master paths (live + `masterOut → limiter → dest`, offline WAV render, and the live MediaRecorder tap now reads + post-limiter). New pure-math unit tests cover the transfer curve. + → `frontend/src/soundfonts/loader.ts` (`makeMasterLimiter`), `useMidiPlayer.ts` +- [~] **Velocity layers / round-robins in sample sets** — _engine done + vibraphone; broad + sample coverage gated on finding confirmed-CC0 sources._ Built `LayeredSampler` + (`layeredSampler.ts`): a drop-in over `Tone.Sampler` that plays a different sample per + velocity range (real dynamics, not just gain) + cycles round-robins, driven by a per-instrument + `velocity.json` manifest. Backward-compatible; wired into the piano/bass/melodic loaders (offline + WAV path is synth-only, untouched). Reproducible pipeline (`scripts/build_velocity_samples.py`, + `soundfile`+`lameenc`) fetches CC0 WAVs → trimmed mono mp3 + manifest. **Vibraphone** migrated + to VCSL CC0 (soft/hard layers). Broad coverage is blocked because no confirmed-CC0 library + covers the electric/synth voices — see the licensing work below. + → `frontend/src/soundfonts/layeredSampler.ts`, `scripts/build_velocity_samples.py` +- [x] **License compliance pass** (added scope) — full audit (`docs/LICENSE_AUDIT.md`) of samples, + npm + pip deps, fonts/icons, and our own GPL declaration. Findings/fixes: deps all + GPL-3.0-compatible; fixed `package.json` `GPL-3.0-only`→`-or-later` to match the source headers; + **removed all MusyngKite-derived samples** (ambiguous license) and the unused/unlicensed Tone.js + drum samples. Those voices now synthesize. Added a **Samples / Synth toggle** (`sampleMode`, + persisted) in the transport bar to A/B sampled vs synth — the seam a future "bring your own + samples" feature plugs into. Net: the app ships no asset with unconfirmed redistribution rights. +- [x] **Loudness normalization across styles** — per-family master trim (`MASTER_TRIM_DB`) + applied on the pre-limiter master when a style starts, so perceived volume doesn't jump + between genres (hot electronic mixes pulled down, sustained pads nudged up). Ramped, not + stepped. A true per-style LUFS target would need offline measurement; these are hand-tunable + starting points. → `frontend/src/soundfonts/fxPresets.ts`, `loader.ts` (`setMasterTrimDb`) +- [x] **Per-style FX presets** — the shared melodic-bus chorus/delay + reverb are retuned + per style family (`MELODIC_FX_PRESETS`) instead of being fixed: ambient/cinematic get a long + lush tail, electronic more movement, trap/drill tight & dry, lo-fi wobbly. Applied live by + mutating the shared nodes' params; the reverb IR is only regenerated when decay changes. + → `frontend/src/soundfonts/fxPresets.ts`, `loader.ts` (`applyMelodicFxPreset`) +- [ ] **Re-source clean samples for the synth-only voices** — after the July 2026 license + pass, 13 voices (all 6 basses + Rhodes/DX7/clavinet/accordion/drawbar organ/nylon guitar/ + string ensemble) synthesize because their MusyngKite samples were removed. Restore real + samples from **confirmed CC0 / CC-BY** sources only, via `scripts/build_velocity_samples.py` + (add each voice id to `SAMPLED_VOICES` / `SAMPLED_BASS_VOICES`). Blocked on sourcing: VCSL + (CC0) doesn't cover them, and Iowa MIS has no explicit license; a manual Freesound-CC0 + curation pass (needs API auth) or another PD library is required. Prioritize the **basses** + (most audible downgrade). The engine + Samples/Synth toggle already support them the moment + a legal set + `velocity.json` exists. → `docs/LICENSE_AUDIT.md`, `DATA_LICENSES.md` +- [~] **User-uploaded custom instruments** (SF2/samples) + per-part instrument picker + _(promoted from Phase 4; MVP built, needs desktop runtime testing)_ — users add their own + samples, mapped to notes/velocities, and pick which instrument plays **each** part; also + sidesteps the licensing gap above (user audio is theirs). Design + status in + **[`custom-instruments-design.md`](custom-instruments-design.md)**. **Shipped (T1 one-shot + + T2 note-named tiers):** pure mapping core (`customInstruments.ts`, +15 tests), library store + (`useCustomInstruments.ts`), Electron storage IPC (`userData/instruments/`, played as blob: + URLs — no custom scheme, avoids the Linux Web-Audio silence bug), per-part resolution in + `useMidiPlayer.ts`, and the Instruments panel + 🎹 transport button. **TODO:** runtime-test on + desktop (import/assign/play/delete), then velocity-layer preview, SF2/SFZ import (T4), auto + pitch-detection, per-style overrides, web/OPFS storage. + → `soundfonts/customInstruments.ts`, `composables/useCustomInstruments.ts`, `components/InstrumentsPanel.vue`, `electron/main.ts` ## Phase 3 — Performance & refactor @@ -77,7 +123,7 @@ _Last updated: 2026-07-23 — Phase 1 complete (see Done log)._ frontend control yet. Low effort. - [ ] **Non-4/4 time signatures** (6/8, 3/4, 7/8) — currently hardcoded `numerator=4`. → `backend/app/services/midi_writer.py:162` -- [ ] **Custom soundfont / SF2 upload** + per-part instrument picker. +- [→] **Custom soundfont / SF2 upload** — _promoted to Phase 2 (Sound polish)._ - [ ] **Surface WAV/offline-audio export more prominently** — already implemented (OfflineAudioContext + render queue); just under-discovered. - [ ] **Tempo automation & mid-song modulation** — partial today (`chorus_key_shift`). @@ -98,5 +144,31 @@ _Last updated: 2026-07-23 — Phase 1 complete (see Done log)._ - Tests: +3 (traversal rejection, CORS allow/deny). Suite 131→134 green; ruff clean; frontend `vue-tsc` + vitest clean. -**Phase 1 complete.** Next up: Phase 2 (sound polish) — master limiter is the natural -first step and pairs well with the now-local piano. +- **2026-07-23 — Phase 2 sound polish (in progress):** + - Master soft-clip limiter added (Linux-safe `WaveShaper`, not a `DynamicsCompressor`): + transparent below −4.4 dBFS, gentle quadratic knee, hard ceiling at −0.13 dBFS. + Applied consistently across live playback, the offline WAV/stem render, and the live + MediaRecorder export (which now taps the post-limiter node). Tests: +5 (transfer-curve + math). + - **Per-style FX presets** + **cross-style loudness normalization** landed. Shared melodic + FX (chorus/delay/reverb) retuned per style family; pre-limiter master trimmed per family + so genres sit at an even level. Applied when a style starts. Tests: +4. + - **Velocity-layer / round-robin infrastructure** landed: `LayeredSampler`, a manifest-driven + (`velocity.json`), backward-compatible drop-in for `Tone.Sampler`, wired into all three live + sample loaders. Tests: +8. Reproducible sample pipeline added + (`scripts/build_velocity_samples.py`). **Vibraphone** migrated to VCSL CC0 with soft/hard + velocity layers (superseding the ambiguously-licensed MusyngKite set). + - **License compliance pass** (`docs/LICENSE_AUDIT.md`): audited samples, npm/pip deps, + fonts/icons, and our own GPL declaration. Deps all GPL-compatible. Fixed `package.json` + license (`GPL-3.0-only`→`-or-later`). **Removed all MusyngKite samples** (ambiguous + license) + unused/unlicensed Tone.js drum samples + dead `getDrumKit` code + the + `download_samples.py` fetcher. Removed voices synthesize; added a persisted **Samples / + Synth toggle** in the transport bar. Iowa MIS was evaluated and rejected (no explicit + license). Net: no shipped asset has unconfirmed redistribution rights. + - Frontend suite 12→29 green; `vue-tsc` + eslint + production build clean. + +**Phase 1 complete.** Phase 2 (sound polish) mostly done: limiter, per-style FX, loudness +normalization, the velocity-layer engine, and the license compliance pass all landed. +**Open Phase 2 items:** re-source clean samples for the 13 synth-only voices (basses first), +and custom soundfont / SF2 upload (promoted from Phase 4) — both now tracked as explicit +items above. diff --git a/frontend/electron/main.ts b/frontend/electron/main.ts index b5ce47b..98f92de 100644 --- a/frontend/electron/main.ts +++ b/frontend/electron/main.ts @@ -406,6 +406,69 @@ ipcMain.handle('log-renderer-error', async (_, entry: { timestamp: string; conte } }) +// ── Custom instrument storage ──────────────────────────────────────────────── +// User-uploaded instruments live under userData/instruments/: an index.json listing +// each instrument (id, name, kind, LayeredSampler manifest) plus a per-id folder of +// audio files. The renderer reads bytes back via 'instruments-read' and plays them as +// blob: URLs (see useCustomInstruments.ts) — deliberately no custom URL scheme, which +// the Linux Web Audio path renders silent. See docs/custom-instruments-design.md. +interface StoredInstrument { id: string; name: string; kind: string; manifest: unknown; createdAt: number } + +function instrumentsDir(): string { + const dir = path.join(app.getPath('userData'), 'instruments') + fs.mkdirSync(dir, { recursive: true }) + return dir +} +function readInstrumentIndex(): StoredInstrument[] { + try { return JSON.parse(fs.readFileSync(path.join(instrumentsDir(), 'index.json'), 'utf-8')) } catch { return [] } +} +function writeInstrumentIndex(list: StoredInstrument[]): void { + fs.writeFileSync(path.join(instrumentsDir(), 'index.json'), JSON.stringify(list, null, 2)) +} +// Resolve a renderer-supplied relative file name strictly within `baseDir`, rejecting +// any traversal/absolute path that would escape it. +function safeJoinWithin(baseDir: string, rel: string): string { + const resolved = path.resolve(baseDir, rel) + if (resolved !== baseDir && !resolved.startsWith(baseDir + path.sep)) throw new Error('unsafe path') + return resolved +} + +ipcMain.handle('instruments-list', async () => readInstrumentIndex()) + +ipcMain.handle('instruments-save', async (_, { inst, files }: { inst: StoredInstrument; files: Array<{ name: string; data: number[] }> }) => { + const id = path.basename(String(inst.id)) // our own uuid; basename defends regardless + const dir = path.join(instrumentsDir(), id) + for (const f of files) { + const dest = safeJoinWithin(dir, f.name) + await fs.promises.mkdir(path.dirname(dest), { recursive: true }) + await fs.promises.writeFile(dest, Buffer.from(f.data)) + } + const index = readInstrumentIndex().filter(i => i.id !== id) + index.push({ ...inst, id }) + writeInstrumentIndex(index) +}) + +ipcMain.handle('instruments-remove', async (_, id: string) => { + const safeId = path.basename(String(id)) + await fs.promises.rm(path.join(instrumentsDir(), safeId), { recursive: true, force: true }) + writeInstrumentIndex(readInstrumentIndex().filter(i => i.id !== safeId)) +}) + +ipcMain.handle('instruments-read', async (_, id: string) => { + const safeId = path.basename(String(id)) + const dir = path.join(instrumentsDir(), safeId) + const out: Array<{ name: string; data: number[] }> = [] + async function walk(rel: string): Promise { + for (const entry of await fs.promises.readdir(path.join(dir, rel), { withFileTypes: true })) { + const childRel = rel ? path.join(rel, entry.name) : entry.name + if (entry.isDirectory()) await walk(childRel) + else out.push({ name: childRel.split(path.sep).join('/'), data: [...await fs.promises.readFile(path.join(dir, childRel))] }) + } + } + try { await walk('') } catch { /* no such instrument */ } + return out +}) + // Build a 32×32 solid purple drag icon from raw RGBA pixels function makeDragIcon(): ReturnType { const size = 32 diff --git a/frontend/electron/preload.ts b/frontend/electron/preload.ts index acddcf1..7f65bde 100644 --- a/frontend/electron/preload.ts +++ b/frontend/electron/preload.ts @@ -38,4 +38,14 @@ contextBridge.exposeInMainWorld('electronAPI', { // the in-app error log panel. logRendererError: (entry: { timestamp: string; context: string; message: string; stack?: string }): Promise => ipcRenderer.invoke('log-renderer-error', entry), + + // User custom-instrument storage under userData/instruments/ (see + // useCustomInstruments.ts + docs/custom-instruments-design.md). + instruments: { + list: () => ipcRenderer.invoke('instruments-list'), + save: (inst: unknown, files: Array<{ name: string; data: number[] }>) => + ipcRenderer.invoke('instruments-save', { inst, files }), + remove: (id: string) => ipcRenderer.invoke('instruments-remove', id), + read: (id: string) => ipcRenderer.invoke('instruments-read', id), + }, }) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7664592..37ee4ad 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,7 +7,7 @@ "": { "name": "genregrid-frontend", "version": "0.1.0", - "license": "GPL-3.0-only", + "license": "GPL-3.0-or-later", "dependencies": { "@tonejs/midi": "^2.0.28", "electron-updater": "^6.8.9", diff --git a/frontend/package.json b/frontend/package.json index b07462b..a9abbe5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,7 +2,7 @@ "name": "genregrid-frontend", "private": true, "version": "0.1.0", - "license": "GPL-3.0-only", + "license": "GPL-3.0-or-later", "description": "Genregrid — A Midi Loop Generator", "author": { "name": "TwDover", diff --git a/frontend/public/samples/bass/acoustic_bass/A1.mp3 b/frontend/public/samples/bass/acoustic_bass/A1.mp3 deleted file mode 100644 index 7d90a78..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/A2.mp3 b/frontend/public/samples/bass/acoustic_bass/A2.mp3 deleted file mode 100644 index c3a3243..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/A3.mp3 b/frontend/public/samples/bass/acoustic_bass/A3.mp3 deleted file mode 100644 index ae751fe..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/C2.mp3 b/frontend/public/samples/bass/acoustic_bass/C2.mp3 deleted file mode 100644 index 21f94f2..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/C3.mp3 b/frontend/public/samples/bass/acoustic_bass/C3.mp3 deleted file mode 100644 index 25aa8f8..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/E2.mp3 b/frontend/public/samples/bass/acoustic_bass/E2.mp3 deleted file mode 100644 index 033fe66..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/E3.mp3 b/frontend/public/samples/bass/acoustic_bass/E3.mp3 deleted file mode 100644 index 1f09a78..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/G2.mp3 b/frontend/public/samples/bass/acoustic_bass/G2.mp3 deleted file mode 100644 index d18ae06..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/acoustic_bass/G3.mp3 b/frontend/public/samples/bass/acoustic_bass/G3.mp3 deleted file mode 100644 index 0783685..0000000 Binary files a/frontend/public/samples/bass/acoustic_bass/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/A1.mp3 b/frontend/public/samples/bass/electric_bass_finger/A1.mp3 deleted file mode 100644 index 16aedc4..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/A2.mp3 b/frontend/public/samples/bass/electric_bass_finger/A2.mp3 deleted file mode 100644 index d93d8ed..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/A3.mp3 b/frontend/public/samples/bass/electric_bass_finger/A3.mp3 deleted file mode 100644 index 3f30f7d..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/C2.mp3 b/frontend/public/samples/bass/electric_bass_finger/C2.mp3 deleted file mode 100644 index 139ce21..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/C3.mp3 b/frontend/public/samples/bass/electric_bass_finger/C3.mp3 deleted file mode 100644 index 4a7075b..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/E2.mp3 b/frontend/public/samples/bass/electric_bass_finger/E2.mp3 deleted file mode 100644 index 0a366c3..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/E3.mp3 b/frontend/public/samples/bass/electric_bass_finger/E3.mp3 deleted file mode 100644 index 3ed9e69..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/G2.mp3 b/frontend/public/samples/bass/electric_bass_finger/G2.mp3 deleted file mode 100644 index 56de683..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_finger/G3.mp3 b/frontend/public/samples/bass/electric_bass_finger/G3.mp3 deleted file mode 100644 index 664eb9d..0000000 Binary files a/frontend/public/samples/bass/electric_bass_finger/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/A1.mp3 b/frontend/public/samples/bass/electric_bass_pick/A1.mp3 deleted file mode 100644 index 718561e..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/A2.mp3 b/frontend/public/samples/bass/electric_bass_pick/A2.mp3 deleted file mode 100644 index 272b60c..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/A3.mp3 b/frontend/public/samples/bass/electric_bass_pick/A3.mp3 deleted file mode 100644 index 6287961..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/C2.mp3 b/frontend/public/samples/bass/electric_bass_pick/C2.mp3 deleted file mode 100644 index 73902c5..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/C3.mp3 b/frontend/public/samples/bass/electric_bass_pick/C3.mp3 deleted file mode 100644 index 72fd2ce..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/E2.mp3 b/frontend/public/samples/bass/electric_bass_pick/E2.mp3 deleted file mode 100644 index 5bf9ad5..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/E3.mp3 b/frontend/public/samples/bass/electric_bass_pick/E3.mp3 deleted file mode 100644 index f7b4819..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/G2.mp3 b/frontend/public/samples/bass/electric_bass_pick/G2.mp3 deleted file mode 100644 index 8c27abe..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/electric_bass_pick/G3.mp3 b/frontend/public/samples/bass/electric_bass_pick/G3.mp3 deleted file mode 100644 index 9fafcaa..0000000 Binary files a/frontend/public/samples/bass/electric_bass_pick/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/A1.mp3 b/frontend/public/samples/bass/fretless_bass/A1.mp3 deleted file mode 100644 index 533a827..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/A2.mp3 b/frontend/public/samples/bass/fretless_bass/A2.mp3 deleted file mode 100644 index c687dcc..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/A3.mp3 b/frontend/public/samples/bass/fretless_bass/A3.mp3 deleted file mode 100644 index 6393d5e..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/C2.mp3 b/frontend/public/samples/bass/fretless_bass/C2.mp3 deleted file mode 100644 index 78105de..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/C3.mp3 b/frontend/public/samples/bass/fretless_bass/C3.mp3 deleted file mode 100644 index 0a27822..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/E2.mp3 b/frontend/public/samples/bass/fretless_bass/E2.mp3 deleted file mode 100644 index c6933cc..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/E3.mp3 b/frontend/public/samples/bass/fretless_bass/E3.mp3 deleted file mode 100644 index f2f2c6a..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/G2.mp3 b/frontend/public/samples/bass/fretless_bass/G2.mp3 deleted file mode 100644 index 4cf3e62..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/fretless_bass/G3.mp3 b/frontend/public/samples/bass/fretless_bass/G3.mp3 deleted file mode 100644 index e7be869..0000000 Binary files a/frontend/public/samples/bass/fretless_bass/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/A1.mp3 b/frontend/public/samples/bass/slap_bass_1/A1.mp3 deleted file mode 100644 index 7a33064..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/A2.mp3 b/frontend/public/samples/bass/slap_bass_1/A2.mp3 deleted file mode 100644 index ead0e73..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/A3.mp3 b/frontend/public/samples/bass/slap_bass_1/A3.mp3 deleted file mode 100644 index 82ad171..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/C2.mp3 b/frontend/public/samples/bass/slap_bass_1/C2.mp3 deleted file mode 100644 index 543db64..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/C3.mp3 b/frontend/public/samples/bass/slap_bass_1/C3.mp3 deleted file mode 100644 index e91044d..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/E2.mp3 b/frontend/public/samples/bass/slap_bass_1/E2.mp3 deleted file mode 100644 index f381a9f..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/E3.mp3 b/frontend/public/samples/bass/slap_bass_1/E3.mp3 deleted file mode 100644 index c829524..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/G2.mp3 b/frontend/public/samples/bass/slap_bass_1/G2.mp3 deleted file mode 100644 index 0b37175..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/slap_bass_1/G3.mp3 b/frontend/public/samples/bass/slap_bass_1/G3.mp3 deleted file mode 100644 index fc92af3..0000000 Binary files a/frontend/public/samples/bass/slap_bass_1/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/A1.mp3 b/frontend/public/samples/bass/synth_bass_1/A1.mp3 deleted file mode 100644 index 7a903b8..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/A1.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/A2.mp3 b/frontend/public/samples/bass/synth_bass_1/A2.mp3 deleted file mode 100644 index 6b7d6ed..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/A3.mp3 b/frontend/public/samples/bass/synth_bass_1/A3.mp3 deleted file mode 100644 index afad613..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/C2.mp3 b/frontend/public/samples/bass/synth_bass_1/C2.mp3 deleted file mode 100644 index 4675426..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/C2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/C3.mp3 b/frontend/public/samples/bass/synth_bass_1/C3.mp3 deleted file mode 100644 index cf17bc0..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/E2.mp3 b/frontend/public/samples/bass/synth_bass_1/E2.mp3 deleted file mode 100644 index fdf5cd5..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/E2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/E3.mp3 b/frontend/public/samples/bass/synth_bass_1/E3.mp3 deleted file mode 100644 index 0fe48dd..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/G2.mp3 b/frontend/public/samples/bass/synth_bass_1/G2.mp3 deleted file mode 100644 index 51f9c5f..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/G2.mp3 and /dev/null differ diff --git a/frontend/public/samples/bass/synth_bass_1/G3.mp3 b/frontend/public/samples/bass/synth_bass_1/G3.mp3 deleted file mode 100644 index 4623ef3..0000000 Binary files a/frontend/public/samples/bass/synth_bass_1/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/crash.mp3 b/frontend/public/samples/drums/CR78/crash.mp3 deleted file mode 100644 index 474204d..0000000 Binary files a/frontend/public/samples/drums/CR78/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/hihat.mp3 b/frontend/public/samples/drums/CR78/hihat.mp3 deleted file mode 100644 index 474204d..0000000 Binary files a/frontend/public/samples/drums/CR78/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/hihat_open.mp3 b/frontend/public/samples/drums/CR78/hihat_open.mp3 deleted file mode 100644 index 474204d..0000000 Binary files a/frontend/public/samples/drums/CR78/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/kick.mp3 b/frontend/public/samples/drums/CR78/kick.mp3 deleted file mode 100644 index 01f3398..0000000 Binary files a/frontend/public/samples/drums/CR78/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/ride.mp3 b/frontend/public/samples/drums/CR78/ride.mp3 deleted file mode 100644 index 474204d..0000000 Binary files a/frontend/public/samples/drums/CR78/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/snare.mp3 b/frontend/public/samples/drums/CR78/snare.mp3 deleted file mode 100644 index aa596ce..0000000 Binary files a/frontend/public/samples/drums/CR78/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/tom1.mp3 b/frontend/public/samples/drums/CR78/tom1.mp3 deleted file mode 100644 index 454c348..0000000 Binary files a/frontend/public/samples/drums/CR78/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/tom2.mp3 b/frontend/public/samples/drums/CR78/tom2.mp3 deleted file mode 100644 index b634e33..0000000 Binary files a/frontend/public/samples/drums/CR78/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/CR78/tom3.mp3 b/frontend/public/samples/drums/CR78/tom3.mp3 deleted file mode 100644 index bb797e1..0000000 Binary files a/frontend/public/samples/drums/CR78/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/crash.mp3 b/frontend/public/samples/drums/KPR77/crash.mp3 deleted file mode 100644 index d6e8b17..0000000 Binary files a/frontend/public/samples/drums/KPR77/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/hihat.mp3 b/frontend/public/samples/drums/KPR77/hihat.mp3 deleted file mode 100644 index d6e8b17..0000000 Binary files a/frontend/public/samples/drums/KPR77/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/hihat_open.mp3 b/frontend/public/samples/drums/KPR77/hihat_open.mp3 deleted file mode 100644 index d6e8b17..0000000 Binary files a/frontend/public/samples/drums/KPR77/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/kick.mp3 b/frontend/public/samples/drums/KPR77/kick.mp3 deleted file mode 100644 index 5432a74..0000000 Binary files a/frontend/public/samples/drums/KPR77/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/ride.mp3 b/frontend/public/samples/drums/KPR77/ride.mp3 deleted file mode 100644 index d6e8b17..0000000 Binary files a/frontend/public/samples/drums/KPR77/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/snare.mp3 b/frontend/public/samples/drums/KPR77/snare.mp3 deleted file mode 100644 index 2d05802..0000000 Binary files a/frontend/public/samples/drums/KPR77/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/tom1.mp3 b/frontend/public/samples/drums/KPR77/tom1.mp3 deleted file mode 100644 index 7a231bb..0000000 Binary files a/frontend/public/samples/drums/KPR77/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/tom2.mp3 b/frontend/public/samples/drums/KPR77/tom2.mp3 deleted file mode 100644 index 0266a7b..0000000 Binary files a/frontend/public/samples/drums/KPR77/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/KPR77/tom3.mp3 b/frontend/public/samples/drums/KPR77/tom3.mp3 deleted file mode 100644 index fe97856..0000000 Binary files a/frontend/public/samples/drums/KPR77/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/crash.mp3 b/frontend/public/samples/drums/LINN/crash.mp3 deleted file mode 100644 index ba1e700..0000000 Binary files a/frontend/public/samples/drums/LINN/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/hihat.mp3 b/frontend/public/samples/drums/LINN/hihat.mp3 deleted file mode 100644 index ba1e700..0000000 Binary files a/frontend/public/samples/drums/LINN/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/hihat_open.mp3 b/frontend/public/samples/drums/LINN/hihat_open.mp3 deleted file mode 100644 index ba1e700..0000000 Binary files a/frontend/public/samples/drums/LINN/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/kick.mp3 b/frontend/public/samples/drums/LINN/kick.mp3 deleted file mode 100644 index bfbe035..0000000 Binary files a/frontend/public/samples/drums/LINN/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/ride.mp3 b/frontend/public/samples/drums/LINN/ride.mp3 deleted file mode 100644 index ba1e700..0000000 Binary files a/frontend/public/samples/drums/LINN/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/snare.mp3 b/frontend/public/samples/drums/LINN/snare.mp3 deleted file mode 100644 index 0f8e73e..0000000 Binary files a/frontend/public/samples/drums/LINN/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/tom1.mp3 b/frontend/public/samples/drums/LINN/tom1.mp3 deleted file mode 100644 index e39573b..0000000 Binary files a/frontend/public/samples/drums/LINN/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/tom2.mp3 b/frontend/public/samples/drums/LINN/tom2.mp3 deleted file mode 100644 index 51f92e5..0000000 Binary files a/frontend/public/samples/drums/LINN/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/LINN/tom3.mp3 b/frontend/public/samples/drums/LINN/tom3.mp3 deleted file mode 100644 index 5e671da..0000000 Binary files a/frontend/public/samples/drums/LINN/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/crash.mp3 b/frontend/public/samples/drums/R8/crash.mp3 deleted file mode 100644 index 39651ff..0000000 Binary files a/frontend/public/samples/drums/R8/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/hihat.mp3 b/frontend/public/samples/drums/R8/hihat.mp3 deleted file mode 100644 index 39651ff..0000000 Binary files a/frontend/public/samples/drums/R8/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/hihat_open.mp3 b/frontend/public/samples/drums/R8/hihat_open.mp3 deleted file mode 100644 index 39651ff..0000000 Binary files a/frontend/public/samples/drums/R8/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/kick.mp3 b/frontend/public/samples/drums/R8/kick.mp3 deleted file mode 100644 index 31d3bbf..0000000 Binary files a/frontend/public/samples/drums/R8/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/ride.mp3 b/frontend/public/samples/drums/R8/ride.mp3 deleted file mode 100644 index 39651ff..0000000 Binary files a/frontend/public/samples/drums/R8/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/snare.mp3 b/frontend/public/samples/drums/R8/snare.mp3 deleted file mode 100644 index f6dce87..0000000 Binary files a/frontend/public/samples/drums/R8/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/tom1.mp3 b/frontend/public/samples/drums/R8/tom1.mp3 deleted file mode 100644 index 9f4befd..0000000 Binary files a/frontend/public/samples/drums/R8/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/tom2.mp3 b/frontend/public/samples/drums/R8/tom2.mp3 deleted file mode 100644 index c7ca90d..0000000 Binary files a/frontend/public/samples/drums/R8/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/R8/tom3.mp3 b/frontend/public/samples/drums/R8/tom3.mp3 deleted file mode 100644 index ffb20dd..0000000 Binary files a/frontend/public/samples/drums/R8/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/crash.mp3 b/frontend/public/samples/drums/Techno/crash.mp3 deleted file mode 100644 index c9cd4e3..0000000 Binary files a/frontend/public/samples/drums/Techno/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/hihat.mp3 b/frontend/public/samples/drums/Techno/hihat.mp3 deleted file mode 100644 index c9cd4e3..0000000 Binary files a/frontend/public/samples/drums/Techno/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/hihat_open.mp3 b/frontend/public/samples/drums/Techno/hihat_open.mp3 deleted file mode 100644 index c9cd4e3..0000000 Binary files a/frontend/public/samples/drums/Techno/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/kick.mp3 b/frontend/public/samples/drums/Techno/kick.mp3 deleted file mode 100644 index 6967fef..0000000 Binary files a/frontend/public/samples/drums/Techno/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/ride.mp3 b/frontend/public/samples/drums/Techno/ride.mp3 deleted file mode 100644 index c9cd4e3..0000000 Binary files a/frontend/public/samples/drums/Techno/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/snare.mp3 b/frontend/public/samples/drums/Techno/snare.mp3 deleted file mode 100644 index e365c1f..0000000 Binary files a/frontend/public/samples/drums/Techno/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/tom1.mp3 b/frontend/public/samples/drums/Techno/tom1.mp3 deleted file mode 100644 index 37c4b91..0000000 Binary files a/frontend/public/samples/drums/Techno/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/tom2.mp3 b/frontend/public/samples/drums/Techno/tom2.mp3 deleted file mode 100644 index 7c44094..0000000 Binary files a/frontend/public/samples/drums/Techno/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/Techno/tom3.mp3 b/frontend/public/samples/drums/Techno/tom3.mp3 deleted file mode 100644 index c2eeda3..0000000 Binary files a/frontend/public/samples/drums/Techno/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/crash.mp3 b/frontend/public/samples/drums/acoustic-kit/crash.mp3 deleted file mode 100644 index 4c9417a..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/hihat.mp3 b/frontend/public/samples/drums/acoustic-kit/hihat.mp3 deleted file mode 100644 index 4c9417a..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/hihat_open.mp3 b/frontend/public/samples/drums/acoustic-kit/hihat_open.mp3 deleted file mode 100644 index 4c9417a..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/kick.mp3 b/frontend/public/samples/drums/acoustic-kit/kick.mp3 deleted file mode 100644 index b0057c8..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/ride.mp3 b/frontend/public/samples/drums/acoustic-kit/ride.mp3 deleted file mode 100644 index 4c9417a..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/snare.mp3 b/frontend/public/samples/drums/acoustic-kit/snare.mp3 deleted file mode 100644 index 4e23bae..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/tom1.mp3 b/frontend/public/samples/drums/acoustic-kit/tom1.mp3 deleted file mode 100644 index e401335..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/tom2.mp3 b/frontend/public/samples/drums/acoustic-kit/tom2.mp3 deleted file mode 100644 index ef88d25..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/acoustic-kit/tom3.mp3 b/frontend/public/samples/drums/acoustic-kit/tom3.mp3 deleted file mode 100644 index e747287..0000000 Binary files a/frontend/public/samples/drums/acoustic-kit/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/crash.mp3 b/frontend/public/samples/drums/breakbeat13/crash.mp3 deleted file mode 100644 index 328a6f7..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/hihat.mp3 b/frontend/public/samples/drums/breakbeat13/hihat.mp3 deleted file mode 100644 index 328a6f7..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/hihat_open.mp3 b/frontend/public/samples/drums/breakbeat13/hihat_open.mp3 deleted file mode 100644 index 328a6f7..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/kick.mp3 b/frontend/public/samples/drums/breakbeat13/kick.mp3 deleted file mode 100644 index 42e72dc..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/ride.mp3 b/frontend/public/samples/drums/breakbeat13/ride.mp3 deleted file mode 100644 index 328a6f7..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/snare.mp3 b/frontend/public/samples/drums/breakbeat13/snare.mp3 deleted file mode 100644 index dee7660..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/tom1.mp3 b/frontend/public/samples/drums/breakbeat13/tom1.mp3 deleted file mode 100644 index 5b7474f..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/tom2.mp3 b/frontend/public/samples/drums/breakbeat13/tom2.mp3 deleted file mode 100644 index f885519..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat13/tom3.mp3 b/frontend/public/samples/drums/breakbeat13/tom3.mp3 deleted file mode 100644 index 24a7211..0000000 Binary files a/frontend/public/samples/drums/breakbeat13/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/crash.mp3 b/frontend/public/samples/drums/breakbeat8/crash.mp3 deleted file mode 100644 index 13717b0..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/crash.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/hihat.mp3 b/frontend/public/samples/drums/breakbeat8/hihat.mp3 deleted file mode 100644 index 13717b0..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/hihat.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/hihat_open.mp3 b/frontend/public/samples/drums/breakbeat8/hihat_open.mp3 deleted file mode 100644 index 13717b0..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/hihat_open.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/kick.mp3 b/frontend/public/samples/drums/breakbeat8/kick.mp3 deleted file mode 100644 index 077d79c..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/kick.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/ride.mp3 b/frontend/public/samples/drums/breakbeat8/ride.mp3 deleted file mode 100644 index 13717b0..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/ride.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/snare.mp3 b/frontend/public/samples/drums/breakbeat8/snare.mp3 deleted file mode 100644 index f1ca928..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/snare.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/tom1.mp3 b/frontend/public/samples/drums/breakbeat8/tom1.mp3 deleted file mode 100644 index 5b7474f..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/tom1.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/tom2.mp3 b/frontend/public/samples/drums/breakbeat8/tom2.mp3 deleted file mode 100644 index f885519..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/tom2.mp3 and /dev/null differ diff --git a/frontend/public/samples/drums/breakbeat8/tom3.mp3 b/frontend/public/samples/drums/breakbeat8/tom3.mp3 deleted file mode 100644 index 24a7211..0000000 Binary files a/frontend/public/samples/drums/breakbeat8/tom3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/A2.mp3 b/frontend/public/samples/melodic/accordion/A2.mp3 deleted file mode 100644 index ae8caf5..0000000 Binary files a/frontend/public/samples/melodic/accordion/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/A3.mp3 b/frontend/public/samples/melodic/accordion/A3.mp3 deleted file mode 100644 index 9614364..0000000 Binary files a/frontend/public/samples/melodic/accordion/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/A4.mp3 b/frontend/public/samples/melodic/accordion/A4.mp3 deleted file mode 100644 index 8090d92..0000000 Binary files a/frontend/public/samples/melodic/accordion/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/A5.mp3 b/frontend/public/samples/melodic/accordion/A5.mp3 deleted file mode 100644 index b5d3626..0000000 Binary files a/frontend/public/samples/melodic/accordion/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/C3.mp3 b/frontend/public/samples/melodic/accordion/C3.mp3 deleted file mode 100644 index eb10293..0000000 Binary files a/frontend/public/samples/melodic/accordion/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/C4.mp3 b/frontend/public/samples/melodic/accordion/C4.mp3 deleted file mode 100644 index d242f3d..0000000 Binary files a/frontend/public/samples/melodic/accordion/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/C5.mp3 b/frontend/public/samples/melodic/accordion/C5.mp3 deleted file mode 100644 index 9d0b81c..0000000 Binary files a/frontend/public/samples/melodic/accordion/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/E3.mp3 b/frontend/public/samples/melodic/accordion/E3.mp3 deleted file mode 100644 index d642a9b..0000000 Binary files a/frontend/public/samples/melodic/accordion/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/E4.mp3 b/frontend/public/samples/melodic/accordion/E4.mp3 deleted file mode 100644 index d46190e..0000000 Binary files a/frontend/public/samples/melodic/accordion/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/E5.mp3 b/frontend/public/samples/melodic/accordion/E5.mp3 deleted file mode 100644 index 98f4eac..0000000 Binary files a/frontend/public/samples/melodic/accordion/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/G3.mp3 b/frontend/public/samples/melodic/accordion/G3.mp3 deleted file mode 100644 index f9643e4..0000000 Binary files a/frontend/public/samples/melodic/accordion/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/G4.mp3 b/frontend/public/samples/melodic/accordion/G4.mp3 deleted file mode 100644 index 8102313..0000000 Binary files a/frontend/public/samples/melodic/accordion/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/accordion/G5.mp3 b/frontend/public/samples/melodic/accordion/G5.mp3 deleted file mode 100644 index faf6ba8..0000000 Binary files a/frontend/public/samples/melodic/accordion/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/A2.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/A2.mp3 deleted file mode 100644 index d020d37..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/A3.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/A3.mp3 deleted file mode 100644 index ddc9945..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/A4.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/A4.mp3 deleted file mode 100644 index 2357a65..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/A5.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/A5.mp3 deleted file mode 100644 index e4dc8ce..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/C3.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/C3.mp3 deleted file mode 100644 index 699147e..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/C4.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/C4.mp3 deleted file mode 100644 index 13456cf..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/C5.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/C5.mp3 deleted file mode 100644 index 7cbe796..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/E3.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/E3.mp3 deleted file mode 100644 index 0001295..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/E4.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/E4.mp3 deleted file mode 100644 index f2bb3aa..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/E5.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/E5.mp3 deleted file mode 100644 index f63e036..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/G3.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/G3.mp3 deleted file mode 100644 index 3fd0d39..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/G4.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/G4.mp3 deleted file mode 100644 index 0896dba..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/acoustic_guitar_nylon/G5.mp3 b/frontend/public/samples/melodic/acoustic_guitar_nylon/G5.mp3 deleted file mode 100644 index 6e1edfc..0000000 Binary files a/frontend/public/samples/melodic/acoustic_guitar_nylon/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/A2.mp3 b/frontend/public/samples/melodic/clavinet/A2.mp3 deleted file mode 100644 index 55fdc01..0000000 Binary files a/frontend/public/samples/melodic/clavinet/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/A3.mp3 b/frontend/public/samples/melodic/clavinet/A3.mp3 deleted file mode 100644 index 270c937..0000000 Binary files a/frontend/public/samples/melodic/clavinet/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/A4.mp3 b/frontend/public/samples/melodic/clavinet/A4.mp3 deleted file mode 100644 index d1ee807..0000000 Binary files a/frontend/public/samples/melodic/clavinet/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/A5.mp3 b/frontend/public/samples/melodic/clavinet/A5.mp3 deleted file mode 100644 index d688442..0000000 Binary files a/frontend/public/samples/melodic/clavinet/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/C3.mp3 b/frontend/public/samples/melodic/clavinet/C3.mp3 deleted file mode 100644 index e6708c7..0000000 Binary files a/frontend/public/samples/melodic/clavinet/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/C4.mp3 b/frontend/public/samples/melodic/clavinet/C4.mp3 deleted file mode 100644 index ee4c84a..0000000 Binary files a/frontend/public/samples/melodic/clavinet/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/C5.mp3 b/frontend/public/samples/melodic/clavinet/C5.mp3 deleted file mode 100644 index 3ce5c4c..0000000 Binary files a/frontend/public/samples/melodic/clavinet/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/E3.mp3 b/frontend/public/samples/melodic/clavinet/E3.mp3 deleted file mode 100644 index 98d236e..0000000 Binary files a/frontend/public/samples/melodic/clavinet/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/E4.mp3 b/frontend/public/samples/melodic/clavinet/E4.mp3 deleted file mode 100644 index 03f296c..0000000 Binary files a/frontend/public/samples/melodic/clavinet/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/E5.mp3 b/frontend/public/samples/melodic/clavinet/E5.mp3 deleted file mode 100644 index 948dc48..0000000 Binary files a/frontend/public/samples/melodic/clavinet/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/G3.mp3 b/frontend/public/samples/melodic/clavinet/G3.mp3 deleted file mode 100644 index e5da808..0000000 Binary files a/frontend/public/samples/melodic/clavinet/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/G4.mp3 b/frontend/public/samples/melodic/clavinet/G4.mp3 deleted file mode 100644 index e2f0289..0000000 Binary files a/frontend/public/samples/melodic/clavinet/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/clavinet/G5.mp3 b/frontend/public/samples/melodic/clavinet/G5.mp3 deleted file mode 100644 index a398f45..0000000 Binary files a/frontend/public/samples/melodic/clavinet/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/A2.mp3 b/frontend/public/samples/melodic/drawbar_organ/A2.mp3 deleted file mode 100644 index c82c44e..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/A3.mp3 b/frontend/public/samples/melodic/drawbar_organ/A3.mp3 deleted file mode 100644 index e5cd842..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/A4.mp3 b/frontend/public/samples/melodic/drawbar_organ/A4.mp3 deleted file mode 100644 index 7aea90c..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/A5.mp3 b/frontend/public/samples/melodic/drawbar_organ/A5.mp3 deleted file mode 100644 index a3f19a5..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/C3.mp3 b/frontend/public/samples/melodic/drawbar_organ/C3.mp3 deleted file mode 100644 index a1c3c4b..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/C4.mp3 b/frontend/public/samples/melodic/drawbar_organ/C4.mp3 deleted file mode 100644 index 2a3a9a8..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/C5.mp3 b/frontend/public/samples/melodic/drawbar_organ/C5.mp3 deleted file mode 100644 index 3762c61..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/E3.mp3 b/frontend/public/samples/melodic/drawbar_organ/E3.mp3 deleted file mode 100644 index 875a099..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/E4.mp3 b/frontend/public/samples/melodic/drawbar_organ/E4.mp3 deleted file mode 100644 index 9685fbb..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/E5.mp3 b/frontend/public/samples/melodic/drawbar_organ/E5.mp3 deleted file mode 100644 index 453027b..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/G3.mp3 b/frontend/public/samples/melodic/drawbar_organ/G3.mp3 deleted file mode 100644 index 0953008..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/G4.mp3 b/frontend/public/samples/melodic/drawbar_organ/G4.mp3 deleted file mode 100644 index 83a8bbf..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/drawbar_organ/G5.mp3 b/frontend/public/samples/melodic/drawbar_organ/G5.mp3 deleted file mode 100644 index c1556c3..0000000 Binary files a/frontend/public/samples/melodic/drawbar_organ/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/A2.mp3 b/frontend/public/samples/melodic/electric_piano_1/A2.mp3 deleted file mode 100644 index df451b7..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/A3.mp3 b/frontend/public/samples/melodic/electric_piano_1/A3.mp3 deleted file mode 100644 index 5f72c6f..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/A4.mp3 b/frontend/public/samples/melodic/electric_piano_1/A4.mp3 deleted file mode 100644 index 178e2b9..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/A5.mp3 b/frontend/public/samples/melodic/electric_piano_1/A5.mp3 deleted file mode 100644 index e9ea74e..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/C3.mp3 b/frontend/public/samples/melodic/electric_piano_1/C3.mp3 deleted file mode 100644 index 6863a93..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/C4.mp3 b/frontend/public/samples/melodic/electric_piano_1/C4.mp3 deleted file mode 100644 index 3fd649f..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/C5.mp3 b/frontend/public/samples/melodic/electric_piano_1/C5.mp3 deleted file mode 100644 index 7fbb5b8..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/E3.mp3 b/frontend/public/samples/melodic/electric_piano_1/E3.mp3 deleted file mode 100644 index 8c6608c..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/E4.mp3 b/frontend/public/samples/melodic/electric_piano_1/E4.mp3 deleted file mode 100644 index 168af85..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/E5.mp3 b/frontend/public/samples/melodic/electric_piano_1/E5.mp3 deleted file mode 100644 index f0a8b7b..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/G3.mp3 b/frontend/public/samples/melodic/electric_piano_1/G3.mp3 deleted file mode 100644 index e17ddfe..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/G4.mp3 b/frontend/public/samples/melodic/electric_piano_1/G4.mp3 deleted file mode 100644 index 6830b8a..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_1/G5.mp3 b/frontend/public/samples/melodic/electric_piano_1/G5.mp3 deleted file mode 100644 index 37b0024..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_1/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/A2.mp3 b/frontend/public/samples/melodic/electric_piano_2/A2.mp3 deleted file mode 100644 index 343a415..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/A3.mp3 b/frontend/public/samples/melodic/electric_piano_2/A3.mp3 deleted file mode 100644 index 7283623..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/A4.mp3 b/frontend/public/samples/melodic/electric_piano_2/A4.mp3 deleted file mode 100644 index 81ee732..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/A5.mp3 b/frontend/public/samples/melodic/electric_piano_2/A5.mp3 deleted file mode 100644 index 56460df..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/C3.mp3 b/frontend/public/samples/melodic/electric_piano_2/C3.mp3 deleted file mode 100644 index 5ce8b69..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/C4.mp3 b/frontend/public/samples/melodic/electric_piano_2/C4.mp3 deleted file mode 100644 index 630cbab..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/C5.mp3 b/frontend/public/samples/melodic/electric_piano_2/C5.mp3 deleted file mode 100644 index a96be90..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/E3.mp3 b/frontend/public/samples/melodic/electric_piano_2/E3.mp3 deleted file mode 100644 index 767a3f1..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/E4.mp3 b/frontend/public/samples/melodic/electric_piano_2/E4.mp3 deleted file mode 100644 index edd11db..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/E5.mp3 b/frontend/public/samples/melodic/electric_piano_2/E5.mp3 deleted file mode 100644 index 1f15ed9..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/G3.mp3 b/frontend/public/samples/melodic/electric_piano_2/G3.mp3 deleted file mode 100644 index 13ef6df..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/G4.mp3 b/frontend/public/samples/melodic/electric_piano_2/G4.mp3 deleted file mode 100644 index cfc2469..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/electric_piano_2/G5.mp3 b/frontend/public/samples/melodic/electric_piano_2/G5.mp3 deleted file mode 100644 index 6f2d815..0000000 Binary files a/frontend/public/samples/melodic/electric_piano_2/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/A2.mp3 b/frontend/public/samples/melodic/string_ensemble_1/A2.mp3 deleted file mode 100644 index 71ba8d2..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/A3.mp3 b/frontend/public/samples/melodic/string_ensemble_1/A3.mp3 deleted file mode 100644 index 1fa880e..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/A4.mp3 b/frontend/public/samples/melodic/string_ensemble_1/A4.mp3 deleted file mode 100644 index ee4bbfc..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/A5.mp3 b/frontend/public/samples/melodic/string_ensemble_1/A5.mp3 deleted file mode 100644 index 099b834..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/C3.mp3 b/frontend/public/samples/melodic/string_ensemble_1/C3.mp3 deleted file mode 100644 index 2fd6410..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/C4.mp3 b/frontend/public/samples/melodic/string_ensemble_1/C4.mp3 deleted file mode 100644 index 25dedea..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/C5.mp3 b/frontend/public/samples/melodic/string_ensemble_1/C5.mp3 deleted file mode 100644 index 2dad86b..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/E3.mp3 b/frontend/public/samples/melodic/string_ensemble_1/E3.mp3 deleted file mode 100644 index bbce482..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/E4.mp3 b/frontend/public/samples/melodic/string_ensemble_1/E4.mp3 deleted file mode 100644 index 02a4e9f..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/E5.mp3 b/frontend/public/samples/melodic/string_ensemble_1/E5.mp3 deleted file mode 100644 index 54198dc..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/G3.mp3 b/frontend/public/samples/melodic/string_ensemble_1/G3.mp3 deleted file mode 100644 index f424981..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/G4.mp3 b/frontend/public/samples/melodic/string_ensemble_1/G4.mp3 deleted file mode 100644 index 7087be4..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/string_ensemble_1/G5.mp3 b/frontend/public/samples/melodic/string_ensemble_1/G5.mp3 deleted file mode 100644 index 8fb77e8..0000000 Binary files a/frontend/public/samples/melodic/string_ensemble_1/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/A2.mp3 b/frontend/public/samples/melodic/vibraphone/A2.mp3 deleted file mode 100644 index adb03b7..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/A2.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/A3.mp3 b/frontend/public/samples/melodic/vibraphone/A3.mp3 deleted file mode 100644 index fb66fa4..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/A3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/A4.mp3 b/frontend/public/samples/melodic/vibraphone/A4.mp3 deleted file mode 100644 index 76b2ead..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/A4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/A5.mp3 b/frontend/public/samples/melodic/vibraphone/A5.mp3 deleted file mode 100644 index 66d5a61..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/A5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/C3.mp3 b/frontend/public/samples/melodic/vibraphone/C3.mp3 deleted file mode 100644 index 9fd8e8f..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/C3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/C4.mp3 b/frontend/public/samples/melodic/vibraphone/C4.mp3 deleted file mode 100644 index b670fdc..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/C4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/C5.mp3 b/frontend/public/samples/melodic/vibraphone/C5.mp3 deleted file mode 100644 index 8db3797..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/C5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/E3.mp3 b/frontend/public/samples/melodic/vibraphone/E3.mp3 deleted file mode 100644 index dadd2e3..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/E3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/E4.mp3 b/frontend/public/samples/melodic/vibraphone/E4.mp3 deleted file mode 100644 index 158f57b..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/E4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/E5.mp3 b/frontend/public/samples/melodic/vibraphone/E5.mp3 deleted file mode 100644 index 898af9d..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/E5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/G3.mp3 b/frontend/public/samples/melodic/vibraphone/G3.mp3 deleted file mode 100644 index 008fb27..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/G3.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/G4.mp3 b/frontend/public/samples/melodic/vibraphone/G4.mp3 deleted file mode 100644 index 016592e..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/G4.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/G5.mp3 b/frontend/public/samples/melodic/vibraphone/G5.mp3 deleted file mode 100644 index 5303c03..0000000 Binary files a/frontend/public/samples/melodic/vibraphone/G5.mp3 and /dev/null differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/A4.mp3 b/frontend/public/samples/melodic/vibraphone/hard/A4.mp3 new file mode 100644 index 0000000..c5e5a0c Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/A4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/B3.mp3 b/frontend/public/samples/melodic/vibraphone/hard/B3.mp3 new file mode 100644 index 0000000..8b8840f Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/B3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/C3.mp3 b/frontend/public/samples/melodic/vibraphone/hard/C3.mp3 new file mode 100644 index 0000000..708183f Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/C3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/C5.mp3 b/frontend/public/samples/melodic/vibraphone/hard/C5.mp3 new file mode 100644 index 0000000..d9803b3 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/C5.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/D4.mp3 b/frontend/public/samples/melodic/vibraphone/hard/D4.mp3 new file mode 100644 index 0000000..29d622f Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/D4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/E3.mp3 b/frontend/public/samples/melodic/vibraphone/hard/E3.mp3 new file mode 100644 index 0000000..97bb20e Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/E3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/E5.mp3 b/frontend/public/samples/melodic/vibraphone/hard/E5.mp3 new file mode 100644 index 0000000..d4ea8f5 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/E5.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/F4.mp3 b/frontend/public/samples/melodic/vibraphone/hard/F4.mp3 new file mode 100644 index 0000000..eb12027 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/F4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/hard/G3.mp3 b/frontend/public/samples/melodic/vibraphone/hard/G3.mp3 new file mode 100644 index 0000000..9a357de Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/hard/G3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/A4.mp3 b/frontend/public/samples/melodic/vibraphone/soft/A4.mp3 new file mode 100644 index 0000000..0735449 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/A4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/B3.mp3 b/frontend/public/samples/melodic/vibraphone/soft/B3.mp3 new file mode 100644 index 0000000..b8d1834 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/B3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/C3.mp3 b/frontend/public/samples/melodic/vibraphone/soft/C3.mp3 new file mode 100644 index 0000000..7d5caf7 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/C3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/C5.mp3 b/frontend/public/samples/melodic/vibraphone/soft/C5.mp3 new file mode 100644 index 0000000..25d256f Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/C5.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/D4.mp3 b/frontend/public/samples/melodic/vibraphone/soft/D4.mp3 new file mode 100644 index 0000000..b234cc4 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/D4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/E3.mp3 b/frontend/public/samples/melodic/vibraphone/soft/E3.mp3 new file mode 100644 index 0000000..2b308f0 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/E3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/E5.mp3 b/frontend/public/samples/melodic/vibraphone/soft/E5.mp3 new file mode 100644 index 0000000..827aab3 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/E5.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/F4.mp3 b/frontend/public/samples/melodic/vibraphone/soft/F4.mp3 new file mode 100644 index 0000000..d070575 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/F4.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/soft/G3.mp3 b/frontend/public/samples/melodic/vibraphone/soft/G3.mp3 new file mode 100644 index 0000000..ba61bb6 Binary files /dev/null and b/frontend/public/samples/melodic/vibraphone/soft/G3.mp3 differ diff --git a/frontend/public/samples/melodic/vibraphone/velocity.json b/frontend/public/samples/melodic/vibraphone/velocity.json new file mode 100644 index 0000000..a001c10 --- /dev/null +++ b/frontend/public/samples/melodic/vibraphone/velocity.json @@ -0,0 +1,32 @@ +{ + "layers": [ + { + "maxVelocity": 0.5, + "urls": { + "C3": "soft/C3.mp3", + "E3": "soft/E3.mp3", + "G3": "soft/G3.mp3", + "B3": "soft/B3.mp3", + "D4": "soft/D4.mp3", + "F4": "soft/F4.mp3", + "A4": "soft/A4.mp3", + "C5": "soft/C5.mp3", + "E5": "soft/E5.mp3" + } + }, + { + "maxVelocity": 1.0, + "urls": { + "C3": "hard/C3.mp3", + "E3": "hard/E3.mp3", + "G3": "hard/G3.mp3", + "B3": "hard/B3.mp3", + "D4": "hard/D4.mp3", + "F4": "hard/F4.mp3", + "A4": "hard/A4.mp3", + "C5": "hard/C5.mp3", + "E5": "hard/E5.mp3" + } + } + ] +} diff --git a/frontend/src/components/InstrumentsPanel.vue b/frontend/src/components/InstrumentsPanel.vue new file mode 100644 index 0000000..83f2b14 --- /dev/null +++ b/frontend/src/components/InstrumentsPanel.vue @@ -0,0 +1,207 @@ + + + + + + diff --git a/frontend/src/components/TransportBar.vue b/frontend/src/components/TransportBar.vue index 5d56db6..a57adb2 100644 --- a/frontend/src/components/TransportBar.vue +++ b/frontend/src/components/TransportBar.vue @@ -62,6 +62,30 @@ >{{ chipLabel(ch) }} + +
+ + +
+ +
{{ volume === 0 ? '🔇' : volume < 40 ? '🔈' : '🔊' }} @@ -81,14 +105,17 @@