@drop-ai/core 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +655 -237
- package/dist/actions/ActionRegistry.d.ts.map +1 -1
- package/dist/actions/ActionRegistry.js +7 -2
- package/dist/actions/ActionRegistry.js.map +1 -1
- package/dist/actions/types.d.ts +7 -1
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/analysis/AudioAnalyzer.d.ts +71 -0
- package/dist/analysis/AudioAnalyzer.d.ts.map +1 -0
- package/dist/analysis/AudioAnalyzer.js +569 -0
- package/dist/analysis/AudioAnalyzer.js.map +1 -0
- package/dist/audio/AudioEngine.d.ts +14 -1
- package/dist/audio/AudioEngine.d.ts.map +1 -1
- package/dist/audio/AudioEngine.js +115 -35
- package/dist/audio/AudioEngine.js.map +1 -1
- package/dist/audio/Auditioner.d.ts +104 -0
- package/dist/audio/Auditioner.d.ts.map +1 -0
- package/dist/audio/Auditioner.js +239 -0
- package/dist/audio/Auditioner.js.map +1 -0
- package/dist/audio/BWFMetadata.d.ts +116 -0
- package/dist/audio/BWFMetadata.d.ts.map +1 -0
- package/dist/audio/BWFMetadata.js +394 -0
- package/dist/audio/BWFMetadata.js.map +1 -0
- package/dist/audio/ChannelSplitter.d.ts +37 -0
- package/dist/audio/ChannelSplitter.d.ts.map +1 -0
- package/dist/audio/ChannelSplitter.js +82 -0
- package/dist/audio/ChannelSplitter.js.map +1 -0
- package/dist/audio/ExportAnalyzer.d.ts +39 -0
- package/dist/audio/ExportAnalyzer.d.ts.map +1 -0
- package/dist/audio/ExportAnalyzer.js +76 -0
- package/dist/audio/ExportAnalyzer.js.map +1 -0
- package/dist/audio/LufsNormalizer.d.ts +37 -0
- package/dist/audio/LufsNormalizer.d.ts.map +1 -0
- package/dist/audio/LufsNormalizer.js +217 -0
- package/dist/audio/LufsNormalizer.js.map +1 -0
- package/dist/audio/OfflineExporter.d.ts +1 -6
- package/dist/audio/OfflineExporter.d.ts.map +1 -1
- package/dist/audio/OfflineExporter.js +31 -10
- package/dist/audio/OfflineExporter.js.map +1 -1
- package/dist/audio/RoutingGraph.d.ts +134 -0
- package/dist/audio/RoutingGraph.d.ts.map +1 -0
- package/dist/audio/RoutingGraph.js +547 -0
- package/dist/audio/RoutingGraph.js.map +1 -0
- package/dist/audio/SampleRateConverter.d.ts +21 -0
- package/dist/audio/SampleRateConverter.d.ts.map +1 -0
- package/dist/audio/SampleRateConverter.js +84 -0
- package/dist/audio/SampleRateConverter.js.map +1 -0
- package/dist/audio/SilencePadding.d.ts +29 -0
- package/dist/audio/SilencePadding.d.ts.map +1 -0
- package/dist/audio/SilencePadding.js +86 -0
- package/dist/audio/SilencePadding.js.map +1 -0
- package/dist/audio/SourceCache.d.ts +13 -16
- package/dist/audio/SourceCache.d.ts.map +1 -1
- package/dist/audio/SourceCache.js +21 -33
- package/dist/audio/SourceCache.js.map +1 -1
- package/dist/audio/engine/Declick.d.ts +98 -0
- package/dist/audio/engine/Declick.d.ts.map +1 -0
- package/dist/audio/engine/Declick.js +204 -0
- package/dist/audio/engine/Declick.js.map +1 -0
- package/dist/audio/engine/DiskIO.d.ts +172 -0
- package/dist/audio/engine/DiskIO.d.ts.map +1 -0
- package/dist/audio/engine/DiskIO.js +384 -0
- package/dist/audio/engine/DiskIO.js.map +1 -0
- package/dist/audio/engine/LatencyCompensator.d.ts +46 -0
- package/dist/audio/engine/LatencyCompensator.d.ts.map +1 -0
- package/dist/audio/engine/LatencyCompensator.js +84 -0
- package/dist/audio/engine/LatencyCompensator.js.map +1 -0
- package/dist/audio/engine/MultiTrackRecorder.d.ts +146 -0
- package/dist/audio/engine/MultiTrackRecorder.d.ts.map +1 -0
- package/dist/audio/engine/MultiTrackRecorder.js +359 -0
- package/dist/audio/engine/MultiTrackRecorder.js.map +1 -0
- package/dist/audio/engine/PlaylistEngine.d.ts.map +1 -1
- package/dist/audio/engine/PlaylistEngine.js +9 -2
- package/dist/audio/engine/PlaylistEngine.js.map +1 -1
- package/dist/audio/engine/PunchRecordManager.d.ts +113 -0
- package/dist/audio/engine/PunchRecordManager.d.ts.map +1 -0
- package/dist/audio/engine/PunchRecordManager.js +191 -0
- package/dist/audio/engine/PunchRecordManager.js.map +1 -0
- package/dist/audio/engine/RoutingGraph.d.ts +135 -0
- package/dist/audio/engine/RoutingGraph.d.ts.map +1 -0
- package/dist/audio/engine/RoutingGraph.js +436 -0
- package/dist/audio/engine/RoutingGraph.js.map +1 -0
- package/dist/audio/engine/SidechainRouter.d.ts +139 -0
- package/dist/audio/engine/SidechainRouter.d.ts.map +1 -0
- package/dist/audio/engine/SidechainRouter.js +292 -0
- package/dist/audio/engine/SidechainRouter.js.map +1 -0
- package/dist/audio/engine/XrunTracker.d.ts +71 -0
- package/dist/audio/engine/XrunTracker.d.ts.map +1 -0
- package/dist/audio/engine/XrunTracker.js +118 -0
- package/dist/audio/engine/XrunTracker.js.map +1 -0
- package/dist/audio/export/CDMarkerExporter.d.ts +62 -0
- package/dist/audio/export/CDMarkerExporter.d.ts.map +1 -0
- package/dist/audio/export/CDMarkerExporter.js +164 -0
- package/dist/audio/export/CDMarkerExporter.js.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts +121 -0
- package/dist/audio/export/ExportGraphBuilder.d.ts.map +1 -0
- package/dist/audio/export/ExportGraphBuilder.js +522 -0
- package/dist/audio/export/ExportGraphBuilder.js.map +1 -0
- package/dist/audio/export/ExportPresetManager.d.ts +87 -0
- package/dist/audio/export/ExportPresetManager.d.ts.map +1 -0
- package/dist/audio/export/ExportPresetManager.js +306 -0
- package/dist/audio/export/ExportPresetManager.js.map +1 -0
- package/dist/commands/handlers/RegionHandler.d.ts.map +1 -1
- package/dist/commands/handlers/RegionHandler.js +25 -1
- package/dist/commands/handlers/RegionHandler.js.map +1 -1
- package/dist/commands/handlers/TrackHandler.js +1 -1
- package/dist/commands/handlers/TrackHandler.js.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.d.ts.map +1 -1
- package/dist/commands/impl/FreezeTrackCommand.js +37 -36
- package/dist/commands/impl/FreezeTrackCommand.js.map +1 -1
- package/dist/commands/impl/SetRegionTimeDomainCommand.d.ts.map +1 -1
- package/dist/commands/impl/SetRegionTimeDomainCommand.js +3 -3
- package/dist/commands/impl/SetRegionTimeDomainCommand.js.map +1 -1
- package/dist/commands/impl/ToggleLoopCommand.d.ts +1 -0
- package/dist/commands/impl/ToggleLoopCommand.d.ts.map +1 -1
- package/dist/commands/impl/ToggleLoopCommand.js +10 -0
- package/dist/commands/impl/ToggleLoopCommand.js.map +1 -1
- package/dist/commands/impl/TrimRegionCommand.d.ts +14 -1
- package/dist/commands/impl/TrimRegionCommand.d.ts.map +1 -1
- package/dist/commands/impl/TrimRegionCommand.js +138 -33
- package/dist/commands/impl/TrimRegionCommand.js.map +1 -1
- package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts +27 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js +69 -0
- package/dist/commands/impl/TrimRegionToPlayheadCommand.js.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts +28 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js +69 -0
- package/dist/commands/impl/TrimRegionToRangeCommand.js.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts +27 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.d.ts.map +1 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.js +77 -0
- package/dist/commands/impl/TrimToAdjacentRegionCommand.js.map +1 -0
- package/dist/commands/types.d.ts +19 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js +21 -0
- package/dist/commands/types.js.map +1 -1
- package/dist/domain/Crossfade.d.ts +78 -0
- package/dist/domain/Crossfade.d.ts.map +1 -0
- package/dist/domain/Crossfade.js +216 -0
- package/dist/domain/Crossfade.js.map +1 -0
- package/dist/domain/ExportConfig.d.ts +98 -1
- package/dist/domain/ExportConfig.d.ts.map +1 -1
- package/dist/domain/ExportConfig.js +154 -1
- package/dist/domain/ExportConfig.js.map +1 -1
- package/dist/domain/ExportPreset.d.ts +62 -0
- package/dist/domain/ExportPreset.d.ts.map +1 -0
- package/dist/domain/ExportPreset.js +79 -0
- package/dist/domain/ExportPreset.js.map +1 -0
- package/dist/domain/ImportStatus.d.ts +40 -0
- package/dist/domain/ImportStatus.d.ts.map +1 -0
- package/dist/domain/ImportStatus.js +86 -0
- package/dist/domain/ImportStatus.js.map +1 -0
- package/dist/domain/Playlist.d.ts +72 -0
- package/dist/domain/Playlist.d.ts.map +1 -1
- package/dist/domain/Playlist.js +231 -6
- package/dist/domain/Playlist.js.map +1 -1
- package/dist/domain/Region.d.ts +76 -0
- package/dist/domain/Region.d.ts.map +1 -1
- package/dist/domain/Region.js +234 -1
- package/dist/domain/Region.js.map +1 -1
- package/dist/domain/Route.d.ts +43 -3
- package/dist/domain/Route.d.ts.map +1 -1
- package/dist/domain/Route.js +92 -6
- package/dist/domain/Route.js.map +1 -1
- package/dist/domain/Session.d.ts +31 -0
- package/dist/domain/Session.d.ts.map +1 -1
- package/dist/domain/Session.js +70 -0
- package/dist/domain/Session.js.map +1 -1
- package/dist/domain/Source.d.ts +145 -1
- package/dist/domain/Source.d.ts.map +1 -1
- package/dist/domain/Source.js +144 -1
- package/dist/domain/Source.js.map +1 -1
- package/dist/domain/ThawList.d.ts +37 -0
- package/dist/domain/ThawList.d.ts.map +1 -0
- package/dist/domain/ThawList.js +73 -0
- package/dist/domain/ThawList.js.map +1 -0
- package/dist/domain/Track.d.ts +93 -1
- package/dist/domain/Track.d.ts.map +1 -1
- package/dist/domain/Track.js +136 -0
- package/dist/domain/Track.js.map +1 -1
- package/dist/domain/TriggerBox.d.ts +123 -0
- package/dist/domain/TriggerBox.d.ts.map +1 -0
- package/dist/domain/TriggerBox.js +430 -0
- package/dist/domain/TriggerBox.js.map +1 -0
- package/dist/domain/VCATrack.d.ts +64 -1
- package/dist/domain/VCATrack.d.ts.map +1 -1
- package/dist/domain/VCATrack.js +128 -1
- package/dist/domain/VCATrack.js.map +1 -1
- package/dist/domain/VideoExportConfig.d.ts +117 -0
- package/dist/domain/VideoExportConfig.d.ts.map +1 -0
- package/dist/domain/VideoExportConfig.js +244 -0
- package/dist/domain/VideoExportConfig.js.map +1 -0
- package/dist/domain/VideoExportStatus.d.ts +89 -0
- package/dist/domain/VideoExportStatus.d.ts.map +1 -0
- package/dist/domain/VideoExportStatus.js +192 -0
- package/dist/domain/VideoExportStatus.js.map +1 -0
- package/dist/domain/VideoMetadata.d.ts +46 -0
- package/dist/domain/VideoMetadata.d.ts.map +1 -0
- package/dist/domain/VideoMetadata.js +2 -0
- package/dist/domain/VideoMetadata.js.map +1 -0
- package/dist/domain/index.d.ts +5 -0
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/temporal/TempoMap.d.ts +199 -2
- package/dist/domain/temporal/TempoMap.d.ts.map +1 -1
- package/dist/domain/temporal/TempoMap.js +464 -30
- package/dist/domain/temporal/TempoMap.js.map +1 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/ThawList.d.ts +100 -0
- package/dist/lib/ThawList.d.ts.map +1 -0
- package/dist/lib/ThawList.js +153 -0
- package/dist/lib/ThawList.js.map +1 -0
- package/dist/midi/MidiFileParser.d.ts +33 -0
- package/dist/midi/MidiFileParser.d.ts.map +1 -0
- package/dist/midi/MidiFileParser.js +246 -0
- package/dist/midi/MidiFileParser.js.map +1 -0
- package/dist/midi/MidiFileWriter.d.ts +31 -0
- package/dist/midi/MidiFileWriter.d.ts.map +1 -0
- package/dist/midi/MidiFileWriter.js +160 -0
- package/dist/midi/MidiFileWriter.js.map +1 -0
- package/dist/midi/MidiImporter.d.ts +37 -0
- package/dist/midi/MidiImporter.d.ts.map +1 -0
- package/dist/midi/MidiImporter.js +62 -0
- package/dist/midi/MidiImporter.js.map +1 -0
- package/dist/plugins/PluginPresetManager.d.ts +86 -0
- package/dist/plugins/PluginPresetManager.d.ts.map +1 -0
- package/dist/plugins/PluginPresetManager.js +140 -0
- package/dist/plugins/PluginPresetManager.js.map +1 -0
- package/dist/processing/IO.d.ts +15 -1
- package/dist/processing/IO.d.ts.map +1 -1
- package/dist/processing/IO.js +29 -1
- package/dist/processing/IO.js.map +1 -1
- package/dist/processing/InternalSend.d.ts +104 -0
- package/dist/processing/InternalSend.d.ts.map +1 -0
- package/dist/processing/InternalSend.js +175 -0
- package/dist/processing/InternalSend.js.map +1 -0
- package/dist/processing/MeterDSP.d.ts +166 -0
- package/dist/processing/MeterDSP.d.ts.map +1 -0
- package/dist/processing/MeterDSP.js +754 -0
- package/dist/processing/MeterDSP.js.map +1 -0
- package/dist/processing/Panner.d.ts +145 -0
- package/dist/processing/Panner.d.ts.map +1 -0
- package/dist/processing/Panner.js +281 -0
- package/dist/processing/Panner.js.map +1 -0
- package/dist/processing/PluginInsert.d.ts +56 -1
- package/dist/processing/PluginInsert.d.ts.map +1 -1
- package/dist/processing/PluginInsert.js +180 -2
- package/dist/processing/PluginInsert.js.map +1 -1
- package/dist/processing/Processor.d.ts +38 -0
- package/dist/processing/Processor.d.ts.map +1 -1
- package/dist/processing/Processor.js +60 -1
- package/dist/processing/Processor.js.map +1 -1
- package/dist/processing/SurroundPanner.d.ts +122 -0
- package/dist/processing/SurroundPanner.d.ts.map +1 -0
- package/dist/processing/SurroundPanner.js +376 -0
- package/dist/processing/SurroundPanner.js.map +1 -0
- package/dist/processing/TruePeakLimiter.d.ts +34 -0
- package/dist/processing/TruePeakLimiter.d.ts.map +1 -0
- package/dist/processing/TruePeakLimiter.js +144 -0
- package/dist/processing/TruePeakLimiter.js.map +1 -0
- package/dist/storage/ExportPresetStorage.d.ts +33 -0
- package/dist/storage/ExportPresetStorage.d.ts.map +1 -0
- package/dist/storage/ExportPresetStorage.js +121 -0
- package/dist/storage/ExportPresetStorage.js.map +1 -0
- package/dist/storage/SessionArchive.d.ts +73 -0
- package/dist/storage/SessionArchive.d.ts.map +1 -0
- package/dist/storage/SessionArchive.js +211 -0
- package/dist/storage/SessionArchive.js.map +1 -0
- package/dist/storage/SessionTemplate.d.ts +74 -5
- package/dist/storage/SessionTemplate.d.ts.map +1 -1
- package/dist/storage/SessionTemplate.js +247 -53
- package/dist/storage/SessionTemplate.js.map +1 -1
- package/dist/utils/BwfMetadataWriter.d.ts +42 -0
- package/dist/utils/BwfMetadataWriter.d.ts.map +1 -0
- package/dist/utils/BwfMetadataWriter.js +131 -0
- package/dist/utils/BwfMetadataWriter.js.map +1 -0
- package/dist/utils/FilenameTemplate.d.ts +40 -0
- package/dist/utils/FilenameTemplate.d.ts.map +1 -0
- package/dist/utils/FilenameTemplate.js +78 -0
- package/dist/utils/FilenameTemplate.js.map +1 -0
- package/dist/utils/Logger.d.ts +28 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +46 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/Mp4ChapterGenerator.d.ts +17 -0
- package/dist/utils/Mp4ChapterGenerator.d.ts.map +1 -0
- package/dist/utils/Mp4ChapterGenerator.js +33 -0
- package/dist/utils/Mp4ChapterGenerator.js.map +1 -0
- package/dist/utils/OggEncoder.d.ts +20 -20
- package/dist/utils/OggEncoder.d.ts.map +1 -1
- package/dist/utils/OggEncoder.js +114 -50
- package/dist/utils/OggEncoder.js.map +1 -1
- package/dist/utils/TocGenerator.d.ts +17 -0
- package/dist/utils/TocGenerator.d.ts.map +1 -0
- package/dist/utils/TocGenerator.js +47 -0
- package/dist/utils/TocGenerator.js.map +1 -0
- package/package.json +7 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportAnalyzer.js","sourceRoot":"","sources":["../../src/audio/ExportAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LUFS Normalizer — ITU-R BS.1770-4 compliant gated loudness measurement.
|
|
3
|
+
* Ardour reference: libs/ardour/loudness_analyzer.cc
|
|
4
|
+
*
|
|
5
|
+
* Implements:
|
|
6
|
+
* 1. K-weighting filter (high shelf + high pass)
|
|
7
|
+
* 2. 400ms block mean square computation
|
|
8
|
+
* 3. Absolute gate at -70 LUFS
|
|
9
|
+
* 4. Relative gate at -10 dB below ungated mean
|
|
10
|
+
* 5. Integrated loudness from gated blocks
|
|
11
|
+
*/
|
|
12
|
+
export interface LufsResult {
|
|
13
|
+
/** Integrated loudness in LUFS */
|
|
14
|
+
integrated: number;
|
|
15
|
+
/** Short-term loudness (3s window) values */
|
|
16
|
+
shortTerm: number[];
|
|
17
|
+
/** Momentary loudness (400ms window) values */
|
|
18
|
+
momentary: number[];
|
|
19
|
+
/** True peak in dBFS (per channel) */
|
|
20
|
+
truePeaks: number[];
|
|
21
|
+
/** Loudness range (LRA) in LU */
|
|
22
|
+
range: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Measure integrated LUFS of an AudioBuffer using the BS.1770-4 gated algorithm.
|
|
26
|
+
*/
|
|
27
|
+
export declare function measureLUFS(buffer: AudioBuffer): LufsResult;
|
|
28
|
+
/**
|
|
29
|
+
* Normalize an AudioBuffer to a target LUFS level.
|
|
30
|
+
* Modifies the buffer in-place.
|
|
31
|
+
*
|
|
32
|
+
* @param buffer Audio buffer to normalize
|
|
33
|
+
* @param targetLufs Target integrated loudness (default: -14 LUFS)
|
|
34
|
+
* @returns The gain applied in dB, or 0 if silence
|
|
35
|
+
*/
|
|
36
|
+
export declare function normalizeLUFS(buffer: AudioBuffer, targetLufs?: number): number;
|
|
37
|
+
//# sourceMappingURL=LufsNormalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LufsNormalizer.d.ts","sourceRoot":"","sources":["../../src/audio/LufsNormalizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAuFH,MAAM,WAAW,UAAU;IACvB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,CA2H3D;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,GAAE,MAAY,GAAG,MAAM,CAmBnF"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LUFS Normalizer — ITU-R BS.1770-4 compliant gated loudness measurement.
|
|
3
|
+
* Ardour reference: libs/ardour/loudness_analyzer.cc
|
|
4
|
+
*
|
|
5
|
+
* Implements:
|
|
6
|
+
* 1. K-weighting filter (high shelf + high pass)
|
|
7
|
+
* 2. 400ms block mean square computation
|
|
8
|
+
* 3. Absolute gate at -70 LUFS
|
|
9
|
+
* 4. Relative gate at -10 dB below ungated mean
|
|
10
|
+
* 5. Integrated loudness from gated blocks
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Pre-filter (high shelf ~+4 dB at ~1681 Hz) for K-weighting.
|
|
14
|
+
* ITU-R BS.1770-4 Table 1, Stage 1.
|
|
15
|
+
*/
|
|
16
|
+
function highShelfCoeffs(sampleRate) {
|
|
17
|
+
const f0 = 1681.974450955533;
|
|
18
|
+
const G = 3.999843853973347;
|
|
19
|
+
const Q = 0.7071752369554196;
|
|
20
|
+
const K = Math.tan((Math.PI * f0) / sampleRate);
|
|
21
|
+
const Vh = Math.pow(10, G / 20);
|
|
22
|
+
const Vb = Math.pow(Vh, 0.4996667741545416);
|
|
23
|
+
const a0 = 1 + K / Q + K * K;
|
|
24
|
+
return {
|
|
25
|
+
b0: (Vh + Vb * K / Q + K * K) / a0,
|
|
26
|
+
b1: (2 * (K * K - Vh)) / a0,
|
|
27
|
+
b2: (Vh - Vb * K / Q + K * K) / a0,
|
|
28
|
+
a1: (2 * (K * K - 1)) / a0,
|
|
29
|
+
a2: (1 - K / Q + K * K) / a0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* High-pass filter (~38 Hz) for K-weighting.
|
|
34
|
+
* ITU-R BS.1770-4 Table 1, Stage 2.
|
|
35
|
+
*/
|
|
36
|
+
function highPassCoeffs(sampleRate) {
|
|
37
|
+
const f0 = 38.13547087602444;
|
|
38
|
+
const Q = 0.5003270373238773;
|
|
39
|
+
const K = Math.tan((Math.PI * f0) / sampleRate);
|
|
40
|
+
const a0 = 1 + K / Q + K * K;
|
|
41
|
+
return {
|
|
42
|
+
b0: 1 / a0,
|
|
43
|
+
b1: -2 / a0,
|
|
44
|
+
b2: 1 / a0,
|
|
45
|
+
a1: (2 * (K * K - 1)) / a0,
|
|
46
|
+
a2: (1 - K / Q + K * K) / a0,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Apply a biquad filter to samples, returning a new array.
|
|
51
|
+
*/
|
|
52
|
+
function applyBiquad(samples, coeffs) {
|
|
53
|
+
const out = new Float32Array(samples.length);
|
|
54
|
+
let x1 = 0, x2 = 0, y1 = 0, y2 = 0;
|
|
55
|
+
for (let i = 0; i < samples.length; i++) {
|
|
56
|
+
const x0 = samples[i];
|
|
57
|
+
const y0 = coeffs.b0 * x0 + coeffs.b1 * x1 + coeffs.b2 * x2
|
|
58
|
+
- coeffs.a1 * y1 - coeffs.a2 * y2;
|
|
59
|
+
out[i] = y0;
|
|
60
|
+
x2 = x1;
|
|
61
|
+
x1 = x0;
|
|
62
|
+
y2 = y1;
|
|
63
|
+
y1 = y0;
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Channel weight per ITU-R BS.1770-4:
|
|
69
|
+
* L, R, C = 1.0; Ls, Rs (surround) = 1.41 (~+1.5 dB)
|
|
70
|
+
* LFE = 0 (excluded)
|
|
71
|
+
*/
|
|
72
|
+
function getChannelWeight(channelIndex, totalChannels) {
|
|
73
|
+
if (totalChannels <= 2)
|
|
74
|
+
return 1.0;
|
|
75
|
+
// 5.1: L=0, R=1, C=2, LFE=3, Ls=4, Rs=5
|
|
76
|
+
if (totalChannels >= 6 && channelIndex === 3)
|
|
77
|
+
return 0; // LFE
|
|
78
|
+
if (totalChannels >= 6 && (channelIndex === 4 || channelIndex === 5))
|
|
79
|
+
return 1.41;
|
|
80
|
+
return 1.0;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Measure integrated LUFS of an AudioBuffer using the BS.1770-4 gated algorithm.
|
|
84
|
+
*/
|
|
85
|
+
export function measureLUFS(buffer) {
|
|
86
|
+
const sampleRate = buffer.sampleRate;
|
|
87
|
+
const numChannels = buffer.numberOfChannels;
|
|
88
|
+
// 400ms block size
|
|
89
|
+
const blockSize = Math.round(sampleRate * 0.4);
|
|
90
|
+
// 75% overlap → step = 100ms
|
|
91
|
+
const stepSize = Math.round(sampleRate * 0.1);
|
|
92
|
+
// Pre-compute K-weighting filter coefficients
|
|
93
|
+
const shelf = highShelfCoeffs(sampleRate);
|
|
94
|
+
const hp = highPassCoeffs(sampleRate);
|
|
95
|
+
// K-weight all channels
|
|
96
|
+
const kWeighted = [];
|
|
97
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
98
|
+
const raw = buffer.getChannelData(ch);
|
|
99
|
+
const stage1 = applyBiquad(raw, shelf);
|
|
100
|
+
const stage2 = applyBiquad(stage1, hp);
|
|
101
|
+
kWeighted.push(stage2);
|
|
102
|
+
}
|
|
103
|
+
// Compute mean square per block, per channel, then sum with channel weights
|
|
104
|
+
const blockLoudnesses = [];
|
|
105
|
+
const numBlocks = Math.floor((buffer.length - blockSize) / stepSize) + 1;
|
|
106
|
+
for (let b = 0; b < numBlocks; b++) {
|
|
107
|
+
const start = b * stepSize;
|
|
108
|
+
const end = start + blockSize;
|
|
109
|
+
if (end > buffer.length)
|
|
110
|
+
break;
|
|
111
|
+
let sumWeightedMeanSquare = 0;
|
|
112
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
113
|
+
const weight = getChannelWeight(ch, numChannels);
|
|
114
|
+
if (weight === 0)
|
|
115
|
+
continue;
|
|
116
|
+
const data = kWeighted[ch];
|
|
117
|
+
let sumSq = 0;
|
|
118
|
+
for (let i = start; i < end; i++) {
|
|
119
|
+
sumSq += data[i] * data[i];
|
|
120
|
+
}
|
|
121
|
+
sumWeightedMeanSquare += weight * (sumSq / blockSize);
|
|
122
|
+
}
|
|
123
|
+
// LUFS for this block
|
|
124
|
+
const blockLufs = sumWeightedMeanSquare > 0
|
|
125
|
+
? -0.691 + 10 * Math.log10(sumWeightedMeanSquare)
|
|
126
|
+
: -Infinity;
|
|
127
|
+
blockLoudnesses.push(blockLufs);
|
|
128
|
+
}
|
|
129
|
+
// === Gated measurement ===
|
|
130
|
+
// Step 1: Absolute gate at -70 LUFS
|
|
131
|
+
const ABSOLUTE_GATE = -70;
|
|
132
|
+
const aboveAbsoluteGate = blockLoudnesses.filter(l => l > ABSOLUTE_GATE);
|
|
133
|
+
if (aboveAbsoluteGate.length === 0) {
|
|
134
|
+
return { integrated: -Infinity, shortTerm: [], momentary: blockLoudnesses, truePeaks: [], range: 0 };
|
|
135
|
+
}
|
|
136
|
+
// Step 2: Compute mean of blocks above absolute gate
|
|
137
|
+
const ungatedMeanPower = aboveAbsoluteGate.reduce((sum, l) => {
|
|
138
|
+
return sum + Math.pow(10, l / 10);
|
|
139
|
+
}, 0) / aboveAbsoluteGate.length;
|
|
140
|
+
const ungatedMeanLufs = -0.691 + 10 * Math.log10(ungatedMeanPower);
|
|
141
|
+
// Step 3: Relative gate at -10 dB below ungated mean
|
|
142
|
+
const relativeGate = ungatedMeanLufs - 10;
|
|
143
|
+
// Step 4: Compute mean of blocks above both gates
|
|
144
|
+
const aboveBothGates = blockLoudnesses.filter(l => l > ABSOLUTE_GATE && l > relativeGate);
|
|
145
|
+
let integrated = -Infinity;
|
|
146
|
+
if (aboveBothGates.length > 0) {
|
|
147
|
+
const gatedMeanPower = aboveBothGates.reduce((sum, l) => {
|
|
148
|
+
return sum + Math.pow(10, l / 10);
|
|
149
|
+
}, 0) / aboveBothGates.length;
|
|
150
|
+
integrated = -0.691 + 10 * Math.log10(gatedMeanPower);
|
|
151
|
+
}
|
|
152
|
+
// Short-term loudness (3s window)
|
|
153
|
+
const shortTermBlockSize = Math.round(sampleRate * 3);
|
|
154
|
+
const shortTermStep = Math.round(sampleRate * 1);
|
|
155
|
+
const shortTerm = [];
|
|
156
|
+
for (let start = 0; start + shortTermBlockSize <= buffer.length; start += shortTermStep) {
|
|
157
|
+
let sumWeightedMS = 0;
|
|
158
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
159
|
+
const weight = getChannelWeight(ch, numChannels);
|
|
160
|
+
if (weight === 0)
|
|
161
|
+
continue;
|
|
162
|
+
const data = kWeighted[ch];
|
|
163
|
+
let sumSq = 0;
|
|
164
|
+
for (let i = start; i < start + shortTermBlockSize; i++) {
|
|
165
|
+
sumSq += data[i] * data[i];
|
|
166
|
+
}
|
|
167
|
+
sumWeightedMS += weight * (sumSq / shortTermBlockSize);
|
|
168
|
+
}
|
|
169
|
+
shortTerm.push(sumWeightedMS > 0 ? -0.691 + 10 * Math.log10(sumWeightedMS) : -Infinity);
|
|
170
|
+
}
|
|
171
|
+
// True peak detection (simple — for full spec, 4x oversample in TruePeakLimiter)
|
|
172
|
+
const truePeaks = [];
|
|
173
|
+
for (let ch = 0; ch < numChannels; ch++) {
|
|
174
|
+
const data = buffer.getChannelData(ch);
|
|
175
|
+
let peak = 0;
|
|
176
|
+
for (let i = 0; i < data.length; i++) {
|
|
177
|
+
const abs = Math.abs(data[i]);
|
|
178
|
+
if (abs > peak)
|
|
179
|
+
peak = abs;
|
|
180
|
+
}
|
|
181
|
+
truePeaks.push(peak > 0 ? 20 * Math.log10(peak) : -Infinity);
|
|
182
|
+
}
|
|
183
|
+
// LRA (Loudness Range) — simplified: difference between 10th and 95th percentile of short-term
|
|
184
|
+
let range = 0;
|
|
185
|
+
const validShortTerm = shortTerm.filter(l => l > ABSOLUTE_GATE && l > relativeGate).sort((a, b) => a - b);
|
|
186
|
+
if (validShortTerm.length >= 2) {
|
|
187
|
+
const p10 = validShortTerm[Math.floor(validShortTerm.length * 0.1)];
|
|
188
|
+
const p95 = validShortTerm[Math.floor(validShortTerm.length * 0.95)];
|
|
189
|
+
range = p95 - p10;
|
|
190
|
+
}
|
|
191
|
+
return { integrated, shortTerm, momentary: blockLoudnesses, truePeaks, range };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Normalize an AudioBuffer to a target LUFS level.
|
|
195
|
+
* Modifies the buffer in-place.
|
|
196
|
+
*
|
|
197
|
+
* @param buffer Audio buffer to normalize
|
|
198
|
+
* @param targetLufs Target integrated loudness (default: -14 LUFS)
|
|
199
|
+
* @returns The gain applied in dB, or 0 if silence
|
|
200
|
+
*/
|
|
201
|
+
export function normalizeLUFS(buffer, targetLufs = -14) {
|
|
202
|
+
const result = measureLUFS(buffer);
|
|
203
|
+
if (result.integrated === -Infinity || !isFinite(result.integrated)) {
|
|
204
|
+
return 0; // silence — no gain to apply
|
|
205
|
+
}
|
|
206
|
+
const gainDb = targetLufs - result.integrated;
|
|
207
|
+
const gainLinear = Math.pow(10, gainDb / 20);
|
|
208
|
+
// Apply gain to all channels
|
|
209
|
+
for (let ch = 0; ch < buffer.numberOfChannels; ch++) {
|
|
210
|
+
const data = buffer.getChannelData(ch);
|
|
211
|
+
for (let i = 0; i < data.length; i++) {
|
|
212
|
+
data[i] *= gainLinear;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return gainDb;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=LufsNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LufsNormalizer.js","sourceRoot":"","sources":["../../src/audio/LufsNormalizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,13 +19,8 @@ export declare class OfflineExporter {
|
|
|
19
19
|
/**
|
|
20
20
|
* Normalize audio buffer using peak normalization.
|
|
21
21
|
*
|
|
22
|
-
* NOTE: Despite previously being labeled as "LUFS", this method performs simple
|
|
23
|
-
* peak normalization (not ITU-R BS.1770 loudness measurement). The target value
|
|
24
|
-
* is interpreted as a peak level in dBFS, not as an integrated loudness value.
|
|
25
|
-
* True LUFS normalization would require K-weighted filtering and gated measurement.
|
|
26
|
-
*
|
|
27
22
|
* @param buffer Audio data (modified in-place)
|
|
28
|
-
* @param targetPeakDb Target peak level in dBFS (default: -
|
|
23
|
+
* @param targetPeakDb Target peak level in dBFS (default: -1 dBFS)
|
|
29
24
|
*/
|
|
30
25
|
private static normalizeBuffer;
|
|
31
26
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OfflineExporter.d.ts","sourceRoot":"","sources":["../../src/audio/OfflineExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"OfflineExporter.d.ts","sourceRoot":"","sources":["../../src/audio/OfflineExporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAgB,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAkB,MAAM,wBAAwB,CAAC;AAStE;;;;;GAKG;AACH,qBAAa,eAAe;IACxB;;;;;;OAMG;WACiB,MAAM,CACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GAC3G,OAAO,CAAC,IAAI,CAAC;IAyFhB;;;;;OAKG;mBACkB,eAAe;IA0BpC;;OAEG;mBACkB,YAAY;IAkBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IA0CxB;;;OAGG;WACiB,WAAW,CAC3B,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,EAChC,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GACtG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CA8D7D"}
|
|
@@ -3,6 +3,8 @@ import { AudioBufferToWav } from '../utils/AudioBufferToWav';
|
|
|
3
3
|
import { OggEncoder } from '../utils/OggEncoder';
|
|
4
4
|
import { FlacEncoder } from '../utils/FlacEncoder';
|
|
5
5
|
import { DitherProcessor, DitherType } from '../utils/DitherProcessor';
|
|
6
|
+
import { normalizeLUFS } from './LufsNormalizer';
|
|
7
|
+
import { applyTruePeakLimiter } from '../processing/TruePeakLimiter';
|
|
6
8
|
import * as lamejs from 'lamejs';
|
|
7
9
|
/**
|
|
8
10
|
* Offline Audio Exporter
|
|
@@ -42,7 +44,22 @@ export class OfflineExporter {
|
|
|
42
44
|
// Normalize Phase (if enabled)
|
|
43
45
|
if (config.normalize) {
|
|
44
46
|
status.setProgress(ExportProgress.NORMALIZING);
|
|
45
|
-
|
|
47
|
+
if (config.normalizeMode === 'lufs') {
|
|
48
|
+
// LUFS normalization (ITU-R BS.1770-4)
|
|
49
|
+
const gainDb = normalizeLUFS(renderedBuffer, config.targetLufs);
|
|
50
|
+
console.log(`[OfflineExporter] LUFS normalization applied: ${gainDb.toFixed(2)} dB gain`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Peak normalization (legacy)
|
|
54
|
+
await this.normalizeBuffer(renderedBuffer, config.targetPeakDb);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// True Peak Limiter (after normalization, before encoding)
|
|
58
|
+
if (config.truePeakLimit) {
|
|
59
|
+
const limited = applyTruePeakLimiter(renderedBuffer, config.truePeakCeiling);
|
|
60
|
+
if (limited) {
|
|
61
|
+
console.log(`[OfflineExporter] True peak limiter applied (ceiling: ${config.truePeakCeiling} dBTP)`);
|
|
62
|
+
}
|
|
46
63
|
}
|
|
47
64
|
// Dithering Phase (before encoding, when reducing bit depth)
|
|
48
65
|
if (config.ditherType !== DitherType.NONE) {
|
|
@@ -72,16 +89,11 @@ export class OfflineExporter {
|
|
|
72
89
|
/**
|
|
73
90
|
* Normalize audio buffer using peak normalization.
|
|
74
91
|
*
|
|
75
|
-
* NOTE: Despite previously being labeled as "LUFS", this method performs simple
|
|
76
|
-
* peak normalization (not ITU-R BS.1770 loudness measurement). The target value
|
|
77
|
-
* is interpreted as a peak level in dBFS, not as an integrated loudness value.
|
|
78
|
-
* True LUFS normalization would require K-weighted filtering and gated measurement.
|
|
79
|
-
*
|
|
80
92
|
* @param buffer Audio data (modified in-place)
|
|
81
|
-
* @param targetPeakDb Target peak level in dBFS (default: -
|
|
93
|
+
* @param targetPeakDb Target peak level in dBFS (default: -1 dBFS)
|
|
82
94
|
*/
|
|
83
95
|
static async normalizeBuffer(buffer, targetPeakDb) {
|
|
84
|
-
const target = targetPeakDb !== null && targetPeakDb !== void 0 ? targetPeakDb : -
|
|
96
|
+
const target = targetPeakDb !== null && targetPeakDb !== void 0 ? targetPeakDb : -1;
|
|
85
97
|
let maxPeak = 0;
|
|
86
98
|
for (let ch = 0; ch < buffer.numberOfChannels; ch++) {
|
|
87
99
|
const data = buffer.getChannelData(ch);
|
|
@@ -113,7 +125,7 @@ export class OfflineExporter {
|
|
|
113
125
|
case 'mp3':
|
|
114
126
|
return this.encodeMP3(buffer, config);
|
|
115
127
|
case 'ogg':
|
|
116
|
-
return OggEncoder.encode(buffer, (_a = config.quality) !== null && _a !== void 0 ? _a : 0.5);
|
|
128
|
+
return await OggEncoder.encode(buffer, (_a = config.quality) !== null && _a !== void 0 ? _a : 0.5);
|
|
117
129
|
case 'flac':
|
|
118
130
|
return FlacEncoder.encode(buffer, config.sampleFormat === 'int24' ? 24 : 16);
|
|
119
131
|
default:
|
|
@@ -180,7 +192,16 @@ export class OfflineExporter {
|
|
|
180
192
|
const renderedBuffer = await getTrackAudio([trackId], config.startFrame, config.endFrame);
|
|
181
193
|
// Normalize if enabled
|
|
182
194
|
if (config.normalize) {
|
|
183
|
-
|
|
195
|
+
if (config.normalizeMode === 'lufs') {
|
|
196
|
+
normalizeLUFS(renderedBuffer, config.targetLufs);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
await this.normalizeBuffer(renderedBuffer, config.targetPeakDb);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// True Peak Limiter
|
|
203
|
+
if (config.truePeakLimit) {
|
|
204
|
+
applyTruePeakLimiter(renderedBuffer, config.truePeakCeiling);
|
|
184
205
|
}
|
|
185
206
|
// Encode
|
|
186
207
|
const blob = await this.encodeToBlob(renderedBuffer, config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OfflineExporter.js","sourceRoot":"","sources":["../../src/audio/OfflineExporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACxB;;;;;;OAMG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACtB,MAAoB,EACpB,MAAoB,EACpB,aAA0G;QAE1G,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;YAErD,OAAO,CAAC,GAAG,CAAC,sCAAsC,eAAe,QAAQ,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;YAChG,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE,MAAM,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAExH,oBAAoB;YACpB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YAE5C,eAAe;YACf,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAE7C,wCAAwC;YACxC,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAClE,CAAC,CAAC,MAAM,CAAC,QAAQ;gBACjB,CAAC,CAAC,SAAS,CAAC,CAAC,+BAA+B;YAEhD,OAAO,CAAC,GAAG,CAAC,wDAAwD,EAAE,gBAAgB,CAAC,CAAC;YAExF,MAAM,cAAc,GAAG,MAAM,aAAa,CACtC,gBAA6B,EAC7B,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,QAAQ,CAClB,CAAC;YAEF,kBAAkB;YAClB,MAAM,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAEvC,+BAA+B;YAC/B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"OfflineExporter.js","sourceRoot":"","sources":["../../src/audio/OfflineExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Session } from '../domain/Session';
|
|
2
|
+
import { Signal } from '../lib/Signal';
|
|
3
|
+
/**
|
|
4
|
+
* A directed connection between two nodes in the routing graph.
|
|
5
|
+
*/
|
|
6
|
+
export interface GraphEdge {
|
|
7
|
+
/** Source track / bus ID. */
|
|
8
|
+
sourceId: string;
|
|
9
|
+
/** Target track / bus ID. */
|
|
10
|
+
targetId: string;
|
|
11
|
+
/** Output port name on the source. */
|
|
12
|
+
sourcePort: string;
|
|
13
|
+
/** Input port name on the target. */
|
|
14
|
+
targetPort: string;
|
|
15
|
+
/** Connection type. */
|
|
16
|
+
type: 'audio' | 'midi' | 'sidechain';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A node in the routing graph, representing a track, bus, aux, master,
|
|
20
|
+
* or send point in the signal chain.
|
|
21
|
+
*/
|
|
22
|
+
export interface GraphNode {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
type: 'track' | 'bus' | 'aux' | 'master' | 'send';
|
|
26
|
+
/** Total processing latency (in samples) introduced by this node. */
|
|
27
|
+
latency: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* RoutingGraph provides high-level routing analysis for a DAW session.
|
|
31
|
+
*
|
|
32
|
+
* It models the signal flow as a directed graph where nodes are tracks /
|
|
33
|
+
* buses and edges are audio / MIDI / sidechain connections. The class
|
|
34
|
+
* exposes Ardour-inspired query methods (`feeds`, `signalSources`,
|
|
35
|
+
* `signalDestinations`) as well as topological sorting, cycle detection,
|
|
36
|
+
* and automatic latency compensation.
|
|
37
|
+
*/
|
|
38
|
+
export declare class RoutingGraph {
|
|
39
|
+
private _nodes;
|
|
40
|
+
private _edges;
|
|
41
|
+
readonly graphChanged: Signal<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Populate the graph from a live Session by inspecting its tracks,
|
|
44
|
+
* send buses, and master bus.
|
|
45
|
+
*
|
|
46
|
+
* All existing nodes / edges are cleared first.
|
|
47
|
+
*/
|
|
48
|
+
buildFromSession(session: Session): void;
|
|
49
|
+
getNode(id: string): GraphNode | undefined;
|
|
50
|
+
getNodes(): GraphNode[];
|
|
51
|
+
getEdges(): GraphEdge[];
|
|
52
|
+
getEdgesFrom(nodeId: string): GraphEdge[];
|
|
53
|
+
getEdgesTo(nodeId: string): GraphEdge[];
|
|
54
|
+
addNode(node: GraphNode): void;
|
|
55
|
+
removeNode(id: string): void;
|
|
56
|
+
addEdge(edge: GraphEdge): void;
|
|
57
|
+
removeEdge(sourceId: string, targetId: string): void;
|
|
58
|
+
/**
|
|
59
|
+
* Does `sourceId` feed into `targetId` through any path?
|
|
60
|
+
* Uses BFS from source looking for target.
|
|
61
|
+
*/
|
|
62
|
+
feeds(sourceId: string, targetId: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Is there a direct (single-hop) connection from source to target?
|
|
65
|
+
*/
|
|
66
|
+
directFeeds(sourceId: string, targetId: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* All upstream nodes that eventually feed into `nodeId`.
|
|
69
|
+
*/
|
|
70
|
+
signalSources(nodeId: string): string[];
|
|
71
|
+
/**
|
|
72
|
+
* All downstream nodes that `nodeId` eventually feeds into.
|
|
73
|
+
*/
|
|
74
|
+
signalDestinations(nodeId: string): string[];
|
|
75
|
+
/**
|
|
76
|
+
* Return node IDs in a valid processing order using Kahn's algorithm
|
|
77
|
+
* (topological sort). Sources are processed before their consumers.
|
|
78
|
+
*
|
|
79
|
+
* @throws {Error} If the graph contains a cycle.
|
|
80
|
+
*/
|
|
81
|
+
getProcessingOrder(): string[];
|
|
82
|
+
/**
|
|
83
|
+
* Detect whether the graph contains any cycles using iterative DFS with
|
|
84
|
+
* a three-color marking scheme.
|
|
85
|
+
*/
|
|
86
|
+
hasCycle(): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Compute total latency along the shortest signal path from `sourceId`
|
|
89
|
+
* to `targetId` by summing node latencies. Uses BFS to find the path.
|
|
90
|
+
*
|
|
91
|
+
* Returns -1 if no path exists.
|
|
92
|
+
*/
|
|
93
|
+
getLatencyForPath(sourceId: string, targetId: string): number;
|
|
94
|
+
/**
|
|
95
|
+
* Compute the maximum latency across any path from a source node to
|
|
96
|
+
* the master (or any terminal node). This is the worst-case latency
|
|
97
|
+
* that must be compensated for.
|
|
98
|
+
*/
|
|
99
|
+
getMaxLatency(): number;
|
|
100
|
+
/**
|
|
101
|
+
* Compute the per-node compensation delay so that all signal paths
|
|
102
|
+
* arrive time-aligned at the master / terminal nodes.
|
|
103
|
+
*
|
|
104
|
+
* For each node, the compensation delay is:
|
|
105
|
+
* maxPathLatency - pathLatencyThroughThisNode
|
|
106
|
+
*
|
|
107
|
+
* where `maxPathLatency` is the longest cumulative latency path in the
|
|
108
|
+
* entire graph.
|
|
109
|
+
*/
|
|
110
|
+
computeCompensationDelays(): Map<string, number>;
|
|
111
|
+
/**
|
|
112
|
+
* Assign depth levels to each node for visualization (e.g. source
|
|
113
|
+
* tracks at level 0, buses at level 1, master at level 2).
|
|
114
|
+
*
|
|
115
|
+
* Uses BFS from source nodes (zero in-degree).
|
|
116
|
+
*/
|
|
117
|
+
getLevels(): Map<string, number>;
|
|
118
|
+
/**
|
|
119
|
+
* Export the graph as a plain JSON structure for persistence or
|
|
120
|
+
* visualization.
|
|
121
|
+
*/
|
|
122
|
+
toJSON(): {
|
|
123
|
+
nodes: GraphNode[];
|
|
124
|
+
edges: GraphEdge[];
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Restore a RoutingGraph from a JSON snapshot.
|
|
128
|
+
*/
|
|
129
|
+
static fromJSON(data: {
|
|
130
|
+
nodes: GraphNode[];
|
|
131
|
+
edges: GraphEdge[];
|
|
132
|
+
}): RoutingGraph;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=RoutingGraph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutingGraph.d.ts","sourceRoot":"","sources":["../../src/audio/RoutingGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClD,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,MAAM,CAAmB;IAEjC,SAAgB,YAAY,eAAsB;IAIlD;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA4FxC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI1C,QAAQ,IAAI,SAAS,EAAE;IAIvB,QAAQ,IAAI,SAAS,EAAE;IAIvB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAIzC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAMvC,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK9B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ5B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAK9B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IASpD;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBlD;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAMxD;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBvC;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAkB5C;;;;;OAKG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAsD9B;;;OAGG;IACH,QAAQ,IAAI,OAAO;IAsDnB;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IA6C7D;;;;OAIG;IACH,aAAa,IAAI,MAAM;IA+DvB;;;;;;;;;OASG;IACH,yBAAyB,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IA4EhD;;;;;OAKG;IACH,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IA6ChC;;;OAGG;IACH,MAAM,IAAI;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE;IAOpD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,SAAS,EAAE,CAAA;KAAE,GAAG,YAAY;CAQlF"}
|