fourier-samples 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fourier/__init__.py +28 -0
- fourier/__main__.py +5 -0
- fourier/_config/devices/digitakt_2.yaml +90 -0
- fourier/_config/devices/generic_44k.yaml +21 -0
- fourier/_config/devices/generic_48k.yaml +21 -0
- fourier/_config/devices/generic_folder.yaml +21 -0
- fourier/_config/devices/generic_sd_card.yaml +25 -0
- fourier/_config/devices/m8_tracker.yaml +118 -0
- fourier/_config/presets/ambient-cinematic.yaml +35 -0
- fourier/_config/presets/balanced.yaml +12 -0
- fourier/_config/presets/breaks-acid.yaml +16 -0
- fourier/_config/presets/hiphop-lofi.yaml +29 -0
- fourier/_config/presets/house-techno.yaml +26 -0
- fourier/_config/presets/trap.yaml +30 -0
- fourier/_config/providers/path.yaml +60 -0
- fourier/_config/providers/sononym.yaml +36 -0
- fourier/_config/taxonomy.yaml +711 -0
- fourier/_config/tunables.yaml +388 -0
- fourier/analysis/__init__.py +14 -0
- fourier/analysis/clap_features.py +442 -0
- fourier/analysis/derived.py +248 -0
- fourier/analysis/events.py +92 -0
- fourier/analysis/key_detection.py +103 -0
- fourier/analysis/librosa_features.py +257 -0
- fourier/analysis/loop_trim.py +215 -0
- fourier/analysis/resolution.py +70 -0
- fourier/cli/__init__.py +24 -0
- fourier/cli/__main__.py +3 -0
- fourier/cli/_app.py +298 -0
- fourier/cli/build.py +1403 -0
- fourier/cli/config.py +317 -0
- fourier/cli/db.py +305 -0
- fourier/cli/devices.py +300 -0
- fourier/cli/enrich.py +1604 -0
- fourier/cli/ingest.py +267 -0
- fourier/cli/opener.py +97 -0
- fourier/cli/quiet.py +204 -0
- fourier/cli/releases.py +582 -0
- fourier/cli/review.py +271 -0
- fourier/cli/search.py +513 -0
- fourier/cli/setup.py +1957 -0
- fourier/db/__init__.py +0 -0
- fourier/db/migrations.py +131 -0
- fourier/db/models.py +552 -0
- fourier/db/session.py +307 -0
- fourier/demo.py +384 -0
- fourier/devices/__init__.py +0 -0
- fourier/devices/convert.py +104 -0
- fourier/devices/exporter.py +305 -0
- fourier/devices/loader.py +399 -0
- fourier/ingest/__init__.py +0 -0
- fourier/ingest/ableton_tags.py +155 -0
- fourier/ingest/chunks.py +92 -0
- fourier/ingest/folder.py +159 -0
- fourier/ingest/formats.py +65 -0
- fourier/ingest/importer.py +802 -0
- fourier/ingest/sononym.py +766 -0
- fourier/ingest/walk.py +285 -0
- fourier/knobs.py +559 -0
- fourier/layers.py +400 -0
- fourier/metadata/__init__.py +1 -0
- fourier/metadata/providers.py +98 -0
- fourier/metadata/resolve.py +357 -0
- fourier/metadata/rows.py +519 -0
- fourier/metadata/shadow.py +396 -0
- fourier/metadata/sound.py +613 -0
- fourier/metadata/store.py +208 -0
- fourier/metadata/train.py +706 -0
- fourier/metadata/vocab.py +52 -0
- fourier/net.py +15 -0
- fourier/packs/__init__.py +0 -0
- fourier/packs/audiocache.py +175 -0
- fourier/packs/audit.py +169 -0
- fourier/packs/builddiff.py +225 -0
- fourier/packs/curate.py +5550 -0
- fourier/packs/curate_config.py +1233 -0
- fourier/packs/device_lock.py +236 -0
- fourier/packs/dryrun.py +131 -0
- fourier/packs/golden.py +172 -0
- fourier/packs/naming.py +685 -0
- fourier/packs/progress.py +118 -0
- fourier/packs/ratings.py +950 -0
- fourier/packs/releases.py +467 -0
- fourier/packs/render.py +687 -0
- fourier/packs/report.py +209 -0
- fourier/packs/review.py +300 -0
- fourier/packs/rules.py +465 -0
- fourier/packs/scale.py +123 -0
- fourier/packs/sets.py +381 -0
- fourier/packs/validate.py +186 -0
- fourier/packs/vendors.py +238 -0
- fourier/packs/verify.py +1073 -0
- fourier/packs/why.py +566 -0
- fourier/packs/why_log.py +212 -0
- fourier/paths.py +52 -0
- fourier/places.py +319 -0
- fourier/platforms.py +308 -0
- fourier/preparers.py +141 -0
- fourier/safety.py +477 -0
- fourier/settings.py +195 -0
- fourier/synthlib.py +324 -0
- fourier/taxonomy.py +335 -0
- fourier/timings.py +173 -0
- fourier_samples-0.1.0.dist-info/METADATA +327 -0
- fourier_samples-0.1.0.dist-info/RECORD +110 -0
- fourier_samples-0.1.0.dist-info/WHEEL +4 -0
- fourier_samples-0.1.0.dist-info/entry_points.txt +2 -0
- fourier_samples-0.1.0.dist-info/licenses/LICENSE +202 -0
- fourier_samples-0.1.0.dist-info/licenses/NOTICE +10 -0
- fourier_samples-0.1.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +60 -0
fourier/__init__.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Fourier Samples: curate a sample library into device-ready folders for hardware samplers."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import os as _os
|
|
5
|
+
import warnings as _warnings
|
|
6
|
+
|
|
7
|
+
# librosa's and numba's warnings about a short or quiet input ("n_fft=1024 is too large for
|
|
8
|
+
# input signal of length=...", "Trying to estimate tuning from empty frequency set") are
|
|
9
|
+
# expected on one-shots and say nothing a user can act on, so they stay out of a build's
|
|
10
|
+
# and an analysis' output, in this process and in every worker (each imports this package).
|
|
11
|
+
# Errors are exceptions, never warnings, and stay visible; `fourier -v` (FOURIER_VERBOSE=1)
|
|
12
|
+
# shows the warnings too.
|
|
13
|
+
VERBOSE_ENV = "FOURIER_VERBOSE"
|
|
14
|
+
# what to do about a missing core dependency (duckdb, librosa, soundfile: every install has
|
|
15
|
+
# them, so one is missing only from a broken install)
|
|
16
|
+
REINSTALL = ("it comes with Fourier Samples, so the install is incomplete: reinstall it (the "
|
|
17
|
+
"README's Updating section), then run `fourier doctor`")
|
|
18
|
+
_QUIET = ((UserWarning, r"librosa(\.|$)"), (Warning, r"numba(\.|$)"))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def quiet_library_warnings(on: bool = True) -> None:
|
|
22
|
+
"""Hide (on) or show again (off) librosa's and numba's warnings in this process."""
|
|
23
|
+
for category, module in _QUIET:
|
|
24
|
+
_warnings.filterwarnings("ignore" if on else "default", category=category, module=module)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
if not _os.environ.get(VERBOSE_ENV):
|
|
28
|
+
quiet_library_warnings(True)
|
fourier/__main__.py
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
id: digitakt_2
|
|
2
|
+
name: Elektron Digitakt 2
|
|
3
|
+
# VERIFIED against the Digitakt II manual OS1.16 (manual: below),
|
|
4
|
+
# with page citations at the bottom of this file (checked by tests/test_device_citations.py).
|
|
5
|
+
# The sequencer has 16 tracks (p.17), each an audio or a MIDI track.
|
|
6
|
+
description: >
|
|
7
|
+
16-track sequencer/sampler: every track is individually assignable as an audio track or
|
|
8
|
+
a MIDI track. 400 MB project RAM (about 72 min mono / 36 min stereo) and 1016 sample slots
|
|
9
|
+
per project, separate from the +Drive's 20 GB / 2048-preset library. Elektron Transfer
|
|
10
|
+
converts all audio files to 16-bit/48 kHz on transfer (which input formats it accepts
|
|
11
|
+
isn't listed in the manual), so pack folders just need to be well organized. Native
|
|
12
|
+
format: 16-bit/48 kHz, mono or stereo (p.73; the 24-bit figure in the tech specs is the
|
|
13
|
+
converters, p.91). Sample slots are assigned to tracks on the Digitakt after transfer;
|
|
14
|
+
Fourier manages the sample pool, organized by function so it's easy to find per track.
|
|
15
|
+
manual:
|
|
16
|
+
title: Digitakt II User Manual
|
|
17
|
+
version: OS1.16 (2026-09-09)
|
|
18
|
+
url: https://www.elektron.se/wp-content/uploads/2026/09/Digitakt-2-User-Manual_ENG_OS1.16_260909.pdf
|
|
19
|
+
sha256: 9445909f94bc0f074be4621791f981bf2c268e91465b8d5ed43a46f1a398706d
|
|
20
|
+
load: transfer # Elektron Transfer: never overwrites a file of the same name (Transfer's manual, pp. 10-11)
|
|
21
|
+
sample_refs: path # the device follows renames (p.29), but a deleted sample drops out of presets,
|
|
22
|
+
# so renders keep paths stable and retired files stay
|
|
23
|
+
|
|
24
|
+
paths:
|
|
25
|
+
folder_depth: {value: 2, status: convention, cite: browser-hierarchy}
|
|
26
|
+
# CATEGORY/family, like the M8 render; the +Drive browser opens directories and steps
|
|
27
|
+
# back up the hierarchy (p.71). Folding the family into the file name would put a whole
|
|
28
|
+
# category in one list.
|
|
29
|
+
files_per_folder: {value: 128, status: convention} # browsing comfort; no documented device cap
|
|
30
|
+
max_name_length: {status: unverified} # check on the hardware
|
|
31
|
+
|
|
32
|
+
audio:
|
|
33
|
+
sample_rate: {value: 48000, cite: native-format}
|
|
34
|
+
bit_depth: {value: 16, cite: native-format}
|
|
35
|
+
channels: {value: stereo, cite: native-format}
|
|
36
|
+
# keep each file's channels: mono and stereo both supported (p.73), and stereo keeps
|
|
37
|
+
# width/panning options on the device. Stereo files whose channels are identical are
|
|
38
|
+
# rendered mono (same sound, half the RAM).
|
|
39
|
+
formats: {value: [wav], status: convention}
|
|
40
|
+
max_slices: {value: 64, status: convention, cite: slice-grid}
|
|
41
|
+
# the largest count CREATE SLICE GRID's [FUNC] snap offers (2/4/8/16/32/64, p.99); the
|
|
42
|
+
# manual states no hard maximum
|
|
43
|
+
dither: {value: true, status: convention}
|
|
44
|
+
|
|
45
|
+
storage_mb: {value: 20000, cite: drive-size} # +Drive is 20 GB (p.29); per project: 400 MB / 1016 slots (p.17)
|
|
46
|
+
|
|
47
|
+
# Checked by tests/test_device_citations.py: each quote must be on its page of the manual
|
|
48
|
+
# named in manual: above. page: is the PDF page (1-based), not the printed page number.
|
|
49
|
+
# Update page/quote, and manual:, when the manual version changes.
|
|
50
|
+
citations:
|
|
51
|
+
tracks:
|
|
52
|
+
claim: 16 tracks, each audio or MIDI
|
|
53
|
+
page: 17
|
|
54
|
+
quote: "The Digitakt II sequencer has 16 tracks that can be either an audio track or a MIDI track"
|
|
55
|
+
project-memory:
|
|
56
|
+
claim: 400 MB of samples per project, 1016 slots
|
|
57
|
+
page: 17
|
|
58
|
+
quote: "You can load up to 400 MB (about 72 minutes in mono, 36 minutes in stereo) of samples in a project"
|
|
59
|
+
project-slots:
|
|
60
|
+
claim: 1016 sample slots per project
|
|
61
|
+
page: 17
|
|
62
|
+
quote: "using a maximum of 1016 sample slots"
|
|
63
|
+
drive-size:
|
|
64
|
+
claim: +Drive is 20 GB; 2048 presets
|
|
65
|
+
page: 29
|
|
66
|
+
quote: "The total size of the +Drive is 20 GB. The +Drive library can hold up to 2048 presets"
|
|
67
|
+
native-format:
|
|
68
|
+
claim: native format 16-bit / 48kHz, mono and stereo
|
|
69
|
+
page: 73
|
|
70
|
+
quote: "converts all audio files to 16 bit, 48 kHz audio files, the Digitakt II native audio format. Both mono and stereo files are supported"
|
|
71
|
+
converters:
|
|
72
|
+
claim: 24-bit applies to the converters, not sample storage
|
|
73
|
+
page: 91
|
|
74
|
+
quote: "48 kHz, 24-bit D/A and A/D converters"
|
|
75
|
+
slice-grid:
|
|
76
|
+
claim: slice grid snaps to 2-64 slices
|
|
77
|
+
page: 99
|
|
78
|
+
quote: "snaps the slice count to values 2, 4, 8, 16, 32, and 64"
|
|
79
|
+
tune-range:
|
|
80
|
+
claim: tune range +/- 5 octaves
|
|
81
|
+
page: 100
|
|
82
|
+
quote: "The range is +/- 5 octaves"
|
|
83
|
+
sampling-time:
|
|
84
|
+
claim: max sampling time 66 seconds
|
|
85
|
+
page: 68
|
|
86
|
+
quote: "The maximum sampling time is 66 seconds"
|
|
87
|
+
browser-hierarchy:
|
|
88
|
+
claim: the +Drive browser navigates a directory hierarchy
|
|
89
|
+
page: 71
|
|
90
|
+
quote: "back one step up in the directory hierarchy"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
id: generic_44k
|
|
2
|
+
name: Generic 44100 Hz sampler
|
|
3
|
+
status: unverified
|
|
4
|
+
description: >
|
|
5
|
+
For a device without its own profile: 44100 Hz / 16-bit stereo WAV in CATEGORY/family
|
|
6
|
+
folders. Nothing here was checked against a manual, so it sets no path-length limit and
|
|
7
|
+
no storage size; copy the render to the device yourself. An agent can draft a real
|
|
8
|
+
profile from the device's manual (docs/device-profiles.md).
|
|
9
|
+
load: copy
|
|
10
|
+
sample_refs: path
|
|
11
|
+
|
|
12
|
+
paths:
|
|
13
|
+
folder_depth: {value: 2, status: unverified}
|
|
14
|
+
files_per_folder: {value: 128, status: unverified}
|
|
15
|
+
|
|
16
|
+
audio:
|
|
17
|
+
sample_rate: {value: 44100, status: unverified}
|
|
18
|
+
bit_depth: {value: 16, status: unverified}
|
|
19
|
+
channels: {value: stereo, status: unverified}
|
|
20
|
+
formats: {value: [wav], status: unverified}
|
|
21
|
+
dither: {value: true, status: unverified}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
id: generic_48k
|
|
2
|
+
name: Generic 48000 Hz sampler
|
|
3
|
+
status: unverified
|
|
4
|
+
description: >
|
|
5
|
+
For a device without its own profile: 48000 Hz / 16-bit stereo WAV in CATEGORY/family
|
|
6
|
+
folders. Nothing here was checked against a manual, so it sets no path-length limit and
|
|
7
|
+
no storage size; copy the render to the device yourself. An agent can draft a real
|
|
8
|
+
profile from the device's manual (docs/device-profiles.md).
|
|
9
|
+
load: copy
|
|
10
|
+
sample_refs: path
|
|
11
|
+
|
|
12
|
+
paths:
|
|
13
|
+
folder_depth: {value: 2, status: unverified}
|
|
14
|
+
files_per_folder: {value: 128, status: unverified}
|
|
15
|
+
|
|
16
|
+
audio:
|
|
17
|
+
sample_rate: {value: 48000, status: unverified}
|
|
18
|
+
bit_depth: {value: 16, status: unverified}
|
|
19
|
+
channels: {value: stereo, status: unverified}
|
|
20
|
+
formats: {value: [wav], status: unverified}
|
|
21
|
+
dither: {value: true, status: unverified}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
id: generic_folder
|
|
2
|
+
name: Generic folder (a DAW or a computer)
|
|
3
|
+
status: unverified
|
|
4
|
+
description: >
|
|
5
|
+
For a folder on a computer, such as a DAW's sample folder: 44100 Hz / 24-bit WAV that keeps
|
|
6
|
+
each file's channels, in CATEGORY/family folders, with no folder, name, path or storage
|
|
7
|
+
limit. It describes no device and cites no manual; copy the render where you want it.
|
|
8
|
+
For a sampler, start from `fourier devices new` (docs/device-profiles.md).
|
|
9
|
+
load: copy
|
|
10
|
+
sample_refs: path
|
|
11
|
+
|
|
12
|
+
paths:
|
|
13
|
+
folder_depth: {value: 2, status: unverified}
|
|
14
|
+
files_per_folder: {value: null, status: unverified} # no limit
|
|
15
|
+
|
|
16
|
+
audio:
|
|
17
|
+
sample_rate: {value: 44100, status: unverified}
|
|
18
|
+
bit_depth: {value: 24, status: unverified}
|
|
19
|
+
channels: {value: stereo, status: unverified}
|
|
20
|
+
formats: {value: [wav], status: unverified}
|
|
21
|
+
dither: {value: true, status: unverified}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: generic_sd_card
|
|
2
|
+
name: Generic SD-card sampler
|
|
3
|
+
status: unverified
|
|
4
|
+
description: >
|
|
5
|
+
A cautious start for a sampler that reads WAV files from an SD card and has no profile
|
|
6
|
+
yet: 44100 Hz / 16-bit WAV that keeps each file's channels, under /Fourier on the card
|
|
7
|
+
(`fourier sync` copies it there), CATEGORY/family folders of at most 128 files, and
|
|
8
|
+
plain-ASCII names. None of it was checked against a manual and it sets no path, name or
|
|
9
|
+
storage limit, so check your device's manual, or make a profile of your own with
|
|
10
|
+
`fourier devices new` (docs/device-profiles.md).
|
|
11
|
+
load: card-sync
|
|
12
|
+
sample_refs: path
|
|
13
|
+
|
|
14
|
+
paths:
|
|
15
|
+
card_dir: {value: /Fourier, status: unverified}
|
|
16
|
+
folder_depth: {value: 2, status: unverified}
|
|
17
|
+
files_per_folder: {value: 128, status: unverified}
|
|
18
|
+
ascii_names: {value: true, status: unverified} # NFC, then plain ASCII
|
|
19
|
+
|
|
20
|
+
audio:
|
|
21
|
+
sample_rate: {value: 44100, status: unverified}
|
|
22
|
+
bit_depth: {value: 16, status: unverified}
|
|
23
|
+
channels: {value: stereo, status: unverified}
|
|
24
|
+
formats: {value: [wav], status: unverified}
|
|
25
|
+
dither: {value: true, status: unverified}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
id: m8_tracker
|
|
2
|
+
name: Dirtywave M8 Tracker
|
|
3
|
+
description: >
|
|
4
|
+
Portable tracker with 8 tracks. Samples are organized in user-defined folders on the SD
|
|
5
|
+
card (Fourier renders go under /Samples/Fourier). The Sampler reads 1- or 2-channel PCM
|
|
6
|
+
.wav ONLY (not AIFF) at 8/16/24/32-bit.
|
|
7
|
+
Samples stream from the SD card rather than RAM, so mono and 16-bit reduce card load
|
|
8
|
+
and raise the pitch ceiling; they don't save memory. The whole sample path must be under
|
|
9
|
+
128 characters. No per-folder file limit is documented; shallow folders browse best.
|
|
10
|
+
SAMPLER PLAY modes (manual-verified): FWD, REV, FWDLOOP, REVLOOP, FWD PP, REV PP,
|
|
11
|
+
OSC, OSC REV, OSC PP, REPITCH/BPM (10 modes).
|
|
12
|
+
manual:
|
|
13
|
+
title: M8 Operation Manual
|
|
14
|
+
version: v20260421
|
|
15
|
+
url: https://cdn.shopify.com/s/files/1/0455/0485/6229/files/m8_operation_manual_v20260421.pdf?v=1776791699
|
|
16
|
+
sha256: 006360bd2a2819e900d785b8ed4bafdc14030eb74acc4add265fdaca65dbeac7
|
|
17
|
+
load: card-sync # the M8 in disk mode: fourier sync
|
|
18
|
+
sample_refs: path
|
|
19
|
+
|
|
20
|
+
paths:
|
|
21
|
+
card_dir: {value: /Samples/Fourier, status: convention} # counts toward max_path_length
|
|
22
|
+
folder_depth: {value: 2, status: convention} # CATEGORY/family under card_dir
|
|
23
|
+
files_per_folder: {value: 128, status: convention}
|
|
24
|
+
# browsing comfort, not a device limit (fewer, fuller folders)
|
|
25
|
+
max_path_length: {value: 127, cite: path-length} # "entire path length ... under 128 characters"
|
|
26
|
+
|
|
27
|
+
audio:
|
|
28
|
+
sample_rate: {value: 44100, status: convention, cite: render-format}
|
|
29
|
+
# M8 renders at 44.1 kHz; the manual states no playback rate
|
|
30
|
+
bit_depth: {value: 16, cite: prefer-16-bit} # convert 24/32-bit to 16/8-bit where possible
|
|
31
|
+
channels: {value: stereo, cite: wav-channels}
|
|
32
|
+
# keep each file's channels, as on the Digitakt 2: the Sampler plays 1- or
|
|
33
|
+
# 2-channel wav. The master is already mono where stereo isn't needed (KICKS, SUB,
|
|
34
|
+
# near-mono files; p.11), and identical-channel stereo is rendered mono. Stereo streams
|
|
35
|
+
# twice the data and lowers the pitch ceiling (p.61).
|
|
36
|
+
formats: {value: [wav], cite: wav-channels}
|
|
37
|
+
max_slices: {value: 128, cite: slice-markers}
|
|
38
|
+
max_duration_s: {value: null, cite: no-length-limit} # samples stream from SD
|
|
39
|
+
dither: {value: true, status: convention}
|
|
40
|
+
|
|
41
|
+
storage_mb: {value: 32000, status: convention} # a typical SD card, not a device limit
|
|
42
|
+
|
|
43
|
+
# Checked by tests/test_device_citations.py: each quote must be on its page of the manual
|
|
44
|
+
# named in manual: above. page: is the PDF page (1-based), which is the manual's printed
|
|
45
|
+
# page + 7. Update page/quote, and manual:, when the manual version changes.
|
|
46
|
+
citations:
|
|
47
|
+
wav-channels:
|
|
48
|
+
claim: Sampler reads 1- or 2-channel PCM wav only
|
|
49
|
+
page: 61
|
|
50
|
+
quote: "Only 1 or 2 channel (stereo) PCM .wav files are supported"
|
|
51
|
+
bit-depths:
|
|
52
|
+
claim: accepted bit depths; PCM only
|
|
53
|
+
page: 74
|
|
54
|
+
quote: "Sample is 8,16, 24, or 32 bit and is mono or stereo"
|
|
55
|
+
path-length:
|
|
56
|
+
claim: whole sample path under 128 characters
|
|
57
|
+
page: 74
|
|
58
|
+
quote: "The entire path length of the sample is under 128 characters"
|
|
59
|
+
streams-from-sd:
|
|
60
|
+
claim: samples stream from the SD card, not memory
|
|
61
|
+
page: 11
|
|
62
|
+
quote: "they are streamed directly from the SD card. They are not read from memory"
|
|
63
|
+
prefer-mono:
|
|
64
|
+
claim: prefer mono (e.g. kicks) and 16-bit to reduce card load
|
|
65
|
+
page: 11
|
|
66
|
+
quote: "Convert stereo samples to mono where stereo is not necessary"
|
|
67
|
+
prefer-16-bit:
|
|
68
|
+
claim: prefer 16-bit or 8-bit over 24/32-bit
|
|
69
|
+
page: 11
|
|
70
|
+
quote: "Convert 32-bit or 24-bit samples to 16-bit or 8-bit where possible"
|
|
71
|
+
pitch-ceiling:
|
|
72
|
+
claim: pitch ceiling depends on bit depth and mono/stereo
|
|
73
|
+
page: 61
|
|
74
|
+
quote: "there is an upper-pitch limitation enforced based on bit-depth and mono/stereo samples"
|
|
75
|
+
slice-markers:
|
|
76
|
+
claim: up to 128 slice markers stored in the wav
|
|
77
|
+
page: 64
|
|
78
|
+
quote: "Add up to 128 markers that are stored within the wav file"
|
|
79
|
+
render-format:
|
|
80
|
+
claim: renders are 16-bit 44.1kHz stereo wav
|
|
81
|
+
page: 54
|
|
82
|
+
quote: "16-bit 44.1kHz stereo wav file"
|
|
83
|
+
tracks:
|
|
84
|
+
claim: 8 tracks
|
|
85
|
+
page: 47
|
|
86
|
+
quote: "sends all 8 tracks and effect individually"
|
|
87
|
+
browser-sort:
|
|
88
|
+
claim: the file browser sorts a directory by name only on request
|
|
89
|
+
page: 16
|
|
90
|
+
quote: "will sort a directory by name if it is unsorted"
|
|
91
|
+
no-length-limit:
|
|
92
|
+
claim: samples stream from SD with no memory or length limit
|
|
93
|
+
page: 98
|
|
94
|
+
quote: "No memory/length limitation"
|
|
95
|
+
slice-mode:
|
|
96
|
+
claim: SLICE cuts the sample into equal length sections
|
|
97
|
+
page: 61
|
|
98
|
+
quote: "the sample into equal length sections and maps each slice"
|
|
99
|
+
degrade:
|
|
100
|
+
claim: DEGRADE is sample rate reduction only
|
|
101
|
+
page: 62
|
|
102
|
+
quote: "DEGRADE - Sample rate reduction effect"
|
|
103
|
+
mixer-sends:
|
|
104
|
+
claim: mixer sends are DRY, MFX, DEL, REV
|
|
105
|
+
page: 62
|
|
106
|
+
quote: "MFX - ModFX send effect volume"
|
|
107
|
+
loop-points:
|
|
108
|
+
claim: loop points are stored in the wav
|
|
109
|
+
page: 63
|
|
110
|
+
quote: "Edits the start and end loop points which are stored"
|
|
111
|
+
slice-playback:
|
|
112
|
+
claim: wav slice markers play in 01 FILE slice mode
|
|
113
|
+
page: 64
|
|
114
|
+
quote: "The markers can be played back when"
|
|
115
|
+
card-formats:
|
|
116
|
+
claim: card formats
|
|
117
|
+
page: 98
|
|
118
|
+
quote: "FAT32 / exFAT compatible"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
description: ambient, cinematic and sound design; pads, textures, drones and FX first (long pads welcome), few drum loops
|
|
2
|
+
extends: breaks-acid # its budgets are what the weights below scale
|
|
3
|
+
# ambient-cinematic: PADS, FX and acoustic instruments get the biggest budgets, pads up to
|
|
4
|
+
# 60 s and FX up to 45 s (DUR_CAP; mind a sampler's RAM), and the drum categories and
|
|
5
|
+
# drum loops are small, with a harmonicity gate that takes percussion over a bed or a
|
|
6
|
+
# reverb tail.
|
|
7
|
+
tempo: 70-120
|
|
8
|
+
size: auto # fit the devices' storage; a pool's surplus moves to the others
|
|
9
|
+
loudness: gentle
|
|
10
|
+
retune: detect
|
|
11
|
+
stereo: keep
|
|
12
|
+
categories:
|
|
13
|
+
DRUMLOOPS: 0.2
|
|
14
|
+
PHRASES: 0.8
|
|
15
|
+
KICKS: 0.4
|
|
16
|
+
SNARES: 0.4
|
|
17
|
+
HATS: 0.4
|
|
18
|
+
CLAPS: 0.4
|
|
19
|
+
TOMS: 0.5
|
|
20
|
+
CYMBALS: 0.7
|
|
21
|
+
PERC: 0.8
|
|
22
|
+
SUB: 0.5
|
|
23
|
+
SYNTH: 0.8
|
|
24
|
+
STABS: 0.6
|
|
25
|
+
PADS: 2.0
|
|
26
|
+
FX: 1.6
|
|
27
|
+
BLIPS: 0.8
|
|
28
|
+
VOX: 1.2
|
|
29
|
+
PIANO: 1.3
|
|
30
|
+
ACOUSTIC: 1.5
|
|
31
|
+
WAVES: 0.8
|
|
32
|
+
advanced:
|
|
33
|
+
DUR_CAP: {KICKS: 4.0, SNARES: 3.0, CLAPS: 3.0, HATS: 4.0, TOMS: 5.0, PERC: 4.0, CYMBALS: 12.0,
|
|
34
|
+
SUB: 8.0, SYNTH: 10.0, STABS: 4.0, PADS: 60.0, VOX: 30.0, BLIPS: 3.0, FX: 45.0}
|
|
35
|
+
DRUMLOOP_HAR_MAX: 0.75 # percussion over a bed or a reverb tail reads tonal
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
description: every category, budgets spread evenly, drum loops of every style from 70 to 180 BPM (the default)
|
|
2
|
+
# balanced: the default style, and the code's own defaults, so this preset resolves to no
|
|
3
|
+
# overrides. Every category, budgets spread evenly (drum loops 1,140, then phrases, pads and
|
|
4
|
+
# keys), 5-BPM loop bands from 70 to 180 BPM (hip hop to dnb), drum loops of every style
|
|
5
|
+
# (only folders that hold no drum loops are left out). size auto: budgets fit the smallest
|
|
6
|
+
# device's storage, and what a category's pool can't fill goes to the categories that filled
|
|
7
|
+
# theirs. The other styles scale its budgets with `categories` weights.
|
|
8
|
+
tempo: 70-180
|
|
9
|
+
size: auto # fit the devices' storage; a pool's surplus moves to the others
|
|
10
|
+
loudness: standard
|
|
11
|
+
retune: detect
|
|
12
|
+
stereo: fold-near-mono
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
description: breaks, jungle, drum and bass and acid first, house after; the biggest budget goes to drum loops (85-180 BPM, half time folded up), then synths and basses
|
|
2
|
+
# breaks-acid: breaks, jungle / dnb and acid first, house after: drum loops get the biggest
|
|
3
|
+
# budget (1,900), then SYNTH and SUB; 5-BPM loop bands from 85 to 180 BPM, half and double
|
|
4
|
+
# time folded into 90-180; loops limited up to 3 dB; tonal one-shots retuned to C. The drum
|
|
5
|
+
# loops leave out trap, dubstep and future bass folders, take loops up to 16 s and hold them
|
|
6
|
+
# to the break prompts' CLAP gate. The other genre styles extend it.
|
|
7
|
+
tempo: 85-180
|
|
8
|
+
loudness: standard
|
|
9
|
+
retune: detect
|
|
10
|
+
stereo: fold-near-mono
|
|
11
|
+
advanced:
|
|
12
|
+
BUDGETS: {DRUMLOOPS: 1900, PHRASES: 600, KICKS: 825, SNARES: 750, HATS: 750, PERC: 600,
|
|
13
|
+
SUB: 900, TOMS: 340, CLAPS: 360, CYMBALS: 300, FX: 660, SYNTH: 1000, PADS: 600,
|
|
14
|
+
STABS: 325, BLIPS: 225, VOX: 375, PIANO: 350, WAVES: 350, ACOUSTIC: 350}
|
|
15
|
+
POOL_SURPLUS: false
|
|
16
|
+
DRUMLOOP_STYLE_EXCLUDE: '(?<![a-z])(?:dubstep|brostep|trap|future ?bass|fx ?loops?|impact ?fx|synth ?bass|brass ?stab)(?![a-z])'
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
description: hip hop, boom bap and lo-fi; drum loops at 70-100 BPM (8 bars welcome), keys, vocals and textures
|
|
2
|
+
extends: breaks-acid # its budgets are what the weights below scale
|
|
3
|
+
# hiphop-lofi: drum loops banded 70-100 BPM and folded into that range (a 170 BPM read of a
|
|
4
|
+
# boom-bap loop is filed at 85; a loop that would fold out of it keeps its tempo), loops and
|
|
5
|
+
# phrases up to 28 s (8 bars at 70 BPM), no breaks-only exclusions, and a harmonicity gate that
|
|
6
|
+
# takes lo-fi drum loops (filtered, or under a chord). More phrases, keys,
|
|
7
|
+
# vocals and acoustic instruments; fewer synth blips and single-cycle waves.
|
|
8
|
+
tempo: 70-100
|
|
9
|
+
size: auto # fit the devices' storage; a pool's surplus moves to the others
|
|
10
|
+
loudness: standard
|
|
11
|
+
retune: detect
|
|
12
|
+
stereo: fold-near-mono
|
|
13
|
+
categories:
|
|
14
|
+
DRUMLOOPS: 0.9
|
|
15
|
+
PHRASES: 1.4
|
|
16
|
+
SUB: 0.8
|
|
17
|
+
SYNTH: 0.7
|
|
18
|
+
STABS: 1.1
|
|
19
|
+
PADS: 1.1
|
|
20
|
+
PIANO: 1.5
|
|
21
|
+
ACOUSTIC: 1.3
|
|
22
|
+
VOX: 1.4
|
|
23
|
+
BLIPS: 0.6
|
|
24
|
+
WAVES: 0.5
|
|
25
|
+
advanced:
|
|
26
|
+
DRUMLOOP_STYLE_EXCLUDE: '(?<![a-z])(?:fx ?loops?|impact ?fx|synth ?bass|brass ?stab)(?![a-z])'
|
|
27
|
+
DRUMLOOP_DUR_MAX: 28.0
|
|
28
|
+
DRUMLOOP_HAR_MAX: 0.78 # lo-fi drums (filtered, under a chord) read more tonal
|
|
29
|
+
PHRASE_DUR: [1.0, 28.0]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
description: house and techno; four-on-the-floor drum loops at 118-140 BPM (no breakbeat folding), stabs, chords and basses
|
|
2
|
+
extends: breaks-acid # its budgets are what the weights below scale
|
|
3
|
+
# house-techno: drum loops banded 118-140 BPM, folded only within that range (a 174 BPM
|
|
4
|
+
# break stays at 174, outside the bands, instead of being halved to 87), and held to
|
|
5
|
+
# four-on-the-floor prompts by the drum loops' CLAP gate. More stabs, basses and vocals.
|
|
6
|
+
tempo: 118-140
|
|
7
|
+
size: auto # fit the devices' storage; a pool's surplus moves to the others
|
|
8
|
+
loudness: standard
|
|
9
|
+
retune: detect
|
|
10
|
+
stereo: fold-near-mono
|
|
11
|
+
categories:
|
|
12
|
+
DRUMLOOPS: 1.0
|
|
13
|
+
PHRASES: 1.1
|
|
14
|
+
STABS: 1.4
|
|
15
|
+
SUB: 1.0
|
|
16
|
+
PADS: 1.0
|
|
17
|
+
VOX: 1.2
|
|
18
|
+
PIANO: 0.8
|
|
19
|
+
ACOUSTIC: 0.6
|
|
20
|
+
WAVES: 0.8
|
|
21
|
+
advanced:
|
|
22
|
+
BREAK_PHRASES: [four on the floor house drum loop, house drum loop, techno drum loop,
|
|
23
|
+
minimal techno beat, deep house groove, tech house drum loop, kick and hi-hat loop,
|
|
24
|
+
driving techno kick loop, disco drum loop, acid house drum loop, garage drum loop,
|
|
25
|
+
electro drum loop, swung house groove, industrial techno loop, percussion loop,
|
|
26
|
+
tribal drum loop]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
description: trap and drill; 808s and hard drums, drum loops at 130-160 BPM (half time at 65-80 folded up), vocals and FX
|
|
2
|
+
extends: breaks-acid # its budgets are what the weights below scale
|
|
3
|
+
# trap: drum loops banded 130-160 BPM (a 70 BPM half-time read is filed at 140), held to
|
|
4
|
+
# trap prompts by the drum loops' CLAP gate, no trap exclusion, a harmonicity gate that takes
|
|
5
|
+
# drum loops with an 808 under them; more 808s (SUB), hats,
|
|
6
|
+
# claps and vocals, fewer breaks-style phrases and acoustic instruments.
|
|
7
|
+
tempo: 130-160
|
|
8
|
+
size: auto # fit the devices' storage; a pool's surplus moves to the others
|
|
9
|
+
loudness: hot
|
|
10
|
+
retune: detect
|
|
11
|
+
stereo: fold-near-mono
|
|
12
|
+
categories:
|
|
13
|
+
SUB: 1.4
|
|
14
|
+
HATS: 1.2
|
|
15
|
+
CLAPS: 1.1
|
|
16
|
+
DRUMLOOPS: 0.8
|
|
17
|
+
PHRASES: 0.8
|
|
18
|
+
PADS: 0.8
|
|
19
|
+
VOX: 1.2
|
|
20
|
+
TOMS: 0.6
|
|
21
|
+
CYMBALS: 0.6
|
|
22
|
+
PIANO: 0.8
|
|
23
|
+
ACOUSTIC: 0.5
|
|
24
|
+
WAVES: 0.5
|
|
25
|
+
advanced:
|
|
26
|
+
DRUMLOOP_STYLE_EXCLUDE: '(?<![a-z])(?:fx ?loops?|impact ?fx|synth ?bass|brass ?stab)(?![a-z])'
|
|
27
|
+
DRUMLOOP_HAR_MAX: 0.75 # an 808 under the drums reads tonal
|
|
28
|
+
BREAK_PHRASES: [trap drum loop, trap hi-hat roll loop, 808 trap beat, drill drum loop,
|
|
29
|
+
half-time hip hop drum loop, rolling hi-hat loop, hard trap drums, phonk drum loop,
|
|
30
|
+
trap snare roll loop, hip hop drum break, boom bap break, percussion loop]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# The path provider (src/fourier/metadata/shadow.py): canonical labels from folder and file
|
|
2
|
+
# names. Each label lists regexes matched, case-insensitively, against the sample's
|
|
3
|
+
# library-relative path with separators turned into spaces; the file's name and folder
|
|
4
|
+
# speak first, the folders above only when those give no category; class.oneshot and class.loop
|
|
5
|
+
# count only in the file's name and its folder (shadow.shape_labels). With Sononym these
|
|
6
|
+
# labels are only scored against its own; without it they classify (metadata/providers.py).
|
|
7
|
+
# Generic words only: never a vendor, pack or person. Sections below the labels:
|
|
8
|
+
# weak words that describe as often as they name ("Noise Clap", "Metal Lead",
|
|
9
|
+
# "Voice 3" of a synth): their label counts only when no other word gives one
|
|
10
|
+
# near_only weak words that count in the file's name and folder, not in the folders
|
|
11
|
+
# above (where "Synths" or "Synth Drums" is a pack name)
|
|
12
|
+
# not_words case-sensitive words dropped before matching: a name that isn't the thing
|
|
13
|
+
# it spells
|
|
14
|
+
class.loop: ['\bloops?\b', '\b(?:drum)loops?\b', '\bbreaks?\b', '\bbreakbeats?\b', '\d{2,3} ?bpm\b', '\bgrooves?\b', '\bbeats?\b', '\bfills?\b']
|
|
15
|
+
class.oneshot: ['\bone ?-?shots?\b', '\bhits?\b', '\bsingle\b', '\bshots?\b']
|
|
16
|
+
kick: ['\bkicks?\b', '\bkiks?\b', '\bkcks?\b', '\bbd\b', '\bbass ?drums?\b']
|
|
17
|
+
snare: ['\bsnares?\b', '\bsnr\b', '\bsd\b', '\brims?(?:shots?)?\b', '\bside ?sticks?\b']
|
|
18
|
+
clap: ['\bclaps?\b', '\bhand ?claps?\b']
|
|
19
|
+
snap: ['\bsnaps?\b', '\bfinger ?snaps?\b']
|
|
20
|
+
hat: ['\bhi-?hats?\b', '\bhihats?\b', '\bhh\b', '\bhats?\b']
|
|
21
|
+
tom: ['\btoms?\b']
|
|
22
|
+
cymbal.crash: ['\bcrash(?:es)?\b', '\bsplash\b', '\bchina\b', '\bcymbals?\b', '\bcyms?\b']
|
|
23
|
+
cymbal.ride: ['\brides?\b']
|
|
24
|
+
perc.hand: ['\bcongas?\b', '\bbongos?\b', '\bdjembe\b', '\btablas?\b', '\bcuica\b', '\btimbales?\b', '\bshakers?\b', '\btambourines?\b', '\bcabasas?\b', '\bmaracas?\b'] # shaken: percussion (a name rule still files a shaker named alone with the hats, DRUM_NAME_RULES)
|
|
25
|
+
perc.wood: ['\bwood ?blocks?\b', '\bclaves?\b', '\bwood\b', '\blog drum\b']
|
|
26
|
+
perc.metal: ['\bcowbells?\b', '\bagogo\b', '\btriangles?\b', '\banvil\b']
|
|
27
|
+
perc.scrape: ['\bguiros?\b', '\bvibraslap\b', '\bscrape\b']
|
|
28
|
+
scratch: ['\bscratch(?:es)?\b', '\bvinyl scratch\b']
|
|
29
|
+
zap: ['\bzaps?\b']
|
|
30
|
+
bass: ['\bbass\b', '\bsub ?bass\b', '\breese\b'] # not a bare 808: a TR-808 hat is a hat
|
|
31
|
+
lead: ['\bleads?\b', '\barps?\b', '\bplucks?\b'] # "synth": near_only, below
|
|
32
|
+
keys: ['\bpianos?\b', '\be-?pianos?\b', '\brhodes\b', '\borgans?\b', '\bwurli(?:tzer)?\b', '\bclavs?\b', '\bclavinet\b', '\belectric piano\b', '\bharpsichords?\b'] # PIANO's
|
|
33
|
+
blip: ['\bblips?\b', '\bbleeps?\b']
|
|
34
|
+
pad: ['\bpads?\b', '\btextures?\b', '\bdrones?\b', '\batmospheres?\b']
|
|
35
|
+
stab: ['\bstabs?\b', '\borch(?:estra)? hits?\b', '\bchords?\b']
|
|
36
|
+
bell: ['\bbells?\b', '\bchimes?\b']
|
|
37
|
+
vocal: ['\bvox\b', '\bvocals?\b', '\bacapellas?\b', '\bchants?\b']
|
|
38
|
+
fx.smash: ['\bsmash(?:es)?\b', '\bglass\b']
|
|
39
|
+
fx.rustle: ['\brustle\b', '\bcrackles?\b', '\bfoley\b']
|
|
40
|
+
fx.impact: ['\bimpacts?\b', '\bexplosions?\b', '\bbooms?\b', '\bgun ?shots?\b']
|
|
41
|
+
fx.nature: ['\bnature\b', '\brain\b', '\bwind\b', '\bfield ?recordings?\b']
|
|
42
|
+
fx.noise: ['\bstatic\b', '\bhiss\b']
|
|
43
|
+
fx.sweep: ['\bsweeps?\b', '\brisers?\b', '\bup ?lifters?\b', '\bdown ?lifters?\b', '\blasers?\b']
|
|
44
|
+
fx.whoosh: ['\bwhoosh(?:es)?\b', '\bswoosh(?:es)?\b', '\bwhips?\b']
|
|
45
|
+
weak:
|
|
46
|
+
fx.noise: ['\bnoise\b', '\bdistortion\b', '\bs?fx\b', '\b(?:sound ?)?effects?\b'] # a bare "FX": FX
|
|
47
|
+
perc.metal: ['\bmetal\b']
|
|
48
|
+
perc.hand: ['\bpercs?\b', '\bpercussions?\b'] # a bare "Perc": PERC, unless a drum is named too
|
|
49
|
+
vocal: ['\bvoices?\b']
|
|
50
|
+
fx.nature: ['\bambien(?:ce|t)\b']
|
|
51
|
+
bass: ['\b808s\b', '\bsubs?\b'] # a folder of 808s; a bare 808 isn't one ("808/Hat 01")
|
|
52
|
+
pad: ['\bstrings?\b', '\bviolins?\b', '\bviolas?\b', '\bcellos?\b'] # a named violin or cello is ACOUSTIC's by its name first
|
|
53
|
+
lead: ['\bbrass\b', '\btrumpets?\b', '\bsax(?:ophone)?s?\b', '\bhorns?\b'] # a named one is ACOUSTIC's by its name first
|
|
54
|
+
keys: ['\bkeys\b', '\bkeyboards?\b'] # "Synth Keys" says lead too
|
|
55
|
+
near_only:
|
|
56
|
+
lead: ['\bsynths?\b'] # not saw / square: waveform names bass and lead alike
|
|
57
|
+
hat: ['\bch\b', '\boh\b'] # closed / open hat abbreviations ("CH_01"), in the file's own name or folder
|
|
58
|
+
clap: ['\bcp\b']
|
|
59
|
+
keys: ['\bep\b'] # an electric piano ("EP_C3"), in the file's own name or folder (not a record's EP)
|
|
60
|
+
not_words: ['\bTOM\b']
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Sononym's labels in the canonical vocabulary (src/fourier/metadata/vocab.py).
|
|
2
|
+
# The taxonomy (curate_config CATEGORIES) names only canonical labels; this file is the one
|
|
3
|
+
# place Sononym's own category names appear. Every class and category Sononym uses must be
|
|
4
|
+
# listed: an unmapped one fails `fourier tools db-stats --metadata` (parity) and the build.
|
|
5
|
+
classes:
|
|
6
|
+
OneShot: class.oneshot
|
|
7
|
+
Loop: class.loop
|
|
8
|
+
categories:
|
|
9
|
+
Perc Kicks: kick
|
|
10
|
+
Perc Snares: snare
|
|
11
|
+
Perc Claps: clap
|
|
12
|
+
Perc Snips & Snaps: snap
|
|
13
|
+
Perc Hats & Shakers: hat
|
|
14
|
+
Perc Toms: tom
|
|
15
|
+
Perc Cymbal Crashes: cymbal.crash
|
|
16
|
+
Perc Cymbal Rides: cymbal.ride
|
|
17
|
+
Perc Bongos & Congas: perc.hand
|
|
18
|
+
Perc Wood Hits: perc.wood
|
|
19
|
+
Perc Metal Hits: perc.metal
|
|
20
|
+
Perc Vibraslap & Guiro: perc.scrape
|
|
21
|
+
Perc Vinyl Scratches: scratch
|
|
22
|
+
Perc Zaps & Blips: zap
|
|
23
|
+
Tone Bass & LowKeys: bass
|
|
24
|
+
Tone Leads & MidHiKeys: lead
|
|
25
|
+
Tone Blips & HighKeys: blip
|
|
26
|
+
Tone Pads & Textures: pad
|
|
27
|
+
Tone Stabs & Orch. Hits: stab
|
|
28
|
+
Tone Triangles & Bells: bell
|
|
29
|
+
Tone Voice & Acapella: vocal
|
|
30
|
+
XFX Breaks & Smashes: fx.smash
|
|
31
|
+
XFX Cracks & Rustle: fx.rustle
|
|
32
|
+
XFX Explosions & Shots: fx.impact
|
|
33
|
+
XFX Nature & Athmospheric: fx.nature
|
|
34
|
+
XFX Noise & Distortion: fx.noise
|
|
35
|
+
XFX Sweeps & Lasers: fx.sweep
|
|
36
|
+
XFX Whooshes & Whips: fx.whoosh
|