@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,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SessionAndPresetsErrors = SessionAndPresetsErrors;
|
|
37
|
+
const React = __importStar(require("react"));
|
|
38
|
+
const ge_dialogs_lib_1 = require("@gorilla-engine-sdk/ge-dialogs-lib");
|
|
39
|
+
const react_1 = require("react");
|
|
40
|
+
const SessionAndPresetsState_1 = require("./state/SessionAndPresetsState");
|
|
41
|
+
const SessionAndPresetsError_1 = require("./errors/SessionAndPresetsError");
|
|
42
|
+
const _1 = require(".");
|
|
43
|
+
function SessionAndPresetsErrors(props) {
|
|
44
|
+
const sessionAndPresetState = (0, SessionAndPresetsState_1.useSessionAndPresetsState)();
|
|
45
|
+
const defaultModalProps = {
|
|
46
|
+
width: 400,
|
|
47
|
+
height: 200,
|
|
48
|
+
title: 'An Error Occured!',
|
|
49
|
+
message: 'Error message',
|
|
50
|
+
cancelTrigger: true,
|
|
51
|
+
cancelTriggerLabel: 'Ok',
|
|
52
|
+
onCancelTrigger: onCancel,
|
|
53
|
+
approveTrigger: false,
|
|
54
|
+
closeTrigger: true,
|
|
55
|
+
};
|
|
56
|
+
const [modalProps, setModalProps] = (0, react_1.useState)({
|
|
57
|
+
...defaultModalProps,
|
|
58
|
+
});
|
|
59
|
+
const modalPropsRef = (0, react_1.useRef)(modalProps);
|
|
60
|
+
modalPropsRef.current = modalProps;
|
|
61
|
+
const [showModal, hideModal] = (0, ge_dialogs_lib_1.useModal)(() => React.createElement(ge_dialogs_lib_1.DefaultModal, { ...modalPropsRef.current }), [true, false]);
|
|
62
|
+
function onCancel() {
|
|
63
|
+
hideModal();
|
|
64
|
+
}
|
|
65
|
+
(0, react_1.useEffect)(() => {
|
|
66
|
+
const e = sessionAndPresetState.error;
|
|
67
|
+
if (e) {
|
|
68
|
+
console.error(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsErrors: useEffect [sessionAndPresetState.error] ${sessionAndPresetState.error}`);
|
|
69
|
+
if (e instanceof SessionAndPresetsError_1.SessionAndPresetsError) {
|
|
70
|
+
console.error(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsErrors: useEffect [sessionAndPresetState.error] ${e.defaultTitle} ${e.defaultMessage}`);
|
|
71
|
+
/*console.log(e);
|
|
72
|
+
console.log(e.type);
|
|
73
|
+
console.log(e.stack);*/
|
|
74
|
+
setModalProps({
|
|
75
|
+
...defaultModalProps,
|
|
76
|
+
title: e.defaultTitle,
|
|
77
|
+
message: e.defaultMessage,
|
|
78
|
+
});
|
|
79
|
+
showModal();
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const err = e;
|
|
83
|
+
setModalProps({
|
|
84
|
+
...defaultModalProps,
|
|
85
|
+
title: 'An Error occured!',
|
|
86
|
+
message: err.message,
|
|
87
|
+
});
|
|
88
|
+
showModal();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}, [sessionAndPresetState.error]);
|
|
92
|
+
return React.createElement(React.Fragment, null);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbkFuZFByZXNldEVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXNzaW9uQW5kUHJlc2V0RXJyb3JzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSwwREFpRUM7QUFuRkQsNkNBQThCO0FBRTlCLHVFQUkyQztBQUMzQyxpQ0FBbUQ7QUFDbkQsMkVBR3VDO0FBRXZDLDRFQUF3RTtBQUN4RSx3QkFBMEM7QUFJMUMsU0FBZ0IsdUJBQXVCLENBQUMsS0FBbUM7SUFDekUsTUFBTSxxQkFBcUIsR0FDekIsSUFBQSxrREFBeUIsR0FBRSxDQUFBO0lBRTdCLE1BQU0saUJBQWlCLEdBQUc7UUFDeEIsS0FBSyxFQUFFLEdBQUc7UUFDVixNQUFNLEVBQUUsR0FBRztRQUVYLEtBQUssRUFBRSxtQkFBbUI7UUFDMUIsT0FBTyxFQUFFLGVBQWU7UUFFeEIsYUFBYSxFQUFFLElBQUk7UUFDbkIsa0JBQWtCLEVBQUUsSUFBSTtRQUN4QixlQUFlLEVBQUUsUUFBUTtRQUN6QixjQUFjLEVBQUUsS0FBSztRQUNyQixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFBO0lBQ0QsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsR0FBRyxJQUFBLGdCQUFRLEVBQW9CO1FBQzlELEdBQUcsaUJBQWlCO0tBQ3JCLENBQUMsQ0FBQTtJQUVGLE1BQU0sYUFBYSxHQUFHLElBQUEsY0FBTSxFQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3hDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFBO0lBRWxDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBQSx5QkFBUSxFQUNyQyxHQUFHLEVBQUUsQ0FBQyxvQkFBQyw2QkFBWSxPQUFLLGFBQWEsQ0FBQyxPQUFPLEdBQUksRUFDakQsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQ2QsQ0FBQTtJQUNELFNBQVMsUUFBUTtRQUNmLFNBQVMsRUFBRSxDQUFBO0lBQ2IsQ0FBQztJQUVELElBQUEsaUJBQVMsRUFBQyxHQUFHLEVBQUU7UUFDYixNQUFNLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUE7UUFDckMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQ1gsR0FBRyx5QkFBc0IscUVBQXFFLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUM1SCxDQUFBO1lBQ0QsSUFBSSxDQUFDLFlBQVksK0NBQXNCLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxDQUFDLEtBQUssQ0FDWCxHQUFHLHlCQUFzQixxRUFBcUUsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQ25JLENBQUE7Z0JBQ0Q7O3VDQUV1QjtnQkFFdkIsYUFBYSxDQUFDO29CQUNaLEdBQUcsaUJBQWlCO29CQUNwQixLQUFLLEVBQUUsQ0FBQyxDQUFDLFlBQVk7b0JBQ3JCLE9BQU8sRUFBRSxDQUFDLENBQUMsY0FBYztpQkFDMUIsQ0FBQyxDQUFBO2dCQUNGLFNBQVMsRUFBRSxDQUFBO1lBQ2IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sR0FBRyxHQUFVLENBQUMsQ0FBQTtnQkFDcEIsYUFBYSxDQUFDO29CQUNaLEdBQUcsaUJBQWlCO29CQUNwQixLQUFLLEVBQUUsbUJBQW1CO29CQUMxQixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87aUJBQ3JCLENBQUMsQ0FBQTtnQkFDRixTQUFTLEVBQUUsQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUVqQyxPQUFPLHlDQUFLLENBQUE7QUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
type SessionAndPresetsWrapper = {
|
|
3
|
+
children?: React.ReactNode;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Orchestrator component that handles DAW session callbacks, preset
|
|
7
|
+
* directory scanning, file-system watching, and initial preset loading.
|
|
8
|
+
*
|
|
9
|
+
* Must be placed **inside** {@link SessionAndPresetsStateProvider}. Wrap
|
|
10
|
+
* your plugin UI with this component so that presets and sessions are ready
|
|
11
|
+
* before your UI renders.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <SessionAndPresetsStateProvider config={config} instrument={instrument}>
|
|
16
|
+
* <SessionAndPresetsWrapper>
|
|
17
|
+
* <App />
|
|
18
|
+
* </SessionAndPresetsWrapper>
|
|
19
|
+
* </SessionAndPresetsStateProvider>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function SessionAndPresetsWrapper(props: SessionAndPresetsWrapper): React.JSX.Element;
|
|
23
|
+
export default SessionAndPresetsWrapper;
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const React = __importStar(require("react"));
|
|
37
|
+
const fs = require("fs-extra");
|
|
38
|
+
const util = require('util');
|
|
39
|
+
const react_1 = require("react");
|
|
40
|
+
const SessionAndPresetsState_1 = require("./state/SessionAndPresetsState");
|
|
41
|
+
const useSessionAndPresets_1 = require("./hooks/useSessionAndPresets");
|
|
42
|
+
const SessionAndPresetErrors_1 = require("./SessionAndPresetErrors");
|
|
43
|
+
const SessionAndPresetsError_1 = require("./errors/SessionAndPresetsError");
|
|
44
|
+
const _1 = require(".");
|
|
45
|
+
/**
|
|
46
|
+
* Orchestrator component that handles DAW session callbacks, preset
|
|
47
|
+
* directory scanning, file-system watching, and initial preset loading.
|
|
48
|
+
*
|
|
49
|
+
* Must be placed **inside** {@link SessionAndPresetsStateProvider}. Wrap
|
|
50
|
+
* your plugin UI with this component so that presets and sessions are ready
|
|
51
|
+
* before your UI renders.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <SessionAndPresetsStateProvider config={config} instrument={instrument}>
|
|
56
|
+
* <SessionAndPresetsWrapper>
|
|
57
|
+
* <App />
|
|
58
|
+
* </SessionAndPresetsWrapper>
|
|
59
|
+
* </SessionAndPresetsStateProvider>
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function SessionAndPresetsWrapper(props) {
|
|
63
|
+
const sessionAndPresetState = (0, SessionAndPresetsState_1.useSessionAndPresetsState)();
|
|
64
|
+
const sessionAndPresetStateRef = (0, react_1.useRef)(sessionAndPresetState);
|
|
65
|
+
sessionAndPresetStateRef.current = sessionAndPresetState;
|
|
66
|
+
const dispatch = (0, SessionAndPresetsState_1.useSessionAndPresetsStateDispatch)();
|
|
67
|
+
const sessionAndPresetsConfig = (0, SessionAndPresetsState_1.useSessionAndPresetsConfig)();
|
|
68
|
+
const sessionAndPresetsConfigRef = (0, react_1.useRef)(sessionAndPresetsConfig);
|
|
69
|
+
sessionAndPresetsConfigRef.current = sessionAndPresetsConfig;
|
|
70
|
+
const [initialized, setInitialized] = (0, react_1.useState)(false);
|
|
71
|
+
const initializedRef = (0, react_1.useRef)(initialized);
|
|
72
|
+
initializedRef.current = initialized;
|
|
73
|
+
const presetManager = (0, SessionAndPresetsState_1.useSessionAndPresetsManager)();
|
|
74
|
+
const { saveSession, loadSession, loadPresets, loadPresetFromSource } = (0, useSessionAndPresets_1.useSessionAndPresets)();
|
|
75
|
+
/**
|
|
76
|
+
* When presetManager is ready/available.
|
|
77
|
+
* - if handleSession = true - attaches listeners for save & loadSession
|
|
78
|
+
* - sets watcher to user-preset-dir to re-load presets on changes
|
|
79
|
+
* - triggeres loadPresets logic
|
|
80
|
+
*/
|
|
81
|
+
(0, react_1.useEffect)(() => {
|
|
82
|
+
if (sessionAndPresetsConfigRef.current.debug)
|
|
83
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsWrapper: useEffect [presetManager] `);
|
|
84
|
+
if (presetManager && presetManager.config.handleSession) {
|
|
85
|
+
// Session load callback
|
|
86
|
+
GorillaEngine.setSessionLoadCallback((stateString) => {
|
|
87
|
+
if (sessionAndPresetsConfigRef.current.debug)
|
|
88
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsWrapper: GorillaEngine.setSessionLoadCallback`);
|
|
89
|
+
const session = loadSession(JSON.parse(stateString));
|
|
90
|
+
//return JSON.stringify(session)
|
|
91
|
+
return stateString;
|
|
92
|
+
}, {});
|
|
93
|
+
// Session save callback
|
|
94
|
+
GorillaEngine.setSessionSaveCallback((additionalStateString) => {
|
|
95
|
+
return saveSession(additionalStateString);
|
|
96
|
+
}, {});
|
|
97
|
+
}
|
|
98
|
+
const fb = async () => {
|
|
99
|
+
if (presetManager.config.handlePresets && presetManager.config.autoLoadPresets) {
|
|
100
|
+
const presetLoacations = [
|
|
101
|
+
{
|
|
102
|
+
type: sessionAndPresetsConfig.factoryPresetType,
|
|
103
|
+
path: sessionAndPresetsConfig.factoryPresetPath,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: sessionAndPresetsConfig.userPresetType,
|
|
107
|
+
path: sessionAndPresetsConfig.userPresetPath,
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
// load presets via hook
|
|
111
|
+
await loadPresets(presetLoacations);
|
|
112
|
+
// add watch to presets dir
|
|
113
|
+
fs.watch(sessionAndPresetsConfig.userPresetPath, { recursive: true }, (eventType, fileName) => {
|
|
114
|
+
if (!fileName.includes('.DS_Store')) {
|
|
115
|
+
// re-load content via hook
|
|
116
|
+
loadPresets(presetLoacations);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
};
|
|
122
|
+
if (presetManager) {
|
|
123
|
+
fb();
|
|
124
|
+
}
|
|
125
|
+
}, [presetManager]);
|
|
126
|
+
/**
|
|
127
|
+
* When presets are loaded
|
|
128
|
+
* - checks if we have to handle a session or a new instantiation scenario
|
|
129
|
+
* - loads session if available
|
|
130
|
+
* - otherwise loads default preset
|
|
131
|
+
*/
|
|
132
|
+
(0, react_1.useEffect)(() => {
|
|
133
|
+
if (sessionAndPresetState.presets && sessionAndPresetState.instrument) {
|
|
134
|
+
if (sessionAndPresetsConfigRef.current.debug)
|
|
135
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsWrapper: useEffect [sessionAndPresetState.presets] - presetManager.sessionInvolved: ${presetManager?.sessionInvolved}`);
|
|
136
|
+
}
|
|
137
|
+
// if already initialised we don't need to run buildup-logic
|
|
138
|
+
if (initialized)
|
|
139
|
+
return;
|
|
140
|
+
if (sessionAndPresetState.presets &&
|
|
141
|
+
sessionAndPresetState.presets.length > 0 &&
|
|
142
|
+
sessionAndPresetState.instrument &&
|
|
143
|
+
!presetManager.sessionInvolved) {
|
|
144
|
+
// if loadInitialPreset=true in config
|
|
145
|
+
if ((sessionAndPresetsConfigRef.current.loadInitialPreset && !presetManager.isLoadingSession) ||
|
|
146
|
+
!presetManager.loadedSession) {
|
|
147
|
+
// Pick the first preset as fallback
|
|
148
|
+
let initialPreset = sessionAndPresetStateRef.current.presets[0];
|
|
149
|
+
// if initialPresetPath is set & successfully validated
|
|
150
|
+
if (sessionAndPresetStateRef.current.initialPresetPath) {
|
|
151
|
+
const initialPresetPath = sessionAndPresetStateRef.current.initialPresetPath;
|
|
152
|
+
const presetItem = sessionAndPresetStateRef.current.presets.find((preset) => preset.filePath === initialPresetPath);
|
|
153
|
+
if (fs.existsSync(initialPresetPath) &&
|
|
154
|
+
presetItem &&
|
|
155
|
+
presetItem.type === sessionAndPresetsConfigRef.current.factoryPresetType) {
|
|
156
|
+
initialPreset = presetItem;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// if an initialPresetPath is provided but preset can not be found, lets inform about it!
|
|
160
|
+
const e = new SessionAndPresetsError_1.SessionAndPresetsError(SessionAndPresetsError_1.SessionAndPresetsErrorTypes.initialPresetLoading, 'Loading Initial Preset Failed!', `No preset found for initialPresetPath ${initialPresetPath}`, { path: initialPresetPath });
|
|
161
|
+
dispatch({
|
|
162
|
+
type: SessionAndPresetsState_1.SessionAndPresetsDispatchTypes.setError,
|
|
163
|
+
payload: { error: e },
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsWrapper: useEffect [sessionAndPresetState.presets] - load initial preset: ${initialPreset.filePath}`);
|
|
168
|
+
loadPresetFromSource(initialPreset.filePath, true); //await
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.debug(`${_1.GE_SESSION_PRESETS_LIB} SessionAndPresetsWrapper: useEffect [sessionAndPresetState.presets] - do nothing - presetManager.sessionInvolved: ${presetManager.sessionInvolved}`);
|
|
172
|
+
}
|
|
173
|
+
setInitialized(true);
|
|
174
|
+
}
|
|
175
|
+
}, [sessionAndPresetState.presets, sessionAndPresetState.instrument]);
|
|
176
|
+
return (React.createElement(React.Fragment, null,
|
|
177
|
+
sessionAndPresetsConfig.handleErrors && React.createElement(SessionAndPresetErrors_1.SessionAndPresetsErrors, null),
|
|
178
|
+
props.children));
|
|
179
|
+
//return <>{initialized && <>{props.children}</>}</>
|
|
180
|
+
}
|
|
181
|
+
exports.default = SessionAndPresetsWrapper;
|
|
182
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbkFuZFByZXNldHNXcmFwcGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1Nlc3Npb25BbmRQcmVzZXRzV3JhcHBlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFFL0IsK0JBQWdDO0FBRWhDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3QixpQ0FBb0Q7QUFDcEQsMkVBT3dDO0FBR3hDLHVFQUFvRTtBQUVwRSxxRUFBbUU7QUFFbkUsNEVBR3lDO0FBQ3pDLHdCQUEyQztBQU0zQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsd0JBQXdCLENBQUMsS0FBK0I7SUFDL0QsTUFBTSxxQkFBcUIsR0FBMkIsSUFBQSxrREFBeUIsR0FBRSxDQUFDO0lBQ2xGLE1BQU0sd0JBQXdCLEdBQUcsSUFBQSxjQUFNLEVBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMvRCx3QkFBd0IsQ0FBQyxPQUFPLEdBQUcscUJBQXFCLENBQUM7SUFFekQsTUFBTSxRQUFRLEdBQUcsSUFBQSwwREFBaUMsR0FBRSxDQUFDO0lBRXJELE1BQU0sdUJBQXVCLEdBQTRCLElBQUEsbURBQTBCLEdBQUUsQ0FBQztJQUN0RixNQUFNLDBCQUEwQixHQUFHLElBQUEsY0FBTSxFQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDbkUsMEJBQTBCLENBQUMsT0FBTyxHQUFHLHVCQUF1QixDQUFDO0lBRTdELE1BQU0sQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEdBQUcsSUFBQSxnQkFBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE1BQU0sY0FBYyxHQUFHLElBQUEsY0FBTSxFQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzNDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO0lBRXJDLE1BQU0sYUFBYSxHQUFtQixJQUFBLG9EQUEyQixHQUFF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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultSessionAndPresetsConfig = void 0;
|
|
4
|
+
exports.defaultSessionAndPresetsConfig = {
|
|
5
|
+
presetFileSuffix: ".patch",
|
|
6
|
+
factoryPresetType: 'FACTORY',
|
|
7
|
+
userPresetType: 'USER',
|
|
8
|
+
handleSession: true,
|
|
9
|
+
handlePresets: true,
|
|
10
|
+
autoLoadPresets: true,
|
|
11
|
+
loadInitialPreset: true,
|
|
12
|
+
handleErrors: true,
|
|
13
|
+
flagPresetChanged: false,
|
|
14
|
+
retainUIScale: true,
|
|
15
|
+
blockAAXInitialSession: false,
|
|
16
|
+
debug: false
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFNlc3Npb25BbmRQcmVzZXRzQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2RlZmF1bHRTZXNzaW9uQW5kUHJlc2V0c0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFYSxRQUFBLDhCQUE4QixHQUE0QjtJQUNyRSxnQkFBZ0IsRUFBRSxRQUFRO0lBQzFCLGlCQUFpQixFQUFFLFNBQVM7SUFDNUIsY0FBYyxFQUFFLE1BQU07SUFFdEIsYUFBYSxFQUFFLElBQUk7SUFDbkIsYUFBYSxFQUFFLElBQUk7SUFFbkIsZUFBZSxFQUFFLElBQUk7SUFDckIsaUJBQWlCLEVBQUUsSUFBSTtJQUN2QixZQUFZLEVBQUUsSUFBSTtJQUNsQixpQkFBaUIsRUFBQyxLQUFLO0lBRXZCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLHNCQUFzQixFQUFFLEtBQUs7SUFFN0IsS0FBSyxFQUFFLEtBQUs7Q0FDYixDQUFDIn0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultSessionAndPresetsState = void 0;
|
|
4
|
+
exports.defaultSessionAndPresetsState = {
|
|
5
|
+
presets: [],
|
|
6
|
+
presetIndex: -1,
|
|
7
|
+
presetChanged: false,
|
|
8
|
+
instrument: undefined,
|
|
9
|
+
initialPresetPath: undefined,
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFNlc3Npb25BbmRQcmVzZXRzU3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVmYXVsdFNlc3Npb25BbmRQcmVzZXRzU3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSw2QkFBNkIsR0FBMkI7SUFDbkUsT0FBTyxFQUFFLEVBQUU7SUFDWCxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2YsYUFBYSxFQUFFLEtBQUs7SUFDcEIsVUFBVSxFQUFFLFNBQVM7SUFDckIsaUJBQWlCLEVBQUUsU0FBUztDQUM3QixDQUFDIn0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enumeration of all error types that can be thrown by the session and preset
|
|
3
|
+
* management system. Use this to distinguish error categories in your error
|
|
4
|
+
* handling code.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* try {
|
|
9
|
+
* await loadPresetFromSource(filePath);
|
|
10
|
+
* } catch (err) {
|
|
11
|
+
* if (err instanceof SessionAndPresetsError) {
|
|
12
|
+
* if (err.type === SessionAndPresetsErrorTypes.presetFileNotFound) {
|
|
13
|
+
* // show "preset not found" UI
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare enum SessionAndPresetsErrorTypes {
|
|
20
|
+
/** Catch-all for errors that do not match any specific category */
|
|
21
|
+
unspecific = "unspecific",
|
|
22
|
+
/** Application-specific custom error */
|
|
23
|
+
custom = "custom",
|
|
24
|
+
/** Error while scanning or reading the preset directory */
|
|
25
|
+
presetsLoading = "presetsLoading",
|
|
26
|
+
/** Error while loading a single preset */
|
|
27
|
+
presetLoading = "presetLoading",
|
|
28
|
+
/** The instrument state stored in the preset is in an unexpected format */
|
|
29
|
+
presetInstrumentFormat = "presetInstrumentFormat",
|
|
30
|
+
/** Failed to load the initial (default) preset on startup */
|
|
31
|
+
initialPresetLoading = "initialPresetLoading",
|
|
32
|
+
/** Error while creating an in-memory preset object */
|
|
33
|
+
presetCreation = "presetCreation",
|
|
34
|
+
/** Error while writing a preset to disk */
|
|
35
|
+
presetSaving = "presetSaving",
|
|
36
|
+
/** The requested preset file does not exist at the expected path */
|
|
37
|
+
presetFileNotFound = "presetFileNotFound",
|
|
38
|
+
/** Operation attempted before an instrument was loaded */
|
|
39
|
+
noInstrumentLoaded = "noInstrumentLoaded",
|
|
40
|
+
/** Error during DAW session restore */
|
|
41
|
+
loadingSession = "loadingSession",
|
|
42
|
+
/** Failed to apply the instrument parameter state from a preset */
|
|
43
|
+
applyInstrumentState = "applyInstrumentState"
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Typed error class thrown by the session and preset management system.
|
|
47
|
+
*
|
|
48
|
+
* Every `SessionAndPresetsError` carries a {@link type} for programmatic
|
|
49
|
+
* handling, a short {@link defaultTitle} for display in error dialogs, a
|
|
50
|
+
* human-readable {@link defaultMessage}, and optional {@link details} for
|
|
51
|
+
* debugging.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* throw new SessionAndPresetsError(
|
|
56
|
+
* SessionAndPresetsErrorTypes.presetFileNotFound,
|
|
57
|
+
* 'Unable to load preset',
|
|
58
|
+
* `The preset file does not exist: ${filePath}`,
|
|
59
|
+
* { filePath }
|
|
60
|
+
* );
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class SessionAndPresetsError extends Error {
|
|
64
|
+
/** Identifies the category of error — use {@link SessionAndPresetsErrorTypes} or a custom string */
|
|
65
|
+
readonly type: SessionAndPresetsErrorTypes | string;
|
|
66
|
+
/** Short, user-facing title suitable for an error dialog header */
|
|
67
|
+
readonly defaultTitle: string;
|
|
68
|
+
/** Detailed, user-facing message describing what went wrong */
|
|
69
|
+
readonly defaultMessage: string;
|
|
70
|
+
/** Optional additional debugging context (file paths, raw error, etc.) */
|
|
71
|
+
readonly details: any;
|
|
72
|
+
constructor(type: SessionAndPresetsErrorTypes | string, defaultTitle: string, defaultMessage: string, details?: any);
|
|
73
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionAndPresetsError = exports.SessionAndPresetsErrorTypes = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Enumeration of all error types that can be thrown by the session and preset
|
|
6
|
+
* management system. Use this to distinguish error categories in your error
|
|
7
|
+
* handling code.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* try {
|
|
12
|
+
* await loadPresetFromSource(filePath);
|
|
13
|
+
* } catch (err) {
|
|
14
|
+
* if (err instanceof SessionAndPresetsError) {
|
|
15
|
+
* if (err.type === SessionAndPresetsErrorTypes.presetFileNotFound) {
|
|
16
|
+
* // show "preset not found" UI
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
var SessionAndPresetsErrorTypes;
|
|
23
|
+
(function (SessionAndPresetsErrorTypes) {
|
|
24
|
+
/** Catch-all for errors that do not match any specific category */
|
|
25
|
+
SessionAndPresetsErrorTypes["unspecific"] = "unspecific";
|
|
26
|
+
/** Application-specific custom error */
|
|
27
|
+
SessionAndPresetsErrorTypes["custom"] = "custom";
|
|
28
|
+
/** Error while scanning or reading the preset directory */
|
|
29
|
+
SessionAndPresetsErrorTypes["presetsLoading"] = "presetsLoading";
|
|
30
|
+
/** Error while loading a single preset */
|
|
31
|
+
SessionAndPresetsErrorTypes["presetLoading"] = "presetLoading";
|
|
32
|
+
/** The instrument state stored in the preset is in an unexpected format */
|
|
33
|
+
SessionAndPresetsErrorTypes["presetInstrumentFormat"] = "presetInstrumentFormat";
|
|
34
|
+
/** Failed to load the initial (default) preset on startup */
|
|
35
|
+
SessionAndPresetsErrorTypes["initialPresetLoading"] = "initialPresetLoading";
|
|
36
|
+
/** Error while creating an in-memory preset object */
|
|
37
|
+
SessionAndPresetsErrorTypes["presetCreation"] = "presetCreation";
|
|
38
|
+
/** Error while writing a preset to disk */
|
|
39
|
+
SessionAndPresetsErrorTypes["presetSaving"] = "presetSaving";
|
|
40
|
+
/** The requested preset file does not exist at the expected path */
|
|
41
|
+
SessionAndPresetsErrorTypes["presetFileNotFound"] = "presetFileNotFound";
|
|
42
|
+
/** Operation attempted before an instrument was loaded */
|
|
43
|
+
SessionAndPresetsErrorTypes["noInstrumentLoaded"] = "noInstrumentLoaded";
|
|
44
|
+
/** Error during DAW session restore */
|
|
45
|
+
SessionAndPresetsErrorTypes["loadingSession"] = "loadingSession";
|
|
46
|
+
/** Failed to apply the instrument parameter state from a preset */
|
|
47
|
+
SessionAndPresetsErrorTypes["applyInstrumentState"] = "applyInstrumentState";
|
|
48
|
+
})(SessionAndPresetsErrorTypes || (exports.SessionAndPresetsErrorTypes = SessionAndPresetsErrorTypes = {}));
|
|
49
|
+
/**
|
|
50
|
+
* Typed error class thrown by the session and preset management system.
|
|
51
|
+
*
|
|
52
|
+
* Every `SessionAndPresetsError` carries a {@link type} for programmatic
|
|
53
|
+
* handling, a short {@link defaultTitle} for display in error dialogs, a
|
|
54
|
+
* human-readable {@link defaultMessage}, and optional {@link details} for
|
|
55
|
+
* debugging.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```ts
|
|
59
|
+
* throw new SessionAndPresetsError(
|
|
60
|
+
* SessionAndPresetsErrorTypes.presetFileNotFound,
|
|
61
|
+
* 'Unable to load preset',
|
|
62
|
+
* `The preset file does not exist: ${filePath}`,
|
|
63
|
+
* { filePath }
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
class SessionAndPresetsError extends Error {
|
|
68
|
+
/** Identifies the category of error — use {@link SessionAndPresetsErrorTypes} or a custom string */
|
|
69
|
+
type;
|
|
70
|
+
/** Short, user-facing title suitable for an error dialog header */
|
|
71
|
+
defaultTitle;
|
|
72
|
+
/** Detailed, user-facing message describing what went wrong */
|
|
73
|
+
defaultMessage;
|
|
74
|
+
/** Optional additional debugging context (file paths, raw error, etc.) */
|
|
75
|
+
details;
|
|
76
|
+
constructor(type, defaultTitle, defaultMessage, details) {
|
|
77
|
+
super(defaultTitle);
|
|
78
|
+
Object.setPrototypeOf(this, SessionAndPresetsError.prototype);
|
|
79
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
80
|
+
this.name = 'SessionAndPresetsError';
|
|
81
|
+
this.type = type;
|
|
82
|
+
this.defaultTitle = defaultTitle;
|
|
83
|
+
this.defaultMessage = defaultMessage;
|
|
84
|
+
this.details = details;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.SessionAndPresetsError = SessionAndPresetsError;
|
|
88
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbkFuZFByZXNldHNFcnJvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvU2Vzc2lvbkFuZFByZXNldHNFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxJQUFZLDJCQXlCWDtBQXpCRCxXQUFZLDJCQUEyQjtJQUNyQyxtRUFBbUU7SUFDbkUsd0RBQXlCLENBQUE7SUFDekIsd0NBQXdDO0lBQ3hDLGdEQUFpQixDQUFBO0lBQ2pCLDJEQUEyRDtJQUMzRCxnRUFBaUMsQ0FBQTtJQUNqQywwQ0FBMEM7SUFDMUMsOERBQStCLENBQUE7SUFDL0IsMkVBQTJFO0lBQzNFLGdGQUFpRCxDQUFBO0lBQ2pELDZEQUE2RDtJQUM3RCw0RUFBNkMsQ0FBQTtJQUM3QyxzREFBc0Q7SUFDdEQsZ0VBQWlDLENBQUE7SUFDakMsMkNBQTJDO0lBQzNDLDREQUE2QixDQUFBO0lBQzdCLG9FQUFvRTtJQUNwRSx3RUFBeUMsQ0FBQTtJQUN6QywwREFBMEQ7SUFDMUQsd0VBQXlDLENBQUE7SUFDekMsdUNBQXVDO0lBQ3ZDLGdFQUFpQyxDQUFBO0lBQ2pDLG1FQUFtRTtJQUNuRSw0RUFBNkMsQ0FBQTtBQUMvQyxDQUFDLEVBekJXLDJCQUEyQiwyQ0FBM0IsMkJBQTJCLFFBeUJ0QztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsS0FBSztJQUMvQyxvR0FBb0c7SUFDcEYsSUFBSSxDQUF1QztJQUMzRCxtRUFBbUU7SUFDbkQsWUFBWSxDQUFTO0lBQ3JDLCtEQUErRDtJQUMvQyxjQUFjLENBQVM7SUFDdkMsMEVBQTBFO0lBQzFELE9BQU8sQ0FBTTtJQUU3QixZQUNFLElBQTBDLEVBQzFDLFlBQW9CLEVBQ3BCLGNBQXNCLEVBQ3RCLE9BQWE7UUFFYixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFcEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsSUFBSSxHQUFHLHdCQUF3QixDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWpCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0lBQ3pCLENBQUM7Q0FDRjtBQTlCRCx3REE4QkMifQ==
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Preset } from '../types/Preset';
|
|
2
|
+
/**
|
|
3
|
+
* The return value of {@link useSessionAndPresets}.
|
|
4
|
+
*
|
|
5
|
+
* Provides functions for loading and saving sessions, scanning and navigating
|
|
6
|
+
* presets, and creating or deleting user presets. All functions dispatch state
|
|
7
|
+
* updates through the {@link SessionAndPresetsStateProvider} context, so any
|
|
8
|
+
* component subscribed to that context will re-render when relevant state
|
|
9
|
+
* changes.
|
|
10
|
+
*/
|
|
11
|
+
type UseSessionAndPresetsReturnValue = {
|
|
12
|
+
/**
|
|
13
|
+
* Save Session for DAW
|
|
14
|
+
* @param additionalStateString
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
saveSession: (additionalStateString: string) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Load Session from DAW
|
|
20
|
+
* @param stateJSON
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
23
|
+
loadSession: (stateJSON: JSON) => Promise<any>;
|
|
24
|
+
/**
|
|
25
|
+
* Load Presets from an array of Directories
|
|
26
|
+
* @param dirs
|
|
27
|
+
* @returns
|
|
28
|
+
*/
|
|
29
|
+
loadPresets: (dirs: any[]) => Promise<any>;
|
|
30
|
+
/**
|
|
31
|
+
* Get preset by it's uuid
|
|
32
|
+
* @param uuid
|
|
33
|
+
* @returns
|
|
34
|
+
*/
|
|
35
|
+
getPreset: (uuid: string) => Preset;
|
|
36
|
+
/**
|
|
37
|
+
* Get the current loaded preset-item
|
|
38
|
+
* @returns the currently loaded preset item
|
|
39
|
+
*/
|
|
40
|
+
getLoadedPreset: () => Preset;
|
|
41
|
+
/**
|
|
42
|
+
* Load Preset from Object
|
|
43
|
+
* @param presetObj
|
|
44
|
+
* @param sessionRestore
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
loadPreset: (presetObj: any, sessionRestore?: boolean) => Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Load Preset from file
|
|
50
|
+
* @param filePath
|
|
51
|
+
* @param isInitialPreset
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
loadPresetFromSource: (filePath: string, isInitialPreset: boolean, instStateToRetain?: any[]) => Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Create a Preset-Object
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
59
|
+
createPreset: () => any;
|
|
60
|
+
/**
|
|
61
|
+
* Save Preset to path
|
|
62
|
+
* @param filePath Path to the new file
|
|
63
|
+
* @returns
|
|
64
|
+
*/
|
|
65
|
+
savePreset: (filePath: string) => Promise<any>;
|
|
66
|
+
saveAsPreset: (filePath: string) => Promise<any>;
|
|
67
|
+
/**
|
|
68
|
+
* Delete Preset at given path
|
|
69
|
+
* @param filePath
|
|
70
|
+
* @returns
|
|
71
|
+
*/
|
|
72
|
+
deletePreset: (filePath: string) => Promise<any>;
|
|
73
|
+
/**
|
|
74
|
+
* Reset an instrument property back to value provided by Preset
|
|
75
|
+
* @param propertyName
|
|
76
|
+
* @returns
|
|
77
|
+
*/
|
|
78
|
+
resetInstrumentProperty: (propertyName: string) => void;
|
|
79
|
+
/**
|
|
80
|
+
* Load previous Preset
|
|
81
|
+
* @returns
|
|
82
|
+
*/
|
|
83
|
+
prevPreset: () => void;
|
|
84
|
+
/**
|
|
85
|
+
* Load next Preset
|
|
86
|
+
* @returns
|
|
87
|
+
*/
|
|
88
|
+
nextPreset: () => void;
|
|
89
|
+
/**
|
|
90
|
+
* Load a random Preset
|
|
91
|
+
* @returns
|
|
92
|
+
*/
|
|
93
|
+
randomize: () => void;
|
|
94
|
+
/**
|
|
95
|
+
* Load a random preset within the same category as the current one
|
|
96
|
+
* @returns
|
|
97
|
+
*/
|
|
98
|
+
randomizeInCategory: () => void;
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Primary hook for interacting with the session and preset system.
|
|
102
|
+
*
|
|
103
|
+
* Must be called from within a component tree that is wrapped by
|
|
104
|
+
* {@link SessionAndPresetsStateProvider} and {@link SessionAndPresetsWrapper}.
|
|
105
|
+
*
|
|
106
|
+
* @returns An object with functions for session I/O and preset management.
|
|
107
|
+
* See {@link UseSessionAndPresetsReturnValue} for the full list.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```tsx
|
|
111
|
+
* function PresetToolbar() {
|
|
112
|
+
* const { prevPreset, nextPreset, getLoadedPreset } = useSessionAndPresets();
|
|
113
|
+
*
|
|
114
|
+
* return (
|
|
115
|
+
* <geLabel width={200} height={30}>
|
|
116
|
+
* <geButton x={0} width={30} height={30} text="<" onClick={prevPreset} />
|
|
117
|
+
* <geLabel x={35} width={130} height={30} text={getLoadedPreset()?.name ?? ''} />
|
|
118
|
+
* <geButton x={170} width={30} height={30} text=">" onClick={nextPreset} />
|
|
119
|
+
* </geLabel>
|
|
120
|
+
* );
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
export declare function useSessionAndPresets(): UseSessionAndPresetsReturnValue;
|
|
125
|
+
export {};
|