@hypit/hypit 0.1.3 → 0.1.5
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 +5 -3
- package/dist/public/caption.d.ts +206 -183
- package/dist/public/composition.d.ts +25 -3
- package/dist/public/endpoint-kit.d.ts +24 -2
- package/dist/public/generation.d.ts +5 -1
- package/dist/public/hyperframes.d.ts +19 -1
- package/dist/public/narrative.d.ts +17 -3
- package/dist/public/performance.d.ts +1590 -0
- package/dist/public/program-space.d.ts +179 -32
- package/dist/public/runtime-kit.d.ts +21 -8
- package/dist/public/sound.d.ts +822 -0
- package/dist/public/speech.d.ts +41 -0
- package/dist/public/studio-adapter.d.ts +107 -16
- package/dist/public/temporal-markup.d.ts +9 -44
- package/dist/public/temporal.d.ts +37 -28
- package/dist/public/{semantic-track.d.ts → timeline.d.ts} +62 -49
- package/examples/README.md +18 -10
- package/examples/minimal-author-package/packages/example-component/preview/preview.svml +19 -12
- package/examples/minimal-author-package/packages/example-component/src/component.ts +5 -5
- package/examples/minimal-author-package/packages/example-component/src/fragment.ts +3 -5
- package/examples/minimal-author-package/packages/example-component/src/manifest.ts +8 -10
- package/examples/minimal-author-package/packages/example-component/src/surface.ts +2 -2
- package/examples/provider-package/README.md +78 -0
- package/examples/provider-package/hypit.runtime.json +12 -0
- package/examples/provider-package/packages/provider-images/package.json +11 -0
- package/examples/provider-package/packages/provider-images/src/activation.ts +24 -0
- package/examples/provider-package/packages/provider-images/src/provider.ts +122 -0
- package/examples/provider-package/packages/provider-images/tsconfig.json +9 -0
- package/examples/semantic-composition/README.md +6 -0
- package/examples/semantic-composition/chat.svml +6 -5
- package/examples/semantic-composition/packages/chat-scene/README.md +3 -3
- package/examples/semantic-composition/packages/chat-scene/src/activation.ts +18 -21
- package/examples/semantic-composition/packages/chat-scene/src/render.ts +4 -4
- package/examples/semantic-composition/packages/performance-styles/README.md +42 -0
- package/examples/semantic-composition/packages/performance-styles/package.json +25 -0
- package/examples/semantic-composition/packages/performance-styles/src/activation.ts +57 -0
- package/examples/semantic-composition/packages/performance-styles/src/render.ts +54 -0
- package/examples/semantic-composition/packages/performance-styles/src/studio.ts +28 -0
- package/examples/semantic-composition/packages/performance-styles/tsconfig.json +18 -0
- package/examples/semantic-composition/packages/responsive-explainer/README.md +16 -9
- package/examples/semantic-composition/packages/responsive-explainer/src/activation.ts +12 -12
- package/examples/semantic-composition/packages/responsive-explainer/src/render.ts +5 -5
- package/examples/semantic-composition/packages/sound-styles/README.md +36 -0
- package/examples/semantic-composition/packages/sound-styles/package.json +25 -0
- package/examples/semantic-composition/packages/sound-styles/src/activation.ts +53 -0
- package/examples/semantic-composition/packages/sound-styles/src/render.ts +14 -0
- package/examples/semantic-composition/packages/sound-styles/tsconfig.json +18 -0
- package/package.json +35 -15
- package/packages/audio-track/README.md +20 -13
- package/packages/audio-track/package.json +1 -1
- package/packages/audio-track/src/component.ts +4 -4
- package/packages/audio-track/src/fragment.ts +6 -5
- package/packages/audio-track/src/index.ts +1 -1
- package/packages/audio-track/src/manifest.ts +17 -16
- package/packages/audio-track/src/program.ts +21 -25
- package/packages/audio-track/src/surface.ts +19 -18
- package/packages/audio-track-studio/README.md +23 -0
- package/packages/audio-track-studio/src/index.ts +33 -19
- package/packages/author-kit/README.md +1 -1
- package/packages/background-removal/README.md +4 -7
- package/packages/browser-capture/package.json +1 -1
- package/packages/build-result/README.md +69 -0
- package/packages/build-result/package.json +2 -1
- package/packages/build-result/src/decode.ts +12 -8
- package/packages/build-result/src/execution-log.ts +17 -0
- package/packages/build-result/src/file-reference.ts +42 -0
- package/packages/build-result/src/index.ts +4 -0
- package/packages/build-result/src/replace-file-windows.ts +58 -0
- package/packages/build-result/src/replace-file.ts +11 -0
- package/packages/build-result/src/store.ts +58 -14
- package/packages/build-result/src/types.ts +41 -8
- package/packages/build-result/src/writer.ts +12 -1
- package/packages/build-result-fs/README.md +23 -1
- package/packages/build-result-s3/README.md +5 -0
- package/packages/build-result-s3/src/repository.ts +23 -5
- package/packages/caption/README.md +61 -73
- package/packages/caption/package.json +3 -2
- package/packages/caption/src/activation.ts +2 -2
- package/packages/caption/src/component.ts +20 -5
- package/packages/caption/src/display.ts +3 -18
- package/packages/caption/src/fragment.ts +3 -7
- package/packages/caption/src/index.ts +6 -5
- package/packages/caption/src/manifest.ts +29 -46
- package/packages/caption/src/style.ts +24 -135
- package/packages/caption/src/surface.ts +12 -92
- package/packages/caption/src/temporalize.ts +18 -53
- package/packages/caption/src/types.ts +8 -35
- package/packages/caption/src/visibility.ts +23 -0
- package/packages/caption-fine/README.md +31 -11
- package/packages/caption-fine/package.json +4 -2
- package/packages/caption-fine/src/component.ts +3 -3
- package/packages/caption-fine/src/fragment.ts +7 -19
- package/packages/caption-fine/src/index.ts +2 -0
- package/packages/caption-fine/src/manifest.ts +27 -18
- package/packages/caption-fine/src/recipe.ts +7 -0
- package/packages/caption-fine/src/render.ts +62 -49
- package/packages/caption-fine/src/schedule.ts +39 -35
- package/packages/caption-fine/src/style.ts +10 -9
- package/packages/caption-fine/src/surface.ts +62 -35
- package/packages/caption-fine/src/types.ts +2 -0
- package/packages/caption-fine-studio/README.md +24 -2
- package/packages/caption-fine-studio/package.json +10 -3
- package/packages/caption-fine-studio/src/activation.ts +3 -3
- package/packages/caption-fine-studio/src/index.ts +61 -40
- package/packages/cli/README.md +81 -3
- package/packages/cli/package.json +1 -0
- package/packages/cli/src/arguments.ts +39 -15
- package/packages/cli/src/build-planning.ts +9 -3
- package/packages/cli/src/command.ts +7 -1
- package/packages/cli/src/commands/environment.ts +66 -27
- package/packages/cli/src/commands/execution.ts +81 -26
- package/packages/cli/src/commands/results.ts +7 -11
- package/packages/cli/src/index.ts +2 -2
- package/packages/cli/src/machine-view.ts +15 -5
- package/packages/cli/src/main.ts +38 -42
- package/packages/cli/src/observation.ts +7 -1
- package/packages/cli/src/output.ts +92 -34
- package/packages/cli/src/result-export.ts +22 -13
- package/packages/cli/src/run-file.ts +19 -8
- package/packages/cli/src/view.ts +64 -18
- package/packages/comment-sticker/README.md +3 -3
- package/packages/comment-sticker/package.json +1 -1
- package/packages/comment-sticker/src/component.ts +4 -4
- package/packages/comment-sticker/src/fragment.ts +5 -4
- package/packages/comment-sticker/src/manifest.ts +7 -6
- package/packages/comment-sticker/src/program.ts +9 -9
- package/packages/comment-sticker/src/surface.ts +6 -7
- package/packages/comment-sticker-studio/src/index.ts +2 -1
- package/packages/compiler-node/src/compiler.ts +1 -0
- package/packages/composition/README.md +21 -0
- package/packages/composition/src/audio-presentation.ts +44 -0
- package/packages/composition/src/index.ts +3 -0
- package/packages/composition/src/schema.ts +8 -3
- package/packages/composition/src/track.ts +15 -1
- package/packages/credential-store-env/README.md +1 -1
- package/packages/deck-track/README.md +3 -3
- package/packages/deck-track/package.json +1 -1
- package/packages/deck-track/src/component.ts +5 -5
- package/packages/deck-track/src/fragment.ts +6 -5
- package/packages/deck-track/src/lower.ts +12 -12
- package/packages/deck-track/src/manifest.ts +8 -7
- package/packages/deck-track/src/program.ts +13 -16
- package/packages/deck-track/src/surface.ts +9 -10
- package/packages/driver-node/src/driver.ts +41 -3
- package/packages/elevenlabs-speech/README.md +27 -0
- package/packages/{provider-xiaomi-mimo → elevenlabs-speech}/package.json +5 -8
- package/packages/elevenlabs-speech/src/activation.ts +26 -0
- package/packages/elevenlabs-speech/src/fragment.ts +11 -0
- package/packages/elevenlabs-speech/src/index.ts +111 -0
- package/packages/elevenlabs-speech/src/surface.ts +167 -0
- package/packages/endpoint-kit/README.md +24 -0
- package/packages/endpoint-kit/src/index.ts +7 -1
- package/packages/estimate/README.md +56 -3
- package/packages/estimate/src/program.ts +7 -8
- package/packages/film/README.md +12 -7
- package/packages/film/package.json +1 -1
- package/packages/film/src/component.ts +4 -4
- package/packages/film/src/fragment.ts +6 -5
- package/packages/film/src/manifest.ts +11 -10
- package/packages/film/src/program.ts +5 -5
- package/packages/film/src/recipe.ts +2 -1
- package/packages/film/src/surface.ts +6 -6
- package/packages/film-studio/package.json +1 -1
- package/packages/film-studio/src/index.ts +2 -2
- package/packages/fishaudio-speech/README.md +33 -0
- package/packages/fishaudio-speech/package.json +21 -0
- package/packages/fishaudio-speech/src/activation.ts +32 -0
- package/packages/fishaudio-speech/src/fragment.ts +11 -0
- package/packages/fishaudio-speech/src/index.ts +156 -0
- package/packages/fishaudio-speech/src/surface.ts +192 -0
- package/packages/fonts-open/README.md +5 -0
- package/packages/fonts-open/package.json +5 -1
- package/packages/fonts-open/src/studio.ts +21 -0
- package/packages/generation/README.md +11 -1
- package/packages/generation/src/mapping.ts +28 -30
- package/packages/gpt-image/README.md +1 -2
- package/packages/grok-imagine/README.md +1 -2
- package/packages/hyperframes/README.md +7 -3
- package/packages/hyperframes/src/browser-program.ts +11 -2
- package/packages/hyperframes/src/document.ts +15 -2
- package/packages/interview-emoji-reveal/README.md +4 -4
- package/packages/interview-emoji-reveal/package.json +1 -1
- package/packages/interview-emoji-reveal/src/component.ts +4 -4
- package/packages/interview-emoji-reveal/src/fragment.ts +6 -5
- package/packages/interview-emoji-reveal/src/manifest.ts +9 -8
- package/packages/interview-emoji-reveal/src/program.ts +14 -14
- package/packages/interview-emoji-reveal/src/surface.ts +8 -9
- package/packages/media-execution/README.md +7 -3
- package/packages/media-execution/src/audio-presentation.ts +23 -0
- package/packages/media-execution/src/execute.ts +2 -0
- package/packages/media-pipeline/README.md +7 -3
- package/packages/media-pipeline/src/audio-plan.ts +4 -1
- package/packages/media-pipeline/src/component.ts +16 -2
- package/packages/media-pipeline/src/manifest.ts +3 -1
- package/packages/media-pipeline/src/types.ts +2 -1
- package/packages/media-track/README.md +14 -47
- package/packages/media-track/package.json +1 -1
- package/packages/media-track/preview/preview.svml +5 -5
- package/packages/media-track/src/author.ts +12 -6
- package/packages/media-track/src/component.ts +10 -16
- package/packages/media-track/src/fragment.ts +8 -7
- package/packages/media-track/src/index.ts +3 -1
- package/packages/media-track/src/lower.ts +7 -7
- package/packages/media-track/src/manifest.ts +16 -38
- package/packages/media-track/src/program.ts +62 -67
- package/packages/media-track/src/sampling.ts +6 -6
- package/packages/media-track/src/sequence.ts +8 -8
- package/packages/media-track/src/surface.ts +25 -43
- package/packages/media-track-studio/README.md +9 -0
- package/packages/media-track-studio/src/index.ts +23 -13
- package/packages/mimo-speech/README.md +1 -1
- package/packages/minimax-h3/README.md +1 -1
- package/packages/nano-banana/README.md +1 -1
- package/packages/narrative/README.md +23 -1
- package/packages/narrative/src/identity.ts +11 -0
- package/packages/narrative/src/index.ts +3 -0
- package/packages/narrative/src/schema.ts +28 -27
- package/packages/narrative/src/selection.ts +52 -0
- package/packages/narrative/src/types.ts +2 -0
- package/packages/package-loader-node/README.md +30 -0
- package/packages/package-loader-node/package.json +5 -2
- package/packages/package-loader-node/src/distribution-resolution.ts +10 -3
- package/packages/package-loader-node/src/index.ts +1 -0
- package/packages/package-loader-node/src/loader.ts +12 -15
- package/packages/package-loader-node/src/location.ts +27 -1
- package/packages/package-loader-node/src/module-scope.ts +183 -0
- package/packages/package-loader-node/src/types.ts +4 -0
- package/packages/performance/README.md +83 -0
- package/packages/performance/package.json +30 -0
- package/packages/performance/src/activation.ts +11 -0
- package/packages/performance/src/component.ts +46 -0
- package/packages/performance/src/index.ts +6 -0
- package/packages/performance/src/manifest.ts +53 -0
- package/packages/{media-track/src/performance.ts → performance/src/media.ts} +9 -10
- package/packages/performance/src/program.ts +51 -0
- package/packages/performance/src/style.ts +35 -0
- package/packages/performance/src/surface.ts +99 -0
- package/packages/performance-studio/README.md +25 -0
- package/packages/performance-studio/package.json +21 -0
- package/packages/performance-studio/src/activation.ts +6 -0
- package/packages/performance-studio/src/index.ts +84 -0
- package/packages/program-space/README.md +9 -18
- package/packages/program-space/src/activation.ts +1 -5
- package/packages/program-space/src/index.ts +2 -11
- package/packages/program-space/src/surface.ts +1 -20
- package/packages/project-context-node/README.md +20 -0
- package/packages/project-context-node/package.json +10 -0
- package/packages/project-context-node/src/index.ts +3 -0
- package/packages/{cli → project-context-node}/src/runtime-selection.ts +7 -2
- package/packages/provider-hyperframes-local/README.md +43 -15
- package/packages/provider-hyperframes-local/src/activation.ts +4 -3
- package/packages/provider-hyperframes-local/src/capture-process.ts +26 -4
- package/packages/provider-hyperframes-local/src/capture.ts +96 -26
- package/packages/provider-hyperframes-local/src/concurrency.ts +86 -0
- package/packages/provider-hyperframes-local/src/opaque-capture.ts +92 -0
- package/packages/provider-hyperframes-local/src/options.ts +2 -0
- package/packages/provider-hyperframes-local/src/program.ts +6 -3
- package/packages/provider-hyperframes-local/src/progress.ts +53 -0
- package/packages/provider-hyperframes-local/src/provider.ts +18 -5
- package/packages/provider-hyperframes-local/src/render.ts +48 -7
- package/packages/provider-hypihub/README.md +48 -17
- package/packages/provider-hypihub/package.json +2 -0
- package/packages/provider-hypihub/src/mapping.ts +31 -7
- package/packages/provider-hypihub/src/oauth.ts +6 -0
- package/packages/provider-hypihub/src/provider.ts +25 -13
- package/packages/provider-hypihub/src/routes.ts +1 -2
- package/packages/provider-hypihub/src/upload.ts +2 -0
- package/packages/provider-media-local/README.md +3 -4
- package/packages/provider-whisperx-local/README.md +57 -0
- package/packages/provider-whisperx-local/src/program.ts +1 -0
- package/packages/provider-whisperx-local/src/provider.ts +3 -0
- package/packages/ranking/README.md +8 -6
- package/packages/ranking/package.json +1 -1
- package/packages/ranking/src/component.ts +6 -6
- package/packages/ranking/src/fragment.ts +11 -7
- package/packages/ranking/src/manifest.ts +21 -14
- package/packages/ranking/src/render.ts +33 -35
- package/packages/ranking/src/schedule.ts +16 -19
- package/packages/ranking/src/surface.ts +12 -13
- package/packages/ranking-studio/README.md +29 -0
- package/packages/ranking-studio/package.json +8 -3
- package/packages/ranking-studio/src/index.ts +71 -12
- package/packages/render-hyperframes/README.md +7 -7
- package/packages/render-hyperframes/package.json +1 -1
- package/packages/render-hyperframes/src/component.ts +11 -1
- package/packages/render-hyperframes/src/fragment.ts +7 -4
- package/packages/render-hyperframes/src/manifest.ts +4 -4
- package/packages/render-hyperframes/src/surface.ts +6 -6
- package/packages/runtime/README.md +8 -1
- package/packages/runtime/src/catalog.ts +2 -0
- package/packages/runtime/src/execution.ts +15 -4
- package/packages/runtime/src/index.ts +2 -1
- package/packages/runtime/src/log.ts +51 -0
- package/packages/runtime/src/types.ts +5 -8
- package/packages/runtime-host-node/README.md +30 -0
- package/packages/runtime-host-node/package.json +1 -0
- package/packages/runtime-host-node/src/index.ts +25 -9
- package/packages/runtime-host-node/src/packages.ts +47 -50
- package/packages/runtime-kit/README.md +5 -0
- package/packages/runtime-kit/src/index.ts +3 -1
- package/packages/runtime-local/README.md +111 -4
- package/packages/runtime-local/src/config.ts +202 -56
- package/packages/runtime-local/src/control.ts +9 -1
- package/packages/runtime-local/src/executor.ts +66 -0
- package/packages/runtime-local/src/host.ts +37 -17
- package/packages/runtime-local/src/log.ts +48 -0
- package/packages/runtime-local/src/programs.ts +41 -25
- package/packages/runtime-local/src/result-writer.ts +2 -0
- package/packages/runtime-local/src/runtime.ts +10 -6
- package/packages/runtime-local/src/supervisor.ts +142 -0
- package/packages/runtime-local/src/types.ts +9 -2
- package/packages/runtime-local/src/worker-process.ts +7 -24
- package/packages/runtime-local/src/worker.ts +55 -83
- package/packages/screen-overlay/README.md +3 -3
- package/packages/screen-overlay/package.json +1 -1
- package/packages/screen-overlay/src/component.ts +3 -3
- package/packages/screen-overlay/src/fragment.ts +5 -4
- package/packages/screen-overlay/src/manifest.ts +7 -6
- package/packages/screen-overlay/src/program.ts +9 -9
- package/packages/screen-overlay/src/surface.ts +6 -7
- package/packages/script/README.md +37 -2
- package/packages/script/src/edit.ts +123 -73
- package/packages/script/src/lexical.ts +40 -6
- package/packages/script/src/manifest.ts +2 -2
- package/packages/script/src/narrative.ts +1 -0
- package/packages/script/src/parser.ts +36 -8
- package/packages/script/src/surface.ts +4 -3
- package/packages/script/src/types.ts +5 -1
- package/packages/script-studio/package.json +9 -3
- package/packages/script-studio/src/index.ts +2 -0
- package/packages/script-studio/src/projection.ts +105 -0
- package/packages/seedance/README.md +30 -1
- package/packages/seedance/src/index.ts +18 -7
- package/packages/seedance/src/surface.ts +17 -4
- package/packages/seedance-kits/README.md +10 -2
- package/packages/seedance-kits/kits/speaker-v1.svs +5 -5
- package/packages/seedream/README.md +1 -1
- package/packages/sound/README.md +81 -0
- package/packages/sound/package.json +25 -0
- package/packages/sound/src/activation.ts +11 -0
- package/packages/sound/src/component.ts +28 -0
- package/packages/sound/src/index.ts +5 -0
- package/packages/sound/src/manifest.ts +47 -0
- package/packages/sound/src/program.ts +84 -0
- package/packages/sound/src/style.ts +34 -0
- package/packages/sound/src/surface.ts +90 -0
- package/packages/sound-studio/README.md +22 -0
- package/packages/sound-studio/package.json +20 -0
- package/packages/sound-studio/src/activation.ts +6 -0
- package/packages/sound-studio/src/index.ts +74 -0
- package/packages/speech/README.md +2 -2
- package/packages/speech-alignment/src/align.ts +45 -21
- package/packages/speech-alignment/src/local.ts +8 -0
- package/packages/speech-alignment/src/locate.ts +1 -1
- package/packages/store-sqlite/README.md +7 -0
- package/packages/store-sqlite/src/store.ts +84 -83
- package/packages/studio/INSPECTOR.md +117 -0
- package/packages/studio/README.md +149 -14
- package/packages/studio/package.json +8 -7
- package/packages/studio/src/build-library.ts +99 -84
- package/packages/studio/src/companion-assembly.ts +1 -0
- package/packages/studio/src/domain.ts +1 -1
- package/packages/studio/src/fallback-companions.ts +3 -3
- package/packages/studio/src/feedback-server.ts +51 -0
- package/packages/studio/src/feedback-store.ts +66 -0
- package/packages/studio/src/feedback.ts +60 -0
- package/packages/studio/src/library-media.ts +19 -0
- package/packages/studio/src/parameter-values.ts +83 -1
- package/packages/studio/src/parameters.ts +132 -43
- package/packages/studio/src/preview/render.ts +5 -1
- package/packages/studio/src/preview/runtime-shim.ts +49 -3
- package/packages/studio/src/programme.ts +14 -30
- package/packages/studio/src/server.ts +66 -34
- package/packages/studio/src/shared.ts +24 -8
- package/packages/studio/src/snapshot.ts +21 -132
- package/packages/studio/src/studio-preflight.ts +3 -3
- package/packages/studio/src/studio-registry.ts +72 -6
- package/packages/studio/src/style.css +342 -190
- package/packages/studio/src/temporal-edit.ts +131 -0
- package/packages/studio/src/ui/artifact-name.ts +80 -0
- package/packages/studio/src/ui/artifact-preview.ts +99 -0
- package/packages/studio/src/ui/comments.ts +233 -0
- package/packages/studio/src/ui/icons.ts +10 -1
- package/packages/studio/src/ui/library.ts +373 -192
- package/packages/studio/src/ui/main.ts +291 -110
- package/packages/studio/src/ui/material-preview.ts +1 -1
- package/packages/studio/src/ui/overlay.ts +31 -26
- package/packages/studio/src/ui/scrub-preview.ts +108 -0
- package/packages/studio/src/ui/sidebar-panel.ts +31 -0
- package/packages/studio/src/ui/stage.ts +188 -9
- package/packages/studio/src/ui/timeline.ts +187 -281
- package/packages/studio/start.ts +19 -5
- package/packages/studio-adapter/README.md +151 -11
- package/packages/studio-adapter/src/index.ts +126 -14
- package/packages/temporal/README.md +6 -6
- package/packages/temporal/package.json +1 -1
- package/packages/temporal/src/component.ts +5 -6
- package/packages/temporal/src/index.ts +8 -6
- package/packages/temporal/src/location.ts +11 -11
- package/packages/temporal/src/projection.ts +19 -19
- package/packages/temporal/src/rational.ts +4 -4
- package/packages/temporal-markup/EDITING.md +183 -0
- package/packages/temporal-markup/README.md +31 -11
- package/packages/temporal-markup/package.json +1 -1
- package/packages/temporal-markup/src/index.ts +20 -25
- package/packages/temporal-markup/src/space.ts +10 -41
- package/packages/timeline/README.md +31 -0
- package/packages/{semantic-track → timeline}/package.json +1 -1
- package/packages/timeline/src/activation.ts +8 -0
- package/packages/timeline/src/component.ts +24 -0
- package/packages/timeline/src/identity.ts +60 -0
- package/packages/timeline/src/index.ts +6 -0
- package/packages/{semantic-track → timeline}/src/location.ts +20 -20
- package/packages/timeline/src/manifest.ts +39 -0
- package/packages/{semantic-track → timeline}/src/projection.ts +14 -14
- package/packages/timeline/src/types.ts +24 -0
- package/packages/timeline-author/README.md +68 -0
- package/packages/{speech-track → timeline-author}/package.json +6 -4
- package/packages/timeline-author/src/activation.ts +22 -0
- package/packages/{speech-track → timeline-author}/src/component.ts +15 -13
- package/packages/{speech-track → timeline-author}/src/fragment.ts +14 -23
- package/packages/timeline-author/src/index.ts +7 -0
- package/packages/timeline-author/src/manifest.ts +78 -0
- package/packages/timeline-author/src/program.ts +107 -0
- package/packages/timeline-author/src/surface.ts +46 -0
- package/packages/timeline-author/src/types.ts +6 -0
- package/packages/typography-track/README.md +4 -4
- package/packages/typography-track/package.json +1 -1
- package/packages/typography-track/src/component.ts +4 -4
- package/packages/typography-track/src/fragment.ts +4 -3
- package/packages/typography-track/src/manifest.ts +11 -9
- package/packages/typography-track/src/program.ts +15 -15
- package/packages/typography-track/src/surface.ts +17 -18
- package/packages/typography-track-studio/package.json +8 -3
- package/packages/typography-track-studio/src/index.ts +5 -1
- package/packages/video-cli/README.md +16 -4
- package/packages/video-cli/package.json +2 -1
- package/packages/video-cli/src/creation.ts +25 -9
- package/packages/video-cli/src/index.ts +1 -1
- package/packages/video-cli/src/studio-distribution.ts +2 -1
- package/packages/volcengine-matting/README.md +3 -3
- package/packages/whisperx/README.md +8 -1
- package/packages/workspace/src/index.ts +2 -0
- package/packages/workspace-fs-node/README.md +4 -1
- package/packages/workspace-fs-node/src/workspace.ts +3 -1
- package/services/whisperx/README.md +14 -0
- package/services/whisperx/pyproject.toml +2 -0
- package/services/whisperx/uv.lock +20 -20
- package/packages/provider-hyperframes-aws-lambda/README.md +0 -30
- package/packages/provider-hyperframes-aws-lambda/package.json +0 -30
- package/packages/provider-hyperframes-aws-lambda/src/activation.ts +0 -97
- package/packages/provider-hyperframes-aws-lambda/src/client.ts +0 -114
- package/packages/provider-hyperframes-aws-lambda/src/index.ts +0 -21
- package/packages/provider-hyperframes-aws-lambda/src/provider.ts +0 -522
- package/packages/provider-kie/README.md +0 -134
- package/packages/provider-kie/package.json +0 -43
- package/packages/provider-kie/src/activation.ts +0 -71
- package/packages/provider-kie/src/index.ts +0 -10
- package/packages/provider-kie/src/mapping.ts +0 -182
- package/packages/provider-kie/src/provider.ts +0 -657
- package/packages/provider-kie/src/routes.ts +0 -150
- package/packages/provider-xiaomi-mimo/README.md +0 -32
- package/packages/provider-xiaomi-mimo/src/activation.ts +0 -57
- package/packages/provider-xiaomi-mimo/src/index.ts +0 -5
- package/packages/provider-xiaomi-mimo/src/provider.ts +0 -214
- package/packages/runtime/src/environment.ts +0 -6
- package/packages/semantic-track/README.md +0 -21
- package/packages/semantic-track/src/activation.ts +0 -8
- package/packages/semantic-track/src/component.ts +0 -24
- package/packages/semantic-track/src/identity.ts +0 -58
- package/packages/semantic-track/src/index.ts +0 -6
- package/packages/semantic-track/src/manifest.ts +0 -38
- package/packages/semantic-track/src/types.ts +0 -26
- package/packages/speech-track/README.md +0 -51
- package/packages/speech-track/src/activation.ts +0 -19
- package/packages/speech-track/src/index.ts +0 -7
- package/packages/speech-track/src/manifest.ts +0 -73
- package/packages/speech-track/src/program.ts +0 -64
- package/packages/speech-track/src/surface.ts +0 -35
- package/packages/speech-track/src/types.ts +0 -6
- package/packages/speech-track-studio/README.md +0 -3
- package/packages/speech-track-studio/package.json +0 -14
- package/packages/speech-track-studio/src/activation.ts +0 -7
- package/packages/speech-track-studio/src/index.ts +0 -40
- /package/packages/{cli → project-context-node}/src/project-context.ts +0 -0
- /package/packages/{speech-track → timeline-author}/preview/Track.png +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import { temporalContextAttributeVocabulary } from "@hypit/temporal-markup";
|
|
2
3
|
import { visualTimedSamplingSchema } from "@hypit/composition";
|
|
3
4
|
import { readFile } from "node:fs/promises";
|
|
@@ -10,9 +11,9 @@ import {
|
|
|
10
11
|
mediaTypes,
|
|
11
12
|
} from "@hypit/media";
|
|
12
13
|
import { narrativeDependency, narrativeTypes } from "@hypit/narrative";
|
|
13
|
-
|
|
14
|
+
|
|
14
15
|
import type { ModuleManifest, ProducerRef, TypeRef, ValueSchema } from "@hypit/protocol";
|
|
15
|
-
import {
|
|
16
|
+
import { timelineDependency, timelineTypes } from "@hypit/timeline";
|
|
16
17
|
import {
|
|
17
18
|
contentFitSchema,
|
|
18
19
|
intrinsicExtentSchema,
|
|
@@ -48,7 +49,6 @@ export const mediaTrackTypes = {
|
|
|
48
49
|
} satisfies Record<string, TypeRef>;
|
|
49
50
|
|
|
50
51
|
export const mediaTrackProducers = {
|
|
51
|
-
appendPerformance: { module: mediaTrackModuleRef, name: "append-media-performance" },
|
|
52
52
|
createLayers: { module: mediaTrackModuleRef, name: "create-media-layer-set" },
|
|
53
53
|
appendPaintLayer: { module: mediaTrackModuleRef, name: "append-media-paint-layer" },
|
|
54
54
|
appendStillLayer: { module: mediaTrackModuleRef, name: "append-still-media-layer" },
|
|
@@ -256,18 +256,18 @@ export const mediaTrackHeaderSchema: ValueSchema = object({
|
|
|
256
256
|
|
|
257
257
|
const itemInputs = [
|
|
258
258
|
{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header },
|
|
259
|
-
{ name: "
|
|
259
|
+
{ name: "timeline", type: timelineTypes.track }, { name: "canvas", type: spatialTypes.canvas },
|
|
260
260
|
{ name: "layers", type: mediaTrackTypes.layerSet },
|
|
261
261
|
{ name: "frame", type: spatialTypes.frame }, { name: "spec", type: mediaTrackTypes.itemSpec },
|
|
262
262
|
{ name: "sounds", type: mediaTrackTypes.soundSet }, { name: "window", type: temporalTypes.window },
|
|
263
263
|
] as const;
|
|
264
264
|
const memberInputs = [
|
|
265
|
-
{ name: "members", type: mediaTrackTypes.memberSet }, { name: "
|
|
265
|
+
{ name: "members", type: mediaTrackTypes.memberSet }, { name: "timeline", type: timelineTypes.track }, { name: "layers", type: mediaTrackTypes.layerSet },
|
|
266
266
|
{ name: "spec", type: mediaTrackTypes.memberSpec }, { name: "activation", type: temporalTypes.instant },
|
|
267
267
|
] as const;
|
|
268
268
|
const sequenceInputs = [
|
|
269
269
|
{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header },
|
|
270
|
-
{ name: "
|
|
270
|
+
{ name: "timeline", type: timelineTypes.track }, { name: "canvas", type: spatialTypes.canvas },
|
|
271
271
|
{ name: "members", type: mediaTrackTypes.memberSet },
|
|
272
272
|
{ name: "frame", type: spatialTypes.frame }, { name: "spec", type: mediaTrackTypes.sequenceSpec },
|
|
273
273
|
{ name: "sounds", type: mediaTrackTypes.soundSet }, { name: "terminal", type: temporalTypes.instant },
|
|
@@ -368,7 +368,7 @@ export const mediaTrackMarkupSurfaces = [{
|
|
|
368
368
|
temporalTypes.instantSpec, temporalTypes.windowSpec, temporalTypes.instant, temporalTypes.window, mediaTrackTypes.program,
|
|
369
369
|
compositionTypes.visualTrack, compositionTypes.audioTrack],
|
|
370
370
|
vocabulary: {
|
|
371
|
-
summary: "Show the
|
|
371
|
+
summary: "Show the timeline performance, place independent media Items, and compose replacement Sequences on a shared film time axis and Canvas. Publishes a VisualTrack and, when audio is authored, an AudioTrack.",
|
|
372
372
|
appearance: "Pictures and layered compositions occupy authored Frames on the Canvas. Each source is scaled and aligned inside its Frame's border and padding; a contain fit can leave space, while cover can crop. Paint and sampled Layers draw in Source order under a shared rectangular, rounded or Path clip, with optional border and shadows. Lifecycle motion moves the framed unit; Sampling pans, zooms or rotates the picture inside it. Each Item has an independent window. A Sequence shares one outer Frame while Members replace its contents through cut, crossfade, push, wipe, cover or page-turn Handoffs. Source playback determines whether moving content covers the whole assigned span. Absolute stack order decides which overlapping unit draws in front.",
|
|
373
373
|
preview: previewImage("Track.png"),
|
|
374
374
|
attributes: [
|
|
@@ -379,23 +379,6 @@ export const mediaTrackMarkupSurfaces = [{
|
|
|
379
379
|
summary: "Chooses the Canvas every Frame on this Track is measured inside." },
|
|
380
380
|
],
|
|
381
381
|
children: [
|
|
382
|
-
{ tag: "Performance", cardinality: "many",
|
|
383
|
-
summary: "Shows the enclosing Track's semantic performance during a chosen interval, preserving each Take's original source position under one frame and continuous motion. Accepts Sampling and Sound children.",
|
|
384
|
-
attributes: [
|
|
385
|
-
{ name: "id", kind: "identifier", required: false,
|
|
386
|
-
summary: "Names this presentation; otherwise its identity follows the shared Item/Performance order." },
|
|
387
|
-
{ name: "frame", kind: "reference", required: true, accepts: [spatialTypes.frame],
|
|
388
|
-
summary: "Places the performance picture on the Canvas." },
|
|
389
|
-
{ name: "appearance", kind: "reference", required: true, accepts: [svsRecipeType],
|
|
390
|
-
summary: "Uses the Media fitting, picture styling, frame paint, clipping, border and shadow properties. Source time follows the semantic performance.",
|
|
391
|
-
recipe: appearanceRecipeProperties.filter(property => !["playback", "trim-start", "trim-end"].includes(property.name)) },
|
|
392
|
-
{ name: "motion", kind: "reference", required: false, accepts: [svsRecipeType],
|
|
393
|
-
summary: "Moves the whole framed presentation over its Window, across Take boundaries.",
|
|
394
|
-
recipe: motionRecipeProperties },
|
|
395
|
-
{ name: "clip", kind: "reference", required: false, accepts: [spatialTypes.path],
|
|
396
|
-
summary: "Clips the presentation to an authored Path." },
|
|
397
|
-
...temporalWindowAttributeVocabulary,
|
|
398
|
-
] },
|
|
399
382
|
{ tag: "Item", cardinality: "many",
|
|
400
383
|
summary: "One independently timed picture on its own Frame, from a direct source or ordered Paint and Layer children, carrying its own Sampling and Sound children.",
|
|
401
384
|
attributes: [
|
|
@@ -458,19 +441,18 @@ export const mediaTrackMarkupSurfaces = [{
|
|
|
458
441
|
example: `<pipeline:Normalize id="cutaway-bags" source={bags-take.video}
|
|
459
442
|
video="primary-moving" audio="none" span-authority="video" clock={clock}/>
|
|
460
443
|
|
|
461
|
-
<media-track:Track id="cutaways"
|
|
462
|
-
<media-track:
|
|
444
|
+
<media-track:Track id="cutaways" timeline={speech.timeline} canvas={vertical}>
|
|
445
|
+
<media-track:Item media={prepared.media} during="program" frame={full} appearance={recipes.media.clip}/>
|
|
463
446
|
<media-track:Item id="bags" media={cutaway-bags.media} during={story.selection.bags}
|
|
464
447
|
frame={full} appearance={recipes.media.cutaway} motion={recipes.motion.cut}/>
|
|
465
448
|
</media-track:Track>`,
|
|
466
449
|
notes: [
|
|
467
|
-
"A Track requires at least one
|
|
468
|
-
"
|
|
469
|
-
"Performance uses the Track's existing semantic input. `during=\"program\"` shows all its prepared Takes in order; a Segment or Selection shows that interval at the corresponding source positions. Speech Track.audio independently supplies the original sound. Sampling pans, zooms or rotates the fitted picture across the whole selected Window.",
|
|
450
|
+
"A Track requires at least one Item or Sequence and accepts no text content.",
|
|
451
|
+
"Item use one window form: `during`, `at` with `for`, `until` with `for`, or `start` with `end`. Bind `selection`, `segment` and/or `moment` only when the start/end expressions use them; different endpoints can use different bindings.",
|
|
470
452
|
"A point expression is `program.start`, `program.end`, `selection.start`, `selection.end`, `segment.start`, `segment.end` or `moment.cue`, each optionally offset by `+` or `-` and a duration, or a bare duration read as an absolute position.",
|
|
471
453
|
"A unit that names a direct source names exactly one of `image`, `media` or `surface`; `extent` is required with `image` and refused otherwise.",
|
|
472
454
|
"`audio-gain` is refused without selected source audio.",
|
|
473
|
-
"`clip` is refused on a
|
|
455
|
+
"`clip` is refused on a Item or Sequence whose Recipe already states a clip.",
|
|
474
456
|
"An `appearance` or `motion` Recipe is refused when it carries a property outside its own set.",
|
|
475
457
|
"`playback`, `trim-start` and `trim-end` are refused on durationless still material, and `trim-start` and `trim-end` are written together or not at all.",
|
|
476
458
|
"An `enter` or an `exit` operator requires its own `enter-frames` or `exit-frames`.",
|
|
@@ -575,8 +557,7 @@ export const mediaTrackManifest: ModuleManifest = {
|
|
|
575
557
|
artifactDependency,
|
|
576
558
|
mediaDependency,
|
|
577
559
|
narrativeDependency,
|
|
578
|
-
|
|
579
|
-
semanticTrackDependency,
|
|
560
|
+
timelineDependency,
|
|
580
561
|
temporalDependency,
|
|
581
562
|
spatialDependency,
|
|
582
563
|
compositionDependency,
|
|
@@ -606,18 +587,15 @@ export const mediaTrackManifest: ModuleManifest = {
|
|
|
606
587
|
{ name: mediaTrackProducers.createSounds.name, inputs: [], outputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }], needs: [] },
|
|
607
588
|
{ name: mediaTrackProducers.appendSound.name, inputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }, { name: "source", type: mediaTypes.synchronized }, { name: "spec", type: mediaTrackTypes.soundSpec }], outputs: [{ name: "sounds", type: mediaTrackTypes.soundSet }], needs: [] },
|
|
608
589
|
{ name: mediaTrackProducers.createSet.name, inputs: [], outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
|
|
609
|
-
{ name: mediaTrackProducers.appendPerformance.name, inputs: [...itemInputs,
|
|
610
|
-
{ name: "semantic", type: semanticTrackTypes.track }, { name: "fit", type: spatialTypes.fit },
|
|
611
|
-
{ name: "sampleSpec", type: mediaTrackTypes.sampleLayerSpec }], outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
|
|
612
590
|
{ name: mediaTrackProducers.appendItem.name, inputs: itemInputs, outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
|
|
613
591
|
{ name: mediaTrackProducers.bindItemClipPath.name, inputs: [{ name: "spec", type: mediaTrackTypes.itemSpec }, { name: "path", type: spatialTypes.path }], outputs: [{ name: "spec", type: mediaTrackTypes.itemSpec }], needs: [] },
|
|
614
592
|
{ name: mediaTrackProducers.bindSequenceClipPath.name, inputs: [{ name: "spec", type: mediaTrackTypes.sequenceSpec }, { name: "path", type: spatialTypes.path }], outputs: [{ name: "spec", type: mediaTrackTypes.sequenceSpec }], needs: [] },
|
|
615
593
|
{ name: mediaTrackProducers.createMembers.name, inputs: [], outputs: [{ name: "members", type: mediaTrackTypes.memberSet }], needs: [] },
|
|
616
594
|
{ name: mediaTrackProducers.appendMember.name, inputs: memberInputs, outputs: [{ name: "members", type: mediaTrackTypes.memberSet }], needs: [] },
|
|
617
595
|
{ name: mediaTrackProducers.appendSequence.name, inputs: sequenceInputs, outputs: [{ name: "set", type: mediaTrackTypes.set }], needs: [] },
|
|
618
|
-
{ name: mediaTrackProducers.finalize.name, inputs: [{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header }, { name: "
|
|
619
|
-
{ name: mediaTrackProducers.projectVisual.name, inputs: [{ name: "
|
|
620
|
-
{ name: mediaTrackProducers.projectAudio.name, inputs: [{ name: "
|
|
596
|
+
{ name: mediaTrackProducers.finalize.name, inputs: [{ name: "set", type: mediaTrackTypes.set }, { name: "header", type: mediaTrackTypes.header }, { name: "timeline", type: timelineTypes.track }], outputs: [{ name: "program", type: mediaTrackTypes.program }], needs: [] },
|
|
597
|
+
{ name: mediaTrackProducers.projectVisual.name, inputs: [{ name: "timeline", type: timelineTypes.track }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.visualTrack }], needs: [] },
|
|
598
|
+
{ name: mediaTrackProducers.projectAudio.name, inputs: [{ name: "timeline", type: timelineTypes.track }, { name: "program", type: mediaTrackTypes.program }], outputs: [{ name: "track", type: compositionTypes.audioTrack }], needs: [] },
|
|
621
599
|
],
|
|
622
600
|
};
|
|
623
601
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import {
|
|
2
3
|
assertAudioTrackIdentity,
|
|
3
4
|
assertVisualTrackIdentity,
|
|
@@ -5,13 +6,7 @@ import {
|
|
|
5
6
|
sealVisualTrack,
|
|
6
7
|
} from "@hypit/composition";
|
|
7
8
|
import type { AudioClip, AudioTrack, VisualTrack } from "@hypit/composition";
|
|
8
|
-
import {
|
|
9
|
-
assertProgramSpaceIdentity,
|
|
10
|
-
programFrameSampleBoundary,
|
|
11
|
-
programSpaceFrameCount,
|
|
12
|
-
programSpaceSampleFrames,
|
|
13
|
-
} from "@hypit/program-space";
|
|
14
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
9
|
+
import { assertProgramSpaceIdentity, programFrameSampleBoundary, programSpaceFrameCount, programSpaceSampleFrames } from "@hypit/program-space";
|
|
15
10
|
import { canonicalize, isResourceId } from "@hypit/protocol";
|
|
16
11
|
import { assertCanvasSpace, assertSpatialFrame } from "@hypit/spatial";
|
|
17
12
|
import type { CanvasSpace } from "@hypit/spatial";
|
|
@@ -125,7 +120,7 @@ export function assertMediaTrackSet(value: MediaTrackSet): void {
|
|
|
125
120
|
function realizedItems(
|
|
126
121
|
set: MediaTrackSet,
|
|
127
122
|
header: MediaTrackHeader,
|
|
128
|
-
|
|
123
|
+
timeline: Timeline,
|
|
129
124
|
canvas: CanvasSpace,
|
|
130
125
|
layers: MediaLayerSet,
|
|
131
126
|
frame: MediaItemProgram["frame"],
|
|
@@ -135,13 +130,13 @@ function realizedItems(
|
|
|
135
130
|
): MediaTrackSet {
|
|
136
131
|
assertMediaTrackSet(set);
|
|
137
132
|
assertMediaTrackHeader(header);
|
|
138
|
-
assertProgramSpaceIdentity(
|
|
133
|
+
assertProgramSpaceIdentity(timeline);
|
|
139
134
|
assertCanvasSpace(canvas);
|
|
140
135
|
assertMediaLayerSet(layers);
|
|
141
136
|
assert(layers.layers.length > 0, `Media Item ${spec.id} requires at least one layer.`);
|
|
142
137
|
assertSpatialFrame(frame);
|
|
143
138
|
assertMediaItemSpec(spec);
|
|
144
|
-
assertTemporalWindowFor(window, { subjectId: spec.id, space });
|
|
139
|
+
assertTemporalWindowFor(window, { subjectId: spec.id, space: timeline });
|
|
145
140
|
assertMediaSoundSet(sounds);
|
|
146
141
|
assert(!sounds.sounds.some((sound) => sound.trigger.kind === "handoff"),
|
|
147
142
|
`Media Item ${spec.id} cannot own a Handoff sound.`);
|
|
@@ -177,7 +172,7 @@ function realizedItems(
|
|
|
177
172
|
export function appendMediaItem(
|
|
178
173
|
set: MediaTrackSet,
|
|
179
174
|
header: MediaTrackHeader,
|
|
180
|
-
|
|
175
|
+
timeline: Timeline,
|
|
181
176
|
canvas: CanvasSpace,
|
|
182
177
|
layers: MediaLayerSet,
|
|
183
178
|
frame: MediaItemProgram["frame"],
|
|
@@ -185,29 +180,29 @@ export function appendMediaItem(
|
|
|
185
180
|
sounds: MediaSoundSet,
|
|
186
181
|
window: ProjectedWindow,
|
|
187
182
|
): MediaTrackSet {
|
|
188
|
-
return realizedItems(set, header,
|
|
183
|
+
return realizedItems(set, header, timeline, canvas, layers, frame, spec, sounds, window);
|
|
189
184
|
}
|
|
190
185
|
|
|
191
|
-
function assertSampleLayerForSpace(layer: MediaSampleLayerProgram,
|
|
186
|
+
function assertSampleLayerForSpace(layer: MediaSampleLayerProgram, timeline: Timeline, label: string): void {
|
|
192
187
|
assertMediaVisualSource(layer.source, `${label}.source`);
|
|
193
188
|
const timing = layer.source.kind === "timed" ? { frameRate: layer.source.frameRate, frameCount: layer.source.frameCount }
|
|
194
189
|
: layer.source.kind === "surface" && layer.source.surface.timing.kind === "frames"
|
|
195
190
|
? layer.source.surface.timing : undefined;
|
|
196
191
|
if (timing === undefined) return;
|
|
197
|
-
assert(timing.frameRate.numerator ===
|
|
198
|
-
&& timing.frameRate.denominator ===
|
|
199
|
-
`${label} is not normalized to
|
|
192
|
+
assert(timing.frameRate.numerator === timeline.frameRate.numerator
|
|
193
|
+
&& timing.frameRate.denominator === timeline.frameRate.denominator,
|
|
194
|
+
`${label} is not normalized to Timeline frame rate.`);
|
|
200
195
|
if (layer.trim !== undefined) assertMediaVisualTrim(layer.trim, timing.frameCount, `${label}.trim`);
|
|
201
196
|
assert(layer.occupancy !== undefined, `${label} requires occupancy.`);
|
|
202
197
|
assertMediaVisualOccupancy(layer.occupancy, `${label}.occupancy`);
|
|
203
198
|
}
|
|
204
199
|
|
|
205
|
-
function assertItem(item: MediaItemProgram,
|
|
200
|
+
function assertItem(item: MediaItemProgram, timeline: Timeline, label: string): void {
|
|
206
201
|
assertMediaIdentity(item.id, `${label}.id`);
|
|
207
202
|
assertMediaIdentity(item.subjectId, `${label}.subjectId`);
|
|
208
203
|
assert(Number.isSafeInteger(item.span.startFrame) && Number.isSafeInteger(item.span.endFrameExclusive)
|
|
209
204
|
&& item.span.startFrame >= 0 && item.span.endFrameExclusive > item.span.startFrame
|
|
210
|
-
&& item.span.endFrameExclusive <= programSpaceFrameCount(
|
|
205
|
+
&& item.span.endFrameExclusive <= programSpaceFrameCount(timeline), `${label}.span is invalid.`);
|
|
211
206
|
assertSpatialFrame(item.frame);
|
|
212
207
|
assertMediaFramePresentation(item.presentation, `${label}.presentation`);
|
|
213
208
|
assertMediaLifecycleMotion(item.motion, item.span.endFrameExclusive - item.span.startFrame, `${label}.motion`);
|
|
@@ -217,7 +212,7 @@ function assertItem(item: MediaItemProgram, space: ProgramSpace, label: string):
|
|
|
217
212
|
assert(item.layers.length > 0, `${label} requires layers.`);
|
|
218
213
|
const layerSet: MediaLayerSet = { layers: item.layers };
|
|
219
214
|
assertMediaLayerSet(layerSet);
|
|
220
|
-
for (const layer of item.layers) if (layer.kind === "sample") assertSampleLayerForSpace(layer,
|
|
215
|
+
for (const layer of item.layers) if (layer.kind === "sample") assertSampleLayerForSpace(layer, timeline, `${label}.${layer.id}`);
|
|
221
216
|
if (item.sourceAudio !== undefined) {
|
|
222
217
|
const selected = item.layers.find((layer) => layer.id === item.sourceAudio!.fromLayer);
|
|
223
218
|
assert(selected?.kind === "sample" && selected.source.kind === "timed" && selected.source.audio !== undefined,
|
|
@@ -230,7 +225,7 @@ function assertItem(item: MediaItemProgram, space: ProgramSpace, label: string):
|
|
|
230
225
|
function appendMediaSequenceAtFrame(
|
|
231
226
|
set: MediaTrackSet,
|
|
232
227
|
header: MediaTrackHeader,
|
|
233
|
-
|
|
228
|
+
timeline: Timeline,
|
|
234
229
|
canvas: CanvasSpace,
|
|
235
230
|
members: MediaSequenceMemberSet,
|
|
236
231
|
frame: MediaSequenceProgram["frame"],
|
|
@@ -241,7 +236,7 @@ function appendMediaSequenceAtFrame(
|
|
|
241
236
|
assertMediaTrackSet(set);
|
|
242
237
|
assertMediaSequenceMemberSet(members);
|
|
243
238
|
assertMediaSequenceSpec(spec);
|
|
244
|
-
const sequence = resolveMediaSequence(header,
|
|
239
|
+
const sequence = resolveMediaSequence(header, timeline, canvas, members, frame, spec, sounds, terminalFrame);
|
|
245
240
|
assert(!set.items.some((item) => item.id === sequence.id)
|
|
246
241
|
&& !set.sequences.some((item) => item.id === sequence.id),
|
|
247
242
|
`Media Track ${header.id} already contains ${sequence.id}.`);
|
|
@@ -251,7 +246,7 @@ function appendMediaSequenceAtFrame(
|
|
|
251
246
|
export function appendMediaSequence(
|
|
252
247
|
set: MediaTrackSet,
|
|
253
248
|
header: MediaTrackHeader,
|
|
254
|
-
|
|
249
|
+
timeline: Timeline,
|
|
255
250
|
canvas: CanvasSpace,
|
|
256
251
|
members: MediaSequenceMemberSet,
|
|
257
252
|
frame: MediaSequenceProgram["frame"],
|
|
@@ -259,13 +254,13 @@ export function appendMediaSequence(
|
|
|
259
254
|
sounds: MediaSoundSet,
|
|
260
255
|
terminal: TemporalInstant,
|
|
261
256
|
): MediaTrackSet {
|
|
262
|
-
assertTemporalInstantFor(terminal, { subjectId: spec.id, space });
|
|
263
|
-
return appendMediaSequenceAtFrame(set, header,
|
|
257
|
+
assertTemporalInstantFor(terminal, { subjectId: spec.id, space: timeline });
|
|
258
|
+
return appendMediaSequenceAtFrame(set, header, timeline, canvas, members, frame, spec, sounds, terminal.frame);
|
|
264
259
|
}
|
|
265
260
|
|
|
266
|
-
function assertSequence(sequence: MediaSequenceProgram,
|
|
261
|
+
function assertSequence(sequence: MediaSequenceProgram, timeline: Timeline, label: string): void {
|
|
267
262
|
assertMediaIdentity(sequence.id, `${label}.id`);
|
|
268
|
-
assert(sequence.span.startFrame >= 0 && sequence.span.endFrameExclusive <= programSpaceFrameCount(
|
|
263
|
+
assert(sequence.span.startFrame >= 0 && sequence.span.endFrameExclusive <= programSpaceFrameCount(timeline)
|
|
269
264
|
&& sequence.span.endFrameExclusive > sequence.span.startFrame
|
|
270
265
|
&& sequence.terminalFrame === sequence.span.endFrameExclusive, `${label}.span is invalid.`);
|
|
271
266
|
assertSpatialFrame(sequence.frame);
|
|
@@ -288,7 +283,7 @@ function assertSequence(sequence: MediaSequenceProgram, space: ProgramSpace, lab
|
|
|
288
283
|
const layerSet: MediaLayerSet = { layers: member.layers };
|
|
289
284
|
assertMediaLayerSet(layerSet);
|
|
290
285
|
for (const layer of member.layers) if (layer.kind === "sample") {
|
|
291
|
-
assertSampleLayerForSpace(layer,
|
|
286
|
+
assertSampleLayerForSpace(layer, timeline, `${label}.members.${index}.${layer.id}`);
|
|
292
287
|
}
|
|
293
288
|
if (member.sourceAudio !== undefined) {
|
|
294
289
|
const selected = member.layers.find((layer) => layer.id === member.sourceAudio!.fromLayer);
|
|
@@ -323,13 +318,13 @@ function normalizeProgram(value: MediaTrackProgram): MediaTrackProgram {
|
|
|
323
318
|
};
|
|
324
319
|
}
|
|
325
320
|
|
|
326
|
-
export function sealMediaTrackProgram(value: MediaTrackProgram,
|
|
321
|
+
export function sealMediaTrackProgram(value: MediaTrackProgram, timeline: Timeline): MediaTrackProgram {
|
|
327
322
|
const normalized = normalizeProgram(value);
|
|
328
|
-
assertMediaTrackProgramIdentity(normalized,
|
|
323
|
+
assertMediaTrackProgramIdentity(normalized, timeline);
|
|
329
324
|
return canonicalize(normalized) as unknown as MediaTrackProgram;
|
|
330
325
|
}
|
|
331
326
|
|
|
332
|
-
export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader,
|
|
327
|
+
export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader, timeline: Timeline): MediaTrackProgram {
|
|
333
328
|
assertMediaTrackSet(set);
|
|
334
329
|
assertMediaTrackHeader(header);
|
|
335
330
|
assert(set.items.length + set.sequences.length > 0, "Media Track requires at least one Item or Sequence.");
|
|
@@ -338,7 +333,7 @@ export function finalizeMediaTrack(set: MediaTrackSet, header: MediaTrackHeader,
|
|
|
338
333
|
id: header.id,
|
|
339
334
|
items: set.items,
|
|
340
335
|
sequences: set.sequences,
|
|
341
|
-
},
|
|
336
|
+
}, timeline);
|
|
342
337
|
}
|
|
343
338
|
|
|
344
339
|
export function assertMediaTrackProgram(value: MediaTrackProgram): void {
|
|
@@ -347,26 +342,26 @@ export function assertMediaTrackProgram(value: MediaTrackProgram): void {
|
|
|
347
342
|
&& value.items.length + value.sequences.length > 0, "MediaTrackProgram is empty.");
|
|
348
343
|
}
|
|
349
344
|
|
|
350
|
-
export function assertMediaTrackProgramIdentity(value: MediaTrackProgram,
|
|
345
|
+
export function assertMediaTrackProgramIdentity(value: MediaTrackProgram, timeline: Timeline): void {
|
|
351
346
|
assertMediaTrackProgram(value);
|
|
352
|
-
assertProgramSpaceIdentity(
|
|
347
|
+
assertProgramSpaceIdentity(timeline);
|
|
353
348
|
const ids = new Set<string>();
|
|
354
349
|
for (const item of value.items) {
|
|
355
350
|
assert(!ids.has(item.id), `MediaTrackProgram repeats ${item.id}.`);
|
|
356
351
|
ids.add(item.id);
|
|
357
|
-
assertItem(item,
|
|
352
|
+
assertItem(item, timeline, `Media Item ${item.id}`);
|
|
358
353
|
}
|
|
359
354
|
for (const sequence of value.sequences) {
|
|
360
355
|
assert(!ids.has(sequence.id), `MediaTrackProgram repeats ${sequence.id}.`);
|
|
361
356
|
ids.add(sequence.id);
|
|
362
|
-
assertSequence(sequence,
|
|
357
|
+
assertSequence(sequence, timeline, `Media Sequence ${sequence.id}`);
|
|
363
358
|
}
|
|
364
359
|
}
|
|
365
360
|
|
|
366
|
-
export function projectMediaVisualTrack(
|
|
367
|
-
assertMediaTrackProgramIdentity(program,
|
|
361
|
+
export function projectMediaVisualTrack(timeline: Timeline, program: MediaTrackProgram): VisualTrack {
|
|
362
|
+
assertMediaTrackProgramIdentity(program, timeline);
|
|
368
363
|
const track = sealVisualTrack({
|
|
369
|
-
programSpaceId:
|
|
364
|
+
programSpaceId: timeline.id,
|
|
370
365
|
visualIr: "hypit.visual-ir@1",
|
|
371
366
|
id: program.id,
|
|
372
367
|
presents: [
|
|
@@ -375,12 +370,12 @@ export function projectMediaVisualTrack(space: ProgramSpace, program: MediaTrack
|
|
|
375
370
|
subjectId: item.subjectId,
|
|
376
371
|
span: { ...item.span },
|
|
377
372
|
stacking: { ...item.stacking },
|
|
378
|
-
elements: lowerMediaItemElements(item,
|
|
373
|
+
elements: lowerMediaItemElements(item, timeline),
|
|
379
374
|
})),
|
|
380
|
-
...program.sequences.flatMap((sequence) => lowerMediaSequencePresents(sequence,
|
|
375
|
+
...program.sequences.flatMap((sequence) => lowerMediaSequencePresents(sequence, timeline)),
|
|
381
376
|
],
|
|
382
377
|
});
|
|
383
|
-
assertVisualTrackIdentity(track,
|
|
378
|
+
assertVisualTrackIdentity(track, timeline);
|
|
384
379
|
return track;
|
|
385
380
|
}
|
|
386
381
|
|
|
@@ -394,7 +389,7 @@ function sourceSampleBoundary(frame: number, frameCount: number, sampleFrames: n
|
|
|
394
389
|
|
|
395
390
|
function sourceAudioClip(
|
|
396
391
|
value: Pick<MediaItemProgram, "id" | "subjectId" | "span" | "layers" | "sourceAudio">,
|
|
397
|
-
|
|
392
|
+
timeline: Timeline,
|
|
398
393
|
fades: { readonly inSamples: number; readonly outSamples: number } = { inSamples: 0, outSamples: 0 },
|
|
399
394
|
): AudioClip | undefined {
|
|
400
395
|
if (value.sourceAudio === undefined) return undefined;
|
|
@@ -409,8 +404,8 @@ function sourceAudioClip(
|
|
|
409
404
|
const trim = layer.trim ?? { startFrame: 0, endFrameExclusive: source.frameCount };
|
|
410
405
|
const sourceStart = sourceSampleBoundary(trim.startFrame, source.frameCount, audio.sampleFrames);
|
|
411
406
|
const sourceEnd = sourceSampleBoundary(trim.endFrameExclusive, source.frameCount, audio.sampleFrames);
|
|
412
|
-
const targetWindowStart = programFrameSampleBoundary(
|
|
413
|
-
const targetWindowEnd = programFrameSampleBoundary(
|
|
407
|
+
const targetWindowStart = programFrameSampleBoundary(timeline, value.span.startFrame, 48_000);
|
|
408
|
+
const targetWindowEnd = programFrameSampleBoundary(timeline, value.span.endFrameExclusive, 48_000);
|
|
414
409
|
const targetFrames = value.span.endFrameExclusive - value.span.startFrame;
|
|
415
410
|
const sourceFrames = trim.endFrameExclusive - trim.startFrame;
|
|
416
411
|
let targetStart = targetWindowStart;
|
|
@@ -423,10 +418,10 @@ function sourceAudioClip(
|
|
|
423
418
|
if (layer.occupancy.mode === "once" || layer.occupancy.mode === "hold") {
|
|
424
419
|
const playedFrames = Math.min(targetFrames, sourceFrames);
|
|
425
420
|
if (layer.occupancy.align === "start") {
|
|
426
|
-
targetEnd = programFrameSampleBoundary(
|
|
421
|
+
targetEnd = programFrameSampleBoundary(timeline, value.span.startFrame + playedFrames, 48_000);
|
|
427
422
|
clipSourceEnd = sourceSampleBoundary(trim.startFrame + playedFrames, source.frameCount, audio.sampleFrames);
|
|
428
423
|
} else {
|
|
429
|
-
targetStart = programFrameSampleBoundary(
|
|
424
|
+
targetStart = programFrameSampleBoundary(timeline, value.span.endFrameExclusive - playedFrames, 48_000);
|
|
430
425
|
clipSourceStart = sourceSampleBoundary(trim.endFrameExclusive - playedFrames, source.frameCount, audio.sampleFrames);
|
|
431
426
|
}
|
|
432
427
|
} else if (layer.occupancy.mode === "loop") {
|
|
@@ -466,12 +461,12 @@ function soundClip(
|
|
|
466
461
|
source: MediaSoundSource,
|
|
467
462
|
gain: number,
|
|
468
463
|
point: number,
|
|
469
|
-
|
|
464
|
+
timeline: Timeline,
|
|
470
465
|
): AudioClip {
|
|
471
|
-
const total = programSpaceSampleFrames(
|
|
472
|
-
const targetStart = programFrameSampleBoundary(
|
|
466
|
+
const total = programSpaceSampleFrames(timeline, 48_000);
|
|
467
|
+
const targetStart = programFrameSampleBoundary(timeline, point, 48_000);
|
|
473
468
|
const audible = Math.min(source.sampleFrames, Math.max(0, total - targetStart));
|
|
474
|
-
assert(audible > 0, `Media sound ${id} begins outside
|
|
469
|
+
assert(audible > 0, `Media sound ${id} begins outside Timeline.`);
|
|
475
470
|
return {
|
|
476
471
|
id,
|
|
477
472
|
artifact: structuredClone(source.artifact),
|
|
@@ -493,18 +488,18 @@ function soundClip(
|
|
|
493
488
|
|
|
494
489
|
function edgeSoundClips(
|
|
495
490
|
value: Pick<MediaItemProgram, "id" | "span" | "motion" | "sounds">,
|
|
496
|
-
|
|
491
|
+
timeline: Timeline,
|
|
497
492
|
): AudioClip[] {
|
|
498
493
|
return value.sounds.flatMap((sound) => {
|
|
499
494
|
if (sound.trigger.kind === "handoff") return [];
|
|
500
495
|
const point = sound.trigger.kind === "enter"
|
|
501
496
|
? value.span.startFrame
|
|
502
497
|
: value.span.endFrameExclusive - (value.motion.exit?.durationFrames ?? 0);
|
|
503
|
-
return [soundClip(`${value.id}:${sound.id}`, sound.source, sound.gain, point,
|
|
498
|
+
return [soundClip(`${value.id}:${sound.id}`, sound.source, sound.gain, point, timeline)];
|
|
504
499
|
});
|
|
505
500
|
}
|
|
506
501
|
|
|
507
|
-
function sequenceAudioClips(sequence: MediaSequenceProgram,
|
|
502
|
+
function sequenceAudioClips(sequence: MediaSequenceProgram, timeline: Timeline): AudioClip[] {
|
|
508
503
|
const sourceClips = sequence.members.flatMap((member, index) => {
|
|
509
504
|
if (member.sourceAudio === undefined) return [];
|
|
510
505
|
const incoming = sequence.handoffs[index - 1];
|
|
@@ -515,12 +510,12 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
|
|
|
515
510
|
? outgoing.span.endFrameExclusive : member.logicalSpan.endFrameExclusive,
|
|
516
511
|
};
|
|
517
512
|
const fadeInSamples = incoming?.audio === "crossfade"
|
|
518
|
-
? programFrameSampleBoundary(
|
|
519
|
-
- programFrameSampleBoundary(
|
|
513
|
+
? programFrameSampleBoundary(timeline, incoming.span.endFrameExclusive, 48_000)
|
|
514
|
+
- programFrameSampleBoundary(timeline, incoming.span.startFrame, 48_000)
|
|
520
515
|
: 0;
|
|
521
516
|
const fadeOutSamples = outgoing?.audio === "crossfade"
|
|
522
|
-
? programFrameSampleBoundary(
|
|
523
|
-
- programFrameSampleBoundary(
|
|
517
|
+
? programFrameSampleBoundary(timeline, outgoing.span.endFrameExclusive, 48_000)
|
|
518
|
+
- programFrameSampleBoundary(timeline, outgoing.span.startFrame, 48_000)
|
|
524
519
|
: 0;
|
|
525
520
|
const clip = sourceAudioClip({
|
|
526
521
|
id: `${sequence.id}:${member.id}`,
|
|
@@ -528,7 +523,7 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
|
|
|
528
523
|
span,
|
|
529
524
|
layers: member.layers,
|
|
530
525
|
sourceAudio: member.sourceAudio,
|
|
531
|
-
},
|
|
526
|
+
}, timeline, { inSamples: fadeInSamples, outSamples: fadeOutSamples });
|
|
532
527
|
return clip === undefined ? [] : [clip];
|
|
533
528
|
});
|
|
534
529
|
const handoffSounds = sequence.sounds.flatMap((sound) => {
|
|
@@ -537,7 +532,7 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
|
|
|
537
532
|
const handoff = sequence.handoffs.find((candidate) => candidate.id === handoffId)!;
|
|
538
533
|
return [soundClip(
|
|
539
534
|
`${sequence.id}:${sound.id}`, sound.source, sound.gain,
|
|
540
|
-
sequence.members.find((member) => member.id === handoff.toMemberId)!.activationFrame,
|
|
535
|
+
sequence.members.find((member) => member.id === handoff.toMemberId)!.activationFrame, timeline,
|
|
541
536
|
)];
|
|
542
537
|
});
|
|
543
538
|
return [
|
|
@@ -547,19 +542,19 @@ function sequenceAudioClips(sequence: MediaSequenceProgram, space: ProgramSpace)
|
|
|
547
542
|
span: sequence.span,
|
|
548
543
|
motion: sequence.motion,
|
|
549
544
|
sounds: sequence.sounds,
|
|
550
|
-
},
|
|
545
|
+
}, timeline),
|
|
551
546
|
...handoffSounds,
|
|
552
547
|
];
|
|
553
548
|
}
|
|
554
549
|
|
|
555
|
-
export function projectMediaAudioTrack(
|
|
556
|
-
assertMediaTrackProgramIdentity(program,
|
|
550
|
+
export function projectMediaAudioTrack(timeline: Timeline, program: MediaTrackProgram): AudioTrack {
|
|
551
|
+
assertMediaTrackProgramIdentity(program, timeline);
|
|
557
552
|
const clips = program.items.flatMap((item) => {
|
|
558
|
-
const source = sourceAudioClip(item,
|
|
559
|
-
return [...(source === undefined ? [] : [source]), ...edgeSoundClips(item,
|
|
560
|
-
}).concat(program.sequences.flatMap((sequence) => sequenceAudioClips(sequence,
|
|
553
|
+
const source = sourceAudioClip(item, timeline);
|
|
554
|
+
return [...(source === undefined ? [] : [source]), ...edgeSoundClips(item, timeline)];
|
|
555
|
+
}).concat(program.sequences.flatMap((sequence) => sequenceAudioClips(sequence, timeline)));
|
|
561
556
|
assert(clips.length > 0, `Media Program ${program.id} has no explicitly authored audio projection.`);
|
|
562
|
-
const track = sealAudioTrack({ programSpaceId:
|
|
563
|
-
assertAudioTrackIdentity(track,
|
|
557
|
+
const track = sealAudioTrack({ programSpaceId: timeline.id, id: `${program.id}:audio`, clips });
|
|
558
|
+
assertAudioTrackIdentity(track, timeline);
|
|
564
559
|
return track;
|
|
565
560
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import type {
|
|
2
3
|
VisualSamplingRational,
|
|
3
4
|
VisualSamplingSegment,
|
|
4
5
|
VisualTimedSampling,
|
|
5
6
|
} from "@hypit/composition";
|
|
6
7
|
import { assertProgramSpaceIdentity } from "@hypit/program-space";
|
|
7
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
8
8
|
|
|
9
9
|
import type { MediaVisualOccupancy, MediaVisualTrim } from "./types.js";
|
|
10
10
|
|
|
@@ -58,21 +58,21 @@ function assertOccupancy(value: MediaVisualOccupancy): void {
|
|
|
58
58
|
* frame. This avoids a second, renderer-specific frame quantizer.
|
|
59
59
|
*/
|
|
60
60
|
export function resolveVisualSampling(input: {
|
|
61
|
-
readonly
|
|
61
|
+
readonly timeline: Timeline;
|
|
62
62
|
readonly sourceFrameRate: { readonly numerator: number; readonly denominator: number };
|
|
63
63
|
readonly sourceFrameCount: number;
|
|
64
64
|
readonly targetFrameCount: number;
|
|
65
65
|
readonly trim?: MediaVisualTrim;
|
|
66
66
|
readonly occupancy: MediaVisualOccupancy;
|
|
67
67
|
}): VisualTimedSampling {
|
|
68
|
-
assertProgramSpaceIdentity(input.
|
|
68
|
+
assertProgramSpaceIdentity(input.timeline);
|
|
69
69
|
assert(Number.isSafeInteger(input.sourceFrameCount) && input.sourceFrameCount > 0,
|
|
70
70
|
"Timed visual source frame count is invalid.");
|
|
71
71
|
assert(Number.isSafeInteger(input.targetFrameCount) && input.targetFrameCount > 0,
|
|
72
72
|
"Timed visual target frame count is invalid.");
|
|
73
|
-
assert(input.sourceFrameRate.numerator === input.
|
|
74
|
-
&& input.sourceFrameRate.denominator === input.
|
|
75
|
-
"Timed visual source must be normalized to
|
|
73
|
+
assert(input.sourceFrameRate.numerator === input.timeline.frameRate.numerator
|
|
74
|
+
&& input.sourceFrameRate.denominator === input.timeline.frameRate.denominator,
|
|
75
|
+
"Timed visual source must be normalized to Timeline frame rate before Media authoring.");
|
|
76
76
|
assertOccupancy(input.occupancy);
|
|
77
77
|
const trim = input.trim ?? { startFrame: 0, endFrameExclusive: input.sourceFrameCount };
|
|
78
78
|
assert(Number.isSafeInteger(trim.startFrame) && Number.isSafeInteger(trim.endFrameExclusive)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Timeline } from "@hypit/timeline";
|
|
1
2
|
import type {
|
|
2
3
|
VisualAnimation,
|
|
3
4
|
VisualEasing,
|
|
@@ -5,7 +6,6 @@ import type {
|
|
|
5
6
|
VisualStyleDeclaration,
|
|
6
7
|
} from "@hypit/composition";
|
|
7
8
|
import { assertProgramSpaceIdentity, programSpaceFrameCount } from "@hypit/program-space";
|
|
8
|
-
import type { ProgramSpace } from "@hypit/program-space";
|
|
9
9
|
import { canonicalize } from "@hypit/protocol";
|
|
10
10
|
import { assertCanvasSpace, assertSpatialFrame } from "@hypit/spatial";
|
|
11
11
|
import type { CanvasSpace } from "@hypit/spatial";
|
|
@@ -109,12 +109,12 @@ function appendMediaSequenceMemberAtFrame(
|
|
|
109
109
|
|
|
110
110
|
export function appendMediaSequenceMember(
|
|
111
111
|
set: MediaSequenceMemberSet,
|
|
112
|
-
|
|
112
|
+
timeline: Timeline,
|
|
113
113
|
layers: MediaLayerSet,
|
|
114
114
|
spec: MediaSequenceMemberSpec,
|
|
115
115
|
activation: TemporalInstant,
|
|
116
116
|
): MediaSequenceMemberSet {
|
|
117
|
-
assertTemporalInstantFor(activation, { subjectId: spec.id, space });
|
|
117
|
+
assertTemporalInstantFor(activation, { subjectId: spec.id, space: timeline });
|
|
118
118
|
return appendMediaSequenceMemberAtFrame(set, layers, spec, activation.frame);
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -180,7 +180,7 @@ function resolvedHandoff(
|
|
|
180
180
|
|
|
181
181
|
export function resolveMediaSequence(
|
|
182
182
|
header: MediaTrackHeader,
|
|
183
|
-
|
|
183
|
+
timeline: Timeline,
|
|
184
184
|
canvas: CanvasSpace,
|
|
185
185
|
memberSet: MediaSequenceMemberSet,
|
|
186
186
|
frame: MediaSequenceProgram["frame"],
|
|
@@ -188,7 +188,7 @@ export function resolveMediaSequence(
|
|
|
188
188
|
sounds: MediaSoundSet,
|
|
189
189
|
terminalFrame: number,
|
|
190
190
|
): MediaSequenceProgram {
|
|
191
|
-
assertProgramSpaceIdentity(
|
|
191
|
+
assertProgramSpaceIdentity(timeline);
|
|
192
192
|
assertCanvasSpace(canvas);
|
|
193
193
|
assertMediaSequenceMemberSet(memberSet);
|
|
194
194
|
assertMediaSequenceSpec(spec);
|
|
@@ -205,7 +205,7 @@ export function resolveMediaSequence(
|
|
|
205
205
|
terminalFrame,
|
|
206
206
|
triggers: memberSet.members.map((member) => ({ id: member.id, frame: member.activationFrame })),
|
|
207
207
|
});
|
|
208
|
-
assert(terminalFrame <= programSpaceFrameCount(
|
|
208
|
+
assert(terminalFrame <= programSpaceFrameCount(timeline), `Media Sequence ${spec.id} exits Timeline.`);
|
|
209
209
|
const handoffs = spec.handoffs.map((handoff, index) => {
|
|
210
210
|
const from = memberSet.members[index]!;
|
|
211
211
|
const to = memberSet.members[index + 1]!;
|
|
@@ -360,7 +360,7 @@ export function sequenceMemberHandoffAnimation(
|
|
|
360
360
|
|
|
361
361
|
export function lowerMediaSequencePresents(
|
|
362
362
|
sequence: MediaSequenceProgram,
|
|
363
|
-
|
|
363
|
+
timeline: Timeline,
|
|
364
364
|
): readonly VisualPresent[] {
|
|
365
365
|
return sequence.members.map((member, index) => {
|
|
366
366
|
const incoming = sequence.handoffs[index - 1];
|
|
@@ -389,7 +389,7 @@ export function lowerMediaSequencePresents(
|
|
|
389
389
|
subjectId: sequence.id,
|
|
390
390
|
span: { ...item.span },
|
|
391
391
|
stacking: { ...item.stacking },
|
|
392
|
-
elements: lowerMediaItemElements(item,
|
|
392
|
+
elements: lowerMediaItemElements(item, timeline, {
|
|
393
393
|
includeHandoffWrapper: true,
|
|
394
394
|
...(handoffAnimation === undefined ? {} : { handoffAnimation }),
|
|
395
395
|
lifecycleAnimationOverride: lifecycleAnimationWindow(
|