@open-audio-stack/core 0.1.46 → 0.1.48

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.
@@ -1,7 +1,7 @@
1
1
  import path from 'path';
2
2
  import { Package } from './Package.js';
3
3
  import { Manager } from './Manager.js';
4
- import { archiveExtract, dirCreate, dirDelete, dirEmpty, dirIs, dirMove, dirRead, fileCreate, fileCreateJson, fileCreateYaml, fileExists, fileHash, fileInstall, fileOpen, fileReadJson, fileReadYaml, filesMove, isAdmin, runCliAsAdmin, } from '../helpers/file.js';
4
+ import { archiveExtract, dirCreate, dirDelete, dirEmpty, dirIs, dirMove, dirRead, fileCreate, fileCreateJson, fileCreateYaml, fileExec, fileExists, fileHash, fileInstall, fileOpen, fileReadJson, fileReadYaml, filesMove, isAdmin, runCliAsAdmin, } from '../helpers/file.js';
5
5
  import { isValidVersion, pathGetSlug, pathGetVersion, toSlug } from '../helpers/utils.js';
6
6
  import { commandExists, getArchitecture, getSystem, isTests } from '../helpers/utilsLocal.js';
7
7
  import { apiBuffer } from '../helpers/api.js';
@@ -296,6 +296,48 @@ export class ManagerLocal extends Manager {
296
296
  dirCreate(dirTarget);
297
297
  dirMove(dirSource, dirTarget);
298
298
  fileCreateJson(path.join(dirTarget, 'index.json'), pkgVersion);
299
+ // Ensure executable permissions for likely executables inside moved app/project/preset
300
+ try {
301
+ const movedFiles = dirRead(path.join(dirTarget, '**', '*')).filter(f => !dirIs(f));
302
+ movedFiles.forEach((movedFile) => {
303
+ const ext = path.extname(movedFile).slice(1).toLowerCase();
304
+ if (['', 'elf', 'exe'].includes(ext)) {
305
+ try {
306
+ fileExec(movedFile);
307
+ }
308
+ catch (err) {
309
+ this.log(`Failed to set exec on ${movedFile}:`, err);
310
+ }
311
+ }
312
+ });
313
+ }
314
+ catch (err) {
315
+ this.log('Error while setting executable permissions:', err);
316
+ }
317
+ // Also handle macOS .app bundles: set exec on binaries in Contents/MacOS
318
+ try {
319
+ const appDirs = dirRead(path.join(dirTarget, '**', '*.app')).filter(d => dirIs(d));
320
+ appDirs.forEach((appDir) => {
321
+ try {
322
+ const macosBinPattern = path.join(appDir, 'Contents', 'MacOS', '**', '*');
323
+ const macosFiles = dirRead(macosBinPattern).filter(f => !dirIs(f));
324
+ macosFiles.forEach((binFile) => {
325
+ try {
326
+ fileExec(binFile);
327
+ }
328
+ catch (err) {
329
+ this.log(`Failed to set exec on app binary ${binFile}:`, err);
330
+ }
331
+ });
332
+ }
333
+ catch (err) {
334
+ this.log(`Error scanning .app contents for ${appDir}:`, err);
335
+ }
336
+ });
337
+ }
338
+ catch (err) {
339
+ this.log(err);
340
+ }
299
341
  }
300
342
  }
301
343
  }
@@ -385,14 +427,16 @@ export class ManagerLocal extends Manager {
385
427
  try {
386
428
  const openPath = openableFile.open;
387
429
  const fileExt = path.extname(openPath).slice(1).toLowerCase();
388
- let formatDir = pluginFormatDir[fileExt] || 'Plugin';
389
- if (this.type === RegistryType.Apps)
390
- formatDir = pluginFormatDir[fileExt] || 'App';
391
- else if (this.type === RegistryType.Presets)
392
- formatDir = presetFormatDir[fileExt] || 'Preset';
393
- else if (this.type === RegistryType.Projects)
394
- formatDir = projectFormatDir[fileExt] || 'Project';
395
- const packageDir = path.join(this.typeDir, formatDir, slug, versionNum);
430
+ let packageDir;
431
+ if (this.type === RegistryType.Plugins) {
432
+ // For plugins, use type-specific subdirectories
433
+ const formatDir = pluginFormatDir[fileExt] || 'Plugin';
434
+ packageDir = path.join(this.typeDir, formatDir, slug, versionNum);
435
+ }
436
+ else {
437
+ // For apps/projects/presets, files are in direct package directory
438
+ packageDir = path.join(this.typeDir, slug, versionNum);
439
+ }
396
440
  let fullPath;
397
441
  if (path.isAbsolute(openPath)) {
398
442
  fullPath = openPath;
@@ -1,18 +1,42 @@
1
+ /**
2
+ * Plugin categories are derived from the official Steinberg VST3 Plug-in
3
+ * Type definitions (plugType) provided by the VST3 SDK.
4
+ *
5
+ * The VST3 SDK defines a large set of hierarchical category strings
6
+ * (e.g. "Fx|Dynamics", "Fx|EQ", "Instrument|Synth") which serve multiple
7
+ * purposes including host routing, UI grouping, and capability flags.
8
+ *
9
+ * This project intentionally normalizes and consolidates those categories
10
+ * into a smaller, format-agnostic set suitable for a plugin registry and
11
+ * tagging system. Not all VST3 plugType values map 1:1 to public categories.
12
+ *
13
+ * Authoritative source (VST3 SDK):
14
+ * https://steinbergmedia.github.io/vst3_doc/vstinterfaces/group__plugType.html
15
+ */
1
16
  export declare enum PluginCategoryEffect {
2
- Chorus = "chorus",
3
- Compression = "compression",
17
+ Delay = "delay",
18
+ Distortion = "distortion",
19
+ Dynamics = "dynamics",
4
20
  Eq = "eq",
5
21
  Filter = "filter",
6
- Reverb = "reverb"
22
+ Modulation = "modulation",
23
+ Pitch = "pitch",
24
+ Reverb = "reverb",
25
+ Spatial = "spatial",
26
+ Utility = "utility"
7
27
  }
8
28
  export declare enum PluginCategoryInstrument {
9
- Drums = "drums",
29
+ Bass = "bass",
30
+ Brass = "brass",
31
+ Drum = "drum",
32
+ Fx = "fx",
10
33
  Guitar = "guitar",
11
- Keys = "keys",
12
- Orchestral = "orchestral",
13
- Samplers = "samplers",
14
- Synths = "synths",
15
- Vocals = "vocals"
34
+ Piano = "piano",
35
+ Sampler = "sampler",
36
+ Strings = "strings",
37
+ Synth = "synth",
38
+ Voice = "voice",
39
+ Woodwinds = "woodwinds"
16
40
  }
17
41
  export interface PluginCategoryOption {
18
42
  description: string;
@@ -1,94 +1,172 @@
1
+ /**
2
+ * Plugin categories are derived from the official Steinberg VST3 Plug-in
3
+ * Type definitions (plugType) provided by the VST3 SDK.
4
+ *
5
+ * The VST3 SDK defines a large set of hierarchical category strings
6
+ * (e.g. "Fx|Dynamics", "Fx|EQ", "Instrument|Synth") which serve multiple
7
+ * purposes including host routing, UI grouping, and capability flags.
8
+ *
9
+ * This project intentionally normalizes and consolidates those categories
10
+ * into a smaller, format-agnostic set suitable for a plugin registry and
11
+ * tagging system. Not all VST3 plugType values map 1:1 to public categories.
12
+ *
13
+ * Authoritative source (VST3 SDK):
14
+ * https://steinbergmedia.github.io/vst3_doc/vstinterfaces/group__plugType.html
15
+ */
1
16
  export var PluginCategoryEffect;
2
17
  (function (PluginCategoryEffect) {
3
- PluginCategoryEffect["Chorus"] = "chorus";
4
- PluginCategoryEffect["Compression"] = "compression";
18
+ PluginCategoryEffect["Delay"] = "delay";
19
+ PluginCategoryEffect["Distortion"] = "distortion";
20
+ PluginCategoryEffect["Dynamics"] = "dynamics";
5
21
  PluginCategoryEffect["Eq"] = "eq";
6
22
  PluginCategoryEffect["Filter"] = "filter";
23
+ PluginCategoryEffect["Modulation"] = "modulation";
24
+ PluginCategoryEffect["Pitch"] = "pitch";
7
25
  PluginCategoryEffect["Reverb"] = "reverb";
26
+ PluginCategoryEffect["Spatial"] = "spatial";
27
+ PluginCategoryEffect["Utility"] = "utility";
8
28
  })(PluginCategoryEffect || (PluginCategoryEffect = {}));
9
29
  export var PluginCategoryInstrument;
10
30
  (function (PluginCategoryInstrument) {
11
- PluginCategoryInstrument["Drums"] = "drums";
31
+ PluginCategoryInstrument["Bass"] = "bass";
32
+ PluginCategoryInstrument["Brass"] = "brass";
33
+ PluginCategoryInstrument["Drum"] = "drum";
34
+ PluginCategoryInstrument["Fx"] = "fx";
12
35
  PluginCategoryInstrument["Guitar"] = "guitar";
13
- PluginCategoryInstrument["Keys"] = "keys";
14
- PluginCategoryInstrument["Orchestral"] = "orchestral";
15
- PluginCategoryInstrument["Samplers"] = "samplers";
16
- PluginCategoryInstrument["Synths"] = "synths";
17
- PluginCategoryInstrument["Vocals"] = "vocals";
36
+ PluginCategoryInstrument["Piano"] = "piano";
37
+ PluginCategoryInstrument["Sampler"] = "sampler";
38
+ PluginCategoryInstrument["Strings"] = "strings";
39
+ PluginCategoryInstrument["Synth"] = "synth";
40
+ PluginCategoryInstrument["Voice"] = "voice";
41
+ PluginCategoryInstrument["Woodwinds"] = "woodwinds";
18
42
  })(PluginCategoryInstrument || (PluginCategoryInstrument = {}));
19
43
  export const pluginCategoryEffects = [
20
44
  {
21
- description: 'Spatial movement and modulation.',
22
- value: PluginCategoryEffect.Chorus,
23
- name: 'Chorus/Phaser',
24
- tags: ['Chorus', 'Phaser'],
45
+ name: 'Delay',
46
+ value: PluginCategoryEffect.Delay,
47
+ description: 'Echoes and rhythmic repeats.',
48
+ tags: ['Delay', 'Echo', 'Tape Delay', 'Ping Pong Delay', 'Multi-Tap Delay'],
25
49
  },
26
50
  {
27
- description: 'Shape dynamics, grit and amplification.',
28
- value: PluginCategoryEffect.Compression,
29
- name: 'Compression/Distortion',
30
- tags: ['Compression', 'Distortion', 'Amplifier', 'Amp'],
51
+ name: 'Distortion',
52
+ value: PluginCategoryEffect.Distortion,
53
+ description: 'Add saturation, grit, or harmonic color.',
54
+ tags: ['Distortion', 'Saturation', 'Overdrive', 'Fuzz', 'Amp', 'Amplifier', 'Exciter', 'Waveshaper'],
31
55
  },
32
56
  {
33
- description: 'Balance frequencies and position sounds in the stereo field.',
57
+ name: 'Dynamics',
58
+ value: PluginCategoryEffect.Dynamics,
59
+ description: 'Control dynamics and signal level.',
60
+ tags: ['Dynamics', 'Compressor', 'Limiter', 'Expander', 'Gate', 'Noise Gate'],
61
+ },
62
+ {
63
+ name: 'EQ',
34
64
  value: PluginCategoryEffect.Eq,
35
- name: 'EQ/Pan',
36
- tags: ['EQ', 'Equalizer', 'Pan'],
65
+ description: 'Shape and balance frequency content.',
66
+ tags: ['EQ', 'Equalizer', 'Parametric EQ', 'Graphic EQ', 'Tone Control'],
37
67
  },
38
68
  {
39
- description: 'Adjust tone and sculpt frequencies.',
40
- value: PluginCategoryEffect.Filter,
41
69
  name: 'Filter',
42
- tags: ['Filter'],
70
+ value: PluginCategoryEffect.Filter,
71
+ description: 'Sculpt sound using frequency filtering.',
72
+ tags: ['Filter', 'Lowpass', 'Highpass', 'Bandpass', 'Notch', 'Resonant', 'Auto Filter'],
73
+ },
74
+ {
75
+ name: 'Modulation',
76
+ value: PluginCategoryEffect.Modulation,
77
+ description: 'Create motion, width, and modulation.',
78
+ tags: ['Modulation', 'Chorus', 'Flanger', 'Phaser', 'Tremolo', 'Vibrato', 'Rotary', 'Ensemble'],
43
79
  },
44
80
  {
45
- description: 'Create depth with echoes, ambience, and space.',
81
+ name: 'Pitch',
82
+ value: PluginCategoryEffect.Pitch,
83
+ description: 'Pitch shifting and harmonic processing.',
84
+ tags: ['Pitch', 'Pitch Shifter', 'Harmonizer', 'Vocoder', 'Octaver', 'Formant'],
85
+ },
86
+ {
87
+ name: 'Reverb',
46
88
  value: PluginCategoryEffect.Reverb,
47
- name: 'Reverb/Delay',
48
- tags: ['Reverb', 'Delay'],
89
+ description: 'Simulate space, depth, and ambience.',
90
+ tags: ['Reverb', 'Room', 'Hall', 'Plate', 'Spring', 'Convolution', 'Ambience'],
91
+ },
92
+ {
93
+ name: 'Spatial',
94
+ value: PluginCategoryEffect.Spatial,
95
+ description: 'Stereo positioning and spatial control.',
96
+ tags: ['Spatial', 'Stereo', 'Panner', 'Width', 'Imager', 'Mid/Side', 'Binaural'],
97
+ },
98
+ {
99
+ name: 'Utility',
100
+ value: PluginCategoryEffect.Utility,
101
+ description: 'Analysis, routing, and signal tools.',
102
+ tags: ['Utility', 'Gain', 'Trim', 'Analyzer', 'Meter', 'Phase', 'Mono', 'Polarity'],
49
103
  },
50
104
  ];
51
105
  export const pluginCategoryInstruments = [
52
106
  {
53
- description: '',
54
- value: PluginCategoryInstrument.Drums,
107
+ name: 'Bass',
108
+ value: PluginCategoryInstrument.Bass,
109
+ description: 'Bass instruments.',
110
+ tags: ['Bass'],
111
+ },
112
+ {
113
+ name: 'Brass',
114
+ value: PluginCategoryInstrument.Brass,
115
+ description: 'Brass instruments.',
116
+ tags: ['Brass'],
117
+ },
118
+ {
55
119
  name: 'Drums',
56
- tags: ['Drums', 'Percussion'],
120
+ value: PluginCategoryInstrument.Drum,
121
+ description: 'Drum and percussion instruments.',
122
+ tags: ['Drums', 'Drum Kit', 'Percussion'],
123
+ },
124
+ {
125
+ name: 'FX Instrument',
126
+ value: PluginCategoryInstrument.Fx,
127
+ description: 'Sound-effect or experimental instruments.',
128
+ tags: ['FX', 'Sound Effects'],
57
129
  },
58
130
  {
59
- description: '',
60
- value: PluginCategoryInstrument.Guitar,
61
131
  name: 'Guitar',
62
- tags: ['Guitar', 'String'],
132
+ value: PluginCategoryInstrument.Guitar,
133
+ description: 'Guitar instruments.',
134
+ tags: ['Guitar'],
135
+ },
136
+ {
137
+ name: 'Piano / Keys',
138
+ value: PluginCategoryInstrument.Piano,
139
+ description: 'Piano and keyboard instruments.',
140
+ tags: ['Piano', 'Keys', 'Keyboard'],
63
141
  },
64
142
  {
65
- description: '',
66
- value: PluginCategoryInstrument.Keys,
67
- name: 'Keys',
68
- tags: ['Keys', 'Piano'],
143
+ name: 'Sampler',
144
+ value: PluginCategoryInstrument.Sampler,
145
+ description: 'Sample-based instruments.',
146
+ tags: ['Sampler', 'Sample'],
69
147
  },
70
148
  {
71
- description: '',
72
- value: PluginCategoryInstrument.Orchestral,
73
- name: 'Orchestral',
74
- tags: ['Orchestral', 'Orchestra', 'Strings', 'Woodwind', 'Brass'],
149
+ name: 'Strings',
150
+ value: PluginCategoryInstrument.Strings,
151
+ description: 'String instruments.',
152
+ tags: ['Strings', 'String Ensemble'],
75
153
  },
76
154
  {
77
- description: '',
78
- value: PluginCategoryInstrument.Samplers,
79
- name: 'Samplers',
80
- tags: ['Samplers', 'Sampler', 'Sample'],
155
+ name: 'Synth',
156
+ value: PluginCategoryInstrument.Synth,
157
+ description: 'Sound synthesis instruments.',
158
+ tags: ['Synth', 'Synthesizer'],
81
159
  },
82
160
  {
83
- description: '',
84
- value: PluginCategoryInstrument.Synths,
85
- name: 'Synths',
86
- tags: ['Synths', 'Synth', 'Synthesizer'],
161
+ name: 'Voice',
162
+ value: PluginCategoryInstrument.Voice,
163
+ description: 'Vocal and choir instruments.',
164
+ tags: ['Voice', 'Vocal', 'Choir'],
87
165
  },
88
166
  {
89
- description: '',
90
- value: PluginCategoryInstrument.Vocals,
91
- name: 'Vocals',
92
- tags: ['Vocals'],
167
+ name: 'Woodwinds',
168
+ value: PluginCategoryInstrument.Woodwinds,
169
+ description: 'Woodwind instruments.',
170
+ tags: ['Woodwinds'],
93
171
  },
94
172
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-audio-stack/core",
3
- "version": "0.1.46",
3
+ "version": "0.1.48",
4
4
  "description": "Open-source audio plugin management software",
5
5
  "type": "module",
6
6
  "main": "./build/index.js",