@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,192 @@
|
|
|
1
|
+
import { Signal } from '../lib/Signal';
|
|
2
|
+
import { ExportStatus, ExportProgress } from './ExportStatus';
|
|
3
|
+
/**
|
|
4
|
+
* Video Export Progress Stages
|
|
5
|
+
* Extends base export progress with video-specific stages
|
|
6
|
+
*/
|
|
7
|
+
export var VideoExportStage;
|
|
8
|
+
(function (VideoExportStage) {
|
|
9
|
+
VideoExportStage["IDLE"] = "idle";
|
|
10
|
+
VideoExportStage["RENDERING_AUDIO"] = "rendering_audio";
|
|
11
|
+
VideoExportStage["RENDERING_VIDEO"] = "rendering_video";
|
|
12
|
+
VideoExportStage["MUXING"] = "muxing";
|
|
13
|
+
VideoExportStage["COMPLETED"] = "completed";
|
|
14
|
+
VideoExportStage["FAILED"] = "failed";
|
|
15
|
+
VideoExportStage["ABORTED"] = "aborted";
|
|
16
|
+
})(VideoExportStage || (VideoExportStage = {}));
|
|
17
|
+
/**
|
|
18
|
+
* Video Export Status
|
|
19
|
+
* Extends ExportStatus to track multi-phase video export:
|
|
20
|
+
* - Phase 1: Audio rendering (40%)
|
|
21
|
+
* - Phase 2: Video frame rendering (40%)
|
|
22
|
+
* - Phase 3: FFmpeg muxing (20%)
|
|
23
|
+
*/
|
|
24
|
+
export class VideoExportStatus extends ExportStatus {
|
|
25
|
+
constructor() {
|
|
26
|
+
super();
|
|
27
|
+
// Video-specific progress tracking
|
|
28
|
+
this.totalFrames = 0; // Total video frames to render
|
|
29
|
+
this.processedFrames = 0; // Video frames processed
|
|
30
|
+
this.ffmpegProgress = 0; // FFmpeg muxing progress (0-100)
|
|
31
|
+
// Phase-specific progress
|
|
32
|
+
this.audioProgress = 0; // 0-100
|
|
33
|
+
this.videoProgress = 0; // 0-100
|
|
34
|
+
this.muxingProgress = 0; // 0-100
|
|
35
|
+
// Current stage
|
|
36
|
+
this._currentStage = VideoExportStage.IDLE;
|
|
37
|
+
// Video-specific signals
|
|
38
|
+
this.videoFrameProcessed = new Signal();
|
|
39
|
+
this.ffmpegProgressChanged = new Signal();
|
|
40
|
+
this.stageChanged = new Signal();
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get current video export stage
|
|
44
|
+
*/
|
|
45
|
+
get currentStage() {
|
|
46
|
+
return this._currentStage;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get overall progress (weighted across all phases)
|
|
50
|
+
* Audio: 40%, Video: 40%, Muxing: 20%
|
|
51
|
+
*/
|
|
52
|
+
get overallProgress() {
|
|
53
|
+
return (this.audioProgress * 0.4 +
|
|
54
|
+
this.videoProgress * 0.4 +
|
|
55
|
+
this.muxingProgress * 0.2);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Initialize video export
|
|
59
|
+
*/
|
|
60
|
+
initVideoExport(totalAudioFrames, totalVideoFrames, filename) {
|
|
61
|
+
// Initialize base export status
|
|
62
|
+
this.init(totalAudioFrames, filename);
|
|
63
|
+
// Initialize video-specific fields
|
|
64
|
+
this.totalFrames = totalVideoFrames;
|
|
65
|
+
this.processedFrames = 0;
|
|
66
|
+
this.ffmpegProgress = 0;
|
|
67
|
+
this.audioProgress = 0;
|
|
68
|
+
this.videoProgress = 0;
|
|
69
|
+
this.muxingProgress = 0;
|
|
70
|
+
this._currentStage = VideoExportStage.RENDERING_AUDIO;
|
|
71
|
+
this.stageChanged.emit(this._currentStage);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update audio rendering progress
|
|
75
|
+
*/
|
|
76
|
+
updateAudioProgress(processedAudioFrames, totalAudioFrames) {
|
|
77
|
+
this.processedFrames = processedAudioFrames;
|
|
78
|
+
this.audioProgress = totalAudioFrames > 0
|
|
79
|
+
? Math.min(100, (processedAudioFrames / totalAudioFrames) * 100)
|
|
80
|
+
: 0;
|
|
81
|
+
this.frameProcessed.emit(processedAudioFrames);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Start video frame rendering phase
|
|
85
|
+
*/
|
|
86
|
+
startVideoRendering() {
|
|
87
|
+
this._currentStage = VideoExportStage.RENDERING_VIDEO;
|
|
88
|
+
this.audioProgress = 100; // Audio is complete
|
|
89
|
+
this.setProgress(ExportProgress.RENDERING);
|
|
90
|
+
this.stageChanged.emit(this._currentStage);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Update video frame rendering progress
|
|
94
|
+
*/
|
|
95
|
+
updateVideoFrameProgress(processedFrames) {
|
|
96
|
+
this.processedFrames = processedFrames;
|
|
97
|
+
this.videoProgress = this.totalFrames > 0
|
|
98
|
+
? Math.min(100, (processedFrames / this.totalFrames) * 100)
|
|
99
|
+
: 0;
|
|
100
|
+
this.videoFrameProcessed.emit(processedFrames);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Start FFmpeg muxing phase
|
|
104
|
+
*/
|
|
105
|
+
startMuxing() {
|
|
106
|
+
this._currentStage = VideoExportStage.MUXING;
|
|
107
|
+
this.videoProgress = 100; // Video rendering is complete
|
|
108
|
+
this.setProgress(ExportProgress.ENCODING);
|
|
109
|
+
this.stageChanged.emit(this._currentStage);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Update FFmpeg muxing progress
|
|
113
|
+
*/
|
|
114
|
+
updateFFmpegProgress(progress) {
|
|
115
|
+
this.ffmpegProgress = Math.min(100, Math.max(0, progress));
|
|
116
|
+
this.muxingProgress = this.ffmpegProgress;
|
|
117
|
+
this.ffmpegProgressChanged.emit(this.ffmpegProgress);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Complete video export
|
|
121
|
+
*/
|
|
122
|
+
completeVideoExport(blob, url) {
|
|
123
|
+
this._currentStage = VideoExportStage.COMPLETED;
|
|
124
|
+
this.audioProgress = 100;
|
|
125
|
+
this.videoProgress = 100;
|
|
126
|
+
this.muxingProgress = 100;
|
|
127
|
+
this.ffmpegProgress = 100;
|
|
128
|
+
this.complete(blob, url);
|
|
129
|
+
this.stageChanged.emit(this._currentStage);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Fail video export with error
|
|
133
|
+
*/
|
|
134
|
+
failVideoExport(message) {
|
|
135
|
+
this._currentStage = VideoExportStage.FAILED;
|
|
136
|
+
this.setError(message);
|
|
137
|
+
this.stageChanged.emit(this._currentStage);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Abort video export
|
|
141
|
+
*/
|
|
142
|
+
abortVideoExport(errorOccurred = false) {
|
|
143
|
+
this._currentStage = VideoExportStage.ABORTED;
|
|
144
|
+
this.abort(errorOccurred);
|
|
145
|
+
this.stageChanged.emit(this._currentStage);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get stage display name
|
|
149
|
+
*/
|
|
150
|
+
getStageName() {
|
|
151
|
+
switch (this._currentStage) {
|
|
152
|
+
case VideoExportStage.IDLE:
|
|
153
|
+
return 'Idle';
|
|
154
|
+
case VideoExportStage.RENDERING_AUDIO:
|
|
155
|
+
return 'Rendering Audio';
|
|
156
|
+
case VideoExportStage.RENDERING_VIDEO:
|
|
157
|
+
return 'Rendering Video Frames';
|
|
158
|
+
case VideoExportStage.MUXING:
|
|
159
|
+
return 'Muxing Audio & Video';
|
|
160
|
+
case VideoExportStage.COMPLETED:
|
|
161
|
+
return 'Completed';
|
|
162
|
+
case VideoExportStage.FAILED:
|
|
163
|
+
return 'Failed';
|
|
164
|
+
case VideoExportStage.ABORTED:
|
|
165
|
+
return 'Aborted';
|
|
166
|
+
default:
|
|
167
|
+
return 'Processing';
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get progress message for current stage
|
|
172
|
+
*/
|
|
173
|
+
getProgressMessage() {
|
|
174
|
+
switch (this._currentStage) {
|
|
175
|
+
case VideoExportStage.RENDERING_AUDIO:
|
|
176
|
+
return `Rendering audio... ${Math.round(this.audioProgress)}%`;
|
|
177
|
+
case VideoExportStage.RENDERING_VIDEO:
|
|
178
|
+
return `Rendering video frames (${this.processedFrames}/${this.totalFrames})... ${Math.round(this.videoProgress)}%`;
|
|
179
|
+
case VideoExportStage.MUXING:
|
|
180
|
+
return `Encoding video with FFmpeg... ${Math.round(this.muxingProgress)}%`;
|
|
181
|
+
case VideoExportStage.COMPLETED:
|
|
182
|
+
return 'Export completed successfully';
|
|
183
|
+
case VideoExportStage.FAILED:
|
|
184
|
+
return `Export failed: ${this.errorMessage}`;
|
|
185
|
+
case VideoExportStage.ABORTED:
|
|
186
|
+
return 'Export was aborted';
|
|
187
|
+
default:
|
|
188
|
+
return 'Processing...';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=VideoExportStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoExportStatus.js","sourceRoot":"","sources":["../../src/domain/VideoExportStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Video metadata attached to audio sources that originated from video files.
|
|
3
|
+
* This allows the DAW to track video-specific information and support video export.
|
|
4
|
+
*/
|
|
5
|
+
export interface VideoMetadata {
|
|
6
|
+
/**
|
|
7
|
+
* Frames per second of the source video
|
|
8
|
+
*/
|
|
9
|
+
readonly fps: number;
|
|
10
|
+
/**
|
|
11
|
+
* Video frame width in pixels
|
|
12
|
+
*/
|
|
13
|
+
readonly width: number;
|
|
14
|
+
/**
|
|
15
|
+
* Video frame height in pixels
|
|
16
|
+
*/
|
|
17
|
+
readonly height: number;
|
|
18
|
+
/**
|
|
19
|
+
* Video codec used in the source file (e.g., "h264", "vp9")
|
|
20
|
+
*/
|
|
21
|
+
readonly codec: string;
|
|
22
|
+
/**
|
|
23
|
+
* Container format of the source file (e.g., "mp4", "webm", "mov")
|
|
24
|
+
*/
|
|
25
|
+
readonly format: string;
|
|
26
|
+
/**
|
|
27
|
+
* Total number of frames in the source video
|
|
28
|
+
*/
|
|
29
|
+
readonly frameCount: number;
|
|
30
|
+
/**
|
|
31
|
+
* Whether the source video file contained audio
|
|
32
|
+
* (audio will have been extracted to the Source's AudioBuffer)
|
|
33
|
+
*/
|
|
34
|
+
readonly hasAudio: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Optional data URL for a thumbnail image of the video
|
|
37
|
+
* Used for timeline preview
|
|
38
|
+
*/
|
|
39
|
+
readonly thumbnailUrl?: string;
|
|
40
|
+
/**
|
|
41
|
+
* Original video file URL (blob URL or file path)
|
|
42
|
+
* Used for video export and frame extraction
|
|
43
|
+
*/
|
|
44
|
+
readonly originalVideoUrl: string;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=VideoMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoMetadata.d.ts","sourceRoot":"","sources":["../../src/domain/VideoMetadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoMetadata.js","sourceRoot":"","sources":["../../src/domain/VideoMetadata.ts"],"names":[],"mappings":""}
|
package/dist/domain/index.d.ts
CHANGED
|
@@ -3,9 +3,14 @@ export * from './Track';
|
|
|
3
3
|
export * from './Region';
|
|
4
4
|
export * from './Route';
|
|
5
5
|
export * from './Source';
|
|
6
|
+
export * from './Crossfade';
|
|
7
|
+
export * from './VideoMetadata';
|
|
6
8
|
export * from './Range';
|
|
7
9
|
export * from './GridSettings';
|
|
8
10
|
export * from './ExportConfig';
|
|
11
|
+
export * from './VideoExportConfig';
|
|
9
12
|
export * from './ExportStatus';
|
|
13
|
+
export * from './VideoExportStatus';
|
|
14
|
+
export * from './ThawList';
|
|
10
15
|
export * from './types';
|
|
11
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
package/dist/domain/index.js
CHANGED
|
@@ -4,9 +4,14 @@ export * from './Track';
|
|
|
4
4
|
export * from './Region';
|
|
5
5
|
export * from './Route';
|
|
6
6
|
export * from './Source';
|
|
7
|
+
export * from './Crossfade';
|
|
8
|
+
export * from './VideoMetadata';
|
|
7
9
|
export * from './Range';
|
|
8
10
|
export * from './GridSettings';
|
|
9
11
|
export * from './ExportConfig';
|
|
12
|
+
export * from './VideoExportConfig';
|
|
10
13
|
export * from './ExportStatus';
|
|
14
|
+
export * from './VideoExportStatus';
|
|
15
|
+
export * from './ThawList';
|
|
11
16
|
export * from './types';
|
|
12
17
|
//# sourceMappingURL=index.js.map
|
package/dist/domain/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domain/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
|
|
@@ -14,14 +14,69 @@ export interface TempoEvent {
|
|
|
14
14
|
/** Time signature denominator (optional, inherits previous if unset) */
|
|
15
15
|
timeSigDen?: number;
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* A meter (time signature) change event, stored independently from tempo events.
|
|
19
|
+
* Inspired by Ardour's temporal::MeterPoint.
|
|
20
|
+
*/
|
|
21
|
+
export interface MeterEvent {
|
|
22
|
+
/** Position in frames */
|
|
23
|
+
frame: number;
|
|
24
|
+
/** Number of beats per bar (time signature numerator) */
|
|
25
|
+
beatsPerBar: number;
|
|
26
|
+
/** Beat value that gets one beat (time signature denominator, e.g. 4 = quarter note) */
|
|
27
|
+
beatValue: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Bar/Beat/Tick representation of a musical position.
|
|
31
|
+
* Tick resolution is 1920 ticks per beat (matching Ardour).
|
|
32
|
+
*/
|
|
33
|
+
export interface BBT {
|
|
34
|
+
/** Bar number (1-based) */
|
|
35
|
+
bar: number;
|
|
36
|
+
/** Beat within bar (1-based) */
|
|
37
|
+
beat: number;
|
|
38
|
+
/** Tick within beat (0-based, 0..1919) */
|
|
39
|
+
tick: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Subdivision types for grid calculations.
|
|
43
|
+
*/
|
|
44
|
+
export type SubdivisionType = 'bar' | 'beat' | 'half' | 'quarter' | 'eighth' | 'sixteenth' | 'triplet' | 'dotted';
|
|
45
|
+
/**
|
|
46
|
+
* Combined tempo and meter information at a point in time.
|
|
47
|
+
*/
|
|
48
|
+
export interface TempoAndMeter {
|
|
49
|
+
bpm: number;
|
|
50
|
+
beatsPerBar: number;
|
|
51
|
+
beatValue: number;
|
|
52
|
+
}
|
|
17
53
|
/**
|
|
18
54
|
* TempoMap handles conversion between AudioTime (samples/frames) and BeatTime (beats/ticks).
|
|
19
|
-
* Supports multiple tempo changes over the timeline (Ardour-style tempo map).
|
|
55
|
+
* Supports multiple tempo and meter changes over the timeline (Ardour-style tempo map).
|
|
56
|
+
*
|
|
57
|
+
* Features:
|
|
58
|
+
* - Dual domain support (AudioTime / BeatTime)
|
|
59
|
+
* - Independent tempo and meter event lists
|
|
60
|
+
* - Bar/Beat/Tick (BBT) conversions with 1920 ticks-per-beat resolution
|
|
61
|
+
* - Grid point generation with subdivision and swing support
|
|
62
|
+
* - Region repositioning on tempo change
|
|
63
|
+
* - Binary search for efficient segment lookup
|
|
20
64
|
*/
|
|
21
65
|
export declare class TempoMap {
|
|
22
66
|
private sampleRate;
|
|
23
67
|
private events;
|
|
68
|
+
private _meterEvents;
|
|
69
|
+
/** Fires after any modification to the tempo map (add/remove tempo or meter changes). */
|
|
24
70
|
readonly changed: Signal<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Fires after a tempo value has been modified, providing the frame at which the change occurred.
|
|
73
|
+
* Useful for repositioning regions or cursors after a tempo edit.
|
|
74
|
+
*/
|
|
75
|
+
readonly onTempoChanged: Signal<{
|
|
76
|
+
frame: number;
|
|
77
|
+
oldBpm: number;
|
|
78
|
+
newBpm: number;
|
|
79
|
+
}>;
|
|
25
80
|
constructor(sampleRate?: number);
|
|
26
81
|
/**
|
|
27
82
|
* Add or update a tempo change at the given frame position.
|
|
@@ -35,18 +90,55 @@ export declare class TempoMap {
|
|
|
35
90
|
removeTempoChange(frame: number): void;
|
|
36
91
|
/**
|
|
37
92
|
* Get the tempo (BPM) at a given frame position.
|
|
38
|
-
*
|
|
93
|
+
* Uses binary search for efficient lookup.
|
|
39
94
|
*/
|
|
40
95
|
getTempoAtFrame(frame: number): number;
|
|
41
96
|
/**
|
|
42
97
|
* Get the time signature at a given frame position.
|
|
43
98
|
* Returns [numerator, denominator].
|
|
99
|
+
* Walks through tempo events that carry time signature overrides.
|
|
44
100
|
*/
|
|
45
101
|
getTimeSignatureAtFrame(frame: number): [number, number];
|
|
46
102
|
/**
|
|
47
103
|
* Get all tempo events, sorted by frame.
|
|
48
104
|
*/
|
|
49
105
|
getAllEvents(): ReadonlyArray<TempoEvent>;
|
|
106
|
+
/**
|
|
107
|
+
* Add or update a meter (time signature) change at the given frame position.
|
|
108
|
+
* If a meter change already exists at the exact frame, it is updated.
|
|
109
|
+
*
|
|
110
|
+
* @param frame - Frame position of the meter change
|
|
111
|
+
* @param beatsPerBar - Number of beats per bar (time signature numerator)
|
|
112
|
+
* @param beatValue - Note value that gets one beat (time signature denominator, e.g. 4 = quarter)
|
|
113
|
+
*/
|
|
114
|
+
addMeterChange(frame: number, beatsPerBar: number, beatValue: number): void;
|
|
115
|
+
/**
|
|
116
|
+
* Remove a meter change at the given frame.
|
|
117
|
+
* The initial meter event at frame 0 cannot be removed.
|
|
118
|
+
*
|
|
119
|
+
* @param frame - Frame position of the meter change to remove
|
|
120
|
+
*/
|
|
121
|
+
removeMeterChange(frame: number): void;
|
|
122
|
+
/**
|
|
123
|
+
* Get the meter (time signature) at a given frame position.
|
|
124
|
+
* Uses binary search for efficient lookup.
|
|
125
|
+
*
|
|
126
|
+
* @param frame - Frame position to query
|
|
127
|
+
* @returns The active MeterEvent at the given frame
|
|
128
|
+
*/
|
|
129
|
+
getMeterAt(frame: number): MeterEvent;
|
|
130
|
+
/**
|
|
131
|
+
* Get all meter events, sorted by frame.
|
|
132
|
+
*/
|
|
133
|
+
getAllMeterEvents(): ReadonlyArray<MeterEvent>;
|
|
134
|
+
/**
|
|
135
|
+
* Get combined tempo and meter information at a given frame position.
|
|
136
|
+
* Convenience method that returns both BPM and time signature data.
|
|
137
|
+
*
|
|
138
|
+
* @param frame - Frame position to query
|
|
139
|
+
* @returns Combined tempo and meter data
|
|
140
|
+
*/
|
|
141
|
+
getTempoAndMeterAt(frame: number): TempoAndMeter;
|
|
50
142
|
/**
|
|
51
143
|
* Convert frames to seconds, accounting for tempo changes across the timeline.
|
|
52
144
|
* Integrates the duration of each tempo segment.
|
|
@@ -56,6 +148,111 @@ export declare class TempoMap {
|
|
|
56
148
|
* Convert seconds to frames, accounting for tempo changes across the timeline.
|
|
57
149
|
*/
|
|
58
150
|
secondsToFrames(seconds: number, sampleRate?: number): FrameCount;
|
|
151
|
+
/**
|
|
152
|
+
* Convert a frame position to an absolute beat count from the start of the timeline,
|
|
153
|
+
* accounting for ALL tempo changes along the way.
|
|
154
|
+
*
|
|
155
|
+
* For each tempo segment, the number of beats is calculated as:
|
|
156
|
+
* beats = (segmentFrames / sampleRate) * (bpm / 60)
|
|
157
|
+
*
|
|
158
|
+
* @param frame - Frame position to convert
|
|
159
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
160
|
+
* @returns Absolute beat count from frame 0
|
|
161
|
+
*/
|
|
162
|
+
framesToBeatsAbsolute(frame: number, sampleRate?: number): number;
|
|
163
|
+
/**
|
|
164
|
+
* Convert an absolute beat count from the start of the timeline to a frame position,
|
|
165
|
+
* accounting for ALL tempo changes along the way.
|
|
166
|
+
*
|
|
167
|
+
* Inverse of `framesToBeatsAbsolute`.
|
|
168
|
+
*
|
|
169
|
+
* @param beats - Absolute beat count from the start
|
|
170
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
171
|
+
* @returns Frame position
|
|
172
|
+
*/
|
|
173
|
+
beatsToFramesAbsolute(beats: number, sampleRate?: number): number;
|
|
174
|
+
/**
|
|
175
|
+
* Convert a frame position to Bar/Beat/Tick notation.
|
|
176
|
+
*
|
|
177
|
+
* Walks through tempo and meter segments to calculate the cumulative
|
|
178
|
+
* bar, beat, and tick position. Uses 1920 ticks per beat (matching Ardour).
|
|
179
|
+
*
|
|
180
|
+
* @param frame - Frame position to convert
|
|
181
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
182
|
+
* @returns BBT position (bars and beats are 1-based, ticks are 0-based)
|
|
183
|
+
*/
|
|
184
|
+
framesToBBT(frame: number, sampleRate?: number): BBT;
|
|
185
|
+
/**
|
|
186
|
+
* Convert Bar/Beat/Tick notation to a frame position.
|
|
187
|
+
*
|
|
188
|
+
* @param bar - Bar number (1-based)
|
|
189
|
+
* @param beat - Beat within bar (1-based)
|
|
190
|
+
* @param tick - Tick within beat (0-based, 0..1919)
|
|
191
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
192
|
+
* @returns Frame position
|
|
193
|
+
*/
|
|
194
|
+
bbtToFrames(bar: number, beat: number, tick: number, sampleRate?: number): number;
|
|
195
|
+
/**
|
|
196
|
+
* Compute the absolute beat position at which each meter event begins.
|
|
197
|
+
* This integrates tempo across the timeline to find beat offsets for each meter point.
|
|
198
|
+
*/
|
|
199
|
+
private _computeMeterBeatStarts;
|
|
200
|
+
/**
|
|
201
|
+
* Returns the number of quarter-note beats per subdivision unit.
|
|
202
|
+
* For example, 'eighth' = 0.5 beats, 'bar' depends on current meter.
|
|
203
|
+
*/
|
|
204
|
+
private _subdivisionToBeats;
|
|
205
|
+
/**
|
|
206
|
+
* Generate grid points between two frame positions for a given subdivision type.
|
|
207
|
+
*
|
|
208
|
+
* Walks through tempo and meter segments, generating evenly spaced grid points
|
|
209
|
+
* according to the active tempo and subdivision at each point.
|
|
210
|
+
*
|
|
211
|
+
* @param startFrame - Start of the range (inclusive)
|
|
212
|
+
* @param endFrame - End of the range (inclusive)
|
|
213
|
+
* @param subdivisionType - Grid subdivision type
|
|
214
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
215
|
+
* @returns Array of frame positions for grid points within the range
|
|
216
|
+
*/
|
|
217
|
+
getGridPoints(startFrame: number, endFrame: number, subdivisionType: SubdivisionType, sampleRate?: number): number[];
|
|
218
|
+
/**
|
|
219
|
+
* Snap a frame position to the nearest grid point for the given subdivision type.
|
|
220
|
+
*
|
|
221
|
+
* @param frame - Frame position to snap
|
|
222
|
+
* @param subdivisionType - Grid subdivision type
|
|
223
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
224
|
+
* @returns The nearest grid-aligned frame position
|
|
225
|
+
*/
|
|
226
|
+
snapToGrid(frame: number, subdivisionType: SubdivisionType, sampleRate?: number): number;
|
|
227
|
+
/**
|
|
228
|
+
* Generate a swing grid between two frame positions.
|
|
229
|
+
*
|
|
230
|
+
* Swing offsets every other grid point by shifting it forward in time.
|
|
231
|
+
* A `swingAmount` of 0 produces a straight grid; 1 pushes the off-beat
|
|
232
|
+
* to the maximum position (the next grid point).
|
|
233
|
+
*
|
|
234
|
+
* @param startFrame - Start of the range (inclusive)
|
|
235
|
+
* @param endFrame - End of the range (inclusive)
|
|
236
|
+
* @param subdivision - Grid subdivision type
|
|
237
|
+
* @param swingAmount - Swing amount between 0 (straight) and 1 (max swing)
|
|
238
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
239
|
+
* @returns Array of frame positions for the swing-adjusted grid
|
|
240
|
+
*/
|
|
241
|
+
getSwingGrid(startFrame: number, endFrame: number, subdivision: SubdivisionType, swingAmount: number, sampleRate?: number): number[];
|
|
242
|
+
/**
|
|
243
|
+
* Recalculate a frame position after a tempo change, preserving its musical position.
|
|
244
|
+
*
|
|
245
|
+
* When tempo changes from `oldTempo` to `newTempo`, a region that was at a certain
|
|
246
|
+
* beat position should move to maintain the same musical position. This method
|
|
247
|
+
* calculates the new frame position.
|
|
248
|
+
*
|
|
249
|
+
* @param frame - Original frame position
|
|
250
|
+
* @param oldTempo - Previous tempo in BPM
|
|
251
|
+
* @param newTempo - New tempo in BPM
|
|
252
|
+
* @param sampleRate - Sample rate override (defaults to constructor value)
|
|
253
|
+
* @returns Recalculated frame position
|
|
254
|
+
*/
|
|
255
|
+
repositionFrameForTempoChange(frame: number, oldTempo: number, newTempo: number, sampleRate?: number): number;
|
|
59
256
|
/** Convert beats to frames at given BPM */
|
|
60
257
|
beatsToFrames(beats: Beats, bpm: number): FrameCount;
|
|
61
258
|
/** Convert frames to beats at given BPM */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TempoMap.d.ts","sourceRoot":"","sources":["../../../src/domain/temporal/TempoMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,YAAY,
|
|
1
|
+
{"version":3,"file":"TempoMap.d.ts","sourceRoot":"","sources":["../../../src/domain/temporal/TempoMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,YAAY,EAAkB,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,GAAG;IAChB,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACrB,KAAK,GACL,MAAM,GACN,MAAM,GACN,SAAS,GACT,QAAQ,GACR,WAAW,GACX,SAAS,GACT,QAAQ,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AA8CD;;;;;;;;;;;GAWG;AACH,qBAAa,QAAQ;IAcb,OAAO,CAAC,UAAU;IAbtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAoB;IAExC,yFAAyF;IACzF,SAAgB,OAAO,eAAsB;IAE7C;;;OAGG;IACH,SAAgB,cAAc;eAAuB,MAAM;gBAAU,MAAM;gBAAU,MAAM;OAAM;gBAGrF,UAAU,GAAE,MAAc;IAUtC;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAqB1F;;;OAGG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAStC;;;OAGG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAKtC;;;;OAIG;IACH,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAYxD;;OAEG;IACH,YAAY,IAAI,aAAa,CAAC,UAAU,CAAC;IAMzC;;;;;;;OAOG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAc3E;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAStC;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAQrC;;OAEG;IACH,iBAAiB,IAAI,aAAa,CAAC,UAAU,CAAC;IAI9C;;;;;;OAMG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa;IAYhD;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAuBhE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU;IAOjE;;;;;;;;;;OAUG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAqBjE;;;;;;;;;OASG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAyBjE;;;;;;;;;OASG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,GAAG;IAiDpD;;;;;;;;OAQG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAuCjF;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAmCpH;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAUxF;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAgCpI;;;;;;;;;;;;OAYG;IACH,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAgB7G,2CAA2C;IAC3C,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU;IAKpD,2CAA2C;IAC3C,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK;IAMrD,qCAAqC;IACrC,QAAQ,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU;IAQpD,oCAAoC;IACpC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK;CAOjD"}
|