@cueframe/kernel 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/_members/composition/ops/compositionOps.d.ts +1 -0
- package/dist/_members/composition/projection/behind-readiness.d.ts +127 -0
- package/dist/_members/composition/projection/index.d.ts +2 -0
- package/dist/_members/composition/projection/reframe-readiness.d.ts +156 -0
- package/dist/_members/composition/validators/composition.d.ts +42 -25
- package/dist/_members/composition/validators/render.d.ts +32 -0
- package/dist/_members/core/render/compositionRender.d.ts +17 -1
- package/dist/_members/core/render/types.d.ts +31 -0
- package/dist/authoring/build-tools.js +6 -6
- package/dist/authoring/context.js +4 -4
- package/dist/authoring/tools.js +5 -5
- package/dist/authoring.js +11 -9
- package/dist/{chunk-ZB3C3HM7.js → chunk-7FO3ZJ43.js} +3 -0
- package/dist/{chunk-ODL7GQJG.js → chunk-AP6ZIVAV.js} +2 -2
- package/dist/{chunk-IBYQG46O.js → chunk-AQBREB5O.js} +1 -1
- package/dist/{chunk-YIOY2XEO.js → chunk-DK2ODBNT.js} +15 -5
- package/dist/{chunk-JRQVPFLF.js → chunk-HY3RIEZW.js} +1 -1
- package/dist/{chunk-GEA7E2FL.js → chunk-JJ6XD7NG.js} +151 -1
- package/dist/{chunk-COYMZ76S.js → chunk-MBCXCJOE.js} +1 -1
- package/dist/{chunk-37NJ27UU.js → chunk-OCFDUCF4.js} +3 -0
- package/dist/{chunk-VOO5FQSS.js → chunk-PDYO3DOJ.js} +5 -5
- package/dist/{chunk-MXFAADCQ.js → chunk-PODIYN2K.js} +9 -2
- package/dist/{chunk-NFEGPWGS.js → chunk-TOJEXFXL.js} +1 -1
- package/dist/{chunk-LM4WDUQJ.js → chunk-UHGSZZDI.js} +1 -1
- package/dist/{chunk-XWKZB5U5.js → chunk-ZWMV6DD2.js} +24 -1
- package/dist/compose/renderer.js +3 -3
- package/dist/compose.js +6 -6
- package/dist/composition/graphics-plan.js +1 -1
- package/dist/composition/ops.js +3 -3
- package/dist/composition/primitive-catalog.js +1 -1
- package/dist/composition/projection.js +19 -3
- package/dist/composition/validators.js +6 -4
- package/dist/composition-ops.js +8 -6
- package/dist/composition.js +24 -6
- package/dist/{context-OKX3HHFS.js → context-YWUZDG5X.js} +4 -4
- package/dist/core/render.js +3 -3
- package/dist/core/select.js +2 -2
- package/dist/core.js +3 -3
- package/dist/errors.js +1 -1
- package/dist/mcp/adapter.js +1 -0
- package/dist/media-model/testing.js +1071 -718
- package/dist/nle-export/server.js +328 -130
- package/dist/nle-export.js +7 -6
- package/package.json +13 -14
- package/dist/_members/account-model/index.js +0 -4
- package/dist/_members/account-model/testing/conversationStoreContract.js +0 -168
- package/dist/_members/account-model/testing/index.js +0 -7
- package/dist/_members/account-model/testing/restorePointStoreContract.js +0 -69
- package/dist/_members/account-model/types/index.js +0 -1
- package/dist/_members/account-model/validators/contextFile.js +0 -18
- package/dist/_members/account-model/validators/conversation.js +0 -95
- package/dist/_members/account-model/validators/dashboardInsight.js +0 -16
- package/dist/_members/account-model/validators/index.js +0 -7
- package/dist/_members/account-model/validators/sessionToken.js +0 -49
- package/dist/_members/account-model/validators/uploadToken.js +0 -16
- package/dist/_members/account-model/validators/userSettings.js +0 -12
- package/dist/_members/account-model/validators/workingComposition.js +0 -20
- package/dist/_members/brand-derivation/constants.js +0 -20
- package/dist/_members/brand-derivation/contrastSafe.js +0 -114
- package/dist/_members/brand-derivation/index.js +0 -1
- package/dist/_members/cloud-import/chunk-XKO6ZSWI.js +0 -162
- package/dist/_members/cloud-import/chunk-XKO6ZSWI.js.map +0 -1
- package/dist/_members/cloud-import/index.js +0 -241
- package/dist/_members/cloud-import/index.js.map +0 -1
- package/dist/_members/cloud-import/multipartUpload.js +0 -7
- package/dist/_members/cloud-import/multipartUpload.js.map +0 -1
- package/dist/_members/composition/audio/audioMix.js +0 -61
- package/dist/_members/composition/audio/index.js +0 -5
- package/dist/_members/composition/audio/mixStaging.js +0 -195
- package/dist/_members/composition/audio/musicPack.generated.js +0 -136
- package/dist/_members/composition/audio/musicPack.js +0 -36
- package/dist/_members/composition/audio/pack.generated.js +0 -603
- package/dist/_members/composition/audio/pack.js +0 -48
- package/dist/_members/composition/audio/palette.js +0 -134
- package/dist/_members/composition/autozoom/index.js +0 -83
- package/dist/_members/composition/brand-kit.js +0 -45
- package/dist/_members/composition/brief/contract.js +0 -209
- package/dist/_members/composition/color-grade.js +0 -80
- package/dist/_members/composition/depth.js +0 -8
- package/dist/_members/composition/fixtures/index.js +0 -143
- package/dist/_members/composition/fixtures/vaayaErrored.d.ts +0 -25
- package/dist/_members/composition/fixtures/vaayaErrored.js +0 -203
- package/dist/_members/composition/fonts.js +0 -162
- package/dist/_members/composition/graphics-plan/compile.js +0 -221
- package/dist/_members/composition/graphics-plan/index.js +0 -10
- package/dist/_members/composition/graphics-plan/instantiateMotif.js +0 -44
- package/dist/_members/composition/graphics-plan/motion.js +0 -66
- package/dist/_members/composition/graphics-plan/schemas.js +0 -261
- package/dist/_members/composition/graphics-plan/solve.js +0 -145
- package/dist/_members/composition/index.js +0 -5
- package/dist/_members/composition/invariants/clipPlacement.js +0 -69
- package/dist/_members/composition/invariants/composition.js +0 -28
- package/dist/_members/composition/invariants/errors.js +0 -10
- package/dist/_members/composition/invariants/etag.js +0 -38
- package/dist/_members/composition/invariants/ids.js +0 -33
- package/dist/_members/composition/invariants/index.js +0 -9
- package/dist/_members/composition/invariants/keyframes.js +0 -45
- package/dist/_members/composition/invariants/markers.js +0 -29
- package/dist/_members/composition/invariants/time.js +0 -20
- package/dist/_members/composition/invariants/tracks.js +0 -304
- package/dist/_members/composition/ops/compositionOps.js +0 -1056
- package/dist/_members/composition/ops/headlessStore.js +0 -94
- package/dist/_members/composition/ops/index.js +0 -4
- package/dist/_members/composition/ops/selectors.js +0 -118
- package/dist/_members/composition/ops/timeline-word.js +0 -1
- package/dist/_members/composition/ops/transcript.js +0 -77
- package/dist/_members/composition/ops/types.js +0 -16
- package/dist/_members/composition/primitive-catalog/catalogQuery.js +0 -150
- package/dist/_members/composition/primitive-catalog/disabled.js +0 -32
- package/dist/_members/composition/primitive-catalog/generated/meta.js +0 -15161
- package/dist/_members/composition/primitive-catalog/index.js +0 -46
- package/dist/_members/composition/primitive-catalog/paramValidation.js +0 -231
- package/dist/_members/composition/primitive-catalog/projection.js +0 -164
- package/dist/_members/composition/primitive-catalog/types.js +0 -14
- package/dist/_members/composition/projection/behind-placement.js +0 -62
- package/dist/_members/composition/projection/brandKit.js +0 -482
- package/dist/_members/composition/projection/cardTokens.js +0 -209
- package/dist/_members/composition/projection/composition-floor.js +0 -582
- package/dist/_members/composition/projection/cropProjection.js +0 -257
- package/dist/_members/composition/projection/index.js +0 -7
- package/dist/_members/composition/projection/occlusion-budget.js +0 -104
- package/dist/_members/composition/projection/safe-zones.js +0 -99
- package/dist/_members/composition/reframe/aspectLoss.js +0 -115
- package/dist/_members/composition/reframe/coverage.js +0 -62
- package/dist/_members/composition/reframe/derive.js +0 -73
- package/dist/_members/composition/reframe/index.js +0 -109
- package/dist/_members/composition/reframe/kenBurns.js +0 -64
- package/dist/_members/composition/reframe/shotScale.js +0 -176
- package/dist/_members/composition/reframe/trajectory.js +0 -124
- package/dist/_members/composition/timeline/compound.js +0 -134
- package/dist/_members/composition/timeline/index.js +0 -9
- package/dist/_members/composition/timeline/intent.js +0 -228
- package/dist/_members/composition/timeline/keyframes.js +0 -121
- package/dist/_members/composition/timeline/link.js +0 -59
- package/dist/_members/composition/timeline/occupancy.js +0 -36
- package/dist/_members/composition/timeline/placement.js +0 -74
- package/dist/_members/composition/timeline/plan.js +0 -31
- package/dist/_members/composition/timeline/resolve.js +0 -170
- package/dist/_members/composition/timeline/trims.js +0 -278
- package/dist/_members/composition/types/index.js +0 -1
- package/dist/_members/composition/validators/brandKit.js +0 -295
- package/dist/_members/composition/validators/composePlan.js +0 -113
- package/dist/_members/composition/validators/composition.js +0 -703
- package/dist/_members/composition/validators/font.js +0 -34
- package/dist/_members/composition/validators/graphicKinds.js +0 -30
- package/dist/_members/composition/validators/index.js +0 -9
- package/dist/_members/composition/validators/project.js +0 -29
- package/dist/_members/composition/validators/registry.js +0 -41
- package/dist/_members/composition/validators/render.js +0 -139
- package/dist/_members/composition/validators/session.js +0 -37
- package/dist/_members/composition/validators/webhook.js +0 -72
- package/dist/_members/composition-ops/alphaLayers.js +0 -141
- package/dist/_members/composition-ops/index.js +0 -637
- package/dist/_members/composition-ops/materializeGrid.js +0 -99
- package/dist/_members/composition-ops/opRecorder.js +0 -196
- package/dist/_members/composition-ops/recordingStore.js +0 -14
- package/dist/_members/composition-ops/replaceRegion.js +0 -102
- package/dist/_members/composition-ops/testFixtures.js +0 -19
- package/dist/_members/core/index.js +0 -5
- package/dist/_members/core/render/bookends.js +0 -53
- package/dist/_members/core/render/captions.js +0 -127
- package/dist/_members/core/render/compositionRender.js +0 -1249
- package/dist/_members/core/render/deriveTrajectory.js +0 -889
- package/dist/_members/core/render/emphasis.js +0 -16
- package/dist/_members/core/render/eval/cropBox.js +0 -139
- package/dist/_members/core/render/eval/inclusion.js +0 -96
- package/dist/_members/core/render/eval/index.js +0 -146
- package/dist/_members/core/render/eval/metrics.js +0 -94
- package/dist/_members/core/render/exportSettings.js +0 -65
- package/dist/_members/core/render/index.js +0 -20
- package/dist/_members/core/render/mapFaceToPerson.js +0 -73
- package/dist/_members/core/render/types.js +0 -8
- package/dist/_members/core/render/vcam/cameraPath.js +0 -248
- package/dist/_members/core/render/vcam/constants.js +0 -115
- package/dist/_members/core/render/vcam/errorCodes.js +0 -39
- package/dist/_members/core/render/vcam/framing.js +0 -136
- package/dist/_members/core/render/vcam/requiredRegion.js +0 -137
- package/dist/_members/core/render/vcam/shots.js +0 -53
- package/dist/_members/core/render/vcam/subjectSet.js +0 -388
- package/dist/_members/core/select/errorCodes.js +0 -38
- package/dist/_members/core/select/index.js +0 -26
- package/dist/_members/core/select/model.js +0 -18
- package/dist/_members/core/select/select.js +0 -244
- package/dist/_members/core/select/stabilize.js +0 -242
- package/dist/_members/core/types.js +0 -7
- package/dist/_members/errors/index.js +0 -1
- package/dist/_members/errors/registry.js +0 -560
- package/dist/_members/foundation/codes/index.js +0 -31
- package/dist/_members/foundation/index.js +0 -2
- package/dist/_members/foundation/primitives/index.js +0 -5
- package/dist/_members/mcp/adapter.js +0 -771
- package/dist/_members/mcp/burnedNames.js +0 -73
- package/dist/_members/mcp/core.js +0 -390
- package/dist/_members/mcp/curation.js +0 -792
- package/dist/_members/mcp/executor.js +0 -142
- package/dist/_members/mcp/format.js +0 -9
- package/dist/_members/mcp/generated/catalogPreviews.js +0 -95
- package/dist/_members/mcp/generated/harness.js +0 -81
- package/dist/_members/mcp/generated/operations.js +0 -131
- package/dist/_members/mcp/index.js +0 -50
- package/dist/_members/mcp/internalLoopTools.js +0 -109
- package/dist/_members/mcp/prompts.js +0 -45
- package/dist/_members/mcp/resources.js +0 -166
- package/dist/_members/mcp/server.js +0 -340
- package/dist/_members/mcp/wait.js +0 -378
- package/dist/_members/mcp/x402Meta.js +0 -66
- package/dist/_members/media-model/api.js +0 -175
- package/dist/_members/media-model/index.js +0 -1
- package/dist/_members/media-model/media-kind.js +0 -116
- package/dist/_members/media-model/testing/index.js +0 -1
- package/dist/_members/media-model/testing/mediaStoreContract.js +0 -82
- package/dist/_members/media-model/transcriptSearch.js +0 -70
- package/dist/_members/media-model/transcriptSearchCases.json +0 -79
- package/dist/_members/nle-export/compact-timeline.js +0 -73
- package/dist/_members/nle-export/compact-timeline.js.map +0 -1
- package/dist/_members/nle-export/composition-to-input.js +0 -147
- package/dist/_members/nle-export/composition-to-input.js.map +0 -1
- package/dist/_members/nle-export/fcpxml.js +0 -159
- package/dist/_members/nle-export/fcpxml.js.map +0 -1
- package/dist/_members/nle-export/index.js +0 -12
- package/dist/_members/nle-export/index.js.map +0 -1
- package/dist/_members/nle-export/premiere.js +0 -161
- package/dist/_members/nle-export/premiere.js.map +0 -1
- package/dist/_members/nle-export/server/index.js +0 -2
- package/dist/_members/nle-export/server/index.js.map +0 -1
- package/dist/_members/nle-export/server/pack-zip.js +0 -38
- package/dist/_members/nle-export/server/pack-zip.js.map +0 -1
- package/dist/_members/nle-export/srt.js +0 -50
- package/dist/_members/nle-export/srt.js.map +0 -1
- package/dist/_members/nle-export/types.js +0 -9
- package/dist/_members/nle-export/types.js.map +0 -1
- package/dist/_members/nle-export/xml/index.js +0 -11
- package/dist/_members/nle-export/xml/index.js.map +0 -1
- package/dist/_members/nle-export/xml-utils.js +0 -48
- package/dist/_members/nle-export/xml-utils.js.map +0 -1
- package/dist/_members/perception/activeSpeaker.js +0 -103
- package/dist/_members/perception/audioQuality.js +0 -76
- package/dist/_members/perception/energyBeat.js +0 -99
- package/dist/_members/perception/identityMatch.js +0 -91
- package/dist/_members/perception/index.js +0 -48
- package/dist/_members/perception/visualQuality.js +0 -95
- package/dist/_members/plane/conformance.js +0 -90
- package/dist/_members/plane/contract.js +0 -49
- package/dist/_members/plane/index.js +0 -16
- package/dist/_members/primitives/backgrounds/index.js +0 -32
- package/dist/_members/primitives/backgrounds/index.js.map +0 -1
- package/dist/_members/primitives/captions/index.js +0 -398
- package/dist/_members/primitives/captions/index.js.map +0 -1
- package/dist/_members/primitives/chunk-2LVE4UIT.js +0 -139
- package/dist/_members/primitives/chunk-2LVE4UIT.js.map +0 -1
- package/dist/_members/primitives/chunk-3IQUH6KK.js +0 -20
- package/dist/_members/primitives/chunk-3IQUH6KK.js.map +0 -1
- package/dist/_members/primitives/chunk-3OMURV6Q.js +0 -112
- package/dist/_members/primitives/chunk-3OMURV6Q.js.map +0 -1
- package/dist/_members/primitives/chunk-4IS6TMEG.js +0 -21
- package/dist/_members/primitives/chunk-4IS6TMEG.js.map +0 -1
- package/dist/_members/primitives/chunk-5MWGAEGQ.js +0 -1644
- package/dist/_members/primitives/chunk-5MWGAEGQ.js.map +0 -1
- package/dist/_members/primitives/chunk-7RRPFPQK.js +0 -15
- package/dist/_members/primitives/chunk-7RRPFPQK.js.map +0 -1
- package/dist/_members/primitives/chunk-DH5TRZK2.js +0 -125
- package/dist/_members/primitives/chunk-DH5TRZK2.js.map +0 -1
- package/dist/_members/primitives/chunk-E3KNUSFG.js +0 -2337
- package/dist/_members/primitives/chunk-E3KNUSFG.js.map +0 -1
- package/dist/_members/primitives/chunk-G2B3G4HK.js +0 -47
- package/dist/_members/primitives/chunk-G2B3G4HK.js.map +0 -1
- package/dist/_members/primitives/chunk-HFPFGZXT.js +0 -1494
- package/dist/_members/primitives/chunk-HFPFGZXT.js.map +0 -1
- package/dist/_members/primitives/chunk-HIWVFZVH.js +0 -19
- package/dist/_members/primitives/chunk-HIWVFZVH.js.map +0 -1
- package/dist/_members/primitives/chunk-IDAL6G3Y.js +0 -134
- package/dist/_members/primitives/chunk-IDAL6G3Y.js.map +0 -1
- package/dist/_members/primitives/chunk-KNC6JP5F.js +0 -34
- package/dist/_members/primitives/chunk-KNC6JP5F.js.map +0 -1
- package/dist/_members/primitives/chunk-KYRDVZST.js +0 -459
- package/dist/_members/primitives/chunk-KYRDVZST.js.map +0 -1
- package/dist/_members/primitives/chunk-LWLHS2NS.js +0 -3410
- package/dist/_members/primitives/chunk-LWLHS2NS.js.map +0 -1
- package/dist/_members/primitives/chunk-QAQ3P7DR.js +0 -8855
- package/dist/_members/primitives/chunk-QAQ3P7DR.js.map +0 -1
- package/dist/_members/primitives/chunk-ROV2ODWC.js +0 -81
- package/dist/_members/primitives/chunk-ROV2ODWC.js.map +0 -1
- package/dist/_members/primitives/chunk-TCRC2FH3.js +0 -183
- package/dist/_members/primitives/chunk-TCRC2FH3.js.map +0 -1
- package/dist/_members/primitives/chunk-US4YEDAA.js +0 -96
- package/dist/_members/primitives/chunk-US4YEDAA.js.map +0 -1
- package/dist/_members/primitives/chunk-UVKRO5ER.js +0 -13
- package/dist/_members/primitives/chunk-UVKRO5ER.js.map +0 -1
- package/dist/_members/primitives/chunk-W4EIIF2I.js +0 -10
- package/dist/_members/primitives/chunk-W4EIIF2I.js.map +0 -1
- package/dist/_members/primitives/chunk-WPGKIPCO.js +0 -3563
- package/dist/_members/primitives/chunk-WPGKIPCO.js.map +0 -1
- package/dist/_members/primitives/chunk-WZFLEGMD.js +0 -1435
- package/dist/_members/primitives/chunk-WZFLEGMD.js.map +0 -1
- package/dist/_members/primitives/chunk-XHU3WBEI.js +0 -33
- package/dist/_members/primitives/chunk-XHU3WBEI.js.map +0 -1
- package/dist/_members/primitives/chunk-YN7WTZZ7.js +0 -46
- package/dist/_members/primitives/chunk-YN7WTZZ7.js.map +0 -1
- package/dist/_members/primitives/effects/index.js +0 -30
- package/dist/_members/primitives/effects/index.js.map +0 -1
- package/dist/_members/primitives/hero-text/index.js +0 -14
- package/dist/_members/primitives/hero-text/index.js.map +0 -1
- package/dist/_members/primitives/index.js +0 -64
- package/dist/_members/primitives/index.js.map +0 -1
- package/dist/_members/primitives/layouts/index.js +0 -24
- package/dist/_members/primitives/layouts/index.js.map +0 -1
- package/dist/_members/primitives/lib/easings.js +0 -26
- package/dist/_members/primitives/lib/easings.js.map +0 -1
- package/dist/_members/primitives/lib/index.js +0 -74
- package/dist/_members/primitives/lib/index.js.map +0 -1
- package/dist/_members/primitives/lib/palette.js +0 -72
- package/dist/_members/primitives/lib/palette.js.map +0 -1
- package/dist/_members/primitives/lib/preview.js +0 -8
- package/dist/_members/primitives/lib/preview.js.map +0 -1
- package/dist/_members/primitives/lib/schema.js +0 -12
- package/dist/_members/primitives/lib/schema.js.map +0 -1
- package/dist/_members/primitives/lib/seeded-random.js +0 -14
- package/dist/_members/primitives/lib/seeded-random.js.map +0 -1
- package/dist/_members/primitives/lib/text/contrast.js +0 -12
- package/dist/_members/primitives/lib/text/contrast.js.map +0 -1
- package/dist/_members/primitives/lib/text/fill.js +0 -8
- package/dist/_members/primitives/lib/text/fill.js.map +0 -1
- package/dist/_members/primitives/lib/text/fitText.js +0 -10
- package/dist/_members/primitives/lib/text/fitText.js.map +0 -1
- package/dist/_members/primitives/lib/text/marker.js +0 -8
- package/dist/_members/primitives/lib/text/marker.js.map +0 -1
- package/dist/_members/primitives/lib/text/motion.js +0 -16
- package/dist/_members/primitives/lib/text/motion.js.map +0 -1
- package/dist/_members/primitives/lib/text/recolor.js +0 -8
- package/dist/_members/primitives/lib/text/recolor.js.map +0 -1
- package/dist/_members/primitives/lib/text/spec.js +0 -1
- package/dist/_members/primitives/lib/text/spec.js.map +0 -1
- package/dist/_members/primitives/lib/text/stage.js +0 -8
- package/dist/_members/primitives/lib/text/stage.js.map +0 -1
- package/dist/_members/primitives/lib/text/typeface.js +0 -8
- package/dist/_members/primitives/lib/text/typeface.js.map +0 -1
- package/dist/_members/primitives/lib/tokens.js +0 -24
- package/dist/_members/primitives/lib/tokens.js.map +0 -1
- package/dist/_members/primitives/lib/types.js +0 -1
- package/dist/_members/primitives/lib/types.js.map +0 -1
- package/dist/_members/primitives/params-required.json +0 -153
- package/dist/_members/primitives/scenes/index.js +0 -25
- package/dist/_members/primitives/scenes/index.js.map +0 -1
- package/dist/_members/primitives/subject-foreground/index.js +0 -30
- package/dist/_members/primitives/subject-foreground/index.js.map +0 -1
- package/dist/_members/primitives/text/index.js +0 -57
- package/dist/_members/primitives/text/index.js.map +0 -1
- package/dist/_members/primitives/transitions/index.js +0 -67
- package/dist/_members/primitives/transitions/index.js.map +0 -1
- package/dist/_members/primitives/ui-blocks/index.js +0 -76
- package/dist/_members/primitives/ui-blocks/index.js.map +0 -1
- package/dist/_members/primitives/version-map.json +0 -105
- package/dist/_members/primitives/workspace.js +0 -60
- package/dist/_members/primitives/workspace.js.map +0 -1
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AUDIO_MIX — the one SSOT for audio design policy (spec 2026-07-20
|
|
3
|
-
* time-synced-sfx-audio-design §5). Consumed by the director's sfxCompile
|
|
4
|
-
* (placement) AND the evaluation audio floors (grading) so the resolver and the
|
|
5
|
-
* grader can never disagree on what "too dense" means.
|
|
6
|
-
*
|
|
7
|
-
* The content-kind split is the restraint rule: real footage (a transcript with
|
|
8
|
-
* words exists) gets the left column BY CONSTRUCTION — podcasts / talking-head
|
|
9
|
-
* content cannot be opted into generated-tier density except via the explicit
|
|
10
|
-
* `dense` intensity.
|
|
11
|
-
*/
|
|
12
|
-
/** Density policy per content kind at each intensity. `off` emits nothing (the
|
|
13
|
-
* resolver returns [] before consulting this table). `dense` on real footage is
|
|
14
|
-
* the explicit opt-in that unlocks the generated-tier caps. */
|
|
15
|
-
export const SFX_DENSITY = {
|
|
16
|
-
"real-footage": {
|
|
17
|
-
light: { maxHitsPer30s: 3, minSpacingSec: 2.5, perElementTicks: false, maxTicksPerGraphic: 0, hitDb: -18 },
|
|
18
|
-
standard: { maxHitsPer30s: 3, minSpacingSec: 2.5, perElementTicks: false, maxTicksPerGraphic: 0, hitDb: -18 },
|
|
19
|
-
dense: { maxHitsPer30s: 8, minSpacingSec: 1.2, perElementTicks: true, maxTicksPerGraphic: 5, hitDb: -12 },
|
|
20
|
-
},
|
|
21
|
-
generated: {
|
|
22
|
-
light: { maxHitsPer30s: 4, minSpacingSec: 2.0, perElementTicks: false, maxTicksPerGraphic: 0, hitDb: -14 },
|
|
23
|
-
standard: { maxHitsPer30s: 8, minSpacingSec: 1.2, perElementTicks: true, maxTicksPerGraphic: 5, hitDb: -12 },
|
|
24
|
-
dense: { maxHitsPer30s: 12, minSpacingSec: 0.8, perElementTicks: true, maxTicksPerGraphic: 5, hitDb: -12 },
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
/** Default intensity per content kind when brief/brand express audio intent but
|
|
28
|
-
* no explicit sfx intensity. */
|
|
29
|
-
export const DEFAULT_SFX_INTENSITY = {
|
|
30
|
-
"real-footage": "light",
|
|
31
|
-
generated: "standard",
|
|
32
|
-
};
|
|
33
|
-
/** Speech-collision policy (real footage only — generated content has no speech
|
|
34
|
-
* unless VO ships): a hit whose transient lands inside a speech word ±150ms is
|
|
35
|
-
* attenuated a further -6 dB; risers that would UNDERLAP speech are dropped. */
|
|
36
|
-
export const SPEECH_COLLISION = {
|
|
37
|
-
windowMs: 150,
|
|
38
|
-
attenuateDb: -6,
|
|
39
|
-
};
|
|
40
|
-
/** Music bed defaults (spec §6): base level, fades, duck. */
|
|
41
|
-
export const MUSIC_BED = {
|
|
42
|
-
volumeDb: -21,
|
|
43
|
-
fadeInMs: 500,
|
|
44
|
-
fadeOutMs: 1200,
|
|
45
|
-
duck: { duckDb: -12, attackMs: 150, releaseMs: 400 },
|
|
46
|
-
};
|
|
47
|
-
/** Ambience bed defaults (audio-substrate P0). Like a music bed — it LOOPS to
|
|
48
|
-
* fill the timeline — but the founder ruling is that ambience HOLDS under VO: it
|
|
49
|
-
* sits at the BOTTOM of the mix (a further −5 dB below the music bed) and is
|
|
50
|
-
* NEVER duck-stamped (no `duck` key — the absence IS the contract; the render's
|
|
51
|
-
* duck pass only ever acts on music/vo roles). No beat map, no anchor semantics. */
|
|
52
|
-
export const AMBIENCE_BED = {
|
|
53
|
-
volumeDb: -26,
|
|
54
|
-
fadeInMs: 500,
|
|
55
|
-
fadeOutMs: 1200,
|
|
56
|
-
};
|
|
57
|
-
/** Dedicated audio track ids — separate tracks so the no-overlap invariant never
|
|
58
|
-
* fights bed-vs-hit, and so eval can address each role's track. */
|
|
59
|
-
export const SFX_TRACK_ID = "track-audio-sfx";
|
|
60
|
-
export const MUSIC_TRACK_ID = "track-audio-music";
|
|
61
|
-
export const AMBIENCE_TRACK_ID = "track-audio-ambience";
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ROLE_DEFAULT_GAIN_DB — engine default level per role (dB relative to source),
|
|
3
|
-
* calibrated to the doctrine's ≥6 dB-VO-over-bed rule:
|
|
4
|
-
*
|
|
5
|
-
* vo 0 dB — the clarity reference; the mix anchors on speech.
|
|
6
|
-
* sfx −6 dB — punctuation: audible under VO, never masks it.
|
|
7
|
-
* music −16 dB WHEN VO is present anywhere in the composition — a ≥16 dB bed
|
|
8
|
-
* keeps speech intelligible with peak headroom (the 1.5 dB
|
|
9
|
-
* memoir mush becomes ≥16 dB of separation).
|
|
10
|
-
* −8 dB WHEN no VO clip exists — a music-driven montage must not bury
|
|
11
|
-
* its own bed, so it sits forward. (This conditional is the
|
|
12
|
-
* load-bearing one.)
|
|
13
|
-
* ambience −22 dB — bottom of the mix; HOLDS under VO (never ducks).
|
|
14
|
-
*/
|
|
15
|
-
export const ROLE_DEFAULT_GAIN_DB = {
|
|
16
|
-
vo: 0,
|
|
17
|
-
sfx: -6,
|
|
18
|
-
music: { withVo: -16, withoutVo: -8 },
|
|
19
|
-
ambience: -22,
|
|
20
|
-
};
|
|
21
|
-
/** The clarity hierarchy, loudest-first. Lower index = should sit higher in the
|
|
22
|
-
* mix. Used by the inversion advisory. */
|
|
23
|
-
export const ROLE_HIERARCHY = ["vo", "sfx", "music", "ambience"];
|
|
24
|
-
/** Resolve the engine default level (dB) for a role. `music` is conditional on
|
|
25
|
-
* whether the composition contains any VO. */
|
|
26
|
-
export function roleDefaultGainDb(role, voPresent) {
|
|
27
|
-
switch (role) {
|
|
28
|
-
case "vo":
|
|
29
|
-
return ROLE_DEFAULT_GAIN_DB.vo;
|
|
30
|
-
case "sfx":
|
|
31
|
-
return ROLE_DEFAULT_GAIN_DB.sfx;
|
|
32
|
-
case "music":
|
|
33
|
-
return voPresent ? ROLE_DEFAULT_GAIN_DB.music.withVo : ROLE_DEFAULT_GAIN_DB.music.withoutVo;
|
|
34
|
-
case "ambience":
|
|
35
|
-
return ROLE_DEFAULT_GAIN_DB.ambience;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* True when ANY clip in ANY enabled track declares `audioRole: 'vo'`. VO can be a
|
|
40
|
-
* dedicated audio clip OR a talking-head video clip's own audio, so this scans
|
|
41
|
-
* every track kind (not just audio) — the music-conditional default depends on it.
|
|
42
|
-
*/
|
|
43
|
-
export function compositionHasVo(composition) {
|
|
44
|
-
for (const track of composition.tracks) {
|
|
45
|
-
if (track.enabled === false)
|
|
46
|
-
continue;
|
|
47
|
-
for (const c of track.contents) {
|
|
48
|
-
if (!("source" in c))
|
|
49
|
-
continue;
|
|
50
|
-
const src = c.source;
|
|
51
|
-
if (src.kind === "media" && src.audioRole === "vo")
|
|
52
|
-
return true;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Effective level (dB relative to source) of a media clip source under the mix
|
|
59
|
-
* policy: authored `volumeDb` wins; else authored linear `volume` converted to
|
|
60
|
-
* dB (`20·log10`); else the role default. A role-less source has no policy level
|
|
61
|
-
* (returns undefined — it stays at unity, out of the hierarchy comparison).
|
|
62
|
-
*/
|
|
63
|
-
export function effectiveClipGainDb(source, voPresent) {
|
|
64
|
-
if (source.volumeDb !== undefined)
|
|
65
|
-
return source.volumeDb;
|
|
66
|
-
if (source.volume !== undefined) {
|
|
67
|
-
// volume 0 → −Infinity dB (silence); never a false "louder-than" in a compare.
|
|
68
|
-
return source.volume <= 0 ? -Infinity : 20 * Math.log10(source.volume);
|
|
69
|
-
}
|
|
70
|
-
if (source.audioRole !== undefined)
|
|
71
|
-
return roleDefaultGainDb(source.audioRole, voPresent);
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Authored sfx transients (audio-substrate P0, Phase 4 — the AV-sync floor): every
|
|
76
|
-
* clip whose source is a media clip tagged `audioRole: 'sfx'`, as {clipId, startMs}
|
|
77
|
-
* where startMs is the clip's authored timeline position (`startTime`, seconds → ms).
|
|
78
|
-
* Sorted earliest-first. These are the "expected transients" the delivered-mix onset
|
|
79
|
-
* analysis matches against — an sfx hit that lands nowhere near a detected onset has
|
|
80
|
-
* drifted. PURE (no I/O); the render policy (cap, fail/advisory) lives in the director.
|
|
81
|
-
*/
|
|
82
|
-
export function sfxTransients(composition) {
|
|
83
|
-
const out = [];
|
|
84
|
-
for (const track of composition.tracks) {
|
|
85
|
-
if (track.enabled === false)
|
|
86
|
-
continue;
|
|
87
|
-
for (const c of track.contents) {
|
|
88
|
-
if (!("source" in c))
|
|
89
|
-
continue;
|
|
90
|
-
const src = c.source;
|
|
91
|
-
if (src.kind === "media" && src.audioRole === "sfx") {
|
|
92
|
-
out.push({ clipId: c.id, startMs: Math.round(c.startTime * 1000) });
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return out.sort((a, b) => a.startMs - b.startMs);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Detect a composition with NO deliberate audio at all — no audio-family
|
|
100
|
-
* track content, no role-tagged media clip, and every video media clip muted
|
|
101
|
-
* (or all silent stills/cards). "Silence is a level" only when someone CHOSE
|
|
102
|
-
* it: a marker of kind "intentional-silence" suppresses the advisory.
|
|
103
|
-
*
|
|
104
|
-
* ADVISORY only — pushed onto the render `warnings[]` channel, never blocks.
|
|
105
|
-
* Craft basis: video-craft-standards cross-cutting rule "audio is decided,
|
|
106
|
-
* never defaulted" (three clean-agent trials shipped silent reels because
|
|
107
|
-
* nothing asked the question — 2026-07-30).
|
|
108
|
-
*/
|
|
109
|
-
export function detectNoAudioTrack(composition) {
|
|
110
|
-
if ((composition.markers ?? []).some((m) => m.kind === "intentional-silence"))
|
|
111
|
-
return [];
|
|
112
|
-
for (const track of composition.tracks) {
|
|
113
|
-
if (track.enabled === false)
|
|
114
|
-
continue;
|
|
115
|
-
for (const c of track.contents) {
|
|
116
|
-
if (!("source" in c))
|
|
117
|
-
continue;
|
|
118
|
-
const src = c.source;
|
|
119
|
-
if (src.kind !== "media")
|
|
120
|
-
continue;
|
|
121
|
-
// Any role-tagged clip (music/vo/sfx/ambience) counts as decided audio.
|
|
122
|
-
if (src.audioRole !== undefined)
|
|
123
|
-
return [];
|
|
124
|
-
// An unmuted media clip on an audio track, or an unmuted video clip,
|
|
125
|
-
// carries source audio into the mix.
|
|
126
|
-
if (track.kind === "audio" && src.muted !== true)
|
|
127
|
-
return [];
|
|
128
|
-
if (track.kind === "video" && src.muted !== true)
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return [
|
|
133
|
-
"no_audio_track — the composition has no audio: no music/vo/sfx/ambience clip and " +
|
|
134
|
-
"every media clip is muted. If silence is deliberate, add a marker " +
|
|
135
|
-
'{kind:"intentional-silence"} to suppress this; otherwise add a bed or ambience ' +
|
|
136
|
-
"(search_resources kind:sfx, audioRole:\"music\") before the final render.",
|
|
137
|
-
];
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Detect hierarchy inversions across the ROLES PRESENT in the composition and
|
|
141
|
-
* return one advisory string per offending (higher-role, lower-role) pair. An
|
|
142
|
-
* inversion is a lower-priority role's LOUDEST clip sitting above a
|
|
143
|
-
* higher-priority role's QUIETEST clip (e.g. any music clip above any vo clip).
|
|
144
|
-
*
|
|
145
|
-
* ADVISORY only — the caller pushes these onto the render `warnings[]` channel;
|
|
146
|
-
* they NEVER block a render. Because engine defaults are hierarchy-correct by
|
|
147
|
-
* construction, only AUTHORED levels can trip this.
|
|
148
|
-
*/
|
|
149
|
-
export function detectMixHierarchyInversion(composition) {
|
|
150
|
-
const voPresent = compositionHasVo(composition);
|
|
151
|
-
// Collect the effective level of every role-tagged media clip, grouped by role.
|
|
152
|
-
const byRole = new Map();
|
|
153
|
-
for (const track of composition.tracks) {
|
|
154
|
-
if (track.enabled === false)
|
|
155
|
-
continue;
|
|
156
|
-
for (const c of track.contents) {
|
|
157
|
-
if (!("source" in c))
|
|
158
|
-
continue;
|
|
159
|
-
const src = c.source;
|
|
160
|
-
if (src.kind !== "media" || src.audioRole === undefined)
|
|
161
|
-
continue;
|
|
162
|
-
const effectiveDb = effectiveClipGainDb(src, voPresent);
|
|
163
|
-
if (effectiveDb === undefined)
|
|
164
|
-
continue;
|
|
165
|
-
const list = byRole.get(src.audioRole) ?? [];
|
|
166
|
-
list.push({ clipId: c.id, role: src.audioRole, effectiveDb });
|
|
167
|
-
byRole.set(src.audioRole, list);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const advisories = [];
|
|
171
|
-
// Walk every ordered (higher, lower) role pair present. rank(higher) < rank(lower).
|
|
172
|
-
for (let i = 0; i < ROLE_HIERARCHY.length; i++) {
|
|
173
|
-
const higherRole = ROLE_HIERARCHY[i];
|
|
174
|
-
const higherClips = byRole.get(higherRole);
|
|
175
|
-
if (!higherClips || higherClips.length === 0)
|
|
176
|
-
continue;
|
|
177
|
-
// Quietest higher-role clip — the ceiling a lower role must stay below.
|
|
178
|
-
const quietestHigher = higherClips.reduce((a, b) => (b.effectiveDb < a.effectiveDb ? b : a));
|
|
179
|
-
for (let j = i + 1; j < ROLE_HIERARCHY.length; j++) {
|
|
180
|
-
const lowerRole = ROLE_HIERARCHY[j];
|
|
181
|
-
const lowerClips = byRole.get(lowerRole);
|
|
182
|
-
if (!lowerClips || lowerClips.length === 0)
|
|
183
|
-
continue;
|
|
184
|
-
const loudestLower = lowerClips.reduce((a, b) => (b.effectiveDb > a.effectiveDb ? b : a));
|
|
185
|
-
if (loudestLower.effectiveDb > quietestHigher.effectiveDb) {
|
|
186
|
-
advisories.push(`mix_hierarchy_inverted: ${lowerRole} clip "${loudestLower.clipId}" ` +
|
|
187
|
-
`(${loudestLower.effectiveDb.toFixed(1)} dB) sits above ${higherRole} clip ` +
|
|
188
|
-
`"${quietestHigher.clipId}" (${quietestHigher.effectiveDb.toFixed(1)} dB) — ` +
|
|
189
|
-
`${higherRole} should lead ${lowerRole} in the mix. Levels are advisory; ` +
|
|
190
|
-
`set volumeDb on the clips to override.`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return advisories;
|
|
195
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
export const MUSIC_PACK_VERSION = "v1";
|
|
2
|
-
export const MUSIC_PACK_ENTRIES = [
|
|
3
|
-
{
|
|
4
|
-
"bedId": "awake-electronic",
|
|
5
|
-
"genre": "electronic",
|
|
6
|
-
"mood": [
|
|
7
|
-
"energetic",
|
|
8
|
-
"driving"
|
|
9
|
-
],
|
|
10
|
-
"bpm": 89.1,
|
|
11
|
-
"bpmMethod": "detected",
|
|
12
|
-
"durationSec": 57.314,
|
|
13
|
-
"description": "driving electronic bed, steady pulse — energetic underscore",
|
|
14
|
-
"attribution": "driving electronic bed, steady pulse — energetic underscore — by cynicmusic (https://opengameart.org/content/awake-megawall-10) — License: Creative Commons 0",
|
|
15
|
-
"sha256": "85d44a98775e51ed321c968116ddfb044dd6dd18cf13f971a34b1d541258b7de",
|
|
16
|
-
"source": {
|
|
17
|
-
"url": "https://opengameart.org/content/awake-megawall-10",
|
|
18
|
-
"author": "cynicmusic",
|
|
19
|
-
"license": "CC0"
|
|
20
|
-
}
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"bedId": "bossa-nova",
|
|
24
|
-
"genre": "jazz",
|
|
25
|
-
"mood": [
|
|
26
|
-
"playful",
|
|
27
|
-
"jazzy"
|
|
28
|
-
],
|
|
29
|
-
"bpm": 129.2,
|
|
30
|
-
"bpmMethod": "detected",
|
|
31
|
-
"durationSec": 59.611,
|
|
32
|
-
"description": "jazzy bossa-nova bed, syncopated groove — light and cheerful",
|
|
33
|
-
"attribution": "jazzy bossa-nova bed, syncopated groove — light and cheerful — by Joth (https://opengameart.org/content/bossa-nova) — License: Creative Commons 0",
|
|
34
|
-
"sha256": "ca311e561e7bb4671579e8f6a765ab823dc7ad00b9c3c458812a879945bd1067",
|
|
35
|
-
"source": {
|
|
36
|
-
"url": "https://opengameart.org/content/bossa-nova",
|
|
37
|
-
"author": "Joth",
|
|
38
|
-
"license": "CC0"
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"bedId": "cave-dark",
|
|
43
|
-
"genre": "ambient",
|
|
44
|
-
"mood": [
|
|
45
|
-
"dark",
|
|
46
|
-
"brooding"
|
|
47
|
-
],
|
|
48
|
-
"bpm": 136,
|
|
49
|
-
"bpmMethod": "detected",
|
|
50
|
-
"durationSec": 280,
|
|
51
|
-
"description": "dark brooding cave ambience — long, atmospheric bed",
|
|
52
|
-
"attribution": "dark brooding cave ambience — long, atmospheric bed — by Brandon75689 (https://opengameart.org/content/cave-theme) — License: Creative Commons 0",
|
|
53
|
-
"sha256": "90c9753d8765603ca00e4ed55a52ea5a3648ed03cd334006a5fa4d1e71adec79",
|
|
54
|
-
"source": {
|
|
55
|
-
"url": "https://opengameart.org/content/cave-theme",
|
|
56
|
-
"author": "Brandon75689",
|
|
57
|
-
"license": "CC0"
|
|
58
|
-
}
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"bedId": "creepy-forest",
|
|
62
|
-
"genre": "ambient",
|
|
63
|
-
"mood": [
|
|
64
|
-
"eerie",
|
|
65
|
-
"tense"
|
|
66
|
-
],
|
|
67
|
-
"bpm": 136,
|
|
68
|
-
"bpmMethod": "detected",
|
|
69
|
-
"durationSec": 216,
|
|
70
|
-
"description": "eerie tense forest ambience — unsettling atmospheric bed",
|
|
71
|
-
"attribution": "eerie tense forest ambience — unsettling atmospheric bed — by Augmentality (Brandon Morris) (https://opengameart.org/content/creepy-forest-f) — License: Creative Commons 0",
|
|
72
|
-
"sha256": "15f970c6f659dbe2f4c0345e30211e13712ae0c90a6de81ea993c9a4f83dfb35",
|
|
73
|
-
"source": {
|
|
74
|
-
"url": "https://opengameart.org/content/creepy-forest-f",
|
|
75
|
-
"author": "Augmentality (Brandon Morris)",
|
|
76
|
-
"license": "CC0"
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"bedId": "crystal-cave-calm",
|
|
81
|
-
"genre": "ambient",
|
|
82
|
-
"mood": [
|
|
83
|
-
"calm",
|
|
84
|
-
"mysterious"
|
|
85
|
-
],
|
|
86
|
-
"bpm": 99.4,
|
|
87
|
-
"bpmMethod": "detected",
|
|
88
|
-
"durationSec": 49.563,
|
|
89
|
-
"description": "calm crystalline ambient bed, gentle motion",
|
|
90
|
-
"attribution": "calm crystalline ambient bed, gentle motion — by cynicmusic (https://opengameart.org/content/crystal-cave-song18) — License: Creative Commons 0",
|
|
91
|
-
"sha256": "927a0a0c3e312ea079e13eb3d7e73889ef0174dc72399413e60f7967386659d4",
|
|
92
|
-
"source": {
|
|
93
|
-
"url": "https://opengameart.org/content/crystal-cave-song18",
|
|
94
|
-
"author": "cynicmusic",
|
|
95
|
-
"license": "CC0"
|
|
96
|
-
}
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
"bedId": "enchanted-tiki",
|
|
100
|
-
"genre": "world",
|
|
101
|
-
"mood": [
|
|
102
|
-
"playful",
|
|
103
|
-
"tropical"
|
|
104
|
-
],
|
|
105
|
-
"bpm": 103.4,
|
|
106
|
-
"bpmMethod": "detected",
|
|
107
|
-
"durationSec": 117.398,
|
|
108
|
-
"description": "playful tropical bed, marimba-led — light and warm",
|
|
109
|
-
"attribution": "playful tropical bed, marimba-led — light and warm — by cynicmusic (https://opengameart.org/content/enchanted-tiki-86) — License: Creative Commons 0",
|
|
110
|
-
"sha256": "df3da48e199494b83df63bbec6eea4b3e57131c1ab0183bd70fbc13539447c93",
|
|
111
|
-
"source": {
|
|
112
|
-
"url": "https://opengameart.org/content/enchanted-tiki-86",
|
|
113
|
-
"author": "cynicmusic",
|
|
114
|
-
"license": "CC0"
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"bedId": "menu-bright",
|
|
119
|
-
"genre": "electronic",
|
|
120
|
-
"mood": [
|
|
121
|
-
"bright",
|
|
122
|
-
"upbeat"
|
|
123
|
-
],
|
|
124
|
-
"bpm": 117.5,
|
|
125
|
-
"bpmMethod": "detected",
|
|
126
|
-
"durationSec": 47.722,
|
|
127
|
-
"description": "bright upbeat electronic bed — clean, forward energy",
|
|
128
|
-
"attribution": "bright upbeat electronic bed — clean, forward energy — by mrpoly (https://opengameart.org/content/menu-music) — License: Creative Commons 0",
|
|
129
|
-
"sha256": "cb7cf40ea0c8a83e280adef0301843e3960427744306737f9a6ebe1760b2302a",
|
|
130
|
-
"source": {
|
|
131
|
-
"url": "https://opengameart.org/content/menu-music",
|
|
132
|
-
"author": "mrpoly",
|
|
133
|
-
"license": "CC0"
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
];
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The CueFrame MUSIC-BED pack — a CLOSED, versioned catalog of CC0 music beds
|
|
3
|
-
* (audio-substrate Phase 2). The music-tier twin of the SFX pack (pack.ts): a
|
|
4
|
-
* Map built once from the generated entries; unknown ids fail loud; no runtime
|
|
5
|
-
* search, no network.
|
|
6
|
-
*
|
|
7
|
-
* Bytes live at content-addressed shared R2 keys `packs/music/v1/{bedId}.mp3`
|
|
8
|
-
* (cross-org shared-bytes model, one copy ever); each entry records sha256 +
|
|
9
|
-
* full provenance (source URL, author, license). Entries are written by the
|
|
10
|
-
* curation script (services/scripts/curate-music-pack.mjs), which normalizes
|
|
11
|
-
* every bed to −16 LUFS integrated (ffmpeg loudnorm — the music loudness anchor,
|
|
12
|
-
* NOT the sfx −6 dBFS peak rule) — hand-editing musicPack.generated.ts is a bug.
|
|
13
|
-
*
|
|
14
|
-
* LICENSE: CC0 ONLY — a hard constraint, not a preference (same as the SFX
|
|
15
|
-
* pack). Beds embed into customers' videos that they redistribute and monetize
|
|
16
|
-
* at scale through the API (multi-tenant sublicensing by machine); only CC0
|
|
17
|
-
* survives that. The curation script audits each source's license PAGE and fails
|
|
18
|
-
* loud on anything it cannot verify as CC0.
|
|
19
|
-
*/
|
|
20
|
-
import { MUSIC_PACK_ENTRIES, MUSIC_PACK_VERSION } from "./musicPack.generated";
|
|
21
|
-
const registry = new Map(MUSIC_PACK_ENTRIES.map((e) => [e.bedId, e]));
|
|
22
|
-
export { MUSIC_PACK_VERSION, MUSIC_PACK_ENTRIES };
|
|
23
|
-
/** R2 key for a music bed's shared bytes. */
|
|
24
|
-
export function musicPackR2Key(bedId) {
|
|
25
|
-
return `packs/music/${MUSIC_PACK_VERSION}/${bedId}.mp3`;
|
|
26
|
-
}
|
|
27
|
-
/** Look up a bed — FAIL LOUD on an unknown id (closed registry; a typo'd bedId
|
|
28
|
-
* must never silently place silence). */
|
|
29
|
-
export function getMusicPackEntry(bedId) {
|
|
30
|
-
const e = registry.get(bedId);
|
|
31
|
-
if (!e) {
|
|
32
|
-
throw new Error(`music-pack: unknown bedId '${bedId}' (pack ${MUSIC_PACK_VERSION}, ${registry.size} beds). ` +
|
|
33
|
-
`The catalog is closed — beds enter only via the curation script.`);
|
|
34
|
-
}
|
|
35
|
-
return e;
|
|
36
|
-
}
|