@gorilla-engine-sdk/ge-session-presets-lib 0.5.13
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/LICENSE.md +64 -0
- package/README.md +316 -0
- package/dist/PresetManager.d.ts +80 -0
- package/dist/PresetManager.js +590 -0
- package/dist/SessionAndPresetErrors.d.ts +3 -0
- package/dist/SessionAndPresetErrors.js +94 -0
- package/dist/SessionAndPresetsWrapper.d.ts +23 -0
- package/dist/SessionAndPresetsWrapper.js +182 -0
- package/dist/defaultSessionAndPresetsConfig.d.ts +2 -0
- package/dist/defaultSessionAndPresetsConfig.js +18 -0
- package/dist/defaultSessionAndPresetsState.d.ts +2 -0
- package/dist/defaultSessionAndPresetsState.js +11 -0
- package/dist/errors/SessionAndPresetsError.d.ts +73 -0
- package/dist/errors/SessionAndPresetsError.js +88 -0
- package/dist/hooks/useSessionAndPresets.d.ts +125 -0
- package/dist/hooks/useSessionAndPresets.js +339 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +30 -0
- package/dist/state/SessionAndPresetsState.d.ts +118 -0
- package/dist/state/SessionAndPresetsState.js +105 -0
- package/dist/state/SessionAndPresetsStateProvider.d.ts +57 -0
- package/dist/state/SessionAndPresetsStateProvider.js +131 -0
- package/dist/types/IPresetManager.d.ts +266 -0
- package/dist/types/IPresetManager.js +3 -0
- package/dist/types/Preset.d.ts +39 -0
- package/dist/types/Preset.js +3 -0
- package/dist/types/SessionAndPresetsConfig.d.ts +96 -0
- package/dist/types/SessionAndPresetsConfig.js +3 -0
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.js +9 -0
- package/package.json +48 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PresetManager = void 0;
|
|
4
|
+
const { platform } = require('os');
|
|
5
|
+
const fs = require("fs-extra");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const crypto = require("crypto");
|
|
8
|
+
const SessionAndPresetsError_1 = require("./errors/SessionAndPresetsError");
|
|
9
|
+
const utils_1 = require("./utils/utils");
|
|
10
|
+
const _1 = require(".");
|
|
11
|
+
class PresetManager {
|
|
12
|
+
config;
|
|
13
|
+
state;
|
|
14
|
+
_isLoadingSession = false;
|
|
15
|
+
get isLoadingSession() {
|
|
16
|
+
return this._isLoadingSession;
|
|
17
|
+
}
|
|
18
|
+
_loadedSession = false;
|
|
19
|
+
get loadedSession() {
|
|
20
|
+
return this._loadedSession;
|
|
21
|
+
}
|
|
22
|
+
get sessionInvolved() {
|
|
23
|
+
return this._isLoadingSession || this._loadedSession;
|
|
24
|
+
}
|
|
25
|
+
_isDirtySessionLoad = false;
|
|
26
|
+
get isDirtySessionLoad() {
|
|
27
|
+
return this._isDirtySessionLoad;
|
|
28
|
+
}
|
|
29
|
+
set isDirtySessionLoad(dirty) {
|
|
30
|
+
if (this.config.debug)
|
|
31
|
+
console.log(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: set isDirtySessionLoad: ${dirty}`);
|
|
32
|
+
this._isDirtySessionLoad = dirty;
|
|
33
|
+
}
|
|
34
|
+
_sessionCount = 0;
|
|
35
|
+
get sessionCount() {
|
|
36
|
+
return this._sessionCount;
|
|
37
|
+
}
|
|
38
|
+
incrementSessionCount() {
|
|
39
|
+
this._sessionCount++;
|
|
40
|
+
}
|
|
41
|
+
constructor(config) {
|
|
42
|
+
this.config = config;
|
|
43
|
+
}
|
|
44
|
+
setState(state) {
|
|
45
|
+
this.state = state;
|
|
46
|
+
}
|
|
47
|
+
getInstrument() {
|
|
48
|
+
return this.state?.instrument;
|
|
49
|
+
}
|
|
50
|
+
saveSession(additionalStateString, preset) {
|
|
51
|
+
if (this.config.debug)
|
|
52
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: saveSession`);
|
|
53
|
+
if (!this.getInstrument()) {
|
|
54
|
+
if (this.config.debug)
|
|
55
|
+
console.log(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: No Instrument Loaded!!!`);
|
|
56
|
+
return additionalStateString;
|
|
57
|
+
}
|
|
58
|
+
if (!this.state) {
|
|
59
|
+
return additionalStateString;
|
|
60
|
+
}
|
|
61
|
+
let stateToSave = this.createPreset(true);
|
|
62
|
+
if (this.config.retainUIScale) {
|
|
63
|
+
try {
|
|
64
|
+
stateToSave['uiScale'] = GorillaEngine.UI.getControlById('root')['uiScale'];
|
|
65
|
+
}
|
|
66
|
+
catch (err) { }
|
|
67
|
+
}
|
|
68
|
+
// add the current preset path to session
|
|
69
|
+
stateToSave['preset'] = preset?.filePath;
|
|
70
|
+
if (this.config.debug)
|
|
71
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: saveSession stateToSave['preset']: ${stateToSave['preset']}`);
|
|
72
|
+
stateToSave['workingState'] = {
|
|
73
|
+
presetChanged: this.state.presetChanged,
|
|
74
|
+
presetChangeLog: this.state.presetChangeLog,
|
|
75
|
+
};
|
|
76
|
+
/// no sessionId yet? -> generate uuid and save
|
|
77
|
+
if (!this.state.sessionId) {
|
|
78
|
+
const uuid = crypto.randomUUID();
|
|
79
|
+
if (this.config.debug)
|
|
80
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: saveSession no sessionId generated yet, use ${uuid}`);
|
|
81
|
+
Object.assign(this.state, { sessionId: uuid });
|
|
82
|
+
}
|
|
83
|
+
/// always add to save
|
|
84
|
+
Object.assign(stateToSave, { sessionId: this.state.sessionId });
|
|
85
|
+
const additionalState = JSON.parse(additionalStateString);
|
|
86
|
+
Object.assign(additionalState, stateToSave);
|
|
87
|
+
for (const hookIn of this._additionalSaveSession)
|
|
88
|
+
hookIn(this.getInstrument(), additionalState);
|
|
89
|
+
return JSON.stringify(additionalState);
|
|
90
|
+
}
|
|
91
|
+
registerLoadSession(stateString) {
|
|
92
|
+
return stateString;
|
|
93
|
+
}
|
|
94
|
+
async loadSession(stateJSON) {
|
|
95
|
+
if (this.config.debug)
|
|
96
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: loadSession`);
|
|
97
|
+
this._isDirtySessionLoad = false;
|
|
98
|
+
try {
|
|
99
|
+
this._isLoadingSession = true;
|
|
100
|
+
for (const hookIn of this._additionalPreLoadSession)
|
|
101
|
+
await hookIn(this.getInstrument(), stateJSON);
|
|
102
|
+
if (this.config.debug)
|
|
103
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: loadSession - FINISHED PRE-HOOK-INS`);
|
|
104
|
+
await this.loadPreset(stateJSON, undefined, true);
|
|
105
|
+
let midiAssignments = stateJSON['additionalState']?.midiAssignments;
|
|
106
|
+
if (midiAssignments && this.getInstrument())
|
|
107
|
+
this.getInstrument().setMIDICCstate(midiAssignments);
|
|
108
|
+
for (const hookIn of this._additionalLoadSession)
|
|
109
|
+
await hookIn(this.getInstrument(), stateJSON, this._isDirtySessionLoad);
|
|
110
|
+
if (this.config.retainUIScale && stateJSON['uiScale'])
|
|
111
|
+
try {
|
|
112
|
+
GorillaEngine.UI.getControlById('root')['uiScale'] = stateJSON['uiScale'];
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
console.error(err);
|
|
116
|
+
}
|
|
117
|
+
this._isLoadingSession = false;
|
|
118
|
+
this._loadedSession = true;
|
|
119
|
+
if (this.config.debug)
|
|
120
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: loadSession - FINISHED`);
|
|
121
|
+
return stateJSON;
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
this._isLoadingSession = false;
|
|
125
|
+
this._loadedSession = false;
|
|
126
|
+
if (this.config.debug)
|
|
127
|
+
console.error(err);
|
|
128
|
+
if (err instanceof SessionAndPresetsError_1.SessionAndPresetsError)
|
|
129
|
+
throw err;
|
|
130
|
+
else
|
|
131
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.loadingSession, 'Error loading session!', `The session could not be restored. ${err}`, { cause: err });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async loadPresets(dirs) {
|
|
135
|
+
if (this.config.debug)
|
|
136
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: loadPresets`);
|
|
137
|
+
const presets = [];
|
|
138
|
+
const lp = async (dir, baseDir) => {
|
|
139
|
+
try {
|
|
140
|
+
fs.ensureDirSync(dir.path, {
|
|
141
|
+
recursive: true,
|
|
142
|
+
});
|
|
143
|
+
const files = await fs.readdir(dir.path);
|
|
144
|
+
if (!files.length)
|
|
145
|
+
return;
|
|
146
|
+
for (const file of files) {
|
|
147
|
+
const fullPath = path.join(dir.path, file);
|
|
148
|
+
if (fs.lstatSync(fullPath).isDirectory()) {
|
|
149
|
+
await lp({
|
|
150
|
+
path: fullPath,
|
|
151
|
+
type: dir.type,
|
|
152
|
+
additionalData: dir.additionalData,
|
|
153
|
+
}, baseDir);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
if (path.basename(fullPath, path.extname(fullPath)) !== '.DS_Store') {
|
|
157
|
+
const preset = await this.createPresetItem(file, dir, dir.path, baseDir);
|
|
158
|
+
presets.push(preset);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err instanceof SessionAndPresetsError_1.SessionAndPresetsError)
|
|
165
|
+
throw err;
|
|
166
|
+
else
|
|
167
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.presetsLoading, 'Presets Loading Error!!', `An error occured trying to load presets. ${err}`, { cause: err });
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
for (const dir of dirs)
|
|
171
|
+
await lp(dir, dir.path);
|
|
172
|
+
return presets;
|
|
173
|
+
}
|
|
174
|
+
async createPresetItem(file, dir, presetsDir, baseDir) {
|
|
175
|
+
let category;
|
|
176
|
+
if (presetsDir.replace(baseDir, '') !== '') {
|
|
177
|
+
category = presetsDir
|
|
178
|
+
.replace(baseDir, '')
|
|
179
|
+
.substring(1)
|
|
180
|
+
.replace(platform() === 'win32' ? /\\/g : '/', '|');
|
|
181
|
+
}
|
|
182
|
+
const fullPath = path.join(presetsDir, file);
|
|
183
|
+
const preset = {
|
|
184
|
+
uuid: (0, utils_1.createHash)(fullPath),
|
|
185
|
+
type: dir.type,
|
|
186
|
+
filePath: fullPath,
|
|
187
|
+
fileName: path.basename(fullPath),
|
|
188
|
+
name: `${path.basename(fullPath, path.extname(fullPath))}`,
|
|
189
|
+
subFolderPath: presetsDir.replace(baseDir, '').substring(1),
|
|
190
|
+
category: category,
|
|
191
|
+
additionalData: structuredClone(dir.additionalData),
|
|
192
|
+
};
|
|
193
|
+
for (const hookIn of this._additionalCreatePresetItem)
|
|
194
|
+
await hookIn(preset);
|
|
195
|
+
return preset;
|
|
196
|
+
}
|
|
197
|
+
/*
|
|
198
|
+
PRESET LOADING
|
|
199
|
+
*/
|
|
200
|
+
async loadPreset(presetObj, presetItem, sessionRestore = false, isInitialPreset = false) {
|
|
201
|
+
if (this.config.debug)
|
|
202
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: loadPreset sessionRestore: ${sessionRestore} isInitialPreset: ${isInitialPreset} - START`);
|
|
203
|
+
for (const hookIn of this._additionalPreLoadPreset) {
|
|
204
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
205
|
+
this.isDirtySessionLoad = true;
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
await hookIn(this.getInstrument(), presetObj, presetItem, sessionRestore);
|
|
209
|
+
}
|
|
210
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
211
|
+
this.isDirtySessionLoad = true;
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
this.applyPresetInstrumentState(this.getInstrument(), presetObj.dsp_settings, sessionRestore, isInitialPreset);
|
|
215
|
+
for (const hookIn of this._additionalLoadPreset) {
|
|
216
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
217
|
+
this.isDirtySessionLoad = true;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
await hookIn(this.getInstrument(), presetObj, sessionRestore);
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
async loadPresetFromSource(source, isInitialPreset = false, instStateToRetain) {
|
|
225
|
+
// chack if youre (filePath) exists
|
|
226
|
+
if (await fs.exists(source)) {
|
|
227
|
+
// Find preset
|
|
228
|
+
const preset = this.state.presets.find((item) => item.filePath === source);
|
|
229
|
+
// Read preset file
|
|
230
|
+
const fileAsString = await fs.readFile(source, 'utf8');
|
|
231
|
+
const parsedPreset = JSON.parse(fileAsString);
|
|
232
|
+
if (isInitialPreset && this.sessionInvolved)
|
|
233
|
+
return;
|
|
234
|
+
for (const hookIn of this._additionalPreLoadPresetFromSource) {
|
|
235
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
236
|
+
this.isDirtySessionLoad = true;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
await hookIn(this.getInstrument(), preset, parsedPreset, isInitialPreset);
|
|
240
|
+
}
|
|
241
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
242
|
+
this.isDirtySessionLoad = true;
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
if (instStateToRetain && instStateToRetain.length > 0) {
|
|
246
|
+
const dspSettings = parsedPreset['dsp_settings'];
|
|
247
|
+
for (let i = 0; i < instStateToRetain.length; i++) {
|
|
248
|
+
const findItem = (item) => item.key === instStateToRetain[i].key;
|
|
249
|
+
const parsedPresetItem = dspSettings.find(findItem);
|
|
250
|
+
// if it does not exist in preset data, add it. Could be a property not flagged to retain
|
|
251
|
+
if (!parsedPresetItem) {
|
|
252
|
+
dspSettings.push(instStateToRetain[i]);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const itemIndex = dspSettings.findIndex(findItem);
|
|
256
|
+
dspSettings[itemIndex] = instStateToRetain[i];
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
await this.loadPreset(parsedPreset, preset, false, isInitialPreset);
|
|
261
|
+
for (const hookIn of this._additionalLoadPresetFromSource) {
|
|
262
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
263
|
+
this.isDirtySessionLoad = true;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
await hookIn(this.getInstrument(), preset, parsedPreset, isInitialPreset);
|
|
267
|
+
}
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.presetFileNotFound, `Unable to load preset!`, `The preset to be loaded could not be found. ${source}`, { source: source });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/*
|
|
275
|
+
PRESET CREATION
|
|
276
|
+
*/
|
|
277
|
+
createPreset(sessionRestore = false) {
|
|
278
|
+
//if(this.config.debug) console.debug(`PresetManager: createPreset sessionRestore: ${sessionRestore}`);
|
|
279
|
+
try {
|
|
280
|
+
// the preset object
|
|
281
|
+
const presetObj = {
|
|
282
|
+
general: this.createPresetHeader(),
|
|
283
|
+
dsp_settings: this.createPresetInstrumentState(this.getInstrument(), sessionRestore),
|
|
284
|
+
};
|
|
285
|
+
for (const hookIn of this._additionalCreatePreset)
|
|
286
|
+
hookIn(this.getInstrument(), presetObj, sessionRestore);
|
|
287
|
+
return presetObj;
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (this.config.debug)
|
|
291
|
+
console.error(err);
|
|
292
|
+
if (err instanceof SessionAndPresetsError_1.SessionAndPresetsError)
|
|
293
|
+
throw err;
|
|
294
|
+
else
|
|
295
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.presetCreation, 'Presets Creation Error!', `An error occured trying to create the preset. ${err}`, { cause: err, sessionRestore: sessionRestore });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
createPresetHeader() {
|
|
299
|
+
return {
|
|
300
|
+
pluginVersion: GorillaEngine.getBuildInformation().version,
|
|
301
|
+
buildNumber: GorillaEngine.getBuildInformation().buildNumber,
|
|
302
|
+
manufacturer: GorillaEngine.getManufacturerName(),
|
|
303
|
+
pluginName: GorillaEngine.getPluginName(),
|
|
304
|
+
date: new Date(),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
createPresetInstrumentState(instrument, sessionRestore) {
|
|
308
|
+
const instState = [];
|
|
309
|
+
for (const key in this.getInstrument()) {
|
|
310
|
+
const p = this.getInstrument()[key];
|
|
311
|
+
if (p instanceof Function) {
|
|
312
|
+
}
|
|
313
|
+
else if (p !== undefined && p !== null) {
|
|
314
|
+
if (p.persistence &&
|
|
315
|
+
(sessionRestore ? p.persistence.saveInSession : p.persistence.saveInPreset)) {
|
|
316
|
+
const saveProps = this.getInstrumentParam(this.getInstrument(), key, sessionRestore);
|
|
317
|
+
if (saveProps)
|
|
318
|
+
instState.push(saveProps);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
return instState;
|
|
323
|
+
}
|
|
324
|
+
getInstrumentParam(instrument, key, sessionRestore) {
|
|
325
|
+
const p = this.getInstrument()[key];
|
|
326
|
+
if (p.persistence &&
|
|
327
|
+
(sessionRestore ? p.persistence.saveInSession : p.persistence.saveInPreset)) {
|
|
328
|
+
const saveProps = {
|
|
329
|
+
key: key,
|
|
330
|
+
controlType: p.controlType,
|
|
331
|
+
normValue: p.normValue,
|
|
332
|
+
value: p.value,
|
|
333
|
+
valueText: p.text,
|
|
334
|
+
maxValue: p.maxValue,
|
|
335
|
+
minValue: p.minValue,
|
|
336
|
+
resolution: p.resolution,
|
|
337
|
+
};
|
|
338
|
+
if (p.steps.length > 0) {
|
|
339
|
+
saveProps['isArray'] = true;
|
|
340
|
+
saveProps['stepsLength'] = p.steps.length;
|
|
341
|
+
}
|
|
342
|
+
for (const hookIn of this._additionalGetInstrumentParam)
|
|
343
|
+
hookIn(this.getInstrument(), key, saveProps, sessionRestore);
|
|
344
|
+
return saveProps;
|
|
345
|
+
}
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
applyPresetInstrumentState(instrument, instStateFromPreset, sessionRestore, isInitialPreset = false) {
|
|
349
|
+
if (this.config.debug)
|
|
350
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: applyPresetInstrumentState sessionRestore: ${sessionRestore} isLoadingSession: ${this._isLoadingSession} loadedSession: ${this._loadedSession}`);
|
|
351
|
+
if (!Array.isArray(instStateFromPreset)) {
|
|
352
|
+
if (this.config.debug)
|
|
353
|
+
console.error(`PresetManager: applyPresetInstrumentState - malformed state`);
|
|
354
|
+
if (this.config.debug)
|
|
355
|
+
console.error(instStateFromPreset);
|
|
356
|
+
/*throw new SessionAndPresetsError(
|
|
357
|
+
SessionAndPresetsErrorTypes.presetInstrumentFormat,
|
|
358
|
+
'Preset Format Error',
|
|
359
|
+
`The instrument state ot this preset is not compatible with the parsing alogrithm! `
|
|
360
|
+
);*/
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
let startedRecalling = false;
|
|
364
|
+
try {
|
|
365
|
+
const recallFirst = Object.keys(this.getInstrument()).filter((prop) => this.getInstrument()[prop].persistence &&
|
|
366
|
+
(sessionRestore
|
|
367
|
+
? this.getInstrument()[prop].persistence.saveInSession
|
|
368
|
+
: this.getInstrument()[prop].persistence.saveInPreset) &&
|
|
369
|
+
this.getInstrument()[prop].persistence.recallFirst);
|
|
370
|
+
const recallLast = Object.keys(this.getInstrument()).filter((prop) => this.getInstrument()[prop].persistence &&
|
|
371
|
+
(sessionRestore
|
|
372
|
+
? this.getInstrument()[prop].persistence.saveInSession
|
|
373
|
+
: this.getInstrument()[prop].persistence.saveInPreset) &&
|
|
374
|
+
this.getInstrument()[prop].persistence.recallLast);
|
|
375
|
+
this.getInstrument().startRecallingParameterState();
|
|
376
|
+
startedRecalling = true;
|
|
377
|
+
for (const param of recallFirst) {
|
|
378
|
+
this.setInstrumentParam(this.getInstrument(), instStateFromPreset, param, sessionRestore, isInitialPreset);
|
|
379
|
+
}
|
|
380
|
+
for (const key in this.getInstrument()) {
|
|
381
|
+
if (this.getInstrument()[key] instanceof Function) {
|
|
382
|
+
}
|
|
383
|
+
else if (!recallFirst.find((k) => k === key) && !recallLast.find((k) => k === key)) {
|
|
384
|
+
this.setInstrumentParam(this.getInstrument(), instStateFromPreset, key, sessionRestore, isInitialPreset);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
for (const param of recallLast) {
|
|
388
|
+
this.setInstrumentParam(this.getInstrument(), instStateFromPreset, param, sessionRestore, isInitialPreset);
|
|
389
|
+
}
|
|
390
|
+
this.getInstrument().endRecallingParameterState();
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
if (this.getInstrument() && startedRecalling)
|
|
394
|
+
this.getInstrument().endRecallingParameterState();
|
|
395
|
+
if (this.config.debug)
|
|
396
|
+
console.error(err);
|
|
397
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.applyInstrumentState, 'Error Applying Instrument State!', `Could not apply instrument state stored in preset.`, { cause: err, instStateFromPreset: instStateFromPreset });
|
|
398
|
+
}
|
|
399
|
+
if (this.config.debug)
|
|
400
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: applyPresetInstrumentState sessionRestore: ${sessionRestore} isLoadingSession: ${this._isLoadingSession} loadedSession: ${this._loadedSession} - FINISHED`);
|
|
401
|
+
}
|
|
402
|
+
setInstrumentParam(instrument, instStateFromPreset, key, sessionRestore, isInitialPreset = false) {
|
|
403
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
404
|
+
this.isDirtySessionLoad = true;
|
|
405
|
+
if (this.config.debug)
|
|
406
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: setInstrumentParam sessionRestore: ${sessionRestore} isLoadingSession: ${this._isLoadingSession} loadedSession: ${this._loadedSession} - ABORT & FLAG SESSION DIRTY`);
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
const instProperty = this.getInstrument()[key];
|
|
410
|
+
if (!instProperty)
|
|
411
|
+
return;
|
|
412
|
+
if (instProperty.persistence &&
|
|
413
|
+
(sessionRestore
|
|
414
|
+
? instProperty.persistence.saveInSession
|
|
415
|
+
: instProperty.persistence.saveInPreset)) {
|
|
416
|
+
const presetProperty = instStateFromPreset.find((item) => item.key === key);
|
|
417
|
+
if (presetProperty && Object.keys(presetProperty).length === 4) {
|
|
418
|
+
// old preset format
|
|
419
|
+
instProperty.normValueAsync = presetProperty.value;
|
|
420
|
+
}
|
|
421
|
+
else if (presetProperty) {
|
|
422
|
+
// if key exists in preset
|
|
423
|
+
if (presetProperty.isArray) {
|
|
424
|
+
// if property contains array/steps
|
|
425
|
+
const valueIndex = instProperty.steps.indexOf(presetProperty.valueText);
|
|
426
|
+
if (valueIndex >= 0) {
|
|
427
|
+
// found in array
|
|
428
|
+
instProperty.valueAsync = valueIndex;
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
instProperty.normValueAsync = presetProperty.normValue;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
else if (instProperty.minValue !== presetProperty.minValue ||
|
|
435
|
+
instProperty.maxValue !== presetProperty.maxValue) {
|
|
436
|
+
// min or max value differ between inst & preset, set value instead of normValue FOR NOW!
|
|
437
|
+
instProperty.valueAsync = presetProperty.value;
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
instProperty.normValueAsync = presetProperty.normValue;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
else {
|
|
444
|
+
// if not exist in preset, write default value
|
|
445
|
+
instProperty.normValueAsync = instProperty.defaultValue;
|
|
446
|
+
}
|
|
447
|
+
for (const hookIn of this._additionalSetInstrumentParam) {
|
|
448
|
+
if (isInitialPreset && this.sessionInvolved) {
|
|
449
|
+
this.isDirtySessionLoad = true;
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
hookIn(this.getInstrument(), key, presetProperty, sessionRestore);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
/*
|
|
457
|
+
SAVING & DELETING OF PRESET
|
|
458
|
+
*/
|
|
459
|
+
async savePreset(filePath) {
|
|
460
|
+
const fileObj = {
|
|
461
|
+
filePath: filePath,
|
|
462
|
+
};
|
|
463
|
+
if (this.config.debug)
|
|
464
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: savePreset filePath: ${fileObj.filePath}`);
|
|
465
|
+
for (const hookIn of this._additionalPreSavePreset)
|
|
466
|
+
await hookIn(this.getInstrument(), fileObj);
|
|
467
|
+
const preset = await this.createPreset(false);
|
|
468
|
+
try {
|
|
469
|
+
await fs.outputFile(filePath, JSON.stringify(preset));
|
|
470
|
+
for (const hookIn of this._additionalSavePreset)
|
|
471
|
+
await hookIn(this.getInstrument(), preset, fileObj);
|
|
472
|
+
}
|
|
473
|
+
catch (err) {
|
|
474
|
+
if (err instanceof SessionAndPresetsError_1.SessionAndPresetsError)
|
|
475
|
+
throw err;
|
|
476
|
+
else
|
|
477
|
+
throw new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.presetSaving, 'Presets Saving Error!', `The preset could not be saved. ${filePath} ${err}`, { cause: err, filePath: filePath, preset: preset });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
async saveAsPreset(filePath) { }
|
|
481
|
+
async deletePreset(filePath) {
|
|
482
|
+
if (this.config.debug)
|
|
483
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} PresetManager: deletePreset filePath: ${filePath}`);
|
|
484
|
+
fs.unlinkSync(filePath);
|
|
485
|
+
//if (this._additionalDeletePreset) await this._additionalDeletePreset(instrument)
|
|
486
|
+
}
|
|
487
|
+
/*
|
|
488
|
+
Additional Hook-In Logic
|
|
489
|
+
*/
|
|
490
|
+
_additionalSaveSession = [];
|
|
491
|
+
setAdditionalSaveSession(additionalSaveSession) {
|
|
492
|
+
this._additionalSaveSession.push(additionalSaveSession);
|
|
493
|
+
}
|
|
494
|
+
removeAdditionalSaveSession(additionalSaveSession) {
|
|
495
|
+
this._additionalSaveSession.splice(this._additionalSaveSession.indexOf(additionalSaveSession), 1);
|
|
496
|
+
}
|
|
497
|
+
_additionalPreLoadSession = [];
|
|
498
|
+
setAdditionalPreLoadSession(additionalPreLoadSession) {
|
|
499
|
+
this._additionalPreLoadSession.push(additionalPreLoadSession);
|
|
500
|
+
}
|
|
501
|
+
removeAdditionalPreLoadSession(additionalPreLoadSession) {
|
|
502
|
+
this._additionalPreLoadSession.splice(this._additionalPreLoadSession.indexOf(additionalPreLoadSession), 1);
|
|
503
|
+
}
|
|
504
|
+
_additionalLoadSession = [];
|
|
505
|
+
setAdditionalLoadSession(additionalLoadSession) {
|
|
506
|
+
this._additionalLoadSession.push(additionalLoadSession);
|
|
507
|
+
}
|
|
508
|
+
removeAdditionalLoadSession(additionalLoadSession) {
|
|
509
|
+
this._additionalLoadSession.splice(this._additionalLoadSession.indexOf(additionalLoadSession), 1);
|
|
510
|
+
}
|
|
511
|
+
_additionalCreatePresetItem = [];
|
|
512
|
+
setAdditionalCreatePresetItem(additionalCreatePresetItem) {
|
|
513
|
+
this._additionalCreatePresetItem.push(additionalCreatePresetItem);
|
|
514
|
+
}
|
|
515
|
+
removeAdditionalCreatePresetItem(additionalCreatePresetItem) {
|
|
516
|
+
this._additionalCreatePresetItem.splice(this._additionalCreatePresetItem.indexOf(additionalCreatePresetItem), 1);
|
|
517
|
+
}
|
|
518
|
+
_additionalPreLoadPreset = [];
|
|
519
|
+
setAdditionalPreLoadPreset(additionalPreLoadPreset) {
|
|
520
|
+
this._additionalPreLoadPreset.push(additionalPreLoadPreset);
|
|
521
|
+
}
|
|
522
|
+
removeAdditionalPreLoadPreset(additionalPreLoadPreset) {
|
|
523
|
+
this._additionalPreLoadPreset.splice(this._additionalPreLoadPreset.indexOf(additionalPreLoadPreset), 1);
|
|
524
|
+
}
|
|
525
|
+
_additionalLoadPreset = [];
|
|
526
|
+
setAdditionalLoadPreset(additionalLoadPreset) {
|
|
527
|
+
this._additionalLoadPreset.push(additionalLoadPreset);
|
|
528
|
+
}
|
|
529
|
+
removeAdditionalLoadPreset(additionalLoadPreset) {
|
|
530
|
+
this._additionalLoadPreset.splice(this._additionalLoadPreset.indexOf(additionalLoadPreset), 1);
|
|
531
|
+
}
|
|
532
|
+
_additionalPreLoadPresetFromSource = [];
|
|
533
|
+
setAdditionalPreLoadPresetFromSource(additionalPreLoadPresetFromSource) {
|
|
534
|
+
this._additionalPreLoadPresetFromSource.push(additionalPreLoadPresetFromSource);
|
|
535
|
+
}
|
|
536
|
+
removeAdditionalPreLoadPresetFromSource(additionalPreLoadPresetFromSource) {
|
|
537
|
+
this._additionalPreLoadPresetFromSource.splice(this._additionalPreLoadPresetFromSource.indexOf(additionalPreLoadPresetFromSource), 1);
|
|
538
|
+
}
|
|
539
|
+
_additionalLoadPresetFromSource = [];
|
|
540
|
+
setAdditionalLoadPresetFromSource(additionalLoadPresetFromSource) {
|
|
541
|
+
this._additionalLoadPresetFromSource.push(additionalLoadPresetFromSource);
|
|
542
|
+
}
|
|
543
|
+
removeAdditionalLoadPresetFromSource(additionalLoadPresetFromSource) {
|
|
544
|
+
this._additionalLoadPresetFromSource.splice(this._additionalLoadPresetFromSource.indexOf(additionalLoadPresetFromSource), 1);
|
|
545
|
+
}
|
|
546
|
+
_additionalCreatePreset = [];
|
|
547
|
+
setAdditionalCreatePreset(additionalCreatePreset) {
|
|
548
|
+
this._additionalCreatePreset.push(additionalCreatePreset);
|
|
549
|
+
}
|
|
550
|
+
removeAdditionalCreatePreset(additionalCreatePreset) {
|
|
551
|
+
this._additionalCreatePreset.splice(this._additionalCreatePreset.indexOf(additionalCreatePreset), 1);
|
|
552
|
+
}
|
|
553
|
+
_additionalGetInstrumentParam = [];
|
|
554
|
+
setAdditionalGetInstrumentParam(additionalGetInstrumentParam) {
|
|
555
|
+
this._additionalGetInstrumentParam.push(additionalGetInstrumentParam);
|
|
556
|
+
}
|
|
557
|
+
removeAdditionalGetInstrumentParam(additionalGetInstrumentParam) {
|
|
558
|
+
this._additionalGetInstrumentParam.splice(this._additionalGetInstrumentParam.indexOf(additionalGetInstrumentParam), 1);
|
|
559
|
+
}
|
|
560
|
+
_additionalSetInstrumentParam = [];
|
|
561
|
+
setAdditionalSetInstrumentParam(additionalSetInstrumentParam) {
|
|
562
|
+
this._additionalSetInstrumentParam.push(additionalSetInstrumentParam);
|
|
563
|
+
}
|
|
564
|
+
removeAdditionalSetInstrumentParam(additionalSetInstrumentParam) {
|
|
565
|
+
this._additionalSetInstrumentParam.splice(this._additionalSetInstrumentParam.indexOf(additionalSetInstrumentParam), 1);
|
|
566
|
+
}
|
|
567
|
+
_additionalPreSavePreset = [];
|
|
568
|
+
setAdditionalPreSavePreset(additionalPreSavePreset) {
|
|
569
|
+
this._additionalPreSavePreset.push(additionalPreSavePreset);
|
|
570
|
+
}
|
|
571
|
+
removeAdditionalPreSavePreset(additionalPreSavePreset) {
|
|
572
|
+
this._additionalPreSavePreset.splice(this._additionalPreSavePreset.indexOf(additionalPreSavePreset), 1);
|
|
573
|
+
}
|
|
574
|
+
_additionalSavePreset = [];
|
|
575
|
+
setAdditionalSavePreset(additionalSavePreset) {
|
|
576
|
+
this._additionalSavePreset.push(additionalSavePreset);
|
|
577
|
+
}
|
|
578
|
+
removeAdditionalSavePreset(additionalSavePreset) {
|
|
579
|
+
this._additionalSavePreset.splice(this._additionalSavePreset.indexOf(additionalSavePreset), 1);
|
|
580
|
+
}
|
|
581
|
+
_additionalDeletePreset = [];
|
|
582
|
+
setAdditionalDeletePreset(additionalDeletePreset) {
|
|
583
|
+
this._additionalDeletePreset.push(additionalDeletePreset);
|
|
584
|
+
}
|
|
585
|
+
removeAdditionalDeletePreset(additionalDeletePreset) {
|
|
586
|
+
this._additionalDeletePreset.splice(this._additionalDeletePreset.indexOf(additionalDeletePreset), 1);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
exports.PresetManager = PresetManager;
|
|
590
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlc2V0TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QcmVzZXRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkMsK0JBQWdDO0FBQ2hDLDZCQUE4QjtBQUM5QixpQ0FBa0M7QUFzQmxDLDRFQUd5QztBQUN6Qyx5Q0FBMkM7QUFDM0Msd0JBQTJDO0FBRTNDLE1BQWEsYUFBYTtJQUN4QixNQUFNLENBQTBCO0lBQ2hDLEtBQUssQ0FBeUI7SUFFdEIsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBQzNDLElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFTyxjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ3hDLElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDdkQsQ0FBQztJQUVPLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUM3QyxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxrQkFBa0IsQ0FBQyxLQUFjO1FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyx5QkFBc0IsMkNBQTJDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBRU8sYUFBYSxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FB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
|