@map-audio/pam-mcp-server 1.22.0 → 1.25.0
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.
- package/README.md +32 -6
- package/dist/bridge.d.ts +4 -0
- package/dist/bridge.js +46 -152
- package/dist/bridge.js.map +1 -1
- package/dist/generated/variationSnapshot.d.ts +8 -4
- package/dist/generated/variationSnapshot.js +6 -4
- package/dist/generated/variationSnapshot.js.map +1 -1
- package/dist/generativePlayerPresets.json +70 -0
- package/dist/generativePlayers.json +134 -0
- package/dist/manifest-cell1.json +2 -2
- package/dist/manifest-mfx.json +171 -20
- package/dist/manifest.d.ts +1 -1
- package/dist/manifest.js +12 -9
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +1915 -240
- package/dist/midiFile.d.ts +21 -0
- package/dist/midiFile.js +108 -0
- package/dist/midiFile.js.map +1 -0
- package/dist/players.d.ts +89 -0
- package/dist/players.js +235 -0
- package/dist/players.js.map +1 -0
- package/dist/presetSave.d.ts +5 -0
- package/dist/presetSave.js +22 -0
- package/dist/presetSave.js.map +1 -1
- package/dist/sampleSlicing.d.ts +12 -0
- package/dist/sampleSlicing.js +78 -0
- package/dist/sampleSlicing.js.map +1 -0
- package/dist/server.js +1052 -269
- package/dist/server.js.map +1 -1
- package/dist/variationSessionKeys.json +34 -1
- package/package.json +5 -4
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_doc": "SINGLE REGISTRY for the generative Players (docs/plans/GENERATIVE_PLAYERS.md §8). One entry per player id; id 0 is Off and has no entry. Consumed by build.js (codegens modules/player/GenerativePlayerSpec.generated.h and gates manifest.generativePatterns) and by interface/src/utils/generativePlayers.ts via the @shared import. IDS ARE APPEND-ONLY and a shipped id's P-slot meanings are frozen: cells[id].playerType persists in every preset and variation, and playerP1..P5 are raw 0..1 knob positions whose meaning comes from this file alone. A player may GROW a slot (the melodic four grew Chord): a new slot's default must be the value that reproduces the pre-slot output, since a preset saved before it existed carries no field. `tag` (drum|melodic|both) drives the UI grouping and the mono-cell hint; `replay` marks the three players whose state is derived by bounded deterministic replay (GenerativePlayerCore::chainStateAtCycle) rather than a closed form. `slots` holds 1..5 P-knob descriptors in P1..P5 order — a player with fewer slots leaves the remaining playerP* fields inert. `steps`/`stepLabels` turn a slot into a detented selector (stepLabels.length must equal steps); everything else is a continuous 0..1 knob. A continuous slot may carry `hint` (one plain sentence the knob's tooltip prints — detented slots self-describe through their labels) and `center: true` (the value is bipolar around 0.5 and prints signed, like KIT's Feel). `defaults.mutate` is 0 for the players where a repeating loop is the point and small where evolution is. `doc` is the ENGINEERING note (algorithm, prior art, hardware lineage) and never reaches the UI; `blurb` is the user-facing one-liner the roster prints, so it carries no filenames, no maths notation and no third-party product names.",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"players": {
|
|
5
|
+
"1": {
|
|
6
|
+
"name": "EUCLID",
|
|
7
|
+
"tag": "drum",
|
|
8
|
+
"replay": false,
|
|
9
|
+
"doc": "Clough-Douthett closed-form maximally-even E(k,n) with rotation; k from DENSITY over the pattern's 16ths. P4 layers a second pulse generator combined by a boolean op (the Digitakt II dual-Euclid trick). Closed-form and seed-independent while MUTATE is locked, so ROTATION stays absolute and the named repertoire is reachable at known positions. The default density is E(7,16) - the Samba necklace - rather than the k=8 midpoint, which is periodic (gcd 8) and degenerates to a plain straight-eighths grid.",
|
|
10
|
+
"blurb": "Spreads hits as evenly as it can across the bar. Density sets how many, Rotate slides them, Layer adds a second pulse.",
|
|
11
|
+
"defaults": { "density": 0.44, "mutate": 0.0 },
|
|
12
|
+
"slots": [
|
|
13
|
+
{ "label": "Rotate", "default": 0.0, "steps": 16 },
|
|
14
|
+
{ "label": "Gate", "default": 0.35, "hint": "Note length, as a share of the step" },
|
|
15
|
+
{ "label": "Accent", "default": 0.5, "hint": "How many of the hits play accented" },
|
|
16
|
+
{ "label": "Layer", "default": 0.0, "steps": 4, "stepLabels": ["Off", "OR", "XOR", "SUB"] }
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"2": {
|
|
20
|
+
"name": "KIT",
|
|
21
|
+
"tag": "drum",
|
|
22
|
+
"replay": false,
|
|
23
|
+
"doc": "Genre-prior threshold masking from RandomizerPatternPriors.h for the cell's default role, played live: onset probability x metric weight, velocity from the prior's mean, ghosts as low-velocity prob steps, ratchets on the retrigger fields.",
|
|
24
|
+
"blurb": "Plays this cell's drum role in the feel of a genre. Ghost notes and ratchets fill the gaps between the main hits.",
|
|
25
|
+
"defaults": { "density": 0.5, "mutate": 0.0 },
|
|
26
|
+
"slots": [
|
|
27
|
+
{ "label": "Genre", "default": 0.0, "steps": 7, "stepLabels": ["Trap", "Drill", "Boom Bap", "DnB", "House", "Techno", "IDM"] },
|
|
28
|
+
{ "label": "Ghosts", "default": 0.3, "hint": "How many quiet extra hits fill the gaps" },
|
|
29
|
+
{ "label": "Ratchet", "default": 0.15, "hint": "How often a hit becomes a short double burst" },
|
|
30
|
+
{ "label": "Feel", "default": 0.5, "center": true, "hint": "Drag behind or push ahead of the beat — the centre is straight" }
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
"3": {
|
|
34
|
+
"name": "TURING",
|
|
35
|
+
"tag": "melodic",
|
|
36
|
+
"replay": true,
|
|
37
|
+
"doc": "Looping shift register over the hardware's musical length set, one full rotation per cycle; MUTATE is the bit-flip probability (full mutate = the Mobius double-length inverted loop). Pitch comes from LSB-in/MSB-out bit weighting mapped into the cell scale.",
|
|
38
|
+
"blurb": "A looping bit pattern read out as a melody. Mutate flips bits, so the loop drifts a little further every time round.",
|
|
39
|
+
"defaults": { "density": 0.6, "mutate": 0.15 },
|
|
40
|
+
"slots": [
|
|
41
|
+
{ "label": "Length", "default": 0.4444444444444444, "steps": 10, "stepLabels": ["2", "3", "4", "5", "6", "8", "12", "16", "24", "32"] },
|
|
42
|
+
{ "label": "Range", "default": 0.35, "hint": "Pitch range, up to four octaves" },
|
|
43
|
+
{ "label": "Gate", "default": 0.5, "hint": "Which notes survive low density — full favours the strong beats" },
|
|
44
|
+
{ "label": "Slide", "default": 0.0, "hint": "How often a note holds legato into the next" },
|
|
45
|
+
{ "label": "Chord", "default": 0.0, "steps": 6, "stepLabels": ["Off", "Oct", "5th", "Triad", "7th", "Quartal"] }
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"4": {
|
|
49
|
+
"name": "WALK",
|
|
50
|
+
"tag": "melodic",
|
|
51
|
+
"replay": true,
|
|
52
|
+
"doc": "Bounded drunk walk over scale degrees: weighted interval table (seconds/thirds dominant), gravity toward the root, leap-then-step-back voice leading, rests from (1-DENSITY).",
|
|
53
|
+
"blurb": "Wanders up and down the scale in small steps. Gravity pulls it back toward the root, and low density turns steps into rests.",
|
|
54
|
+
"defaults": { "density": 0.6, "mutate": 0.3 },
|
|
55
|
+
"slots": [
|
|
56
|
+
{ "label": "Step", "default": 0.4, "hint": "Interval size, small steps to wide leaps" },
|
|
57
|
+
{ "label": "Gravity", "default": 0.5, "hint": "Pull toward the root; high keeps it close to home" },
|
|
58
|
+
{ "label": "Rests", "default": 0.25, "hint": "How often a step becomes a rest" },
|
|
59
|
+
{ "label": "Range", "default": 0.4, "hint": "How far above and below the root it can wander" },
|
|
60
|
+
{ "label": "Chord", "default": 0.0, "steps": 6, "stepLabels": ["Off", "Oct", "5th", "Triad", "7th", "Quartal"] }
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
"5": {
|
|
64
|
+
"name": "MARKOV",
|
|
65
|
+
"tag": "melodic",
|
|
66
|
+
"replay": true,
|
|
67
|
+
"doc": "Order-1 chain over scale-degree intervals learned from the cell's own drawn pattern, blended toward the metric-hierarchy prior when the clip is thin. P2 is the temperature (argmax replay to uniform).",
|
|
68
|
+
"blurb": "Learns from the pattern you drew and improvises around it. Fidelity holds the line, Temp loosens it.",
|
|
69
|
+
"defaults": { "density": 0.6, "mutate": 0.3 },
|
|
70
|
+
"slots": [
|
|
71
|
+
{ "label": "Fidelity", "default": 0.7, "hint": "How closely it follows the pattern it learnt" },
|
|
72
|
+
{ "label": "Freedom", "default": 0.5, "steps": 5, "stepLabels": ["Lock", "Tight", "As Learnt", "Loose", "Free"] },
|
|
73
|
+
{ "label": "Rests", "default": 0.25, "hint": "How often a step becomes a rest" },
|
|
74
|
+
{ "label": "Range", "default": 0.4, "hint": "Octave span of the improvisation" },
|
|
75
|
+
{ "label": "Chord", "default": 0.0, "steps": 6, "stepLabels": ["Off", "Oct", "5th", "Triad", "7th", "Quartal"] }
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"6": {
|
|
79
|
+
"name": "RATCHET",
|
|
80
|
+
"tag": "drum",
|
|
81
|
+
"replay": false,
|
|
82
|
+
"doc": "Sparse archetype skeleton grown by threshold masking, plus per-cycle fills and retrigger bursts baked from the cycle hash. Emits the grid an Elektron-style player freezes into.",
|
|
83
|
+
"blurb": "A sparse skeleton with fills and retrigger bursts. Every cycle puts them somewhere new.",
|
|
84
|
+
"defaults": { "density": 0.45, "mutate": 0.1 },
|
|
85
|
+
"slots": [
|
|
86
|
+
{ "label": "Skeleton", "default": 0.0, "steps": 4, "stepLabels": ["Downbeat", "Backbeat", "Offbeat", "Rolling"] },
|
|
87
|
+
{ "label": "Fills", "default": 0.25, "hint": "How often a cycle grows a fill" },
|
|
88
|
+
{ "label": "Ratchet", "default": 0.3, "hint": "How often a hit becomes a retrigger burst" },
|
|
89
|
+
{ "label": "Ramp", "default": 0.5, "hint": "Burst speed, and how hard the repeats hit" }
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
"7": {
|
|
93
|
+
"name": "PHASE",
|
|
94
|
+
"tag": "both",
|
|
95
|
+
"replay": false,
|
|
96
|
+
"doc": "A sub-loop of L steps tiled against the pattern window and rotated by a fixed number of steps per cycle (discrete Reich phasing - loop-safe and bounce-exact, unlike continuous drift).",
|
|
97
|
+
"blurb": "A short loop of odd length that slides against the bar. The two pull apart, then meet up again.",
|
|
98
|
+
"defaults": { "density": 0.5, "mutate": 0.0 },
|
|
99
|
+
"slots": [
|
|
100
|
+
{ "label": "Loop", "default": 0.0, "steps": 5, "stepLabels": ["3", "5", "6", "7", "9"] },
|
|
101
|
+
{ "label": "Drift", "default": 0.25, "steps": 5, "stepLabels": ["0", "1", "2", "3", "4"] },
|
|
102
|
+
{ "label": "Accent", "default": 0.3333333333333333, "steps": 4, "stepLabels": ["1", "2", "3", "4"] },
|
|
103
|
+
{ "label": "Alternate", "default": 0.0, "steps": 2, "stepLabels": ["Off", "On"] }
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"8": {
|
|
107
|
+
"name": "RIFF",
|
|
108
|
+
"tag": "melodic",
|
|
109
|
+
"replay": false,
|
|
110
|
+
"doc": "Scale-degree arp automaton: a chord-tone pool cycling through a short progression per cycle, traversed by shape over an octave span, with skips from (1-DENSITY).",
|
|
111
|
+
"blurb": "Arpeggios over a short chord progression. Shape picks the path up and down, Octaves sets the range.",
|
|
112
|
+
"defaults": { "density": 0.7, "mutate": 0.15 },
|
|
113
|
+
"slots": [
|
|
114
|
+
{ "label": "Shape", "default": 0.0, "steps": 4, "stepLabels": ["Up", "Down", "Orbit", "Converge"] },
|
|
115
|
+
{ "label": "Prog", "default": 0.0, "steps": 4, "stepLabels": ["Static", "i-VI", "i-iv-V", "i-VII-VI-V"] },
|
|
116
|
+
{ "label": "Octaves", "default": 0.3333333333333333, "steps": 4, "stepLabels": ["1", "2", "3", "4"] },
|
|
117
|
+
{ "label": "Gate", "default": 0.4, "hint": "Note length, as a share of the step" },
|
|
118
|
+
{ "label": "Chord", "default": 0.0, "steps": 6, "stepLabels": ["Off", "Oct", "5th", "Triad", "7th", "Quartal"] }
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
"9": {
|
|
122
|
+
"name": "MASK",
|
|
123
|
+
"tag": "both",
|
|
124
|
+
"replay": false,
|
|
125
|
+
"doc": "The cell's own drawn pattern, morphed. Per-step weights seeded from the clip (velocity on their notes, metric hierarchy on their rests) under one monotone threshold whose CENTER DETENT reproduces the clip exactly; MUTATE is a per-cycle latched perturbation depth.",
|
|
126
|
+
"blurb": "Your drawn pattern, thinned out or filled in. The centre of Density plays it back exactly as written.",
|
|
127
|
+
"defaults": { "density": 0.5, "mutate": 0.0 },
|
|
128
|
+
"slots": [
|
|
129
|
+
{ "label": "Accent", "default": 0.5, "hint": "How far the off-beats duck under the strong beats" },
|
|
130
|
+
{ "label": "Gate", "default": 0.35, "hint": "Note length, as a share of the step" }
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
package/dist/manifest-cell1.json
CHANGED
|
@@ -8438,7 +8438,7 @@
|
|
|
8438
8438
|
"cell": "cell1",
|
|
8439
8439
|
"effect": "wavefold",
|
|
8440
8440
|
"suffix": "%",
|
|
8441
|
-
"tooltip": "Extra
|
|
8441
|
+
"tooltip": "Extra gain on top of Drive — pushes past the last fold into the saturated end of travel",
|
|
8442
8442
|
"version": 51,
|
|
8443
8443
|
"macroVersion": 38,
|
|
8444
8444
|
"isPluginParameter": true,
|
|
@@ -8513,7 +8513,7 @@
|
|
|
8513
8513
|
"cell": "cell1",
|
|
8514
8514
|
"effect": "wavefold",
|
|
8515
8515
|
"suffix": "%",
|
|
8516
|
-
"tooltip": "Fold
|
|
8516
|
+
"tooltip": "Fold ladder stagger — evenly spaced Serge folds (0%) through to the unequal, formant-like Buchla 259 spacing (100%)",
|
|
8517
8517
|
"version": 53,
|
|
8518
8518
|
"macroVersion": 40,
|
|
8519
8519
|
"isPluginParameter": true,
|
package/dist/manifest-mfx.json
CHANGED
|
@@ -395,6 +395,7 @@
|
|
|
395
395
|
"strRepr": [],
|
|
396
396
|
"skew": 1,
|
|
397
397
|
"suffix": "bits",
|
|
398
|
+
"displayId": "crusherBits",
|
|
398
399
|
"defaultValue": 16,
|
|
399
400
|
"tooltip": "Control Crush Bit for all cells",
|
|
400
401
|
"bipolar": false,
|
|
@@ -452,6 +453,7 @@
|
|
|
452
453
|
"strRepr": [],
|
|
453
454
|
"skew": 1,
|
|
454
455
|
"suffix": "Hz",
|
|
456
|
+
"displayId": "crusherRateHz",
|
|
455
457
|
"defaultValue": 30000,
|
|
456
458
|
"tooltip": "Control Crush Rate for all cells",
|
|
457
459
|
"bipolar": false,
|
|
@@ -1177,6 +1179,7 @@
|
|
|
1177
1179
|
"strRepr": [],
|
|
1178
1180
|
"skew": 1,
|
|
1179
1181
|
"suffix": "ms",
|
|
1182
|
+
"displayId": "flangerTimeMs",
|
|
1180
1183
|
"defaultValue": 0.1,
|
|
1181
1184
|
"tooltip": "Control Flanger Time for all cells",
|
|
1182
1185
|
"bipolar": false,
|
|
@@ -2213,7 +2216,8 @@
|
|
|
2213
2216
|
"cell": "cell1",
|
|
2214
2217
|
"effect": "crusher",
|
|
2215
2218
|
"suffix": "bits",
|
|
2216
|
-
"tooltip": "
|
|
2219
|
+
"tooltip": "Effective bit depth (1-16 bits)",
|
|
2220
|
+
"displayId": "crusherBits",
|
|
2217
2221
|
"version": 1,
|
|
2218
2222
|
"isPluginParameter": true,
|
|
2219
2223
|
"isModulatable": true
|
|
@@ -2264,7 +2268,8 @@
|
|
|
2264
2268
|
"cell": "cell1",
|
|
2265
2269
|
"effect": "crusher",
|
|
2266
2270
|
"suffix": "Hz",
|
|
2267
|
-
"tooltip": "
|
|
2271
|
+
"tooltip": "Sample-hold rate (172 Hz-44.1 kHz), limited by the host sample rate",
|
|
2272
|
+
"displayId": "crusherRateHz",
|
|
2268
2273
|
"version": 1,
|
|
2269
2274
|
"isPluginParameter": true,
|
|
2270
2275
|
"isModulatable": true
|
|
@@ -3486,6 +3491,7 @@
|
|
|
3486
3491
|
"effect": "flanger",
|
|
3487
3492
|
"suffix": "ms",
|
|
3488
3493
|
"tooltip": "Flanger delay time (0.1-25ms)",
|
|
3494
|
+
"displayId": "flangerTimeMs",
|
|
3489
3495
|
"version": 1,
|
|
3490
3496
|
"isPluginParameter": true,
|
|
3491
3497
|
"isModulatable": true
|
|
@@ -3795,7 +3801,7 @@
|
|
|
3795
3801
|
"cell": "cell1",
|
|
3796
3802
|
"effect": "wavefold",
|
|
3797
3803
|
"suffix": "%",
|
|
3798
|
-
"tooltip": "Extra
|
|
3804
|
+
"tooltip": "Extra gain on top of Drive — pushes past the last fold into the saturated end of travel",
|
|
3799
3805
|
"version": 51,
|
|
3800
3806
|
"macroVersion": 38,
|
|
3801
3807
|
"isPluginParameter": true,
|
|
@@ -3832,7 +3838,7 @@
|
|
|
3832
3838
|
"cell": "cell1",
|
|
3833
3839
|
"effect": "wavefold",
|
|
3834
3840
|
"suffix": "%",
|
|
3835
|
-
"tooltip": "Fold
|
|
3841
|
+
"tooltip": "Fold ladder stagger — evenly spaced Serge folds (0%) through to the unequal, formant-like Buchla 259 spacing (100%)",
|
|
3836
3842
|
"version": 53,
|
|
3837
3843
|
"macroVersion": 40,
|
|
3838
3844
|
"isPluginParameter": true,
|
|
@@ -4364,7 +4370,8 @@
|
|
|
4364
4370
|
"cell": "cell2",
|
|
4365
4371
|
"effect": "crusher",
|
|
4366
4372
|
"suffix": "bits",
|
|
4367
|
-
"tooltip": "
|
|
4373
|
+
"tooltip": "Effective bit depth (1-16 bits)",
|
|
4374
|
+
"displayId": "crusherBits",
|
|
4368
4375
|
"version": 1,
|
|
4369
4376
|
"isPluginParameter": true,
|
|
4370
4377
|
"isModulatable": true
|
|
@@ -4415,7 +4422,8 @@
|
|
|
4415
4422
|
"cell": "cell2",
|
|
4416
4423
|
"effect": "crusher",
|
|
4417
4424
|
"suffix": "Hz",
|
|
4418
|
-
"tooltip": "
|
|
4425
|
+
"tooltip": "Sample-hold rate (172 Hz-44.1 kHz), limited by the host sample rate",
|
|
4426
|
+
"displayId": "crusherRateHz",
|
|
4419
4427
|
"version": 1,
|
|
4420
4428
|
"isPluginParameter": true,
|
|
4421
4429
|
"isModulatable": true
|
|
@@ -5637,6 +5645,7 @@
|
|
|
5637
5645
|
"effect": "flanger",
|
|
5638
5646
|
"suffix": "ms",
|
|
5639
5647
|
"tooltip": "Flanger delay time (0.1-25ms)",
|
|
5648
|
+
"displayId": "flangerTimeMs",
|
|
5640
5649
|
"version": 1,
|
|
5641
5650
|
"isPluginParameter": true,
|
|
5642
5651
|
"isModulatable": true
|
|
@@ -5946,7 +5955,7 @@
|
|
|
5946
5955
|
"cell": "cell2",
|
|
5947
5956
|
"effect": "wavefold",
|
|
5948
5957
|
"suffix": "%",
|
|
5949
|
-
"tooltip": "Extra
|
|
5958
|
+
"tooltip": "Extra gain on top of Drive — pushes past the last fold into the saturated end of travel",
|
|
5950
5959
|
"version": 51,
|
|
5951
5960
|
"macroVersion": 38,
|
|
5952
5961
|
"isPluginParameter": true,
|
|
@@ -5983,7 +5992,7 @@
|
|
|
5983
5992
|
"cell": "cell2",
|
|
5984
5993
|
"effect": "wavefold",
|
|
5985
5994
|
"suffix": "%",
|
|
5986
|
-
"tooltip": "Fold
|
|
5995
|
+
"tooltip": "Fold ladder stagger — evenly spaced Serge folds (0%) through to the unequal, formant-like Buchla 259 spacing (100%)",
|
|
5987
5996
|
"version": 53,
|
|
5988
5997
|
"macroVersion": 40,
|
|
5989
5998
|
"isPluginParameter": true,
|
|
@@ -6515,7 +6524,8 @@
|
|
|
6515
6524
|
"cell": "cell3",
|
|
6516
6525
|
"effect": "crusher",
|
|
6517
6526
|
"suffix": "bits",
|
|
6518
|
-
"tooltip": "
|
|
6527
|
+
"tooltip": "Effective bit depth (1-16 bits)",
|
|
6528
|
+
"displayId": "crusherBits",
|
|
6519
6529
|
"version": 1,
|
|
6520
6530
|
"isPluginParameter": true,
|
|
6521
6531
|
"isModulatable": true
|
|
@@ -6566,7 +6576,8 @@
|
|
|
6566
6576
|
"cell": "cell3",
|
|
6567
6577
|
"effect": "crusher",
|
|
6568
6578
|
"suffix": "Hz",
|
|
6569
|
-
"tooltip": "
|
|
6579
|
+
"tooltip": "Sample-hold rate (172 Hz-44.1 kHz), limited by the host sample rate",
|
|
6580
|
+
"displayId": "crusherRateHz",
|
|
6570
6581
|
"version": 1,
|
|
6571
6582
|
"isPluginParameter": true,
|
|
6572
6583
|
"isModulatable": true
|
|
@@ -7788,6 +7799,7 @@
|
|
|
7788
7799
|
"effect": "flanger",
|
|
7789
7800
|
"suffix": "ms",
|
|
7790
7801
|
"tooltip": "Flanger delay time (0.1-25ms)",
|
|
7802
|
+
"displayId": "flangerTimeMs",
|
|
7791
7803
|
"version": 1,
|
|
7792
7804
|
"isPluginParameter": true,
|
|
7793
7805
|
"isModulatable": true
|
|
@@ -8097,7 +8109,7 @@
|
|
|
8097
8109
|
"cell": "cell3",
|
|
8098
8110
|
"effect": "wavefold",
|
|
8099
8111
|
"suffix": "%",
|
|
8100
|
-
"tooltip": "Extra
|
|
8112
|
+
"tooltip": "Extra gain on top of Drive — pushes past the last fold into the saturated end of travel",
|
|
8101
8113
|
"version": 51,
|
|
8102
8114
|
"macroVersion": 38,
|
|
8103
8115
|
"isPluginParameter": true,
|
|
@@ -8134,7 +8146,7 @@
|
|
|
8134
8146
|
"cell": "cell3",
|
|
8135
8147
|
"effect": "wavefold",
|
|
8136
8148
|
"suffix": "%",
|
|
8137
|
-
"tooltip": "Fold
|
|
8149
|
+
"tooltip": "Fold ladder stagger — evenly spaced Serge folds (0%) through to the unequal, formant-like Buchla 259 spacing (100%)",
|
|
8138
8150
|
"version": 53,
|
|
8139
8151
|
"macroVersion": 40,
|
|
8140
8152
|
"isPluginParameter": true,
|
|
@@ -8666,7 +8678,8 @@
|
|
|
8666
8678
|
"cell": "cell4",
|
|
8667
8679
|
"effect": "crusher",
|
|
8668
8680
|
"suffix": "bits",
|
|
8669
|
-
"tooltip": "
|
|
8681
|
+
"tooltip": "Effective bit depth (1-16 bits)",
|
|
8682
|
+
"displayId": "crusherBits",
|
|
8670
8683
|
"version": 1,
|
|
8671
8684
|
"isPluginParameter": true,
|
|
8672
8685
|
"isModulatable": true
|
|
@@ -8717,7 +8730,8 @@
|
|
|
8717
8730
|
"cell": "cell4",
|
|
8718
8731
|
"effect": "crusher",
|
|
8719
8732
|
"suffix": "Hz",
|
|
8720
|
-
"tooltip": "
|
|
8733
|
+
"tooltip": "Sample-hold rate (172 Hz-44.1 kHz), limited by the host sample rate",
|
|
8734
|
+
"displayId": "crusherRateHz",
|
|
8721
8735
|
"version": 1,
|
|
8722
8736
|
"isPluginParameter": true,
|
|
8723
8737
|
"isModulatable": true
|
|
@@ -9939,6 +9953,7 @@
|
|
|
9939
9953
|
"effect": "flanger",
|
|
9940
9954
|
"suffix": "ms",
|
|
9941
9955
|
"tooltip": "Flanger delay time (0.1-25ms)",
|
|
9956
|
+
"displayId": "flangerTimeMs",
|
|
9942
9957
|
"version": 1,
|
|
9943
9958
|
"isPluginParameter": true,
|
|
9944
9959
|
"isModulatable": true
|
|
@@ -10248,7 +10263,7 @@
|
|
|
10248
10263
|
"cell": "cell4",
|
|
10249
10264
|
"effect": "wavefold",
|
|
10250
10265
|
"suffix": "%",
|
|
10251
|
-
"tooltip": "Extra
|
|
10266
|
+
"tooltip": "Extra gain on top of Drive — pushes past the last fold into the saturated end of travel",
|
|
10252
10267
|
"version": 51,
|
|
10253
10268
|
"macroVersion": 38,
|
|
10254
10269
|
"isPluginParameter": true,
|
|
@@ -10285,7 +10300,7 @@
|
|
|
10285
10300
|
"cell": "cell4",
|
|
10286
10301
|
"effect": "wavefold",
|
|
10287
10302
|
"suffix": "%",
|
|
10288
|
-
"tooltip": "Fold
|
|
10303
|
+
"tooltip": "Fold ladder stagger — evenly spaced Serge folds (0%) through to the unequal, formant-like Buchla 259 spacing (100%)",
|
|
10289
10304
|
"version": 53,
|
|
10290
10305
|
"macroVersion": 40,
|
|
10291
10306
|
"isPluginParameter": true,
|
|
@@ -19707,6 +19722,7 @@
|
|
|
19707
19722
|
"version": 232,
|
|
19708
19723
|
"skipMacro": true,
|
|
19709
19724
|
"macroVersion": 233,
|
|
19725
|
+
"automatable": false,
|
|
19710
19726
|
"isPluginParameter": true,
|
|
19711
19727
|
"isModulatable": false
|
|
19712
19728
|
},
|
|
@@ -19729,6 +19745,7 @@
|
|
|
19729
19745
|
"version": 232,
|
|
19730
19746
|
"skipMacro": true,
|
|
19731
19747
|
"macroVersion": 233,
|
|
19748
|
+
"automatable": false,
|
|
19732
19749
|
"isPluginParameter": true,
|
|
19733
19750
|
"isModulatable": false
|
|
19734
19751
|
},
|
|
@@ -19751,6 +19768,7 @@
|
|
|
19751
19768
|
"version": 232,
|
|
19752
19769
|
"skipMacro": true,
|
|
19753
19770
|
"macroVersion": 233,
|
|
19771
|
+
"automatable": false,
|
|
19754
19772
|
"isPluginParameter": true,
|
|
19755
19773
|
"isModulatable": false
|
|
19756
19774
|
},
|
|
@@ -19773,6 +19791,7 @@
|
|
|
19773
19791
|
"version": 232,
|
|
19774
19792
|
"skipMacro": true,
|
|
19775
19793
|
"macroVersion": 233,
|
|
19794
|
+
"automatable": false,
|
|
19776
19795
|
"isPluginParameter": true,
|
|
19777
19796
|
"isModulatable": false
|
|
19778
19797
|
},
|
|
@@ -19796,6 +19815,7 @@
|
|
|
19796
19815
|
"isModulatable": false,
|
|
19797
19816
|
"cell": "macro",
|
|
19798
19817
|
"effect": "pitchshift",
|
|
19818
|
+
"automatable": false,
|
|
19799
19819
|
"version": 233
|
|
19800
19820
|
},
|
|
19801
19821
|
{
|
|
@@ -20070,6 +20090,97 @@
|
|
|
20070
20090
|
"cell": "macro",
|
|
20071
20091
|
"effect": "eq",
|
|
20072
20092
|
"version": 236
|
|
20093
|
+
},
|
|
20094
|
+
{
|
|
20095
|
+
"paramId": "cell1_filterFormantOffset",
|
|
20096
|
+
"name": "Cell1 Filter Formant Offset",
|
|
20097
|
+
"displayName": "Offset",
|
|
20098
|
+
"min": 0.1,
|
|
20099
|
+
"max": 4,
|
|
20100
|
+
"step": 0.01,
|
|
20101
|
+
"skew": 0.5,
|
|
20102
|
+
"defaultValue": 1,
|
|
20103
|
+
"cell": "cell1",
|
|
20104
|
+
"effect": "filter",
|
|
20105
|
+
"suffix": "×",
|
|
20106
|
+
"tooltip": "Scale all three Formant frequencies. 1× preserves the original voice; lower values deepen it and higher values brighten it",
|
|
20107
|
+
"version": 237,
|
|
20108
|
+
"macroVersion": 237,
|
|
20109
|
+
"isPluginParameter": true,
|
|
20110
|
+
"isModulatable": true
|
|
20111
|
+
},
|
|
20112
|
+
{
|
|
20113
|
+
"paramId": "cell2_filterFormantOffset",
|
|
20114
|
+
"name": "Cell2 Filter Formant Offset",
|
|
20115
|
+
"displayName": "Offset",
|
|
20116
|
+
"min": 0.1,
|
|
20117
|
+
"max": 4,
|
|
20118
|
+
"step": 0.01,
|
|
20119
|
+
"skew": 0.5,
|
|
20120
|
+
"defaultValue": 1,
|
|
20121
|
+
"cell": "cell2",
|
|
20122
|
+
"effect": "filter",
|
|
20123
|
+
"suffix": "×",
|
|
20124
|
+
"tooltip": "Scale all three Formant frequencies. 1× preserves the original voice; lower values deepen it and higher values brighten it",
|
|
20125
|
+
"version": 237,
|
|
20126
|
+
"macroVersion": 237,
|
|
20127
|
+
"isPluginParameter": true,
|
|
20128
|
+
"isModulatable": true
|
|
20129
|
+
},
|
|
20130
|
+
{
|
|
20131
|
+
"paramId": "cell3_filterFormantOffset",
|
|
20132
|
+
"name": "Cell3 Filter Formant Offset",
|
|
20133
|
+
"displayName": "Offset",
|
|
20134
|
+
"min": 0.1,
|
|
20135
|
+
"max": 4,
|
|
20136
|
+
"step": 0.01,
|
|
20137
|
+
"skew": 0.5,
|
|
20138
|
+
"defaultValue": 1,
|
|
20139
|
+
"cell": "cell3",
|
|
20140
|
+
"effect": "filter",
|
|
20141
|
+
"suffix": "×",
|
|
20142
|
+
"tooltip": "Scale all three Formant frequencies. 1× preserves the original voice; lower values deepen it and higher values brighten it",
|
|
20143
|
+
"version": 237,
|
|
20144
|
+
"macroVersion": 237,
|
|
20145
|
+
"isPluginParameter": true,
|
|
20146
|
+
"isModulatable": true
|
|
20147
|
+
},
|
|
20148
|
+
{
|
|
20149
|
+
"paramId": "cell4_filterFormantOffset",
|
|
20150
|
+
"name": "Cell4 Filter Formant Offset",
|
|
20151
|
+
"displayName": "Offset",
|
|
20152
|
+
"min": 0.1,
|
|
20153
|
+
"max": 4,
|
|
20154
|
+
"step": 0.01,
|
|
20155
|
+
"skew": 0.5,
|
|
20156
|
+
"defaultValue": 1,
|
|
20157
|
+
"cell": "cell4",
|
|
20158
|
+
"effect": "filter",
|
|
20159
|
+
"suffix": "×",
|
|
20160
|
+
"tooltip": "Scale all three Formant frequencies. 1× preserves the original voice; lower values deepen it and higher values brighten it",
|
|
20161
|
+
"version": 237,
|
|
20162
|
+
"macroVersion": 237,
|
|
20163
|
+
"isPluginParameter": true,
|
|
20164
|
+
"isModulatable": true
|
|
20165
|
+
},
|
|
20166
|
+
{
|
|
20167
|
+
"paramId": "macro_filterFormantOffset",
|
|
20168
|
+
"name": "Macro Filter Formant Offset",
|
|
20169
|
+
"displayName": "Offset",
|
|
20170
|
+
"min": 0.1,
|
|
20171
|
+
"max": 4,
|
|
20172
|
+
"step": 0.01,
|
|
20173
|
+
"strRepr": [],
|
|
20174
|
+
"skew": 0.5,
|
|
20175
|
+
"suffix": "×",
|
|
20176
|
+
"defaultValue": 1,
|
|
20177
|
+
"tooltip": "Control Filter Formant Offset for all cells",
|
|
20178
|
+
"bipolar": false,
|
|
20179
|
+
"isPluginParameter": true,
|
|
20180
|
+
"isModulatable": true,
|
|
20181
|
+
"cell": "macro",
|
|
20182
|
+
"effect": "filter",
|
|
20183
|
+
"version": 237
|
|
20073
20184
|
}
|
|
20074
20185
|
],
|
|
20075
20186
|
"stateVariables": [
|
|
@@ -22900,6 +23011,46 @@
|
|
|
22900
23011
|
}
|
|
22901
23012
|
],
|
|
22902
23013
|
"parameterInfos": [
|
|
23014
|
+
{
|
|
23015
|
+
"paramId": "flangerTimeMs",
|
|
23016
|
+
"displayName": "Time",
|
|
23017
|
+
"min": 0.1,
|
|
23018
|
+
"max": 25,
|
|
23019
|
+
"step": 0.01,
|
|
23020
|
+
"skew": 1,
|
|
23021
|
+
"suffix": "ms"
|
|
23022
|
+
},
|
|
23023
|
+
{
|
|
23024
|
+
"paramId": "crusherBits",
|
|
23025
|
+
"displayName": "Bit",
|
|
23026
|
+
"min": 1,
|
|
23027
|
+
"max": 16,
|
|
23028
|
+
"step": 0.01,
|
|
23029
|
+
"skew": 1,
|
|
23030
|
+
"suffix": "bits",
|
|
23031
|
+
"displayTransform": {
|
|
23032
|
+
"offset": 16,
|
|
23033
|
+
"scale": -15,
|
|
23034
|
+
"exponent": 0.25,
|
|
23035
|
+
"reverse": true
|
|
23036
|
+
}
|
|
23037
|
+
},
|
|
23038
|
+
{
|
|
23039
|
+
"paramId": "crusherRateHz",
|
|
23040
|
+
"displayName": "Rate",
|
|
23041
|
+
"min": 172.265625,
|
|
23042
|
+
"max": 44100,
|
|
23043
|
+
"step": 0.01,
|
|
23044
|
+
"skew": 1,
|
|
23045
|
+
"suffix": "Hz",
|
|
23046
|
+
"displayTransform": {
|
|
23047
|
+
"offset": 1,
|
|
23048
|
+
"scale": 255,
|
|
23049
|
+
"exponent": 3,
|
|
23050
|
+
"reverse": true,
|
|
23051
|
+
"reciprocal": 44100
|
|
23052
|
+
}
|
|
23053
|
+
},
|
|
22903
23054
|
{
|
|
22904
23055
|
"paramId": "envelopeSpeedHz",
|
|
22905
23056
|
"displayName": "Speed",
|
|
@@ -22950,8 +23101,8 @@
|
|
|
22950
23101
|
"displayName": "Time",
|
|
22951
23102
|
"min": 1,
|
|
22952
23103
|
"max": 2000,
|
|
22953
|
-
"step":
|
|
22954
|
-
"skew":
|
|
23104
|
+
"step": 0.01,
|
|
23105
|
+
"skew": 1,
|
|
22955
23106
|
"suffix": "ms",
|
|
22956
23107
|
"defaultValue": 120,
|
|
22957
23108
|
"tooltip": "Gate subdivision time in milliseconds",
|
|
@@ -22991,8 +23142,8 @@
|
|
|
22991
23142
|
"displayName": "Time",
|
|
22992
23143
|
"min": 1,
|
|
22993
23144
|
"max": 2000,
|
|
22994
|
-
"step":
|
|
22995
|
-
"skew":
|
|
23145
|
+
"step": 0.01,
|
|
23146
|
+
"skew": 1,
|
|
22996
23147
|
"suffix": "ms",
|
|
22997
23148
|
"defaultValue": 120,
|
|
22998
23149
|
"tooltip": "Gate subdivision time in milliseconds (macro)",
|
package/dist/manifest.d.ts
CHANGED
|
@@ -56,7 +56,7 @@ export declare function loadManifest(productOverride?: string): Promise<Manifest
|
|
|
56
56
|
export declare function getParameterIndex(): Promise<Map<string, ManifestParameter>>;
|
|
57
57
|
export declare function getParametersByCell(cellId: string): Promise<ManifestParameter[]>;
|
|
58
58
|
export declare function getGlobalParameters(): Promise<ManifestParameter[]>;
|
|
59
|
-
export declare function findPresetDirs(): Promise<string[]>;
|
|
59
|
+
export declare function findPresetDirs(strict?: boolean): Promise<string[]>;
|
|
60
60
|
export declare function resolvePresetPath(presetPath: string): Promise<string>;
|
|
61
61
|
export declare function walkPresets(dir: string, prefix?: string): Promise<{
|
|
62
62
|
path: string;
|
package/dist/manifest.js
CHANGED
|
@@ -174,7 +174,7 @@ async function resolveActiveProduct() {
|
|
|
174
174
|
process.env.PAM_MCP_PRODUCT;
|
|
175
175
|
return normalizeProduct(envProduct ?? activeProductHint ?? (await discoverProductFromBridge()));
|
|
176
176
|
}
|
|
177
|
-
export async function findPresetDirs() {
|
|
177
|
+
export async function findPresetDirs(strict = false) {
|
|
178
178
|
const product = await resolveActiveProduct();
|
|
179
179
|
const dirs = [];
|
|
180
180
|
const repoSegments = REPO_PRESET_DIR_BY_PRODUCT[product] ?? REPO_PRESET_DIR_BY_PRODUCT.pam;
|
|
@@ -183,21 +183,23 @@ export async function findPresetDirs() {
|
|
|
183
183
|
await stat(repoPresets);
|
|
184
184
|
dirs.push(repoPresets);
|
|
185
185
|
}
|
|
186
|
-
catch {
|
|
187
|
-
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (strict && error.code !== "ENOENT")
|
|
188
|
+
throw error;
|
|
188
189
|
}
|
|
189
190
|
try {
|
|
190
191
|
const userPresets = getUserPresetsDir(product);
|
|
191
192
|
await stat(userPresets);
|
|
192
193
|
dirs.push(userPresets);
|
|
193
194
|
}
|
|
194
|
-
catch {
|
|
195
|
-
|
|
195
|
+
catch (error) {
|
|
196
|
+
if (strict && error.code !== "ENOENT")
|
|
197
|
+
throw error;
|
|
196
198
|
}
|
|
197
199
|
return dirs;
|
|
198
200
|
}
|
|
199
201
|
export async function resolvePresetPath(presetPath) {
|
|
200
|
-
const dirs = await findPresetDirs();
|
|
202
|
+
const dirs = await findPresetDirs(true);
|
|
201
203
|
for (const dir of dirs) {
|
|
202
204
|
const candidate = resolve(dir, presetPath);
|
|
203
205
|
// Path traversal guard: resolved path must stay within the allowed directory
|
|
@@ -207,11 +209,12 @@ export async function resolvePresetPath(presetPath) {
|
|
|
207
209
|
await stat(candidate);
|
|
208
210
|
return candidate;
|
|
209
211
|
}
|
|
210
|
-
catch {
|
|
211
|
-
|
|
212
|
+
catch (error) {
|
|
213
|
+
if (error.code !== "ENOENT")
|
|
214
|
+
throw error;
|
|
212
215
|
}
|
|
213
216
|
}
|
|
214
|
-
throw new Error(`Preset not found: ${presetPath}`);
|
|
217
|
+
throw Object.assign(new Error(`Preset not found: ${presetPath}`), { code: "ENOENT" });
|
|
215
218
|
}
|
|
216
219
|
export async function walkPresets(dir, prefix = "") {
|
|
217
220
|
const results = [];
|