@drop-ai/core 0.2.0 → 0.3.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 +655 -237
- package/dist/actions/ActionRegistry.d.ts.map +1 -1
- package/dist/actions/ActionRegistry.js +7 -2
- package/dist/actions/ActionRegistry.js.map +1 -1
- package/dist/actions/types.d.ts +7 -1
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/analysis/AudioAnalyzer.d.ts +71 -0
- package/dist/analysis/AudioAnalyzer.d.ts.map +1 -0
- package/dist/analysis/AudioAnalyzer.js +569 -0
- package/dist/analysis/AudioAnalyzer.js.map +1 -0
- package/dist/audio/AudioEngine.d.ts +14 -1
- package/dist/audio/AudioEngine.d.ts.map +1 -1
- package/dist/audio/AudioEngine.js +115 -35
- package/dist/audio/AudioEngine.js.map +1 -1
- package/dist/audio/Auditioner.d.ts +104 -0
- package/dist/audio/Auditioner.d.ts.map +1 -0
- package/dist/audio/Auditioner.js +239 -0
- package/dist/audio/Auditioner.js.map +1 -0
- package/dist/audio/BWFMetadata.d.ts +116 -0
- package/dist/audio/BWFMetadata.d.ts.map +1 -0
- package/dist/audio/BWFMetadata.js +394 -0
- package/dist/audio/BWFMetadata.js.map +1 -0
- package/dist/audio/ChannelSplitter.d.ts +37 -0
- package/dist/audio/ChannelSplitter.d.ts.map +1 -0
- package/dist/audio/ChannelSplitter.js +82 -0
- package/dist/audio/ChannelSplitter.js.map +1 -0
- package/dist/audio/ExportAnalyzer.d.ts +39 -0
- package/dist/audio/ExportAnalyzer.d.ts.map +1 -0
- package/dist/audio/ExportAnalyzer.js +76 -0
- package/dist/audio/ExportAnalyzer.js.map +1 -0
- package/dist/audio/LufsNormalizer.d.ts +37 -0
- package/dist/audio/LufsNormalizer.d.ts.map +1 -0
- package/dist/audio/LufsNormalizer.js +217 -0
- package/dist/audio/LufsNormalizer.js.map +1 -0
- package/dist/audio/OfflineExporter.d.ts +1 -6
- package/dist/audio/OfflineExporter.d.ts.map +1 -1
- package/dist/audio/OfflineExporter.js +31 -10
- package/dist/audio/OfflineExporter.js.map +1 -1
- package/dist/audio/RoutingGraph.d.ts +134 -0
- package/dist/audio/RoutingGraph.d.ts.map +1 -0
- package/dist/audio/RoutingGraph.js +547 -0
- package/dist/audio/RoutingGraph.js.map +1 -0
- package/dist/audio/SampleRateConverter.d.ts +21 -0
- package/dist/audio/SampleRateConverter.d.ts.map +1 -0
- package/dist/audio/SampleRateConverter.js +84 -0
- package/dist/audio/SampleRateConverter.js.map +1 -0
- package/dist/audio/SilencePadding.d.ts +29 -0
- package/dist/audio/SilencePadding.d.ts.map +1 -0
- package/dist/audio/SilencePadding.js +86 -0
- package/dist/audio/SilencePadding.js.map +1 -0
- package/dist/audio/SourceCache.d.ts +13 -16
- package/dist/audio/SourceCache.d.ts.map +1 -1
- package/dist/audio/SourceCache.js +21 -33
- package/dist/audio/SourceCache.js.map +1 -1
- package/dist/audio/engine/Declick.d.ts +98 -0
- package/dist/audio/engine/Declick.d.ts.map +1 -0
- package/dist/audio/engine/Declick.js +204 -0
- package/dist/audio/engine/Declick.js.map +1 -0
- package/dist/audio/engine/DiskIO.d.ts +172 -0
- package/dist/audio/engine/DiskIO.d.ts.map +1 -0
- package/dist/audio/engine/DiskIO.js +384 -0
- package/dist/audio/engine/DiskIO.js.map +1 -0
- package/dist/audio/engine/LatencyCompensator.d.ts +46 -0
- package/dist/audio/engine/LatencyCompensator.d.ts.map +1 -0
- package/dist/audio/engine/LatencyCompensator.js +84 -0
- package/dist/audio/engine/LatencyCompensator.js.map +1 -0
- package/dist/audio/engine/MultiTrackRecorder.d.ts +146 -0
- package/dist/audio/engine/MultiTrackRecorder.d.ts.map +1 -0
- package/dist/audio/engine/MultiTrackRecorder.js +359 -0
- package/dist/audio/engine/MultiTrackRecorder.js.map +1 -0
- package/dist/audio/engine/PlaylistEngine.d.ts.map +1 -1
- package/dist/audio/engine/PlaylistEngine.js +9 -2
- package/dist/audio/engine/PlaylistEngine.js.map +1 -1
- package/dist/audio/engine/PunchRecordManager.d.ts +113 -0
- package/dist/audio/engine/PunchRecordManager.d.ts.map +1 -0
- package/dist/audio/engine/PunchRecordManager.js +191 -0
- package/dist/audio/engine/PunchRecordManager.js.map +1 -0
- package/dist/audio/engine/RoutingGraph.d.ts +135 -0
- package/dist/audio/engine/RoutingGraph.d.ts.map +1 -0
- package/dist/audio/engine/RoutingGraph.js +436 -0
- package/dist/audio/engine/RoutingGraph.js.map +1 -0
- package/dist/audio/engine/SidechainRouter.d.ts +139 -0
- package/dist/audio/engine/SidechainRouter.d.ts.map +1 -0
- package/dist/audio/engine/SidechainRouter.js +292 -0
- package/dist/audio/engine/SidechainRouter.js.map +1 -0
- package/dist/audio/engine/XrunTracker.d.ts +71 -0
- package/dist/audio/engine/XrunTracker.d.ts.map +1 -0
- package/dist/audio/engine/XrunTracker.js +118 -0
- package/dist/audio/engine/XrunTracker.js.map +1 -0
- package/dist/audio/export/CDMarkerExporter.d.ts +62 -0
- package/dist/audio/export/CDMarkerExporter.d.ts.map +1 -0
- package/dist/audio/export/CDMarkerExporter.js +164 -0
- package/dist/audio/export/CDMarkerExporter.js.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts +121 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.js +522 -0
- package/dist/audio/export/ExportGraphBuilder.js.map +1 -0
- package/dist/audio/export/ExportPresetManager.d.ts +87 -0
- package/dist/audio/export/ExportPresetManager.d.ts.map +1 -0
- package/dist/audio/export/ExportPresetManager.js +306 -0
- package/dist/audio/export/ExportPresetManager.js.map +1 -0
- package/dist/commands/handlers/RegionHandler.d.ts.map +1 -1
- package/dist/commands/handlers/RegionHandler.js +25 -1
- package/dist/commands/handlers/RegionHandler.js.map +1 -1
- package/dist/commands/handlers/TrackHandler.js +1 -1
- package/dist/commands/handlers/TrackHandler.js.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.d.ts.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.js +37 -36
- package/dist/commands/impl/FreezeTrackCommand.js.map +1 -1
- package/dist/commands/impl/SetRegionTimeDomainCommand.d.ts.map +1 -1
- package/dist/commands/impl/SetRegionTimeDomainCommand.js +3 -3
- package/dist/commands/impl/SetRegionTimeDomainCommand.js.map +1 -1
- package/dist/commands/impl/ToggleLoopCommand.d.ts +1 -0
- package/dist/commands/impl/ToggleLoopCommand.d.ts.map +1 -1
- package/dist/commands/impl/ToggleLoopCommand.js +10 -0
- package/dist/commands/impl/ToggleLoopCommand.js.map +1 -1
- package/dist/commands/impl/TrimRegionCommand.d.ts +14 -1
- package/dist/commands/impl/TrimRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/TrimRegionCommand.js +138 -33
- package/dist/commands/impl/TrimRegionCommand.js.map +1 -1
- package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts +27 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js +69 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts +28 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js +69 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts +27 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.js +77 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.js.map +1 -0
- package/dist/commands/types.d.ts +19 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +21 -0
- package/dist/commands/types.js.map +1 -1
- package/dist/domain/Crossfade.d.ts +78 -0
- package/dist/domain/Crossfade.d.ts.map +1 -0
- package/dist/domain/Crossfade.js +216 -0
- package/dist/domain/Crossfade.js.map +1 -0
- package/dist/domain/ExportConfig.d.ts +98 -1
- package/dist/domain/ExportConfig.d.ts.map +1 -1
- package/dist/domain/ExportConfig.js +154 -1
- package/dist/domain/ExportConfig.js.map +1 -1
- package/dist/domain/ExportPreset.d.ts +62 -0
- package/dist/domain/ExportPreset.d.ts.map +1 -0
- package/dist/domain/ExportPreset.js +79 -0
- package/dist/domain/ExportPreset.js.map +1 -0
- package/dist/domain/ImportStatus.d.ts +40 -0
- package/dist/domain/ImportStatus.d.ts.map +1 -0
- package/dist/domain/ImportStatus.js +86 -0
- package/dist/domain/ImportStatus.js.map +1 -0
- package/dist/domain/Playlist.d.ts +72 -0
- package/dist/domain/Playlist.d.ts.map +1 -1
- package/dist/domain/Playlist.js +231 -6
- package/dist/domain/Playlist.js.map +1 -1
- package/dist/domain/Region.d.ts +76 -0
- package/dist/domain/Region.d.ts.map +1 -1
- package/dist/domain/Region.js +234 -1
- package/dist/domain/Region.js.map +1 -1
- package/dist/domain/Route.d.ts +43 -3
- package/dist/domain/Route.d.ts.map +1 -1
- package/dist/domain/Route.js +92 -6
- package/dist/domain/Route.js.map +1 -1
- package/dist/domain/Session.d.ts +31 -0
- package/dist/domain/Session.d.ts.map +1 -1
- package/dist/domain/Session.js +70 -0
- package/dist/domain/Session.js.map +1 -1
- package/dist/domain/Source.d.ts +145 -1
- package/dist/domain/Source.d.ts.map +1 -1
- package/dist/domain/Source.js +144 -1
- package/dist/domain/Source.js.map +1 -1
- package/dist/domain/ThawList.d.ts +37 -0
- package/dist/domain/ThawList.d.ts.map +1 -0
- package/dist/domain/ThawList.js +73 -0
- package/dist/domain/ThawList.js.map +1 -0
- package/dist/domain/Track.d.ts +93 -1
- package/dist/domain/Track.d.ts.map +1 -1
- package/dist/domain/Track.js +136 -0
- package/dist/domain/Track.js.map +1 -1
- package/dist/domain/TriggerBox.d.ts +123 -0
- package/dist/domain/TriggerBox.d.ts.map +1 -0
- package/dist/domain/TriggerBox.js +430 -0
- package/dist/domain/TriggerBox.js.map +1 -0
- package/dist/domain/VCATrack.d.ts +64 -1
- package/dist/domain/VCATrack.d.ts.map +1 -1
- package/dist/domain/VCATrack.js +128 -1
- package/dist/domain/VCATrack.js.map +1 -1
- package/dist/domain/VideoExportConfig.d.ts +117 -0
- package/dist/domain/VideoExportConfig.d.ts.map +1 -0
- package/dist/domain/VideoExportConfig.js +244 -0
- package/dist/domain/VideoExportConfig.js.map +1 -0
- package/dist/domain/VideoExportStatus.d.ts +89 -0
- package/dist/domain/VideoExportStatus.d.ts.map +1 -0
- package/dist/domain/VideoExportStatus.js +192 -0
- package/dist/domain/VideoExportStatus.js.map +1 -0
- package/dist/domain/VideoMetadata.d.ts +46 -0
- package/dist/domain/VideoMetadata.d.ts.map +1 -0
- package/dist/domain/VideoMetadata.js +2 -0
- package/dist/domain/VideoMetadata.js.map +1 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/temporal/TempoMap.d.ts +199 -2
- package/dist/domain/temporal/TempoMap.d.ts.map +1 -1
- package/dist/domain/temporal/TempoMap.js +464 -30
- package/dist/domain/temporal/TempoMap.js.map +1 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ThawList.d.ts +100 -0
- package/dist/lib/ThawList.d.ts.map +1 -0
- package/dist/lib/ThawList.js +153 -0
- package/dist/lib/ThawList.js.map +1 -0
- package/dist/midi/MidiFileParser.d.ts +33 -0
- package/dist/midi/MidiFileParser.d.ts.map +1 -0
- package/dist/midi/MidiFileParser.js +246 -0
- package/dist/midi/MidiFileParser.js.map +1 -0
- package/dist/midi/MidiFileWriter.d.ts +31 -0
- package/dist/midi/MidiFileWriter.d.ts.map +1 -0
- package/dist/midi/MidiFileWriter.js +160 -0
- package/dist/midi/MidiFileWriter.js.map +1 -0
- package/dist/midi/MidiImporter.d.ts +37 -0
- package/dist/midi/MidiImporter.d.ts.map +1 -0
- package/dist/midi/MidiImporter.js +62 -0
- package/dist/midi/MidiImporter.js.map +1 -0
- package/dist/plugins/PluginPresetManager.d.ts +86 -0
- package/dist/plugins/PluginPresetManager.d.ts.map +1 -0
- package/dist/plugins/PluginPresetManager.js +140 -0
- package/dist/plugins/PluginPresetManager.js.map +1 -0
- package/dist/processing/IO.d.ts +15 -1
- package/dist/processing/IO.d.ts.map +1 -1
- package/dist/processing/IO.js +29 -1
- package/dist/processing/IO.js.map +1 -1
- package/dist/processing/InternalSend.d.ts +104 -0
- package/dist/processing/InternalSend.d.ts.map +1 -0
- package/dist/processing/InternalSend.js +175 -0
- package/dist/processing/InternalSend.js.map +1 -0
- package/dist/processing/MeterDSP.d.ts +166 -0
- package/dist/processing/MeterDSP.d.ts.map +1 -0
- package/dist/processing/MeterDSP.js +754 -0
- package/dist/processing/MeterDSP.js.map +1 -0
- package/dist/processing/Panner.d.ts +145 -0
- package/dist/processing/Panner.d.ts.map +1 -0
- package/dist/processing/Panner.js +281 -0
- package/dist/processing/Panner.js.map +1 -0
- package/dist/processing/PluginInsert.d.ts +56 -1
- package/dist/processing/PluginInsert.d.ts.map +1 -1
- package/dist/processing/PluginInsert.js +180 -2
- package/dist/processing/PluginInsert.js.map +1 -1
- package/dist/processing/Processor.d.ts +38 -0
- package/dist/processing/Processor.d.ts.map +1 -1
- package/dist/processing/Processor.js +60 -1
- package/dist/processing/Processor.js.map +1 -1
- package/dist/processing/SurroundPanner.d.ts +122 -0
- package/dist/processing/SurroundPanner.d.ts.map +1 -0
- package/dist/processing/SurroundPanner.js +376 -0
- package/dist/processing/SurroundPanner.js.map +1 -0
- package/dist/processing/TruePeakLimiter.d.ts +34 -0
- package/dist/processing/TruePeakLimiter.d.ts.map +1 -0
- package/dist/processing/TruePeakLimiter.js +144 -0
- package/dist/processing/TruePeakLimiter.js.map +1 -0
- package/dist/storage/ExportPresetStorage.d.ts +33 -0
- package/dist/storage/ExportPresetStorage.d.ts.map +1 -0
- package/dist/storage/ExportPresetStorage.js +121 -0
- package/dist/storage/ExportPresetStorage.js.map +1 -0
- package/dist/storage/SessionArchive.d.ts +73 -0
- package/dist/storage/SessionArchive.d.ts.map +1 -0
- package/dist/storage/SessionArchive.js +211 -0
- package/dist/storage/SessionArchive.js.map +1 -0
- package/dist/storage/SessionTemplate.d.ts +74 -5
- package/dist/storage/SessionTemplate.d.ts.map +1 -1
- package/dist/storage/SessionTemplate.js +247 -53
- package/dist/storage/SessionTemplate.js.map +1 -1
- package/dist/utils/BwfMetadataWriter.d.ts +42 -0
- package/dist/utils/BwfMetadataWriter.d.ts.map +1 -0
- package/dist/utils/BwfMetadataWriter.js +131 -0
- package/dist/utils/BwfMetadataWriter.js.map +1 -0
- package/dist/utils/FilenameTemplate.d.ts +40 -0
- package/dist/utils/FilenameTemplate.d.ts.map +1 -0
- package/dist/utils/FilenameTemplate.js +78 -0
- package/dist/utils/FilenameTemplate.js.map +1 -0
- package/dist/utils/Logger.d.ts +28 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +46 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/Mp4ChapterGenerator.d.ts +17 -0
- package/dist/utils/Mp4ChapterGenerator.d.ts.map +1 -0
- package/dist/utils/Mp4ChapterGenerator.js +33 -0
- package/dist/utils/Mp4ChapterGenerator.js.map +1 -0
- package/dist/utils/OggEncoder.d.ts +20 -20
- package/dist/utils/OggEncoder.d.ts.map +1 -1
- package/dist/utils/OggEncoder.js +114 -50
- package/dist/utils/OggEncoder.js.map +1 -1
- package/dist/utils/TocGenerator.d.ts +17 -0
- package/dist/utils/TocGenerator.d.ts.map +1 -0
- package/dist/utils/TocGenerator.js +47 -0
- package/dist/utils/TocGenerator.js.map +1 -0
- package/package.json +7 -8
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { ExportPreset, getBuiltInPresets } from '../domain/ExportPreset';
|
|
2
|
+
const DB_NAME = 'drop-ai-daw';
|
|
3
|
+
const DB_VERSION = 2;
|
|
4
|
+
const PRESETS_STORE = 'exportPresets';
|
|
5
|
+
/**
|
|
6
|
+
* IndexedDB storage for export presets.
|
|
7
|
+
* Follows the same pattern as SessionStorage.
|
|
8
|
+
*/
|
|
9
|
+
export class ExportPresetStorage {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.dbPromise = null;
|
|
12
|
+
}
|
|
13
|
+
static getInstance() {
|
|
14
|
+
if (!ExportPresetStorage.instance) {
|
|
15
|
+
ExportPresetStorage.instance = new ExportPresetStorage();
|
|
16
|
+
}
|
|
17
|
+
return ExportPresetStorage.instance;
|
|
18
|
+
}
|
|
19
|
+
openDB() {
|
|
20
|
+
if (this.dbPromise)
|
|
21
|
+
return this.dbPromise;
|
|
22
|
+
this.dbPromise = new Promise((resolve, reject) => {
|
|
23
|
+
const request = indexedDB.open(DB_NAME, DB_VERSION);
|
|
24
|
+
request.onupgradeneeded = (event) => {
|
|
25
|
+
const db = request.result;
|
|
26
|
+
const oldVersion = event.oldVersion;
|
|
27
|
+
// Existing stores from version 1
|
|
28
|
+
if (oldVersion < 1) {
|
|
29
|
+
if (!db.objectStoreNames.contains('sessions')) {
|
|
30
|
+
const sessionsStore = db.createObjectStore('sessions', { keyPath: 'id' });
|
|
31
|
+
sessionsStore.createIndex('name', 'name', { unique: false });
|
|
32
|
+
sessionsStore.createIndex('modified', 'modified', { unique: false });
|
|
33
|
+
}
|
|
34
|
+
if (!db.objectStoreNames.contains('snapshots')) {
|
|
35
|
+
const snapshotsStore = db.createObjectStore('snapshots', { keyPath: 'id' });
|
|
36
|
+
snapshotsStore.createIndex('sessionId', 'sessionId', { unique: false });
|
|
37
|
+
snapshotsStore.createIndex('created', 'created', { unique: false });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// New store for version 2
|
|
41
|
+
if (oldVersion < 2) {
|
|
42
|
+
if (!db.objectStoreNames.contains(PRESETS_STORE)) {
|
|
43
|
+
const presetsStore = db.createObjectStore(PRESETS_STORE, { keyPath: 'id' });
|
|
44
|
+
presetsStore.createIndex('name', 'name', { unique: false });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
request.onsuccess = () => resolve(request.result);
|
|
49
|
+
request.onerror = () => {
|
|
50
|
+
this.dbPromise = null;
|
|
51
|
+
reject(request.error);
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
return this.dbPromise;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Save a user preset.
|
|
58
|
+
*/
|
|
59
|
+
async savePreset(preset) {
|
|
60
|
+
const db = await this.openDB();
|
|
61
|
+
const record = preset.toJSON();
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const tx = db.transaction(PRESETS_STORE, 'readwrite');
|
|
64
|
+
tx.objectStore(PRESETS_STORE).put(record);
|
|
65
|
+
tx.oncomplete = () => resolve();
|
|
66
|
+
tx.onerror = () => reject(tx.error);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load a preset by ID.
|
|
71
|
+
*/
|
|
72
|
+
async loadPreset(id) {
|
|
73
|
+
const db = await this.openDB();
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
const tx = db.transaction(PRESETS_STORE, 'readonly');
|
|
76
|
+
const request = tx.objectStore(PRESETS_STORE).get(id);
|
|
77
|
+
request.onsuccess = () => {
|
|
78
|
+
const record = request.result;
|
|
79
|
+
resolve(record ? ExportPreset.fromJSON(record) : null);
|
|
80
|
+
};
|
|
81
|
+
request.onerror = () => reject(request.error);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* List all saved user presets.
|
|
86
|
+
*/
|
|
87
|
+
async listPresets() {
|
|
88
|
+
const db = await this.openDB();
|
|
89
|
+
return new Promise((resolve, reject) => {
|
|
90
|
+
const tx = db.transaction(PRESETS_STORE, 'readonly');
|
|
91
|
+
const request = tx.objectStore(PRESETS_STORE).getAll();
|
|
92
|
+
request.onsuccess = () => {
|
|
93
|
+
var _a;
|
|
94
|
+
const records = ((_a = request.result) !== null && _a !== void 0 ? _a : []);
|
|
95
|
+
resolve(records.map(r => ExportPreset.fromJSON(r)));
|
|
96
|
+
};
|
|
97
|
+
request.onerror = () => reject(request.error);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get all presets (built-in + user).
|
|
102
|
+
*/
|
|
103
|
+
async getAllPresets() {
|
|
104
|
+
const builtIn = getBuiltInPresets();
|
|
105
|
+
const userPresets = await this.listPresets();
|
|
106
|
+
return [...builtIn, ...userPresets];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Delete a user preset by ID.
|
|
110
|
+
*/
|
|
111
|
+
async deletePreset(id) {
|
|
112
|
+
const db = await this.openDB();
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
const tx = db.transaction(PRESETS_STORE, 'readwrite');
|
|
115
|
+
tx.objectStore(PRESETS_STORE).delete(id);
|
|
116
|
+
tx.oncomplete = () => resolve();
|
|
117
|
+
tx.onerror = () => reject(tx.error);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=ExportPresetStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportPresetStorage.js","sourceRoot":"","sources":["../../src/storage/ExportPresetStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Signal } from '../lib/Signal';
|
|
2
|
+
/**
|
|
3
|
+
* SessionArchive packages a session and all its referenced audio files
|
|
4
|
+
* into a single downloadable archive.
|
|
5
|
+
*
|
|
6
|
+
* In the browser context, this creates a custom binary bundle containing:
|
|
7
|
+
* - session.json (the serialized session state)
|
|
8
|
+
* - audio sources (all source audio files as blobs)
|
|
9
|
+
* - metadata.json (archive metadata)
|
|
10
|
+
*
|
|
11
|
+
* Binary format:
|
|
12
|
+
* [4 bytes magic: "DRPA"]
|
|
13
|
+
* [4 bytes version: 1]
|
|
14
|
+
* [4 bytes metadata JSON length]
|
|
15
|
+
* [metadata JSON]
|
|
16
|
+
* [4 bytes session JSON length]
|
|
17
|
+
* [session JSON]
|
|
18
|
+
* [4 bytes source count]
|
|
19
|
+
* For each source:
|
|
20
|
+
* [4 bytes name length]
|
|
21
|
+
* [name UTF-8]
|
|
22
|
+
* [4 bytes blob size]
|
|
23
|
+
* [blob data]
|
|
24
|
+
*/
|
|
25
|
+
export interface ArchiveMetadata {
|
|
26
|
+
version: string;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
sessionName: string;
|
|
29
|
+
sourceCount: number;
|
|
30
|
+
totalSize: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ExtractedArchive {
|
|
33
|
+
sessionData: string;
|
|
34
|
+
sources: Array<{
|
|
35
|
+
name: string;
|
|
36
|
+
blob: Blob;
|
|
37
|
+
}>;
|
|
38
|
+
metadata: ArchiveMetadata;
|
|
39
|
+
}
|
|
40
|
+
export declare class SessionArchive {
|
|
41
|
+
readonly progress: Signal<number>;
|
|
42
|
+
/**
|
|
43
|
+
* Create an archive from session data and audio sources.
|
|
44
|
+
*
|
|
45
|
+
* @param sessionData JSON string of the serialized session.
|
|
46
|
+
* @param sources Array of audio sources to include.
|
|
47
|
+
* @param metadata Optional metadata overrides.
|
|
48
|
+
* @returns A Blob containing the packed archive.
|
|
49
|
+
*/
|
|
50
|
+
createArchive(sessionData: string, sources: Array<{
|
|
51
|
+
name: string;
|
|
52
|
+
url: string;
|
|
53
|
+
blob: Blob;
|
|
54
|
+
}>, metadata?: Partial<ArchiveMetadata>): Promise<Blob>;
|
|
55
|
+
/**
|
|
56
|
+
* Extract an archive into session data and audio blobs.
|
|
57
|
+
*
|
|
58
|
+
* @param archiveBlob The archive Blob to extract.
|
|
59
|
+
* @returns The extracted session data, sources, and metadata.
|
|
60
|
+
* @throws Error if the archive format is invalid.
|
|
61
|
+
*/
|
|
62
|
+
extractArchive(archiveBlob: Blob): Promise<ExtractedArchive>;
|
|
63
|
+
/**
|
|
64
|
+
* Get archive info without fully extracting all sources.
|
|
65
|
+
* Only reads the header and metadata section.
|
|
66
|
+
*
|
|
67
|
+
* @param archiveBlob The archive Blob to inspect.
|
|
68
|
+
* @returns The archive metadata.
|
|
69
|
+
* @throws Error if the archive format is invalid.
|
|
70
|
+
*/
|
|
71
|
+
getArchiveInfo(archiveBlob: Blob): Promise<ArchiveMetadata>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=SessionArchive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionArchive.d.ts","sourceRoot":"","sources":["../../src/storage/SessionArchive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,CAAC;IAC7C,QAAQ,EAAE,eAAe,CAAC;CAC7B;AAMD,qBAAa,cAAc;IACvB,SAAgB,QAAQ,iBAAwB;IAEhD;;;;;;;OAOG;IACG,aAAa,CACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,IAAI,CAAA;KAAE,CAAC,EACzD,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GACpC,OAAO,CAAC,IAAI,CAAC;IAyGhB;;;;;;OAMG;IACG,cAAc,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8ElE;;;;;;;OAOG;IACG,cAAc,CAAC,WAAW,EAAE,IAAI,GAAG,OAAO,CAAC,eAAe,CAAC;CAwCpE"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { Signal } from '../lib/Signal';
|
|
2
|
+
/** Magic bytes identifying a drop.ai archive: "DRPA" */
|
|
3
|
+
const ARCHIVE_MAGIC = new Uint8Array([0x44, 0x52, 0x50, 0x41]); // "DRPA"
|
|
4
|
+
const ARCHIVE_FORMAT_VERSION = 1;
|
|
5
|
+
export class SessionArchive {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.progress = new Signal();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create an archive from session data and audio sources.
|
|
11
|
+
*
|
|
12
|
+
* @param sessionData JSON string of the serialized session.
|
|
13
|
+
* @param sources Array of audio sources to include.
|
|
14
|
+
* @param metadata Optional metadata overrides.
|
|
15
|
+
* @returns A Blob containing the packed archive.
|
|
16
|
+
*/
|
|
17
|
+
async createArchive(sessionData, sources, metadata) {
|
|
18
|
+
var _a, _b, _c;
|
|
19
|
+
this.progress.emit(0);
|
|
20
|
+
const encoder = new TextEncoder();
|
|
21
|
+
// Convert all source blobs to ArrayBuffers up front
|
|
22
|
+
const sourceBuffers = [];
|
|
23
|
+
let totalSourceSize = 0;
|
|
24
|
+
for (let i = 0; i < sources.length; i++) {
|
|
25
|
+
const data = await sources[i].blob.arrayBuffer();
|
|
26
|
+
sourceBuffers.push({ name: sources[i].name, data });
|
|
27
|
+
totalSourceSize += data.byteLength;
|
|
28
|
+
this.progress.emit((i + 1) / (sources.length + 2) * 0.5);
|
|
29
|
+
}
|
|
30
|
+
// Build metadata
|
|
31
|
+
const sessionBytes = encoder.encode(sessionData);
|
|
32
|
+
const archiveMetadata = {
|
|
33
|
+
version: (_a = metadata === null || metadata === void 0 ? void 0 : metadata.version) !== null && _a !== void 0 ? _a : '1.0.0',
|
|
34
|
+
createdAt: (_b = metadata === null || metadata === void 0 ? void 0 : metadata.createdAt) !== null && _b !== void 0 ? _b : new Date().toISOString(),
|
|
35
|
+
sessionName: (_c = metadata === null || metadata === void 0 ? void 0 : metadata.sessionName) !== null && _c !== void 0 ? _c : 'Untitled Session',
|
|
36
|
+
sourceCount: sources.length,
|
|
37
|
+
totalSize: 0, // Will be computed after assembly
|
|
38
|
+
};
|
|
39
|
+
const metadataBytes = encoder.encode(JSON.stringify(archiveMetadata));
|
|
40
|
+
// Calculate total size:
|
|
41
|
+
// 4 (magic) + 4 (version) +
|
|
42
|
+
// 4 (metadata len) + metadata +
|
|
43
|
+
// 4 (session len) + session +
|
|
44
|
+
// 4 (source count) +
|
|
45
|
+
// for each source: 4 (name len) + name + 4 (blob size) + blob
|
|
46
|
+
let totalSize = 4 + 4 + 4 + metadataBytes.byteLength + 4 + sessionBytes.byteLength + 4;
|
|
47
|
+
for (const src of sourceBuffers) {
|
|
48
|
+
const nameBytes = encoder.encode(src.name);
|
|
49
|
+
totalSize += 4 + nameBytes.byteLength + 4 + src.data.byteLength;
|
|
50
|
+
}
|
|
51
|
+
// Update metadata with actual total size and re-encode
|
|
52
|
+
archiveMetadata.totalSize = totalSize;
|
|
53
|
+
const finalMetadataBytes = encoder.encode(JSON.stringify(archiveMetadata));
|
|
54
|
+
// Recalculate if metadata size changed
|
|
55
|
+
const sizeDiff = finalMetadataBytes.byteLength - metadataBytes.byteLength;
|
|
56
|
+
totalSize += sizeDiff;
|
|
57
|
+
this.progress.emit(0.6);
|
|
58
|
+
// Assemble the archive buffer
|
|
59
|
+
const buffer = new ArrayBuffer(totalSize);
|
|
60
|
+
const view = new DataView(buffer);
|
|
61
|
+
const bytes = new Uint8Array(buffer);
|
|
62
|
+
let offset = 0;
|
|
63
|
+
// Magic: "DRPA"
|
|
64
|
+
bytes.set(ARCHIVE_MAGIC, offset);
|
|
65
|
+
offset += 4;
|
|
66
|
+
// Format version
|
|
67
|
+
view.setUint32(offset, ARCHIVE_FORMAT_VERSION, true);
|
|
68
|
+
offset += 4;
|
|
69
|
+
// Metadata JSON length + data
|
|
70
|
+
view.setUint32(offset, finalMetadataBytes.byteLength, true);
|
|
71
|
+
offset += 4;
|
|
72
|
+
bytes.set(finalMetadataBytes, offset);
|
|
73
|
+
offset += finalMetadataBytes.byteLength;
|
|
74
|
+
// Session JSON length + data
|
|
75
|
+
view.setUint32(offset, sessionBytes.byteLength, true);
|
|
76
|
+
offset += 4;
|
|
77
|
+
bytes.set(sessionBytes, offset);
|
|
78
|
+
offset += sessionBytes.byteLength;
|
|
79
|
+
// Source count
|
|
80
|
+
view.setUint32(offset, sourceBuffers.length, true);
|
|
81
|
+
offset += 4;
|
|
82
|
+
this.progress.emit(0.7);
|
|
83
|
+
// Each source
|
|
84
|
+
for (let i = 0; i < sourceBuffers.length; i++) {
|
|
85
|
+
const src = sourceBuffers[i];
|
|
86
|
+
const nameBytes = encoder.encode(src.name);
|
|
87
|
+
// Name length + name
|
|
88
|
+
view.setUint32(offset, nameBytes.byteLength, true);
|
|
89
|
+
offset += 4;
|
|
90
|
+
bytes.set(nameBytes, offset);
|
|
91
|
+
offset += nameBytes.byteLength;
|
|
92
|
+
// Blob size + blob data
|
|
93
|
+
view.setUint32(offset, src.data.byteLength, true);
|
|
94
|
+
offset += 4;
|
|
95
|
+
bytes.set(new Uint8Array(src.data), offset);
|
|
96
|
+
offset += src.data.byteLength;
|
|
97
|
+
this.progress.emit(0.7 + ((i + 1) / sourceBuffers.length) * 0.25);
|
|
98
|
+
}
|
|
99
|
+
this.progress.emit(1.0);
|
|
100
|
+
return new Blob([buffer], { type: 'application/x-drop-archive' });
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Extract an archive into session data and audio blobs.
|
|
104
|
+
*
|
|
105
|
+
* @param archiveBlob The archive Blob to extract.
|
|
106
|
+
* @returns The extracted session data, sources, and metadata.
|
|
107
|
+
* @throws Error if the archive format is invalid.
|
|
108
|
+
*/
|
|
109
|
+
async extractArchive(archiveBlob) {
|
|
110
|
+
this.progress.emit(0);
|
|
111
|
+
const arrayBuffer = await archiveBlob.arrayBuffer();
|
|
112
|
+
const view = new DataView(arrayBuffer);
|
|
113
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
114
|
+
const decoder = new TextDecoder();
|
|
115
|
+
let offset = 0;
|
|
116
|
+
// Validate magic
|
|
117
|
+
if (bytes[0] !== ARCHIVE_MAGIC[0] ||
|
|
118
|
+
bytes[1] !== ARCHIVE_MAGIC[1] ||
|
|
119
|
+
bytes[2] !== ARCHIVE_MAGIC[2] ||
|
|
120
|
+
bytes[3] !== ARCHIVE_MAGIC[3]) {
|
|
121
|
+
throw new Error('Invalid archive: missing DRPA magic bytes');
|
|
122
|
+
}
|
|
123
|
+
offset += 4;
|
|
124
|
+
// Read format version
|
|
125
|
+
const formatVersion = view.getUint32(offset, true);
|
|
126
|
+
if (formatVersion !== ARCHIVE_FORMAT_VERSION) {
|
|
127
|
+
throw new Error(`Unsupported archive format version: ${formatVersion}`);
|
|
128
|
+
}
|
|
129
|
+
offset += 4;
|
|
130
|
+
this.progress.emit(0.1);
|
|
131
|
+
// Read metadata
|
|
132
|
+
const metadataLength = view.getUint32(offset, true);
|
|
133
|
+
offset += 4;
|
|
134
|
+
const metadataJson = decoder.decode(bytes.slice(offset, offset + metadataLength));
|
|
135
|
+
const metadata = JSON.parse(metadataJson);
|
|
136
|
+
offset += metadataLength;
|
|
137
|
+
this.progress.emit(0.2);
|
|
138
|
+
// Read session data
|
|
139
|
+
const sessionLength = view.getUint32(offset, true);
|
|
140
|
+
offset += 4;
|
|
141
|
+
const sessionData = decoder.decode(bytes.slice(offset, offset + sessionLength));
|
|
142
|
+
offset += sessionLength;
|
|
143
|
+
this.progress.emit(0.4);
|
|
144
|
+
// Read source count
|
|
145
|
+
const sourceCount = view.getUint32(offset, true);
|
|
146
|
+
offset += 4;
|
|
147
|
+
// Read each source
|
|
148
|
+
const sources = [];
|
|
149
|
+
for (let i = 0; i < sourceCount; i++) {
|
|
150
|
+
// Name length + name
|
|
151
|
+
const nameLength = view.getUint32(offset, true);
|
|
152
|
+
offset += 4;
|
|
153
|
+
const name = decoder.decode(bytes.slice(offset, offset + nameLength));
|
|
154
|
+
offset += nameLength;
|
|
155
|
+
// Blob size + blob data
|
|
156
|
+
const blobSize = view.getUint32(offset, true);
|
|
157
|
+
offset += 4;
|
|
158
|
+
const blobData = bytes.slice(offset, offset + blobSize);
|
|
159
|
+
offset += blobSize;
|
|
160
|
+
sources.push({
|
|
161
|
+
name,
|
|
162
|
+
blob: new Blob([blobData]),
|
|
163
|
+
});
|
|
164
|
+
this.progress.emit(0.4 + ((i + 1) / sourceCount) * 0.55);
|
|
165
|
+
}
|
|
166
|
+
this.progress.emit(1.0);
|
|
167
|
+
return { sessionData, sources, metadata };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get archive info without fully extracting all sources.
|
|
171
|
+
* Only reads the header and metadata section.
|
|
172
|
+
*
|
|
173
|
+
* @param archiveBlob The archive Blob to inspect.
|
|
174
|
+
* @returns The archive metadata.
|
|
175
|
+
* @throws Error if the archive format is invalid.
|
|
176
|
+
*/
|
|
177
|
+
async getArchiveInfo(archiveBlob) {
|
|
178
|
+
// We only need to read the header portion: magic (4) + version (4) +
|
|
179
|
+
// metadata length (4) + metadata. Read a generous initial chunk.
|
|
180
|
+
const headerSize = Math.min(archiveBlob.size, 64 * 1024); // up to 64KB
|
|
181
|
+
const headerSlice = archiveBlob.slice(0, headerSize);
|
|
182
|
+
const arrayBuffer = await headerSlice.arrayBuffer();
|
|
183
|
+
const view = new DataView(arrayBuffer);
|
|
184
|
+
const bytes = new Uint8Array(arrayBuffer);
|
|
185
|
+
const decoder = new TextDecoder();
|
|
186
|
+
let offset = 0;
|
|
187
|
+
// Validate magic
|
|
188
|
+
if (bytes[0] !== ARCHIVE_MAGIC[0] ||
|
|
189
|
+
bytes[1] !== ARCHIVE_MAGIC[1] ||
|
|
190
|
+
bytes[2] !== ARCHIVE_MAGIC[2] ||
|
|
191
|
+
bytes[3] !== ARCHIVE_MAGIC[3]) {
|
|
192
|
+
throw new Error('Invalid archive: missing DRPA magic bytes');
|
|
193
|
+
}
|
|
194
|
+
offset += 4;
|
|
195
|
+
// Read format version
|
|
196
|
+
const formatVersion = view.getUint32(offset, true);
|
|
197
|
+
if (formatVersion !== ARCHIVE_FORMAT_VERSION) {
|
|
198
|
+
throw new Error(`Unsupported archive format version: ${formatVersion}`);
|
|
199
|
+
}
|
|
200
|
+
offset += 4;
|
|
201
|
+
// Read metadata
|
|
202
|
+
const metadataLength = view.getUint32(offset, true);
|
|
203
|
+
offset += 4;
|
|
204
|
+
if (offset + metadataLength > arrayBuffer.byteLength) {
|
|
205
|
+
throw new Error('Archive header is truncated; cannot read metadata');
|
|
206
|
+
}
|
|
207
|
+
const metadataJson = decoder.decode(bytes.slice(offset, offset + metadataLength));
|
|
208
|
+
return JSON.parse(metadataJson);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=SessionArchive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionArchive.js","sourceRoot":"","sources":["../../src/storage/SessionArchive.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,81 @@
|
|
|
1
1
|
import { Session } from '../domain/Session';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { TrackType } from '../domain/Track';
|
|
3
|
+
import { Signal } from '../lib/Signal';
|
|
4
|
+
export interface TrackTemplate {
|
|
5
|
+
name: string;
|
|
6
|
+
type: TrackType;
|
|
7
|
+
color?: string;
|
|
8
|
+
plugins?: Array<{
|
|
9
|
+
pluginId: string;
|
|
10
|
+
params?: Record<string, number>;
|
|
11
|
+
}>;
|
|
12
|
+
armed?: boolean;
|
|
13
|
+
monitorMode?: string;
|
|
14
|
+
}
|
|
5
15
|
export interface SessionTemplate {
|
|
6
16
|
id: string;
|
|
7
17
|
name: string;
|
|
8
18
|
description: string;
|
|
9
|
-
|
|
19
|
+
category: 'recording' | 'mixing' | 'mastering' | 'production' | 'podcast' | 'custom';
|
|
20
|
+
sampleRate: number;
|
|
21
|
+
tempo: number;
|
|
22
|
+
timeSignature: [number, number];
|
|
23
|
+
tracks: TrackTemplate[];
|
|
24
|
+
createdAt: string;
|
|
25
|
+
updatedAt: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Manages session templates — predefined track / routing configurations
|
|
29
|
+
* that users can instantiate to quickly bootstrap new sessions.
|
|
30
|
+
*
|
|
31
|
+
* Includes a set of built-in factory templates (recording, podcast,
|
|
32
|
+
* mixing, mastering, production) and supports user-created custom
|
|
33
|
+
* templates.
|
|
34
|
+
*/
|
|
35
|
+
export declare class SessionTemplateManager {
|
|
36
|
+
private _templates;
|
|
37
|
+
readonly templatesChanged: Signal<void>;
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Add a new template. An `id`, `createdAt`, and `updatedAt` are generated
|
|
41
|
+
* automatically.
|
|
42
|
+
*/
|
|
43
|
+
addTemplate(template: Omit<SessionTemplate, 'id' | 'createdAt' | 'updatedAt'>): SessionTemplate;
|
|
44
|
+
/**
|
|
45
|
+
* Update an existing template. Only the supplied fields are merged; the
|
|
46
|
+
* `updatedAt` timestamp is refreshed automatically.
|
|
47
|
+
*/
|
|
48
|
+
updateTemplate(id: string, updates: Partial<SessionTemplate>): void;
|
|
49
|
+
/**
|
|
50
|
+
* Remove a template by ID.
|
|
51
|
+
*/
|
|
52
|
+
removeTemplate(id: string): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get a single template by ID.
|
|
55
|
+
*/
|
|
56
|
+
getTemplate(id: string): SessionTemplate | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Get all registered templates.
|
|
59
|
+
*/
|
|
60
|
+
getAllTemplates(): SessionTemplate[];
|
|
61
|
+
/**
|
|
62
|
+
* Get templates filtered by category.
|
|
63
|
+
*/
|
|
64
|
+
getTemplatesByCategory(category: string): SessionTemplate[];
|
|
65
|
+
/**
|
|
66
|
+
* Snapshot a Session into a reusable template.
|
|
67
|
+
*/
|
|
68
|
+
static createFromSession(session: Session, name: string, description: string): SessionTemplate;
|
|
69
|
+
static getDefaultTemplates(): SessionTemplate[];
|
|
70
|
+
/**
|
|
71
|
+
* Serialize all templates to a JSON string.
|
|
72
|
+
*/
|
|
73
|
+
serialize(): string;
|
|
74
|
+
/**
|
|
75
|
+
* Restore a SessionTemplateManager from a JSON string produced by
|
|
76
|
+
* `serialize()`.
|
|
77
|
+
*/
|
|
78
|
+
static deserialize(json: string): SessionTemplateManager;
|
|
10
79
|
}
|
|
11
80
|
/**
|
|
12
81
|
* Returns the list of available session templates.
|
|
@@ -16,7 +85,7 @@ export declare function getTemplates(): SessionTemplate[];
|
|
|
16
85
|
* Create a new Session from a template.
|
|
17
86
|
*
|
|
18
87
|
* Each template pre-configures tracks with default names, colors,
|
|
19
|
-
* and routing through the master bus.
|
|
88
|
+
* armed state, and routing through the master bus.
|
|
20
89
|
*/
|
|
21
90
|
export declare function createFromTemplate(templateId: string): Session;
|
|
22
91
|
//# sourceMappingURL=SessionTemplate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionTemplate.d.ts","sourceRoot":"","sources":["../../src/storage/SessionTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionTemplate.d.ts","sourceRoot":"","sources":["../../src/storage/SessionTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAS,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IACvE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAUD;;;;;;;GAOG;AACH,qBAAa,sBAAsB;IAC/B,OAAO,CAAC,UAAU,CAA2C;IAE7D,SAAgB,gBAAgB,eAAsB;;IAWtD;;;OAGG;IACH,WAAW,CACP,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,CAAC,GAClE,eAAe;IAalB;;;OAGG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAenE;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMhC;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIpD;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE;IAIpC;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAM3D;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACpB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GACpB,eAAe;IA4BlB,MAAM,CAAC,mBAAmB,IAAI,eAAe,EAAE;IA+H/C;;OAEG;IACH,SAAS,IAAI,MAAM;IAOnB;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB;CAU3D;AAID;;GAEG;AACH,wBAAgB,YAAY,IAAI,eAAe,EAAE,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAsB9D"}
|