@drop-ai/core 0.2.0 → 0.3.1
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 +21 -21
- package/README.md +734 -316
- 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 +69 -0
- package/dist/analysis/AudioAnalyzer.d.ts.map +1 -0
- package/dist/analysis/AudioAnalyzer.js +567 -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 +102 -0
- package/dist/audio/Auditioner.d.ts.map +1 -0
- package/dist/audio/Auditioner.js +237 -0
- package/dist/audio/Auditioner.js.map +1 -0
- package/dist/audio/BWFMetadata.d.ts +114 -0
- package/dist/audio/BWFMetadata.d.ts.map +1 -0
- package/dist/audio/BWFMetadata.js +392 -0
- package/dist/audio/BWFMetadata.js.map +1 -0
- package/dist/audio/BufferPool.d.ts +0 -3
- package/dist/audio/BufferPool.d.ts.map +1 -1
- package/dist/audio/BufferPool.js +0 -3
- package/dist/audio/BufferPool.js.map +1 -1
- package/dist/audio/ChannelSplitter.d.ts +36 -0
- package/dist/audio/ChannelSplitter.d.ts.map +1 -0
- package/dist/audio/ChannelSplitter.js +81 -0
- package/dist/audio/ChannelSplitter.js.map +1 -0
- package/dist/audio/ExportAnalyzer.d.ts +38 -0
- package/dist/audio/ExportAnalyzer.d.ts.map +1 -0
- package/dist/audio/ExportAnalyzer.js +75 -0
- package/dist/audio/ExportAnalyzer.js.map +1 -0
- package/dist/audio/LufsNormalizer.d.ts +36 -0
- package/dist/audio/LufsNormalizer.d.ts.map +1 -0
- package/dist/audio/LufsNormalizer.js +216 -0
- package/dist/audio/LufsNormalizer.js.map +1 -0
- package/dist/audio/MeterUtils.d.ts +0 -2
- package/dist/audio/MeterUtils.d.ts.map +1 -1
- package/dist/audio/MeterUtils.js +0 -2
- package/dist/audio/MeterUtils.js.map +1 -1
- package/dist/audio/OfflineExporter.d.ts +1 -7
- package/dist/audio/OfflineExporter.d.ts.map +1 -1
- package/dist/audio/OfflineExporter.js +31 -11
- package/dist/audio/OfflineExporter.js.map +1 -1
- package/dist/audio/ProcessingGraph.d.ts +0 -1
- package/dist/audio/ProcessingGraph.d.ts.map +1 -1
- package/dist/audio/ProcessingGraph.js +0 -1
- package/dist/audio/ProcessingGraph.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 +20 -0
- package/dist/audio/SampleRateConverter.d.ts.map +1 -0
- package/dist/audio/SampleRateConverter.js +83 -0
- package/dist/audio/SampleRateConverter.js.map +1 -0
- package/dist/audio/SilencePadding.d.ts +27 -0
- package/dist/audio/SilencePadding.d.ts.map +1 -0
- package/dist/audio/SilencePadding.js +84 -0
- package/dist/audio/SilencePadding.js.map +1 -0
- package/dist/audio/SourceCache.d.ts +13 -19
- package/dist/audio/SourceCache.d.ts.map +1 -1
- package/dist/audio/SourceCache.js +21 -36
- package/dist/audio/SourceCache.js.map +1 -1
- package/dist/audio/engine/Declick.d.ts +97 -0
- package/dist/audio/engine/Declick.d.ts.map +1 -0
- package/dist/audio/engine/Declick.js +203 -0
- package/dist/audio/engine/Declick.js.map +1 -0
- package/dist/audio/engine/DiskIO.d.ts +170 -0
- package/dist/audio/engine/DiskIO.d.ts.map +1 -0
- package/dist/audio/engine/DiskIO.js +382 -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 +144 -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 +1 -1
- package/dist/audio/engine/PlaylistEngine.d.ts.map +1 -1
- package/dist/audio/engine/PlaylistEngine.js +10 -3
- package/dist/audio/engine/PlaylistEngine.js.map +1 -1
- package/dist/audio/engine/PunchRecordManager.d.ts +111 -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 +133 -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 +137 -0
- package/dist/audio/engine/SidechainRouter.d.ts.map +1 -0
- package/dist/audio/engine/SidechainRouter.js +290 -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 +60 -0
- package/dist/audio/export/CDMarkerExporter.d.ts.map +1 -0
- package/dist/audio/export/CDMarkerExporter.js +162 -0
- package/dist/audio/export/CDMarkerExporter.js.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts +119 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.js +520 -0
- package/dist/audio/export/ExportGraphBuilder.js.map +1 -0
- package/dist/audio/export/ExportPresetManager.d.ts +85 -0
- package/dist/audio/export/ExportPresetManager.d.ts.map +1 -0
- package/dist/audio/export/ExportPresetManager.js +304 -0
- package/dist/audio/export/ExportPresetManager.js.map +1 -0
- package/dist/automation/AutomationList.d.ts +0 -1
- package/dist/automation/AutomationList.d.ts.map +1 -1
- package/dist/automation/AutomationList.js +0 -1
- package/dist/automation/AutomationList.js.map +1 -1
- package/dist/automation/AutomationMode.d.ts +0 -1
- package/dist/automation/AutomationMode.d.ts.map +1 -1
- package/dist/automation/AutomationMode.js +0 -1
- package/dist/automation/AutomationMode.js.map +1 -1
- package/dist/commands/CommandHistory.d.ts +1 -4
- package/dist/commands/CommandHistory.d.ts.map +1 -1
- package/dist/commands/CommandHistory.js +6 -9
- package/dist/commands/CommandHistory.js.map +1 -1
- package/dist/commands/CommandRegistry.d.ts +1 -2
- package/dist/commands/CommandRegistry.d.ts.map +1 -1
- package/dist/commands/CommandRegistry.js +1 -2
- package/dist/commands/CommandRegistry.js.map +1 -1
- package/dist/commands/UndoTransaction.d.ts +0 -2
- package/dist/commands/UndoTransaction.d.ts.map +1 -1
- package/dist/commands/UndoTransaction.js +1 -3
- package/dist/commands/UndoTransaction.js.map +1 -1
- package/dist/commands/handlers/HistoryHandler.d.ts +5 -5
- package/dist/commands/handlers/HistoryHandler.js +10 -10
- package/dist/commands/handlers/HistoryHandler.js.map +1 -1
- package/dist/commands/handlers/MarkerHandler.d.ts +0 -1
- package/dist/commands/handlers/MarkerHandler.d.ts.map +1 -1
- package/dist/commands/handlers/MarkerHandler.js +0 -1
- package/dist/commands/handlers/MarkerHandler.js.map +1 -1
- 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/CopyRegionCommand.d.ts +0 -1
- package/dist/commands/impl/CopyRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/CopyRegionCommand.js +0 -1
- package/dist/commands/impl/CopyRegionCommand.js.map +1 -1
- package/dist/commands/impl/DuplicateRegionCommand.d.ts +0 -1
- package/dist/commands/impl/DuplicateRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/DuplicateRegionCommand.js +0 -1
- package/dist/commands/impl/DuplicateRegionCommand.js.map +1 -1
- package/dist/commands/impl/ExportCommand.d.ts +0 -1
- package/dist/commands/impl/ExportCommand.d.ts.map +1 -1
- package/dist/commands/impl/ExportCommand.js +0 -1
- package/dist/commands/impl/ExportCommand.js.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.d.ts +1 -1
- package/dist/commands/impl/FreezeTrackCommand.d.ts.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.js +38 -37
- package/dist/commands/impl/FreezeTrackCommand.js.map +1 -1
- package/dist/commands/impl/PasteRegionCommand.d.ts +0 -1
- package/dist/commands/impl/PasteRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/PasteRegionCommand.js +0 -1
- package/dist/commands/impl/PasteRegionCommand.js.map +1 -1
- package/dist/commands/impl/SaveSnapshotCommand.d.ts +1 -1
- package/dist/commands/impl/SaveSnapshotCommand.js +1 -1
- package/dist/commands/impl/SetLoopRangeCommand.d.ts +0 -1
- package/dist/commands/impl/SetLoopRangeCommand.d.ts.map +1 -1
- package/dist/commands/impl/SetLoopRangeCommand.js +0 -1
- package/dist/commands/impl/SetLoopRangeCommand.js.map +1 -1
- package/dist/commands/impl/SetPunchRangeCommand.d.ts +0 -1
- package/dist/commands/impl/SetPunchRangeCommand.d.ts.map +1 -1
- package/dist/commands/impl/SetPunchRangeCommand.js +0 -1
- package/dist/commands/impl/SetPunchRangeCommand.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/SplitAtPlayheadCommand.d.ts +0 -2
- package/dist/commands/impl/SplitAtPlayheadCommand.d.ts.map +1 -1
- package/dist/commands/impl/SplitAtPlayheadCommand.js +0 -2
- package/dist/commands/impl/SplitAtPlayheadCommand.js.map +1 -1
- package/dist/commands/impl/SplitRegionCommand.d.ts +0 -1
- package/dist/commands/impl/SplitRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/SplitRegionCommand.js +0 -1
- package/dist/commands/impl/SplitRegionCommand.js.map +1 -1
- package/dist/commands/impl/StripSilenceCommand.d.ts +0 -1
- package/dist/commands/impl/StripSilenceCommand.d.ts.map +1 -1
- package/dist/commands/impl/StripSilenceCommand.js +0 -1
- package/dist/commands/impl/StripSilenceCommand.js.map +1 -1
- package/dist/commands/impl/TimeStretchRegionCommand.d.ts +1 -2
- package/dist/commands/impl/TimeStretchRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/TimeStretchRegionCommand.js +1 -2
- package/dist/commands/impl/TimeStretchRegionCommand.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 +26 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js +68 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts +27 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js +68 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts +26 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.js +76 -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/ABComparison.d.ts +0 -1
- package/dist/domain/ABComparison.d.ts.map +1 -1
- package/dist/domain/ABComparison.js +0 -1
- package/dist/domain/ABComparison.js.map +1 -1
- package/dist/domain/CDMarker.d.ts +0 -1
- package/dist/domain/CDMarker.d.ts.map +1 -1
- package/dist/domain/CDMarker.js +0 -1
- package/dist/domain/CDMarker.js.map +1 -1
- package/dist/domain/ClockMode.d.ts +0 -1
- package/dist/domain/ClockMode.d.ts.map +1 -1
- package/dist/domain/ClockMode.js +0 -1
- package/dist/domain/ClockMode.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/DragManager.d.ts +0 -2
- package/dist/domain/DragManager.d.ts.map +1 -1
- package/dist/domain/DragManager.js +0 -2
- package/dist/domain/DragManager.js.map +1 -1
- package/dist/domain/EditMode.d.ts +0 -1
- package/dist/domain/EditMode.d.ts.map +1 -1
- package/dist/domain/EditMode.js +0 -1
- package/dist/domain/EditMode.js.map +1 -1
- package/dist/domain/ExportConfig.d.ts +98 -2
- package/dist/domain/ExportConfig.d.ts.map +1 -1
- package/dist/domain/ExportConfig.js +154 -2
- package/dist/domain/ExportConfig.js.map +1 -1
- package/dist/domain/ExportPreset.d.ts +60 -0
- package/dist/domain/ExportPreset.d.ts.map +1 -0
- package/dist/domain/ExportPreset.js +77 -0
- package/dist/domain/ExportPreset.js.map +1 -0
- package/dist/domain/ExportStatus.d.ts +0 -1
- package/dist/domain/ExportStatus.d.ts.map +1 -1
- package/dist/domain/ExportStatus.js +0 -1
- package/dist/domain/ExportStatus.js.map +1 -1
- package/dist/domain/GridSettings.d.ts +0 -3
- package/dist/domain/GridSettings.d.ts.map +1 -1
- package/dist/domain/GridSettings.js +0 -3
- package/dist/domain/GridSettings.js.map +1 -1
- 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/Marker.d.ts +0 -1
- package/dist/domain/Marker.d.ts.map +1 -1
- package/dist/domain/Marker.js +0 -1
- package/dist/domain/Marker.js.map +1 -1
- package/dist/domain/MeterData.d.ts +0 -2
- package/dist/domain/MeterData.d.ts.map +1 -1
- package/dist/domain/MeterType.d.ts +0 -2
- package/dist/domain/MeterType.d.ts.map +1 -1
- package/dist/domain/MeterType.js +0 -2
- package/dist/domain/MeterType.js.map +1 -1
- package/dist/domain/MonitorMode.d.ts +0 -1
- package/dist/domain/MonitorMode.d.ts.map +1 -1
- package/dist/domain/MonitorMode.js +0 -1
- package/dist/domain/MonitorMode.js.map +1 -1
- package/dist/domain/MouseMode.d.ts +0 -1
- package/dist/domain/MouseMode.d.ts.map +1 -1
- package/dist/domain/MouseMode.js +0 -1
- package/dist/domain/MouseMode.js.map +1 -1
- package/dist/domain/OverlapType.d.ts +0 -2
- package/dist/domain/OverlapType.d.ts.map +1 -1
- package/dist/domain/OverlapType.js +0 -2
- package/dist/domain/OverlapType.js.map +1 -1
- 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/Range.d.ts +0 -1
- package/dist/domain/Range.d.ts.map +1 -1
- package/dist/domain/Range.js +0 -1
- package/dist/domain/Range.js.map +1 -1
- package/dist/domain/RecordMode.d.ts +0 -1
- package/dist/domain/RecordMode.d.ts.map +1 -1
- package/dist/domain/RecordMode.js +0 -1
- package/dist/domain/RecordMode.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/RegionClipboard.d.ts +1 -3
- package/dist/domain/RegionClipboard.d.ts.map +1 -1
- package/dist/domain/RegionClipboard.js +1 -2
- package/dist/domain/RegionClipboard.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/RulerType.d.ts +0 -1
- package/dist/domain/RulerType.d.ts.map +1 -1
- package/dist/domain/RulerType.js +0 -1
- package/dist/domain/RulerType.js.map +1 -1
- package/dist/domain/SelectionHistory.d.ts +0 -3
- package/dist/domain/SelectionHistory.d.ts.map +1 -1
- package/dist/domain/SelectionHistory.js +0 -3
- package/dist/domain/SelectionHistory.js.map +1 -1
- package/dist/domain/SendBus.d.ts +0 -1
- package/dist/domain/SendBus.d.ts.map +1 -1
- package/dist/domain/SendBus.js +0 -1
- package/dist/domain/SendBus.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/SidechainConfig.d.ts +0 -1
- package/dist/domain/SidechainConfig.d.ts.map +1 -1
- package/dist/domain/SidechainConfig.js +0 -1
- package/dist/domain/SidechainConfig.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/Take.d.ts +0 -1
- package/dist/domain/Take.d.ts.map +1 -1
- package/dist/domain/Take.js +0 -1
- package/dist/domain/Take.js.map +1 -1
- package/dist/domain/ThawList.d.ts +36 -0
- package/dist/domain/ThawList.d.ts.map +1 -0
- package/dist/domain/ThawList.js +72 -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/TrackGroup.d.ts +0 -1
- package/dist/domain/TrackGroup.d.ts.map +1 -1
- package/dist/domain/TrackGroup.js +0 -1
- package/dist/domain/TrackGroup.js.map +1 -1
- package/dist/domain/TransportFSM.d.ts +0 -1
- package/dist/domain/TransportFSM.d.ts.map +1 -1
- package/dist/domain/TransportFSM.js +0 -1
- package/dist/domain/TransportFSM.js.map +1 -1
- package/dist/domain/TransportMode.d.ts +0 -1
- package/dist/domain/TransportMode.d.ts.map +1 -1
- package/dist/domain/TransportMode.js +0 -1
- package/dist/domain/TransportMode.js.map +1 -1
- package/dist/domain/TriggerBox.d.ts +121 -0
- package/dist/domain/TriggerBox.d.ts.map +1 -0
- package/dist/domain/TriggerBox.js +428 -0
- package/dist/domain/TriggerBox.js.map +1 -0
- package/dist/domain/VCATrack.d.ts +63 -2
- package/dist/domain/VCATrack.d.ts.map +1 -1
- package/dist/domain/VCATrack.js +127 -2
- package/dist/domain/VCATrack.js.map +1 -1
- package/dist/domain/VideoExportConfig.d.ts +116 -0
- package/dist/domain/VideoExportConfig.d.ts.map +1 -0
- package/dist/domain/VideoExportConfig.js +243 -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/ZoomFocus.d.ts +0 -1
- package/dist/domain/ZoomFocus.d.ts.map +1 -1
- package/dist/domain/ZoomFocus.js +0 -1
- package/dist/domain/ZoomFocus.js.map +1 -1
- 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 +198 -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/domain/temporal/types.d.ts +1 -1
- package/dist/domain/temporal/types.d.ts.map +1 -1
- package/dist/domain/temporal/types.js +1 -1
- package/dist/domain/temporal/types.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/Signal.d.ts +1 -1
- package/dist/lib/ThawList.d.ts +98 -0
- package/dist/lib/ThawList.d.ts.map +1 -0
- package/dist/lib/ThawList.js +151 -0
- package/dist/lib/ThawList.js.map +1 -0
- package/dist/midi/MidiFileParser.d.ts +32 -0
- package/dist/midi/MidiFileParser.d.ts.map +1 -0
- package/dist/midi/MidiFileParser.js +245 -0
- package/dist/midi/MidiFileParser.js.map +1 -0
- package/dist/midi/MidiFileWriter.d.ts +30 -0
- package/dist/midi/MidiFileWriter.d.ts.map +1 -0
- package/dist/midi/MidiFileWriter.js +159 -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/PluginManager.js +2 -2
- package/dist/plugins/PluginManager.js.map +1 -1
- 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/plugins/impl/ExpanderPlugin.d.ts +1 -1
- package/dist/plugins/impl/ExpanderPlugin.js +1 -1
- package/dist/plugins/impl/ParametricEQPlugin.d.ts +1 -1
- package/dist/plugins/impl/ParametricEQPlugin.js +1 -1
- 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 +102 -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 +165 -0
- package/dist/processing/MeterDSP.d.ts.map +1 -0
- package/dist/processing/MeterDSP.js +753 -0
- package/dist/processing/MeterDSP.js.map +1 -0
- package/dist/processing/MeterProcessor.d.ts +0 -1
- package/dist/processing/MeterProcessor.d.ts.map +1 -1
- package/dist/processing/MeterProcessor.js +0 -1
- package/dist/processing/MeterProcessor.js.map +1 -1
- package/dist/processing/Panner.d.ts +144 -0
- package/dist/processing/Panner.d.ts.map +1 -0
- package/dist/processing/Panner.js +280 -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/PolarityProcessor.d.ts +1 -1
- package/dist/processing/PolarityProcessor.js +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/SendProcessor.d.ts +0 -1
- package/dist/processing/SendProcessor.d.ts.map +1 -1
- package/dist/processing/SendProcessor.js +0 -1
- package/dist/processing/SendProcessor.js.map +1 -1
- package/dist/processing/SurroundPanner.d.ts +120 -0
- package/dist/processing/SurroundPanner.d.ts.map +1 -0
- package/dist/processing/SurroundPanner.js +374 -0
- package/dist/processing/SurroundPanner.js.map +1 -0
- package/dist/processing/TruePeakLimiter.d.ts +32 -0
- package/dist/processing/TruePeakLimiter.d.ts.map +1 -0
- package/dist/processing/TruePeakLimiter.js +142 -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/SessionStorage.d.ts +1 -1
- 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 +41 -0
- package/dist/utils/BwfMetadataWriter.d.ts.map +1 -0
- package/dist/utils/BwfMetadataWriter.js +130 -0
- package/dist/utils/BwfMetadataWriter.js.map +1 -0
- package/dist/utils/DitherProcessor.d.ts +0 -1
- package/dist/utils/DitherProcessor.d.ts.map +1 -1
- package/dist/utils/DitherProcessor.js +0 -1
- package/dist/utils/DitherProcessor.js.map +1 -1
- package/dist/utils/FilenameTemplate.d.ts +39 -0
- package/dist/utils/FilenameTemplate.d.ts.map +1 -0
- package/dist/utils/FilenameTemplate.js +77 -0
- package/dist/utils/FilenameTemplate.js.map +1 -0
- package/dist/utils/FlacEncoder.d.ts +0 -1
- package/dist/utils/FlacEncoder.d.ts.map +1 -1
- package/dist/utils/FlacEncoder.js +0 -1
- package/dist/utils/FlacEncoder.js.map +1 -1
- 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 +16 -0
- package/dist/utils/Mp4ChapterGenerator.d.ts.map +1 -0
- package/dist/utils/Mp4ChapterGenerator.js +32 -0
- package/dist/utils/Mp4ChapterGenerator.js.map +1 -0
- package/dist/utils/OggEncoder.d.ts +19 -21
- package/dist/utils/OggEncoder.d.ts.map +1 -1
- package/dist/utils/OggEncoder.js +113 -51
- package/dist/utils/OggEncoder.js.map +1 -1
- package/dist/utils/TocGenerator.d.ts +16 -0
- package/dist/utils/TocGenerator.d.ts.map +1 -0
- package/dist/utils/TocGenerator.js +46 -0
- package/dist/utils/TocGenerator.js.map +1 -0
- package/package.json +7 -8
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
import { Processor } from './Processor';
|
|
2
|
+
import { Signal } from '../lib/Signal';
|
|
3
|
+
/**
|
|
4
|
+
* SurroundPanner supports multichannel panning beyond stereo.
|
|
5
|
+
*
|
|
6
|
+
* Supported layouts:
|
|
7
|
+
* - Stereo (2.0): L, R
|
|
8
|
+
* - Quad (4.0): FL, FR, RL, RR
|
|
9
|
+
* - 5.1: FL, FR, C, LFE, RL, RR
|
|
10
|
+
* - 7.1: FL, FR, C, LFE, RL, RR, SL, SR
|
|
11
|
+
* - Atmos/3D: adds height channels
|
|
12
|
+
*
|
|
13
|
+
* Uses VBAP (Vector Base Amplitude Panning) algorithm for
|
|
14
|
+
* arbitrary speaker configurations.
|
|
15
|
+
*/
|
|
16
|
+
export var SpeakerLayout;
|
|
17
|
+
(function (SpeakerLayout) {
|
|
18
|
+
SpeakerLayout["STEREO"] = "STEREO";
|
|
19
|
+
SpeakerLayout["QUAD"] = "QUAD";
|
|
20
|
+
SpeakerLayout["SURROUND_5_1"] = "5.1";
|
|
21
|
+
SpeakerLayout["SURROUND_7_1"] = "7.1";
|
|
22
|
+
})(SpeakerLayout || (SpeakerLayout = {}));
|
|
23
|
+
export class SurroundPanner extends Processor {
|
|
24
|
+
constructor(id, layout) {
|
|
25
|
+
super(id, 'Surround Panner');
|
|
26
|
+
this._azimuth = 0; // Source horizontal angle in degrees
|
|
27
|
+
this._elevation = 0; // Source vertical angle in degrees
|
|
28
|
+
this._spread = 0; // Source spread (0 = point, 1 = omni)
|
|
29
|
+
this._lfeLevel = 0; // LFE send level (0-1)
|
|
30
|
+
this._layout = SpeakerLayout.STEREO;
|
|
31
|
+
this._speakers = [];
|
|
32
|
+
this._gains = new Float32Array(0);
|
|
33
|
+
this.positionChanged = new Signal();
|
|
34
|
+
this.layoutChanged = new Signal();
|
|
35
|
+
const initialLayout = layout !== null && layout !== void 0 ? layout : SpeakerLayout.STEREO;
|
|
36
|
+
this._speakers = this.setupSpeakers(initialLayout);
|
|
37
|
+
this._layout = initialLayout;
|
|
38
|
+
this._gains = new Float32Array(this._speakers.length);
|
|
39
|
+
this.computeGains();
|
|
40
|
+
}
|
|
41
|
+
// ── Position control ────────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Set the source position.
|
|
44
|
+
* @param azimuth Horizontal angle in degrees (-180 to 180).
|
|
45
|
+
* @param elevation Vertical angle in degrees (-90 to 90). Defaults to current.
|
|
46
|
+
*/
|
|
47
|
+
setPosition(azimuth, elevation) {
|
|
48
|
+
const clampedAz = Math.max(-180, Math.min(180, azimuth));
|
|
49
|
+
const clampedEl = elevation !== undefined
|
|
50
|
+
? Math.max(-90, Math.min(90, elevation))
|
|
51
|
+
: this._elevation;
|
|
52
|
+
if (this._azimuth !== clampedAz || this._elevation !== clampedEl) {
|
|
53
|
+
this._azimuth = clampedAz;
|
|
54
|
+
this._elevation = clampedEl;
|
|
55
|
+
this.computeGains();
|
|
56
|
+
this.positionChanged.emit({ azimuth: this._azimuth, elevation: this._elevation });
|
|
57
|
+
this.stateChanged.emit();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Set the source spread.
|
|
62
|
+
* @param spread 0 = point source, 1 = omnidirectional.
|
|
63
|
+
*/
|
|
64
|
+
setSpread(spread) {
|
|
65
|
+
const clamped = Math.max(0, Math.min(1, spread));
|
|
66
|
+
if (this._spread !== clamped) {
|
|
67
|
+
this._spread = clamped;
|
|
68
|
+
this.computeGains();
|
|
69
|
+
this.stateChanged.emit();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Set the LFE send level.
|
|
74
|
+
* @param level 0 to 1.
|
|
75
|
+
*/
|
|
76
|
+
setLFELevel(level) {
|
|
77
|
+
const clamped = Math.max(0, Math.min(1, level));
|
|
78
|
+
if (this._lfeLevel !== clamped) {
|
|
79
|
+
this._lfeLevel = clamped;
|
|
80
|
+
this.stateChanged.emit();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
get azimuth() { return this._azimuth; }
|
|
84
|
+
get elevation() { return this._elevation; }
|
|
85
|
+
get spread() { return this._spread; }
|
|
86
|
+
get lfeLevel() { return this._lfeLevel; }
|
|
87
|
+
// ── Layout ──────────────────────────────────────────────────────────────
|
|
88
|
+
/**
|
|
89
|
+
* Set the speaker layout. Recomputes speaker positions and gains.
|
|
90
|
+
*/
|
|
91
|
+
setLayout(layout) {
|
|
92
|
+
if (this._layout !== layout) {
|
|
93
|
+
this._layout = layout;
|
|
94
|
+
this._speakers = this.setupSpeakers(layout);
|
|
95
|
+
this._gains = new Float32Array(this._speakers.length);
|
|
96
|
+
this.computeGains();
|
|
97
|
+
this.layoutChanged.emit(layout);
|
|
98
|
+
this.stateChanged.emit();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
get layout() { return this._layout; }
|
|
102
|
+
/** Number of output channels for the current layout. */
|
|
103
|
+
get channelCount() { return this._speakers.length; }
|
|
104
|
+
/** Speaker positions for the current layout. */
|
|
105
|
+
get speakers() { return this._speakers; }
|
|
106
|
+
// ── Gain computation ────────────────────────────────────────────────────
|
|
107
|
+
/**
|
|
108
|
+
* Compute per-channel gains based on the current source position,
|
|
109
|
+
* spread, and layout using VBAP.
|
|
110
|
+
*
|
|
111
|
+
* @returns Float32Array of linear gains, one per speaker/channel.
|
|
112
|
+
*/
|
|
113
|
+
computeGains() {
|
|
114
|
+
const hasElevation = this._elevation !== 0;
|
|
115
|
+
let rawGains;
|
|
116
|
+
if (hasElevation) {
|
|
117
|
+
rawGains = this.vbap3D(this._azimuth, this._elevation);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
rawGains = this.vbap2D(this._azimuth);
|
|
121
|
+
}
|
|
122
|
+
// Apply spread: interpolate between point-source gains and uniform (omni)
|
|
123
|
+
if (this._spread > 0) {
|
|
124
|
+
const uniformGain = 1.0 / Math.sqrt(this._speakers.length);
|
|
125
|
+
for (let i = 0; i < rawGains.length; i++) {
|
|
126
|
+
rawGains[i] = rawGains[i] * (1 - this._spread) + uniformGain * this._spread;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// For 5.1 and 7.1 layouts, apply LFE level to the LFE channel
|
|
130
|
+
if (this._layout === SpeakerLayout.SURROUND_5_1 || this._layout === SpeakerLayout.SURROUND_7_1) {
|
|
131
|
+
const lfeIndex = this.getLFEChannelIndex();
|
|
132
|
+
if (lfeIndex >= 0 && lfeIndex < rawGains.length) {
|
|
133
|
+
rawGains[lfeIndex] = this._lfeLevel;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Store and return
|
|
137
|
+
this._gains = rawGains;
|
|
138
|
+
return new Float32Array(rawGains);
|
|
139
|
+
}
|
|
140
|
+
// ── VBAP algorithms ─────────────────────────────────────────────────────
|
|
141
|
+
/**
|
|
142
|
+
* 2D VBAP: Vector Base Amplitude Panning in the horizontal plane.
|
|
143
|
+
*
|
|
144
|
+
* For each adjacent speaker pair, computes the amplitude split
|
|
145
|
+
* based on the angular position of the source relative to both speakers.
|
|
146
|
+
*
|
|
147
|
+
* @param azimuth Source azimuth in degrees (-180 to 180).
|
|
148
|
+
*/
|
|
149
|
+
vbap2D(azimuth) {
|
|
150
|
+
const gains = new Float32Array(this._speakers.length);
|
|
151
|
+
const speakerCount = this._speakers.length;
|
|
152
|
+
if (speakerCount === 0)
|
|
153
|
+
return gains;
|
|
154
|
+
// Special case: stereo uses simple equal-power panning
|
|
155
|
+
if (this._layout === SpeakerLayout.STEREO) {
|
|
156
|
+
// Normalize azimuth: -180..180 -> -1..1 for L/R
|
|
157
|
+
const normalized = Math.max(-1, Math.min(1, azimuth / 180));
|
|
158
|
+
const pan01 = (normalized + 1) / 2; // 0 = left, 1 = right
|
|
159
|
+
const angle = pan01 * Math.PI / 2;
|
|
160
|
+
gains[0] = Math.cos(angle); // Left
|
|
161
|
+
gains[1] = Math.sin(angle); // Right
|
|
162
|
+
return gains;
|
|
163
|
+
}
|
|
164
|
+
// Convert source azimuth to radians
|
|
165
|
+
const sourceRad = (azimuth * Math.PI) / 180;
|
|
166
|
+
// Get non-LFE speaker indices and their azimuths
|
|
167
|
+
const activeSpeakers = [];
|
|
168
|
+
for (let i = 0; i < speakerCount; i++) {
|
|
169
|
+
// Skip LFE channel in VBAP calculations
|
|
170
|
+
if (this._speakers[i].label === 'LFE')
|
|
171
|
+
continue;
|
|
172
|
+
activeSpeakers.push({
|
|
173
|
+
index: i,
|
|
174
|
+
azimuthRad: (this._speakers[i].azimuth * Math.PI) / 180,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Sort speakers by azimuth
|
|
178
|
+
activeSpeakers.sort((a, b) => a.azimuthRad - b.azimuthRad);
|
|
179
|
+
if (activeSpeakers.length === 0)
|
|
180
|
+
return gains;
|
|
181
|
+
if (activeSpeakers.length === 1) {
|
|
182
|
+
gains[activeSpeakers[0].index] = 1.0;
|
|
183
|
+
return gains;
|
|
184
|
+
}
|
|
185
|
+
// Find the two speakers that bracket the source angle
|
|
186
|
+
let found = false;
|
|
187
|
+
for (let i = 0; i < activeSpeakers.length; i++) {
|
|
188
|
+
const next = (i + 1) % activeSpeakers.length;
|
|
189
|
+
let az1 = activeSpeakers[i].azimuthRad;
|
|
190
|
+
let az2 = activeSpeakers[next].azimuthRad;
|
|
191
|
+
// Handle wrap-around
|
|
192
|
+
let span = az2 - az1;
|
|
193
|
+
if (span <= 0)
|
|
194
|
+
span += 2 * Math.PI;
|
|
195
|
+
let sourceOffset = sourceRad - az1;
|
|
196
|
+
if (sourceOffset < 0)
|
|
197
|
+
sourceOffset += 2 * Math.PI;
|
|
198
|
+
if (sourceOffset <= span) {
|
|
199
|
+
// Source is between speakers i and next
|
|
200
|
+
const t = span > 0 ? sourceOffset / span : 0;
|
|
201
|
+
// Equal-power crossfade between the two speakers
|
|
202
|
+
const angle = t * Math.PI / 2;
|
|
203
|
+
const g2 = Math.sin(angle);
|
|
204
|
+
const g1 = Math.cos(angle);
|
|
205
|
+
gains[activeSpeakers[i].index] = g1;
|
|
206
|
+
gains[activeSpeakers[next].index] = g2;
|
|
207
|
+
found = true;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Fallback: if no pair found, use closest speaker
|
|
212
|
+
if (!found) {
|
|
213
|
+
let minDist = Infinity;
|
|
214
|
+
let closest = 0;
|
|
215
|
+
for (const sp of activeSpeakers) {
|
|
216
|
+
let dist = Math.abs(sourceRad - sp.azimuthRad);
|
|
217
|
+
if (dist > Math.PI)
|
|
218
|
+
dist = 2 * Math.PI - dist;
|
|
219
|
+
if (dist < minDist) {
|
|
220
|
+
minDist = dist;
|
|
221
|
+
closest = sp.index;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
gains[closest] = 1.0;
|
|
225
|
+
}
|
|
226
|
+
return gains;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 3D VBAP: Vector Base Amplitude Panning with elevation.
|
|
230
|
+
*
|
|
231
|
+
* Extends 2D VBAP by considering the vertical angle to distribute
|
|
232
|
+
* energy across speakers at different elevations.
|
|
233
|
+
*
|
|
234
|
+
* @param azimuth Source azimuth in degrees.
|
|
235
|
+
* @param elevation Source elevation in degrees.
|
|
236
|
+
*/
|
|
237
|
+
vbap3D(azimuth, elevation) {
|
|
238
|
+
const gains = new Float32Array(this._speakers.length);
|
|
239
|
+
const speakerCount = this._speakers.length;
|
|
240
|
+
if (speakerCount === 0)
|
|
241
|
+
return gains;
|
|
242
|
+
// Convert source position to Cartesian unit vector
|
|
243
|
+
const srcAzRad = (azimuth * Math.PI) / 180;
|
|
244
|
+
const srcElRad = (elevation * Math.PI) / 180;
|
|
245
|
+
const srcX = Math.cos(srcElRad) * Math.cos(srcAzRad);
|
|
246
|
+
const srcY = Math.cos(srcElRad) * Math.sin(srcAzRad);
|
|
247
|
+
const srcZ = Math.sin(srcElRad);
|
|
248
|
+
// Compute dot product with each speaker's direction vector.
|
|
249
|
+
// This gives a measure of how "close" the source is to each speaker.
|
|
250
|
+
const dotProducts = [];
|
|
251
|
+
let totalWeight = 0;
|
|
252
|
+
for (let i = 0; i < speakerCount; i++) {
|
|
253
|
+
if (this._speakers[i].label === 'LFE') {
|
|
254
|
+
dotProducts.push(0);
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
const spAzRad = (this._speakers[i].azimuth * Math.PI) / 180;
|
|
258
|
+
const spElRad = (this._speakers[i].elevation * Math.PI) / 180;
|
|
259
|
+
const spX = Math.cos(spElRad) * Math.cos(spAzRad);
|
|
260
|
+
const spY = Math.cos(spElRad) * Math.sin(spAzRad);
|
|
261
|
+
const spZ = Math.sin(spElRad);
|
|
262
|
+
// Dot product (cosine of angle between source and speaker)
|
|
263
|
+
let dot = srcX * spX + srcY * spY + srcZ * spZ;
|
|
264
|
+
// Clamp to [0, 1] - speakers behind the source get no signal
|
|
265
|
+
dot = Math.max(0, dot);
|
|
266
|
+
// Square the dot product for sharper localization
|
|
267
|
+
dot = dot * dot;
|
|
268
|
+
dotProducts.push(dot);
|
|
269
|
+
totalWeight += dot;
|
|
270
|
+
}
|
|
271
|
+
// Normalize and apply
|
|
272
|
+
if (totalWeight > 0) {
|
|
273
|
+
for (let i = 0; i < speakerCount; i++) {
|
|
274
|
+
// Use sqrt for energy preservation (VBAP convention)
|
|
275
|
+
gains[i] = Math.sqrt(dotProducts[i] / totalWeight);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
// Fallback: equal distribution across all non-LFE speakers
|
|
280
|
+
let nonLfeCount = 0;
|
|
281
|
+
for (let i = 0; i < speakerCount; i++) {
|
|
282
|
+
if (this._speakers[i].label !== 'LFE')
|
|
283
|
+
nonLfeCount++;
|
|
284
|
+
}
|
|
285
|
+
if (nonLfeCount > 0) {
|
|
286
|
+
const equalGain = 1.0 / Math.sqrt(nonLfeCount);
|
|
287
|
+
for (let i = 0; i < speakerCount; i++) {
|
|
288
|
+
if (this._speakers[i].label !== 'LFE') {
|
|
289
|
+
gains[i] = equalGain;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return gains;
|
|
295
|
+
}
|
|
296
|
+
// ── Speaker setup ───────────────────────────────────────────────────────
|
|
297
|
+
/**
|
|
298
|
+
* Setup default speaker positions for a given layout.
|
|
299
|
+
* Angles follow the ITU-R BS.775 and ITU-R BS.2051 standards.
|
|
300
|
+
*/
|
|
301
|
+
setupSpeakers(layout) {
|
|
302
|
+
switch (layout) {
|
|
303
|
+
case SpeakerLayout.STEREO:
|
|
304
|
+
return [
|
|
305
|
+
{ azimuth: -30, elevation: 0, distance: 1, label: 'L' },
|
|
306
|
+
{ azimuth: 30, elevation: 0, distance: 1, label: 'R' },
|
|
307
|
+
];
|
|
308
|
+
case SpeakerLayout.QUAD:
|
|
309
|
+
return [
|
|
310
|
+
{ azimuth: -45, elevation: 0, distance: 1, label: 'FL' },
|
|
311
|
+
{ azimuth: 45, elevation: 0, distance: 1, label: 'FR' },
|
|
312
|
+
{ azimuth: -135, elevation: 0, distance: 1, label: 'RL' },
|
|
313
|
+
{ azimuth: 135, elevation: 0, distance: 1, label: 'RR' },
|
|
314
|
+
];
|
|
315
|
+
case SpeakerLayout.SURROUND_5_1:
|
|
316
|
+
return [
|
|
317
|
+
{ azimuth: -30, elevation: 0, distance: 1, label: 'FL' },
|
|
318
|
+
{ azimuth: 30, elevation: 0, distance: 1, label: 'FR' },
|
|
319
|
+
{ azimuth: 0, elevation: 0, distance: 1, label: 'C' },
|
|
320
|
+
{ azimuth: 0, elevation: -90, distance: 1, label: 'LFE' },
|
|
321
|
+
{ azimuth: -110, elevation: 0, distance: 1, label: 'RL' },
|
|
322
|
+
{ azimuth: 110, elevation: 0, distance: 1, label: 'RR' },
|
|
323
|
+
];
|
|
324
|
+
case SpeakerLayout.SURROUND_7_1:
|
|
325
|
+
return [
|
|
326
|
+
{ azimuth: -30, elevation: 0, distance: 1, label: 'FL' },
|
|
327
|
+
{ azimuth: 30, elevation: 0, distance: 1, label: 'FR' },
|
|
328
|
+
{ azimuth: 0, elevation: 0, distance: 1, label: 'C' },
|
|
329
|
+
{ azimuth: 0, elevation: -90, distance: 1, label: 'LFE' },
|
|
330
|
+
{ azimuth: -135, elevation: 0, distance: 1, label: 'RL' },
|
|
331
|
+
{ azimuth: 135, elevation: 0, distance: 1, label: 'RR' },
|
|
332
|
+
{ azimuth: -90, elevation: 0, distance: 1, label: 'SL' },
|
|
333
|
+
{ azimuth: 90, elevation: 0, distance: 1, label: 'SR' },
|
|
334
|
+
];
|
|
335
|
+
default:
|
|
336
|
+
return [
|
|
337
|
+
{ azimuth: -30, elevation: 0, distance: 1, label: 'L' },
|
|
338
|
+
{ azimuth: 30, elevation: 0, distance: 1, label: 'R' },
|
|
339
|
+
];
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get the index of the LFE channel in the current layout.
|
|
344
|
+
* Returns -1 if the layout has no LFE channel.
|
|
345
|
+
*/
|
|
346
|
+
getLFEChannelIndex() {
|
|
347
|
+
return this._speakers.findIndex(s => s.label === 'LFE');
|
|
348
|
+
}
|
|
349
|
+
// ── Serialization ───────────────────────────────────────────────────────
|
|
350
|
+
toJSON() {
|
|
351
|
+
return {
|
|
352
|
+
id: this.id,
|
|
353
|
+
name: this.name,
|
|
354
|
+
azimuth: this._azimuth,
|
|
355
|
+
elevation: this._elevation,
|
|
356
|
+
spread: this._spread,
|
|
357
|
+
lfeLevel: this._lfeLevel,
|
|
358
|
+
layout: this._layout,
|
|
359
|
+
active: this.active,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
static fromJSON(data) {
|
|
363
|
+
const panner = new SurroundPanner(data.id, data.layout);
|
|
364
|
+
panner.name = data.name;
|
|
365
|
+
panner._azimuth = data.azimuth;
|
|
366
|
+
panner._elevation = data.elevation;
|
|
367
|
+
panner._spread = data.spread;
|
|
368
|
+
panner._lfeLevel = data.lfeLevel;
|
|
369
|
+
panner.active = data.active;
|
|
370
|
+
panner.computeGains();
|
|
371
|
+
return panner;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=SurroundPanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SurroundPanner.js","sourceRoot":"","sources":["../../src/processing/SurroundPanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True Peak Limiter
|
|
3
|
+
*
|
|
4
|
+
* Implements:
|
|
5
|
+
* 1. 4x oversampling via windowed sinc interpolation
|
|
6
|
+
* 2. True peak measurement per ITU-R BS.1770-4 Annex 2
|
|
7
|
+
* 3. Brick-wall limiting with lookahead and release
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Measure the true peak of a mono channel using 4x oversampling.
|
|
11
|
+
* Returns peak in linear scale.
|
|
12
|
+
*/
|
|
13
|
+
export declare function measureTruePeak(samples: Float32Array): number;
|
|
14
|
+
/**
|
|
15
|
+
* Measure true peak in dBTP for a mono channel.
|
|
16
|
+
*/
|
|
17
|
+
export declare function measureTruePeakDbTP(samples: Float32Array): number;
|
|
18
|
+
/**
|
|
19
|
+
* Apply brick-wall true peak limiting to an AudioBuffer.
|
|
20
|
+
* Modifies the buffer in-place.
|
|
21
|
+
*
|
|
22
|
+
* The limiter uses a simple gain reduction approach:
|
|
23
|
+
* 1. Find the true peak of the entire buffer
|
|
24
|
+
* 2. If it exceeds the ceiling, apply uniform gain reduction
|
|
25
|
+
* 3. For per-sample limiting, use a lookahead envelope follower
|
|
26
|
+
*
|
|
27
|
+
* @param buffer Audio buffer to limit (modified in-place)
|
|
28
|
+
* @param ceilingDbTP Target ceiling in dBTP (e.g., -1.0)
|
|
29
|
+
* @returns true if limiting was applied
|
|
30
|
+
*/
|
|
31
|
+
export declare function applyTruePeakLimiter(buffer: AudioBuffer, ceilingDbTP?: number): boolean;
|
|
32
|
+
//# sourceMappingURL=TruePeakLimiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TruePeakLimiter.d.ts","sourceRoot":"","sources":["../../src/processing/TruePeakLimiter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAwB7D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAGjE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,GAAE,MAAa,GAAG,OAAO,CA0E7F"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True Peak Limiter
|
|
3
|
+
*
|
|
4
|
+
* Implements:
|
|
5
|
+
* 1. 4x oversampling via windowed sinc interpolation
|
|
6
|
+
* 2. True peak measurement per ITU-R BS.1770-4 Annex 2
|
|
7
|
+
* 3. Brick-wall limiting with lookahead and release
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 4x oversampling FIR coefficients (half-band low-pass, 12-tap).
|
|
11
|
+
* These approximate a windowed sinc interpolation filter for 4x upsampling.
|
|
12
|
+
*/
|
|
13
|
+
const OVERSAMPLE_TAPS = [
|
|
14
|
+
0.0017089843750,
|
|
15
|
+
-0.0291748046875,
|
|
16
|
+
-0.0189208984375,
|
|
17
|
+
0.0708618164062,
|
|
18
|
+
0.3031005859375,
|
|
19
|
+
0.4736328125000,
|
|
20
|
+
0.3031005859375,
|
|
21
|
+
0.0708618164062,
|
|
22
|
+
-0.0189208984375,
|
|
23
|
+
-0.0291748046875,
|
|
24
|
+
0.0017089843750,
|
|
25
|
+
0.0000000000000,
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Measure the true peak of a mono channel using 4x oversampling.
|
|
29
|
+
* Returns peak in linear scale.
|
|
30
|
+
*/
|
|
31
|
+
export function measureTruePeak(samples) {
|
|
32
|
+
const taps = OVERSAMPLE_TAPS;
|
|
33
|
+
const numTaps = taps.length;
|
|
34
|
+
const halfTaps = Math.floor(numTaps / 2);
|
|
35
|
+
let maxPeak = 0;
|
|
36
|
+
// For each input sample, compute 4 interpolated values
|
|
37
|
+
for (let i = 0; i < samples.length; i++) {
|
|
38
|
+
for (let phase = 0; phase < 4; phase++) {
|
|
39
|
+
let sum = 0;
|
|
40
|
+
for (let t = 0; t < numTaps; t++) {
|
|
41
|
+
const srcIdx = i - halfTaps + t;
|
|
42
|
+
if (srcIdx >= 0 && srcIdx < samples.length) {
|
|
43
|
+
// Phase-offset tap selection for polyphase decomposition
|
|
44
|
+
sum += samples[srcIdx] * taps[t];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const abs = Math.abs(sum);
|
|
48
|
+
if (abs > maxPeak)
|
|
49
|
+
maxPeak = abs;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return maxPeak;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Measure true peak in dBTP for a mono channel.
|
|
56
|
+
*/
|
|
57
|
+
export function measureTruePeakDbTP(samples) {
|
|
58
|
+
const peak = measureTruePeak(samples);
|
|
59
|
+
return peak > 0 ? 20 * Math.log10(peak) : -Infinity;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Apply brick-wall true peak limiting to an AudioBuffer.
|
|
63
|
+
* Modifies the buffer in-place.
|
|
64
|
+
*
|
|
65
|
+
* The limiter uses a simple gain reduction approach:
|
|
66
|
+
* 1. Find the true peak of the entire buffer
|
|
67
|
+
* 2. If it exceeds the ceiling, apply uniform gain reduction
|
|
68
|
+
* 3. For per-sample limiting, use a lookahead envelope follower
|
|
69
|
+
*
|
|
70
|
+
* @param buffer Audio buffer to limit (modified in-place)
|
|
71
|
+
* @param ceilingDbTP Target ceiling in dBTP (e.g., -1.0)
|
|
72
|
+
* @returns true if limiting was applied
|
|
73
|
+
*/
|
|
74
|
+
export function applyTruePeakLimiter(buffer, ceilingDbTP = -1.0) {
|
|
75
|
+
const ceilingLinear = Math.pow(10, ceilingDbTP / 20);
|
|
76
|
+
const numChannels = buffer.numberOfChannels;
|
|
77
|
+
// Measure true peak across all channels
|
|
78
|
+
let globalTruePeak = 0;
|
|
79
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
80
|
+
const data = buffer.getChannelData(ch);
|
|
81
|
+
const peak = measureTruePeak(data);
|
|
82
|
+
if (peak > globalTruePeak)
|
|
83
|
+
globalTruePeak = peak;
|
|
84
|
+
}
|
|
85
|
+
// If already below ceiling, nothing to do
|
|
86
|
+
if (globalTruePeak <= ceilingLinear) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
// Lookahead limiter parameters
|
|
90
|
+
const sampleRate = buffer.sampleRate;
|
|
91
|
+
const lookaheadMs = 5; // 5ms lookahead
|
|
92
|
+
const releaseMs = 100; // 100ms release
|
|
93
|
+
const lookaheadSamples = Math.ceil(sampleRate * lookaheadMs / 1000);
|
|
94
|
+
const releaseCoeff = Math.exp(-1.0 / (sampleRate * releaseMs / 1000));
|
|
95
|
+
// Compute per-sample gain envelope based on peak detection
|
|
96
|
+
const length = buffer.length;
|
|
97
|
+
const gainEnvelope = new Float32Array(length);
|
|
98
|
+
gainEnvelope.fill(1.0);
|
|
99
|
+
// First pass: find per-sample peaks across channels
|
|
100
|
+
const peaks = new Float32Array(length);
|
|
101
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
102
|
+
const data = buffer.getChannelData(ch);
|
|
103
|
+
for (let i = 0; i < length; i++) {
|
|
104
|
+
const abs = Math.abs(data[i]);
|
|
105
|
+
if (abs > peaks[i])
|
|
106
|
+
peaks[i] = abs;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Second pass: compute gain reduction with lookahead
|
|
110
|
+
let currentGain = 1.0;
|
|
111
|
+
for (let i = length - 1; i >= 0; i--) {
|
|
112
|
+
// Look ahead to find the peak that's coming
|
|
113
|
+
let futureMax = 0;
|
|
114
|
+
const lookEnd = Math.min(i + lookaheadSamples, length);
|
|
115
|
+
for (let j = i; j < lookEnd; j++) {
|
|
116
|
+
if (peaks[j] > futureMax)
|
|
117
|
+
futureMax = peaks[j];
|
|
118
|
+
}
|
|
119
|
+
// Desired gain for this sample
|
|
120
|
+
let desiredGain = 1.0;
|
|
121
|
+
if (futureMax > ceilingLinear) {
|
|
122
|
+
desiredGain = ceilingLinear / futureMax;
|
|
123
|
+
}
|
|
124
|
+
// Smooth gain changes (attack = instant, release = smooth)
|
|
125
|
+
if (desiredGain < currentGain) {
|
|
126
|
+
currentGain = desiredGain; // instant attack
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
currentGain = desiredGain + releaseCoeff * (currentGain - desiredGain);
|
|
130
|
+
}
|
|
131
|
+
gainEnvelope[i] = currentGain;
|
|
132
|
+
}
|
|
133
|
+
// Apply gain envelope to all channels
|
|
134
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
135
|
+
const data = buffer.getChannelData(ch);
|
|
136
|
+
for (let i = 0; i < length; i++) {
|
|
137
|
+
data[i] *= gainEnvelope[i];
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=TruePeakLimiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TruePeakLimiter.js","sourceRoot":"","sources":["../../src/processing/TruePeakLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ExportPreset } from '../domain/ExportPreset';
|
|
2
|
+
/**
|
|
3
|
+
* IndexedDB storage for export presets.
|
|
4
|
+
* Follows the same pattern as SessionStorage.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ExportPresetStorage {
|
|
7
|
+
private static instance;
|
|
8
|
+
private dbPromise;
|
|
9
|
+
private constructor();
|
|
10
|
+
static getInstance(): ExportPresetStorage;
|
|
11
|
+
private openDB;
|
|
12
|
+
/**
|
|
13
|
+
* Save a user preset.
|
|
14
|
+
*/
|
|
15
|
+
savePreset(preset: ExportPreset): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Load a preset by ID.
|
|
18
|
+
*/
|
|
19
|
+
loadPreset(id: string): Promise<ExportPreset | null>;
|
|
20
|
+
/**
|
|
21
|
+
* List all saved user presets.
|
|
22
|
+
*/
|
|
23
|
+
listPresets(): Promise<ExportPreset[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Get all presets (built-in + user).
|
|
26
|
+
*/
|
|
27
|
+
getAllPresets(): Promise<ExportPreset[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Delete a user preset by ID.
|
|
30
|
+
*/
|
|
31
|
+
deletePreset(id: string): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ExportPresetStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportPresetStorage.d.ts","sourceRoot":"","sources":["../../src/storage/ExportPresetStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,YAAY,EAAqB,MAAM,wBAAwB,CAAC;AAM/F;;;GAGG;AACH,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAqC;IAEtD,OAAO;WAEO,WAAW,IAAI,mBAAmB;IAOhD,OAAO,CAAC,MAAM;IA2Cd;;OAEG;IACU,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5D;;OAEG;IACU,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAajE;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAanD;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAMrD;;OAEG;IACU,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASvD"}
|