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.
Files changed (110) hide show
  1. fourier/__init__.py +28 -0
  2. fourier/__main__.py +5 -0
  3. fourier/_config/devices/digitakt_2.yaml +90 -0
  4. fourier/_config/devices/generic_44k.yaml +21 -0
  5. fourier/_config/devices/generic_48k.yaml +21 -0
  6. fourier/_config/devices/generic_folder.yaml +21 -0
  7. fourier/_config/devices/generic_sd_card.yaml +25 -0
  8. fourier/_config/devices/m8_tracker.yaml +118 -0
  9. fourier/_config/presets/ambient-cinematic.yaml +35 -0
  10. fourier/_config/presets/balanced.yaml +12 -0
  11. fourier/_config/presets/breaks-acid.yaml +16 -0
  12. fourier/_config/presets/hiphop-lofi.yaml +29 -0
  13. fourier/_config/presets/house-techno.yaml +26 -0
  14. fourier/_config/presets/trap.yaml +30 -0
  15. fourier/_config/providers/path.yaml +60 -0
  16. fourier/_config/providers/sononym.yaml +36 -0
  17. fourier/_config/taxonomy.yaml +711 -0
  18. fourier/_config/tunables.yaml +388 -0
  19. fourier/analysis/__init__.py +14 -0
  20. fourier/analysis/clap_features.py +442 -0
  21. fourier/analysis/derived.py +248 -0
  22. fourier/analysis/events.py +92 -0
  23. fourier/analysis/key_detection.py +103 -0
  24. fourier/analysis/librosa_features.py +257 -0
  25. fourier/analysis/loop_trim.py +215 -0
  26. fourier/analysis/resolution.py +70 -0
  27. fourier/cli/__init__.py +24 -0
  28. fourier/cli/__main__.py +3 -0
  29. fourier/cli/_app.py +298 -0
  30. fourier/cli/build.py +1403 -0
  31. fourier/cli/config.py +317 -0
  32. fourier/cli/db.py +305 -0
  33. fourier/cli/devices.py +300 -0
  34. fourier/cli/enrich.py +1604 -0
  35. fourier/cli/ingest.py +267 -0
  36. fourier/cli/opener.py +97 -0
  37. fourier/cli/quiet.py +204 -0
  38. fourier/cli/releases.py +582 -0
  39. fourier/cli/review.py +271 -0
  40. fourier/cli/search.py +513 -0
  41. fourier/cli/setup.py +1957 -0
  42. fourier/db/__init__.py +0 -0
  43. fourier/db/migrations.py +131 -0
  44. fourier/db/models.py +552 -0
  45. fourier/db/session.py +307 -0
  46. fourier/demo.py +384 -0
  47. fourier/devices/__init__.py +0 -0
  48. fourier/devices/convert.py +104 -0
  49. fourier/devices/exporter.py +305 -0
  50. fourier/devices/loader.py +399 -0
  51. fourier/ingest/__init__.py +0 -0
  52. fourier/ingest/ableton_tags.py +155 -0
  53. fourier/ingest/chunks.py +92 -0
  54. fourier/ingest/folder.py +159 -0
  55. fourier/ingest/formats.py +65 -0
  56. fourier/ingest/importer.py +802 -0
  57. fourier/ingest/sononym.py +766 -0
  58. fourier/ingest/walk.py +285 -0
  59. fourier/knobs.py +559 -0
  60. fourier/layers.py +400 -0
  61. fourier/metadata/__init__.py +1 -0
  62. fourier/metadata/providers.py +98 -0
  63. fourier/metadata/resolve.py +357 -0
  64. fourier/metadata/rows.py +519 -0
  65. fourier/metadata/shadow.py +396 -0
  66. fourier/metadata/sound.py +613 -0
  67. fourier/metadata/store.py +208 -0
  68. fourier/metadata/train.py +706 -0
  69. fourier/metadata/vocab.py +52 -0
  70. fourier/net.py +15 -0
  71. fourier/packs/__init__.py +0 -0
  72. fourier/packs/audiocache.py +175 -0
  73. fourier/packs/audit.py +169 -0
  74. fourier/packs/builddiff.py +225 -0
  75. fourier/packs/curate.py +5550 -0
  76. fourier/packs/curate_config.py +1233 -0
  77. fourier/packs/device_lock.py +236 -0
  78. fourier/packs/dryrun.py +131 -0
  79. fourier/packs/golden.py +172 -0
  80. fourier/packs/naming.py +685 -0
  81. fourier/packs/progress.py +118 -0
  82. fourier/packs/ratings.py +950 -0
  83. fourier/packs/releases.py +467 -0
  84. fourier/packs/render.py +687 -0
  85. fourier/packs/report.py +209 -0
  86. fourier/packs/review.py +300 -0
  87. fourier/packs/rules.py +465 -0
  88. fourier/packs/scale.py +123 -0
  89. fourier/packs/sets.py +381 -0
  90. fourier/packs/validate.py +186 -0
  91. fourier/packs/vendors.py +238 -0
  92. fourier/packs/verify.py +1073 -0
  93. fourier/packs/why.py +566 -0
  94. fourier/packs/why_log.py +212 -0
  95. fourier/paths.py +52 -0
  96. fourier/places.py +319 -0
  97. fourier/platforms.py +308 -0
  98. fourier/preparers.py +141 -0
  99. fourier/safety.py +477 -0
  100. fourier/settings.py +195 -0
  101. fourier/synthlib.py +324 -0
  102. fourier/taxonomy.py +335 -0
  103. fourier/timings.py +173 -0
  104. fourier_samples-0.1.0.dist-info/METADATA +327 -0
  105. fourier_samples-0.1.0.dist-info/RECORD +110 -0
  106. fourier_samples-0.1.0.dist-info/WHEEL +4 -0
  107. fourier_samples-0.1.0.dist-info/entry_points.txt +2 -0
  108. fourier_samples-0.1.0.dist-info/licenses/LICENSE +202 -0
  109. fourier_samples-0.1.0.dist-info/licenses/NOTICE +10 -0
  110. 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,5 @@
1
+ """python -m fourier: the fourier command."""
2
+ from fourier.cli import main
3
+
4
+ if __name__ == "__main__":
5
+ main()
@@ -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