@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,111 @@
|
|
|
1
|
+
import { Signal } from '../../lib/Signal';
|
|
2
|
+
import { FrameCount, TrackId } from '../../domain/types';
|
|
3
|
+
/**
|
|
4
|
+
* PunchRecordManager handles automatic punch-in/punch-out recording.
|
|
5
|
+
*
|
|
6
|
+
* When punch is enabled:
|
|
7
|
+
* - Recording starts automatically when playhead enters the punch range
|
|
8
|
+
* - Recording stops automatically when playhead exits the punch range
|
|
9
|
+
* - Declick fades are applied at punch boundaries
|
|
10
|
+
* - Pre-roll audio before punch-in is discarded
|
|
11
|
+
*
|
|
12
|
+
* Modes:
|
|
13
|
+
* - Simple punch: single pass recording within the range
|
|
14
|
+
* - Loop punch: repeated punch recording when loop + punch are both enabled
|
|
15
|
+
*/
|
|
16
|
+
export interface PunchState {
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
punchIn: FrameCount;
|
|
19
|
+
punchOut: FrameCount;
|
|
20
|
+
isPunchedIn: boolean;
|
|
21
|
+
armedTrackIds: TrackId[];
|
|
22
|
+
}
|
|
23
|
+
export declare class PunchRecordManager {
|
|
24
|
+
private _enabled;
|
|
25
|
+
private _punchIn;
|
|
26
|
+
private _punchOut;
|
|
27
|
+
private _isPunchedIn;
|
|
28
|
+
private _armedTrackIds;
|
|
29
|
+
private _declickLength;
|
|
30
|
+
/** Emitted when the playhead enters the punch range and recording begins. */
|
|
31
|
+
readonly punchInTriggered: Signal<string[]>;
|
|
32
|
+
/** Emitted when the playhead exits the punch range and recording stops. */
|
|
33
|
+
readonly punchOutTriggered: Signal<string[]>;
|
|
34
|
+
/** Emitted whenever the punch state changes. */
|
|
35
|
+
readonly stateChanged: Signal<PunchState>;
|
|
36
|
+
/**
|
|
37
|
+
* @param sampleRate - Audio sample rate, used to compute declick fade length.
|
|
38
|
+
* Defaults to 44100 if omitted.
|
|
39
|
+
*/
|
|
40
|
+
constructor(sampleRate?: number);
|
|
41
|
+
/**
|
|
42
|
+
* Configure the punch range boundaries.
|
|
43
|
+
* @param punchIn - Frame at which recording should begin
|
|
44
|
+
* @param punchOut - Frame at which recording should end
|
|
45
|
+
*/
|
|
46
|
+
setPunchRange(punchIn: FrameCount, punchOut: FrameCount): void;
|
|
47
|
+
/**
|
|
48
|
+
* Enable or disable punch recording.
|
|
49
|
+
* Disabling while punched-in will trigger an immediate punch-out.
|
|
50
|
+
*/
|
|
51
|
+
setEnabled(enabled: boolean): void;
|
|
52
|
+
/**
|
|
53
|
+
* Arm a track for punch recording.
|
|
54
|
+
* Only armed tracks will be affected by punch-in/punch-out events.
|
|
55
|
+
*/
|
|
56
|
+
armTrack(trackId: TrackId): void;
|
|
57
|
+
/**
|
|
58
|
+
* Disarm a track from punch recording.
|
|
59
|
+
*/
|
|
60
|
+
disarmTrack(trackId: TrackId): void;
|
|
61
|
+
/**
|
|
62
|
+
* Called each audio process cycle with the current transport position.
|
|
63
|
+
* Checks whether the playhead has crossed a punch boundary and triggers
|
|
64
|
+
* punch-in or punch-out accordingly.
|
|
65
|
+
*
|
|
66
|
+
* @param currentFrame - The current transport playhead position in frames
|
|
67
|
+
* @returns true if the recording state changed during this call
|
|
68
|
+
*/
|
|
69
|
+
processPosition(currentFrame: FrameCount): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get a snapshot of the current punch state.
|
|
72
|
+
*/
|
|
73
|
+
getState(): PunchState;
|
|
74
|
+
/**
|
|
75
|
+
* Whether we're currently in the punched-in state (recording is active
|
|
76
|
+
* within the punch range).
|
|
77
|
+
*/
|
|
78
|
+
get isPunchedIn(): boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Compute declick fade gain at a given position relative to punch boundaries.
|
|
81
|
+
*
|
|
82
|
+
* Returns a gain value between 0.0 and 1.0:
|
|
83
|
+
* - Ramps from 0->1 over _declickLength frames starting at punchIn (fade-in)
|
|
84
|
+
* - Ramps from 1->0 over _declickLength frames ending at punchOut (fade-out)
|
|
85
|
+
* - Returns 1.0 for positions in the middle of the punch range
|
|
86
|
+
* - Returns 0.0 for positions outside the punch range
|
|
87
|
+
*
|
|
88
|
+
* Uses a raised-cosine (Hann) curve for perceptually smooth transitions,
|
|
89
|
+
* consistent with the Declicker class.
|
|
90
|
+
*/
|
|
91
|
+
getDeclickGain(frame: FrameCount): number;
|
|
92
|
+
/**
|
|
93
|
+
* Reset state (called on transport stop).
|
|
94
|
+
* Clears the punched-in state without emitting punch-out signals,
|
|
95
|
+
* since transport stop implies recording has already ceased.
|
|
96
|
+
*/
|
|
97
|
+
reset(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Execute a punch-in: transition to recording state and notify listeners.
|
|
100
|
+
*/
|
|
101
|
+
private _doPunchIn;
|
|
102
|
+
/**
|
|
103
|
+
* Execute a punch-out: transition out of recording state and notify listeners.
|
|
104
|
+
*/
|
|
105
|
+
private _doPunchOut;
|
|
106
|
+
/**
|
|
107
|
+
* Emit a stateChanged signal with the current punch state snapshot.
|
|
108
|
+
*/
|
|
109
|
+
private _emitStateChanged;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=PunchRecordManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PunchRecordManager.d.ts","sourceRoot":"","sources":["../../../src/audio/engine/PunchRecordManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,EAAE,CAAC;CAC5B;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAA2B;IAGjD,OAAO,CAAC,cAAc,CAAc;IAEpC,6EAA6E;IAC7E,SAAgB,gBAAgB,mBAA2B;IAE3D,2EAA2E;IAC3E,SAAgB,iBAAiB,mBAA2B;IAE5D,gDAAgD;IAChD,SAAgB,YAAY,qBAA4B;IAExD;;;OAGG;gBACS,UAAU,CAAC,EAAE,MAAM;IAQ/B;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAW9D;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAclC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKhC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOnC;;;;;;;OAOG;IACH,eAAe,CAAC,YAAY,EAAE,UAAU,GAAG,OAAO;IA6BlD;;OAEG;IACH,QAAQ,IAAI,UAAU;IAUtB;;;OAGG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAgCzC;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG5B"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Signal } from '../../lib/Signal';
|
|
2
|
+
export class PunchRecordManager {
|
|
3
|
+
/**
|
|
4
|
+
* @param sampleRate - Audio sample rate, used to compute declick fade length.
|
|
5
|
+
* Defaults to 44100 if omitted.
|
|
6
|
+
*/
|
|
7
|
+
constructor(sampleRate) {
|
|
8
|
+
this._enabled = false;
|
|
9
|
+
this._punchIn = 0;
|
|
10
|
+
this._punchOut = 0;
|
|
11
|
+
this._isPunchedIn = false;
|
|
12
|
+
this._armedTrackIds = new Set();
|
|
13
|
+
// Declick fade length in frames (~1.5ms at 44100)
|
|
14
|
+
this._declickLength = 64;
|
|
15
|
+
/** Emitted when the playhead enters the punch range and recording begins. */
|
|
16
|
+
this.punchInTriggered = new Signal();
|
|
17
|
+
/** Emitted when the playhead exits the punch range and recording stops. */
|
|
18
|
+
this.punchOutTriggered = new Signal();
|
|
19
|
+
/** Emitted whenever the punch state changes. */
|
|
20
|
+
this.stateChanged = new Signal();
|
|
21
|
+
const rate = sampleRate !== null && sampleRate !== void 0 ? sampleRate : 44100;
|
|
22
|
+
// ~1.5ms declick fade, minimum 16 samples
|
|
23
|
+
this._declickLength = Math.max(16, Math.round((1.5 / 1000) * rate));
|
|
24
|
+
}
|
|
25
|
+
// ─── Configuration ──────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Configure the punch range boundaries.
|
|
28
|
+
* @param punchIn - Frame at which recording should begin
|
|
29
|
+
* @param punchOut - Frame at which recording should end
|
|
30
|
+
*/
|
|
31
|
+
setPunchRange(punchIn, punchOut) {
|
|
32
|
+
if (punchOut <= punchIn) {
|
|
33
|
+
throw new Error(`Invalid punch range: punchOut (${punchOut}) must be greater than punchIn (${punchIn})`);
|
|
34
|
+
}
|
|
35
|
+
this._punchIn = punchIn;
|
|
36
|
+
this._punchOut = punchOut;
|
|
37
|
+
this._emitStateChanged();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Enable or disable punch recording.
|
|
41
|
+
* Disabling while punched-in will trigger an immediate punch-out.
|
|
42
|
+
*/
|
|
43
|
+
setEnabled(enabled) {
|
|
44
|
+
const wasEnabled = this._enabled;
|
|
45
|
+
this._enabled = enabled;
|
|
46
|
+
// If disabling while currently punched in, trigger punch-out
|
|
47
|
+
if (wasEnabled && !enabled && this._isPunchedIn) {
|
|
48
|
+
this._doPunchOut();
|
|
49
|
+
}
|
|
50
|
+
this._emitStateChanged();
|
|
51
|
+
}
|
|
52
|
+
// ─── Track Arming ───────────────────────────────────────────────────
|
|
53
|
+
/**
|
|
54
|
+
* Arm a track for punch recording.
|
|
55
|
+
* Only armed tracks will be affected by punch-in/punch-out events.
|
|
56
|
+
*/
|
|
57
|
+
armTrack(trackId) {
|
|
58
|
+
this._armedTrackIds.add(trackId);
|
|
59
|
+
this._emitStateChanged();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Disarm a track from punch recording.
|
|
63
|
+
*/
|
|
64
|
+
disarmTrack(trackId) {
|
|
65
|
+
this._armedTrackIds.delete(trackId);
|
|
66
|
+
this._emitStateChanged();
|
|
67
|
+
}
|
|
68
|
+
// ─── Processing ─────────────────────────────────────────────────────
|
|
69
|
+
/**
|
|
70
|
+
* Called each audio process cycle with the current transport position.
|
|
71
|
+
* Checks whether the playhead has crossed a punch boundary and triggers
|
|
72
|
+
* punch-in or punch-out accordingly.
|
|
73
|
+
*
|
|
74
|
+
* @param currentFrame - The current transport playhead position in frames
|
|
75
|
+
* @returns true if the recording state changed during this call
|
|
76
|
+
*/
|
|
77
|
+
processPosition(currentFrame) {
|
|
78
|
+
if (!this._enabled) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
if (this._armedTrackIds.size === 0) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
const wasInRange = this._isPunchedIn;
|
|
85
|
+
const isInRange = currentFrame >= this._punchIn && currentFrame < this._punchOut;
|
|
86
|
+
if (!wasInRange && isInRange) {
|
|
87
|
+
// Playhead just entered the punch range -> punch in
|
|
88
|
+
this._doPunchIn();
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
if (wasInRange && !isInRange) {
|
|
92
|
+
// Playhead just exited the punch range -> punch out
|
|
93
|
+
this._doPunchOut();
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// ─── State Queries ──────────────────────────────────────────────────
|
|
99
|
+
/**
|
|
100
|
+
* Get a snapshot of the current punch state.
|
|
101
|
+
*/
|
|
102
|
+
getState() {
|
|
103
|
+
return {
|
|
104
|
+
enabled: this._enabled,
|
|
105
|
+
punchIn: this._punchIn,
|
|
106
|
+
punchOut: this._punchOut,
|
|
107
|
+
isPunchedIn: this._isPunchedIn,
|
|
108
|
+
armedTrackIds: Array.from(this._armedTrackIds),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether we're currently in the punched-in state (recording is active
|
|
113
|
+
* within the punch range).
|
|
114
|
+
*/
|
|
115
|
+
get isPunchedIn() {
|
|
116
|
+
return this._isPunchedIn;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Compute declick fade gain at a given position relative to punch boundaries.
|
|
120
|
+
*
|
|
121
|
+
* Returns a gain value between 0.0 and 1.0:
|
|
122
|
+
* - Ramps from 0->1 over _declickLength frames starting at punchIn (fade-in)
|
|
123
|
+
* - Ramps from 1->0 over _declickLength frames ending at punchOut (fade-out)
|
|
124
|
+
* - Returns 1.0 for positions in the middle of the punch range
|
|
125
|
+
* - Returns 0.0 for positions outside the punch range
|
|
126
|
+
*
|
|
127
|
+
* Uses a raised-cosine (Hann) curve for perceptually smooth transitions,
|
|
128
|
+
* consistent with the Declicker class.
|
|
129
|
+
*/
|
|
130
|
+
getDeclickGain(frame) {
|
|
131
|
+
if (!this._enabled) {
|
|
132
|
+
return 1.0;
|
|
133
|
+
}
|
|
134
|
+
// Outside punch range entirely
|
|
135
|
+
if (frame < this._punchIn || frame >= this._punchOut) {
|
|
136
|
+
return 0.0;
|
|
137
|
+
}
|
|
138
|
+
const fadeLen = this._declickLength;
|
|
139
|
+
// Fade-in region: punchIn to punchIn + fadeLen
|
|
140
|
+
const distFromStart = frame - this._punchIn;
|
|
141
|
+
if (distFromStart < fadeLen) {
|
|
142
|
+
// Raised cosine (Hann) fade-in: 0.5 * (1 - cos(pi * t))
|
|
143
|
+
const t = distFromStart / (fadeLen - 1);
|
|
144
|
+
return 0.5 * (1 - Math.cos(Math.PI * t));
|
|
145
|
+
}
|
|
146
|
+
// Fade-out region: punchOut - fadeLen to punchOut
|
|
147
|
+
const distFromEnd = this._punchOut - frame;
|
|
148
|
+
if (distFromEnd <= fadeLen) {
|
|
149
|
+
// Raised cosine (Hann) fade-out: 0.5 * (1 + cos(pi * t))
|
|
150
|
+
const t = (fadeLen - distFromEnd) / (fadeLen - 1);
|
|
151
|
+
return 0.5 * (1 + Math.cos(Math.PI * t));
|
|
152
|
+
}
|
|
153
|
+
// In the middle of the range — full gain
|
|
154
|
+
return 1.0;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Reset state (called on transport stop).
|
|
158
|
+
* Clears the punched-in state without emitting punch-out signals,
|
|
159
|
+
* since transport stop implies recording has already ceased.
|
|
160
|
+
*/
|
|
161
|
+
reset() {
|
|
162
|
+
this._isPunchedIn = false;
|
|
163
|
+
this._emitStateChanged();
|
|
164
|
+
}
|
|
165
|
+
// ─── Private helpers ────────────────────────────────────────────────
|
|
166
|
+
/**
|
|
167
|
+
* Execute a punch-in: transition to recording state and notify listeners.
|
|
168
|
+
*/
|
|
169
|
+
_doPunchIn() {
|
|
170
|
+
this._isPunchedIn = true;
|
|
171
|
+
const trackIds = Array.from(this._armedTrackIds);
|
|
172
|
+
this.punchInTriggered.emit(trackIds);
|
|
173
|
+
this._emitStateChanged();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Execute a punch-out: transition out of recording state and notify listeners.
|
|
177
|
+
*/
|
|
178
|
+
_doPunchOut() {
|
|
179
|
+
this._isPunchedIn = false;
|
|
180
|
+
const trackIds = Array.from(this._armedTrackIds);
|
|
181
|
+
this.punchOutTriggered.emit(trackIds);
|
|
182
|
+
this._emitStateChanged();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Emit a stateChanged signal with the current punch state snapshot.
|
|
186
|
+
*/
|
|
187
|
+
_emitStateChanged() {
|
|
188
|
+
this.stateChanged.emit(this.getState());
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=PunchRecordManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PunchRecordManager.js","sourceRoot":"","sources":["../../../src/audio/engine/PunchRecordManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Signal } from '../../lib/Signal';
|
|
2
|
+
/**
|
|
3
|
+
* RoutingGraph represents the DAW's signal flow as a directed graph.
|
|
4
|
+
*
|
|
5
|
+
* Each node is a track/bus/aux route. Edges represent audio connections:
|
|
6
|
+
* - Direct outputs (track -> master bus)
|
|
7
|
+
* - Send connections (track -> aux bus)
|
|
8
|
+
* - Sidechain connections (track -> processor on another track)
|
|
9
|
+
*
|
|
10
|
+
* The graph is used to:
|
|
11
|
+
* 1. Compute topological processing order
|
|
12
|
+
* 2. Detect feedback loops
|
|
13
|
+
* 3. Determine which routes "feed" other routes
|
|
14
|
+
* 4. Optimize parallel processing opportunities
|
|
15
|
+
*/
|
|
16
|
+
export interface GraphNode {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
type: 'audio' | 'midi' | 'aux' | 'bus' | 'master' | 'folder' | 'vca';
|
|
20
|
+
inputs: Set<string>;
|
|
21
|
+
outputs: Set<string>;
|
|
22
|
+
processed: boolean;
|
|
23
|
+
depth: number;
|
|
24
|
+
}
|
|
25
|
+
export interface FeedbackLoop {
|
|
26
|
+
path: string[];
|
|
27
|
+
description: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class RoutingGraph {
|
|
30
|
+
private _nodes;
|
|
31
|
+
readonly graphChanged: Signal<void>;
|
|
32
|
+
readonly feedbackDetected: Signal<FeedbackLoop>;
|
|
33
|
+
/**
|
|
34
|
+
* Add a node to the graph.
|
|
35
|
+
* If a node with the same ID already exists, it is updated in place.
|
|
36
|
+
*/
|
|
37
|
+
addNode(id: string, name: string, type: GraphNode['type']): void;
|
|
38
|
+
/**
|
|
39
|
+
* Remove a node and all edges that reference it.
|
|
40
|
+
*/
|
|
41
|
+
removeNode(id: string): void;
|
|
42
|
+
/**
|
|
43
|
+
* Add a directed edge from one node to another.
|
|
44
|
+
* Both nodes must already exist in the graph.
|
|
45
|
+
*/
|
|
46
|
+
addEdge(fromId: string, toId: string): void;
|
|
47
|
+
/**
|
|
48
|
+
* Remove a directed edge between two nodes.
|
|
49
|
+
*/
|
|
50
|
+
removeEdge(fromId: string, toId: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Rebuild the entire graph from session state.
|
|
53
|
+
* Clears all existing nodes/edges and reconstructs from the provided
|
|
54
|
+
* track descriptors. Typically called after bulk routing changes.
|
|
55
|
+
*/
|
|
56
|
+
rebuild(tracks: Array<{
|
|
57
|
+
id: string;
|
|
58
|
+
name: string;
|
|
59
|
+
type: string;
|
|
60
|
+
sendTargets: string[];
|
|
61
|
+
outputTarget: string;
|
|
62
|
+
}>): void;
|
|
63
|
+
/**
|
|
64
|
+
* Compute a valid processing order using Kahn's algorithm for
|
|
65
|
+
* topological sorting. Leaf nodes (no inputs) are processed first,
|
|
66
|
+
* working upward to the master bus.
|
|
67
|
+
*
|
|
68
|
+
* If cycles exist, the returned order will be incomplete (nodes
|
|
69
|
+
* involved in cycles are omitted). Use detectFeedback() to identify
|
|
70
|
+
* those cycles.
|
|
71
|
+
*
|
|
72
|
+
* @returns An array of node IDs in processing order.
|
|
73
|
+
*/
|
|
74
|
+
getProcessingOrder(): string[];
|
|
75
|
+
/**
|
|
76
|
+
* Detect all feedback loops (cycles) in the graph using DFS.
|
|
77
|
+
* Returns an array of FeedbackLoop descriptors, each containing the
|
|
78
|
+
* ordered path of node IDs that form the cycle.
|
|
79
|
+
*/
|
|
80
|
+
detectFeedback(): FeedbackLoop[];
|
|
81
|
+
/**
|
|
82
|
+
* Check whether route A feeds (directly or indirectly) into route B.
|
|
83
|
+
* Uses BFS from A, following output edges, to determine reachability.
|
|
84
|
+
*/
|
|
85
|
+
feeds(fromId: string, toId: string): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Check whether route A directly feeds into route B (single hop).
|
|
88
|
+
*/
|
|
89
|
+
directFeeds(fromId: string, toId: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Get all routes that feed (directly or indirectly) into the given route.
|
|
92
|
+
* Traverses backward from the target, following input edges via BFS.
|
|
93
|
+
*/
|
|
94
|
+
getUpstream(nodeId: string): string[];
|
|
95
|
+
/**
|
|
96
|
+
* Get all routes that the given route feeds (directly or indirectly) into.
|
|
97
|
+
* Traverses forward from the source, following output edges via BFS.
|
|
98
|
+
*/
|
|
99
|
+
getDownstream(nodeId: string): string[];
|
|
100
|
+
/**
|
|
101
|
+
* Find groups of nodes that can be processed in parallel.
|
|
102
|
+
* Nodes at the same depth in the topological ordering have no
|
|
103
|
+
* dependencies on each other and can safely run concurrently.
|
|
104
|
+
*
|
|
105
|
+
* Uses a BFS-based level assignment: leaf nodes (in-degree 0) are
|
|
106
|
+
* at level 0, their consumers at level 1, and so on. Nodes at the
|
|
107
|
+
* same level form a parallel group.
|
|
108
|
+
*
|
|
109
|
+
* @returns An array of groups, where each group is an array of node IDs
|
|
110
|
+
* that can be processed simultaneously. Groups are returned in
|
|
111
|
+
* processing order (group 0 first, then group 1, etc.).
|
|
112
|
+
*/
|
|
113
|
+
getParallelGroups(): string[][];
|
|
114
|
+
/**
|
|
115
|
+
* Get a single node by ID.
|
|
116
|
+
*/
|
|
117
|
+
getNode(id: string): GraphNode | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Get all nodes as a read-only array.
|
|
120
|
+
*/
|
|
121
|
+
get nodes(): ReadonlyArray<GraphNode>;
|
|
122
|
+
/**
|
|
123
|
+
* Clear all nodes and edges, resetting the graph to an empty state.
|
|
124
|
+
*/
|
|
125
|
+
clear(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Compute the depth of each node (longest path from any leaf to this node).
|
|
128
|
+
* Leaf nodes (no inputs) have depth 0. Used for parallel group assignment
|
|
129
|
+
* and rendering the graph visualization.
|
|
130
|
+
*/
|
|
131
|
+
private _computeDepths;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=RoutingGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutingGraph.d.ts","sourceRoot":"","sources":["../../../src/audio/engine/RoutingGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IACrE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAqC;IAEnD,SAAgB,YAAY,eAAsB;IAClD,SAAgB,gBAAgB,uBAA8B;IAI9D;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAmBhE;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAoB5B;;;OAGG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAU3C;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAY9C;;;;OAIG;IACH,OAAO,CACH,MAAM,EAAE,KAAK,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC,GACH,IAAI;IAkDP;;;;;;;;;;OAUG;IACH,kBAAkB,IAAI,MAAM,EAAE;IA0C9B;;;;OAIG;IACH,cAAc,IAAI,YAAY,EAAE;IA6DhC;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAyB5C;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAMlD;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAyBrC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IA2BvC;;;;;;;;;;;;OAYG;IACH,iBAAiB,IAAI,MAAM,EAAE,EAAE;IAqE/B;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI1C;;OAEG;IACH,IAAI,KAAK,IAAI,aAAa,CAAC,SAAS,CAAC,CAEpC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;;;OAIG;IACH,OAAO,CAAC,cAAc;CAoBzB"}
|