@adatechnology/game-audio 0.5.0 → 0.6.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/assets/sfx/CREDITOS.md +11 -0
- package/assets/sfx/explosoes-fogo/fire_loop_gas_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_gas_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_gas_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_gas_04.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_liquid_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_liquid_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_liquid_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_plastic_01.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_plastic_02.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_plastic_03.ogg +0 -0
- package/assets/sfx/explosoes-fogo/fire_loop_plastic_04.ogg +0 -0
- package/assets/sfx/manifest.json +134 -0
- package/dist/{chunk-7TLFY7VO.js → chunk-KBTUANNG.js} +267 -8
- package/dist/chunk-KBTUANNG.js.map +1 -0
- package/dist/index.d.ts +10 -80
- package/dist/index.global.js +167 -4
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +104 -138
- package/dist/index.js.map +1 -1
- package/dist/{locale-BugSe8dA.d.ts → locale-CJfDpWnI.d.ts} +180 -1
- package/dist/testing.d.ts +7 -5
- package/dist/testing.js +1 -1
- package/package.json +4 -3
- package/dist/chunk-7TLFY7VO.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/manifest.ts","../src/kit-samples.ts","../src/recipes/scene.ts","../src/recipes/foley.ts","../src/recipes/body-foley.ts","../src/webaudio/sink.ts"],"sourcesContent":["/**\n * The manifest the converter (`scripts/sfx-convert.mjs`) writes next to the converted files: every sound id with its takes per layer, the file\n * facts the criteria check (rate, channels, peak, length) and where each file came from. `sampleBankFromManifest` turns it into a `SoundBank`\n * of `SampleSound`s, with the bus and the numbers of each sound given by the caller.\n */\nimport type { BusId, Falloff, SoundBank } from './recipe'\nimport type { SampleCrossover, SampleRef, SampleSound } from './sample'\n\n/** Licences the SDK accepts (the files are redistributed on npm): public domain or attribution only. */\nexport const SDK_LICENSES = ['CC0', 'CC-BY'] as const\nexport type SdkLicense = (typeof SDK_LICENSES)[number]\n\nexport type SfxFileEntry = {\n /** Path from the manifest's folder: `armas/pistol_9mm_close_01.ogg`. */\n readonly file: string\n readonly sampleRate: number\n readonly channels: number\n /** dBFS. */\n readonly peak: number\n readonly seconds: number\n readonly source: string\n readonly author: string\n readonly license: SdkLicense\n}\n\n/** The layers a file name can end in: `<id>_<layer>_<nn>` (`pistol_9mm_close_01`); a name without one is a `close` take. */\nexport const SFX_LAYERS = ['close', 'far', 'tail_in', 'tail_out'] as const\nexport type SfxLayer = (typeof SFX_LAYERS)[number]\n\nexport type SfxManifestSound = {\n readonly id: string\n readonly category: string\n readonly layers: Partial<Readonly<Record<SfxLayer, readonly SfxFileEntry[]>>>\n}\n\nexport type SfxManifest = {\n readonly version: 1\n readonly format: { readonly codec: 'vorbis'; readonly sampleRate: number; readonly channels: number; readonly peakDb: number }\n readonly sounds: readonly SfxManifestSound[]\n}\n\n/** The numbers of one sound that the files do not say (bus, curve, pitch...). */\nexport type SampleDefaults = {\n readonly bus: BusId\n readonly gain?: number\n readonly pitch?: number\n readonly crossover?: SampleCrossover\n readonly tailGain?: number\n readonly falloff?: Falloff\n readonly cutoffK?: number\n readonly group?: string\n readonly priority?: number\n readonly fallback?: string\n}\n\nexport type SampleBankOptions = {\n readonly id: string\n /** Prefix of every url (where the manifest's folder is served: `/sfx/`). Default ''. */\n readonly baseUrl?: string\n /** Numbers per sound id, or one function; a sound with neither is left out (it has no bus). */\n readonly sounds?: Readonly<Record<string, SampleDefaults>>\n readonly defaults?: (sound: SfxManifestSound) => SampleDefaults | undefined\n}\n\n/** The strength suffixes of a sound id (`kick_hit_heavy`): takes of the tiers of `kick_hit`, from these intensities. */\nexport const SFX_TIERS: Readonly<Record<string, number>> = { light: 0, medium: 0.34, heavy: 0.67 }\n\n/** Splits a file name (no extension) into its sound id, layer and take number. */\nexport function parseSfxName(name: string): { readonly id: string; readonly layer: SfxLayer; readonly take: number } {\n const match = /^(.*?)(?:_(close|far|tail_in|tail_out))?(?:_(\\d+))?$/.exec(name)\n const id = match?.[1] || name\n const layer = (match?.[2] as SfxLayer | undefined) ?? 'close'\n const take = match?.[3] ? Number(match[3]) : 1\n return { id, layer, take }\n}\n\n/** The base id and tier of a sound id: `kick_hit_heavy` → `kick_hit`, `heavy`. */\nexport function splitTier(id: string): { readonly base: string; readonly tier?: string } {\n const match = /^(.*)_(light|medium|heavy)$/.exec(id)\n return match ? { base: match[1] as string, tier: match[2] as string } : { base: id }\n}\n\nconst refsOf = (entries: readonly SfxFileEntry[] | undefined, baseUrl: string): SampleRef[] => (entries ?? []).map((entry) => ({ url: `${baseUrl}${entry.file}` }))\n\n/** A bank of sample sounds from a manifest. */\nexport function sampleBankFromManifest(manifest: SfxManifest, options: SampleBankOptions): SoundBank {\n const baseUrl = options.baseUrl ?? ''\n const samples: SampleSound[] = []\n // `<id>_light`, `_medium`, `_heavy` are the tiers of `<id>`, gathered under it\n const tiersOf = new Map<string, SfxManifestSound[]>()\n for (const sound of manifest.sounds) {\n const { base, tier } = splitTier(sound.id)\n if (tier) tiersOf.set(base, [...(tiersOf.get(base) ?? []), sound])\n }\n const bases = new Map<string, SfxManifestSound>()\n for (const sound of manifest.sounds) {\n if (!splitTier(sound.id).tier) bases.set(sound.id, sound)\n }\n for (const [base, tiers] of tiersOf) {\n if (!bases.has(base)) bases.set(base, { id: base, category: tiers[0]?.category ?? '', layers: { close: tiers[0]?.layers.close ?? [] } })\n }\n for (const sound of bases.values()) {\n const numbers = options.sounds?.[sound.id] ?? options.defaults?.(sound)\n const close = refsOf(sound.layers.close, baseUrl)\n if (!numbers || close.length === 0) continue\n const tiers = (tiersOf.get(sound.id) ?? [])\n .map((tier) => {\n const name = splitTier(tier.id).tier as string\n const tierFar = refsOf(tier.layers.far, baseUrl)\n return { name, from: SFX_TIERS[name] ?? 0, close: refsOf(tier.layers.close, baseUrl), ...(tierFar.length > 0 ? { far: tierFar } : {}) }\n })\n .sort((a, b) => a.from - b.from)\n const far = refsOf(sound.layers.far, baseUrl)\n const indoor = refsOf(sound.layers.tail_in, baseUrl)\n const outdoor = refsOf(sound.layers.tail_out, baseUrl)\n const files = [sound, ...(tiersOf.get(sound.id) ?? [])].flatMap((entry) => Object.values(entry.layers).flatMap((entries) => entries ?? []))\n samples.push({\n id: sound.id,\n bus: numbers.bus,\n close,\n ...(far.length > 0 ? { far } : {}),\n ...(tiers.length > 0 ? { tiers } : {}),\n ...(numbers.crossover ? { crossover: numbers.crossover } : {}),\n ...(indoor.length > 0 || outdoor.length > 0\n ? { tail: { ...(indoor.length > 0 ? { indoor } : {}), ...(outdoor.length > 0 ? { outdoor } : {}), ...(numbers.tailGain === undefined ? {} : { gain: numbers.tailGain }) } }\n : {}),\n ...(numbers.pitch === undefined ? {} : { pitch: numbers.pitch }),\n ...(numbers.gain === undefined ? {} : { gain: numbers.gain }),\n ...(numbers.falloff ? { falloff: numbers.falloff } : {}),\n ...(numbers.cutoffK === undefined ? {} : { cutoffK: numbers.cutoffK }),\n ...(numbers.group ? { group: numbers.group } : {}),\n ...(numbers.priority === undefined ? {} : { priority: numbers.priority }),\n ...(numbers.fallback ? { fallback: numbers.fallback } : {}),\n sources: files.map((file) => `${file.file}: ${file.source} ${file.author} ${file.license}`),\n })\n }\n return { id: options.id, samples }\n}\n","/**\n * The kit's own recorded sounds: the files in `assets/sfx/` (CC0 / CC-BY, credited in `assets/sfx/CREDITOS.md`) and the numbers each one plays\n * with. `kitSampleBank` turns the converter's manifest into a bank; `KIT_SAMPLE_ALIASES` lets a recipe id the kit already plays (`shut_wood`,\n * `rattle`...) be answered by the takes of a file id (`door_wood_shut`), so a sound that was synthesized becomes the recording with no change where\n * it is played: the recipe of the same id plays while the files load, and wherever they cannot be fetched (`file://`). `loadKitSamples` fetches the\n * manifest from where the folder is served and registers the bank on an engine.\n */\nimport { sampleBankFromManifest } from './manifest'\nimport type { SampleDefaults, SfxManifest, SfxManifestSound } from './manifest'\nimport type { BusId, SoundBank } from './recipe'\n\n/** The bus of a manifest category (the folder the file sits in). */\nexport const KIT_CATEGORY_BUS: Readonly<Record<string, BusId>> = {\n armas: 'weapons',\n impactos: 'world',\n 'explosoes-fogo': 'world',\n personagem: 'world',\n veiculos: 'world',\n 'itens-portas': 'world',\n ambiente: 'ambience',\n}\n\n/** Voice sounds go on the voices bus whatever folder they are in. */\nconst VOICE_IDS = /^(player_(hurt|death|effort|breath)|scream|zombie_)/\n\n/**\n * Recipe id → file id. The recipe keeps playing until the takes of the file id load. Hand-worked leaves (doors, drawers) of `game-destruction-three`\n * and the hand sounds of items.\n */\nexport const KIT_SAMPLE_ALIASES: Readonly<Record<string, string>> = {\n // a house door: the latch giving, the hinge, the leaf meeting the frame, a locked one shaken; a drawer on its runners\n latch: 'metal_latch',\n creak_wood: 'door_creak',\n shut_wood: 'door_wood_shut',\n rattle: 'door_locked_rattle',\n // a drawer stays on its recipe: the recorded runs (1 to 1.9 s) outlast a drawer's pull\n // an item taken in the hand (game-destruction-three grab_* keys)\n grab_hard: 'item_pickup_generic',\n grab_soft: 'item_pickup_leather',\n}\n\n/** The numbers of a sound the files do not say: the bus of its folder, a little pitch spread. */\nexport function kitSampleDefaults(sound: SfxManifestSound): SampleDefaults | undefined {\n const bus = VOICE_IDS.test(sound.id) ? 'voices' : KIT_CATEGORY_BUS[sound.category]\n if (!bus) return undefined\n return { bus, pitch: sound.category === 'ambiente' || /_loop/.test(sound.id) ? 0 : 0.04 }\n}\n\nexport type KitSampleBankOptions = {\n /** Where the `assets/sfx/` folder is served (`./sfx/`). */\n readonly baseUrl?: string\n /** Recipe id → file id (default `KIT_SAMPLE_ALIASES`); `{}` adds none. */\n readonly aliases?: Readonly<Record<string, string>>\n readonly id?: string\n}\n\n/** The manifest with each alias as one more sound, holding the takes of its file id. */\nexport function withAliases(manifest: SfxManifest, aliases: Readonly<Record<string, string>>): SfxManifest {\n const byId = new Map(manifest.sounds.map((sound) => [sound.id, sound]))\n const extra: SfxManifestSound[] = []\n for (const [alias, target] of Object.entries(aliases)) {\n const sound = byId.get(target)\n if (sound && !byId.has(alias)) extra.push({ ...sound, id: alias })\n }\n return { ...manifest, sounds: [...manifest.sounds, ...extra] }\n}\n\n/** The bank of the kit's files. */\nexport function kitSampleBank(manifest: SfxManifest, options: KitSampleBankOptions = {}): SoundBank {\n return sampleBankFromManifest(withAliases(manifest, options.aliases ?? KIT_SAMPLE_ALIASES), {\n id: options.id ?? 'kit_samples',\n baseUrl: options.baseUrl ?? '',\n defaults: kitSampleDefaults,\n })\n}\n\nexport type LoadKitSamplesOptions = KitSampleBankOptions & {\n /** Gets the manifest (default `fetch` of `<baseUrl>manifest.json`). */\n readonly fetchManifest?: (url: string) => Promise<SfxManifest>\n /** Ids to load right away instead of on their first play (the sounds of the first seconds, so they are not the recipe). */\n readonly preload?: readonly string[]\n}\n\ntype Registers = { register(bank: SoundBank): void; loadSamples?(ids?: readonly string[]): Promise<unknown> }\n\n/** True when `url`, read against the page, is a `file://` one: `fetch` refuses that scheme and the browser logs an error for each try. */\nconst isFileUrl = (url: string): boolean => {\n const page = (globalThis as { location?: { href?: string } }).location?.href\n try {\n return new URL(url, page).protocol === 'file:'\n } catch {\n return false\n }\n}\n\nconst fetchJson = async (url: string): Promise<SfxManifest> => {\n // a page opened from disk keeps the recipes without asking: the refused fetch would only put an error in the console\n if (isFileUrl(url)) throw new Error(`${url}: file:// is not fetched`)\n const response = await fetch(url)\n if (!response.ok) throw new Error(`${url}: ${response.status}`)\n return (await response.json()) as SfxManifest\n}\n\n/**\n * Fetches the manifest and registers the bank on the engine. Resolves to the bank, or `null` when the manifest cannot be had (a page opened from\n * `file://`, the folder not served): the recipes keep playing, so that is not an error.\n */\nexport async function loadKitSamples(engine: Registers, options: LoadKitSamplesOptions = {}): Promise<SoundBank | null> {\n const baseUrl = options.baseUrl ?? ''\n let manifest: SfxManifest\n try {\n manifest = await (options.fetchManifest ?? fetchJson)(`${baseUrl}manifest.json`)\n } catch {\n return null\n }\n const bank = kitSampleBank(manifest, options)\n engine.register(bank)\n if (options.preload && engine.loadSamples) void engine.loadSamples(options.preload).catch(() => undefined)\n return bank\n}\n","// The art scene's synthesis primitives (cena L1322-L1328) as recipe layers, shared by every subject bank that ports a `sfx.*` of the page: the\n// materials in `destruction-three`, the voices and wounds in `characters-three`. Each helper writes the layer the team routine builds, with its\n// fields in the order the routine draws its random numbers, so a recipe built from them leaves the trace of the team code.\nimport { DISTANCE_CURVES } from '../falloff'\nimport type { BusId, Envelope, Layer, ParamRef, Range, SoundRecipe } from '../recipe'\n\nconst ATTACK = 0.002\n\n/** A length in seconds: a number, a `[min, max]` range or a named number. */\nexport type SceneLength = number | readonly [number, number] | ParamRef\n\n// the layer is `attack + d` long (the art scene's gain rises over `a` and falls over `d`)\nfunction lengthOf(d: SceneLength, attack: number): Range {\n if (typeof d === 'number') return attack + d\n if (Array.isArray(d)) return [attack + d[0], attack + d[1]] as const\n return { ...(d as ParamRef), add: ((d as ParamRef).add ?? 0) + attack }\n}\n\nconst envelope = (attack: number): Envelope => [\n [0, 0.0001, 'set', 'fixed'],\n [attack, 1, 'exp'],\n ['1d', 0.0001, 'exp', 'fixed'],\n]\n\nexport type SceneNoise = {\n readonly type?: BiquadFilterType\n readonly f: Range\n /** The filter slides here over `d` (needs a fixed `d`). */\n readonly f2?: number\n readonly q?: number\n readonly a?: number\n readonly d: SceneLength\n readonly vol: Range\n readonly wet?: number\n readonly delay?: Range\n}\n\n/** `sNoise` (cena L1323): noise from a random point, a filter (default lowpass, Q 0.7), the gain rising over `a` and falling over `d`. */\nexport function sceneNoise(o: SceneNoise): Layer {\n const a = o.a ?? ATTACK\n const over = typeof o.d === 'number' ? o.d : 0\n return {\n filters: {\n mode: 'serial',\n bank: [{ type: o.type ?? 'lowpass', frequency: o.f2 === undefined ? { set: o.f } : { set: o.f, to: o.f2, curve: 'exp', over }, q: o.q ?? 0.7 }],\n },\n duration: lengthOf(o.d, a),\n gain: o.vol,\n ...(o.delay === undefined ? {} : { at: o.delay }),\n ...(o.wet === undefined ? {} : { wet: o.wet }),\n source: { kind: 'noise', offset: 'random', offsetScale: 1.5, loop: true },\n envelope: envelope(a),\n }\n}\n\nexport type SceneTone = { readonly wave?: OscillatorType; readonly f: Range; readonly f2?: number; readonly d: SceneLength; readonly vol: Range; readonly wet?: number; readonly delay?: Range }\n\n/** `sTone` (cena L1324): an oscillator sliding from `f` to `f2` (back to `f` when none), the gain rising over 0.002 s and falling over `d`. */\nexport function sceneTone(o: SceneTone): Layer {\n return {\n source: { kind: 'osc', wave: o.wave ?? 'sine', frequency: { from: o.f, to: o.f2 ?? 'from', curve: 'exp', over: 'duration' } },\n duration: lengthOf(o.d, ATTACK),\n gain: o.vol,\n ...(o.delay === undefined ? {} : { at: o.delay }),\n ...(o.wet === undefined ? {} : { wet: o.wet }),\n envelope: envelope(ATTACK),\n }\n}\n\nexport type SceneVoice = {\n /** Start and end frequency of the sweep (the page ramps linearly from `f0` to `f1` over the length). */\n readonly f0: Range\n readonly f1: Range\n /** Length in seconds. */\n readonly d: SceneLength\n /** Centre of the first and second formant (Q 4 and 6) and of the breath band (Q 1.1). */\n readonly fA: Range\n readonly fB: Range\n /** Level of the breath noise. */\n readonly noise: Range\n readonly vol: Range\n readonly wave?: OscillatorType\n}\n\n/**\n * `voice` (cena L1325): an oscillator swept from `f0` to `f1` with a vibrato of 4 to 10 Hz (depth 0.08 of `f0`) through two formant bands plus a band of\n * breath noise, summed and boosted 3.2 times, the gain rising over 0.1 s, held to 0.6 of the length and falling; reverb send 0.45. It is the one\n * layer the page builds with `voice(...)`, so a scream is two of them.\n */\nexport function sceneVoice(o: SceneVoice): Layer {\n return {\n duration: lengthOf(o.d, 0),\n gain: o.vol,\n wet: 0.45,\n source: {\n kind: 'formant_voice',\n wave: o.wave ?? 'sawtooth',\n frequency: { from: o.f0, to: o.f1, curve: 'linear', over: 'duration' },\n vibrato: { rate: [4, 10], depth: 0.08 },\n formants: [\n { frequency: o.fA, q: 4 },\n { frequency: o.fB, q: 6 },\n ],\n breath: { frequency: o.fB, q: 1.1, gain: o.noise },\n mix: 3.2,\n },\n envelope: [\n [0, 0.0001, 'set', 'fixed'],\n [0.1, 1, 'exp'],\n ['0.6d', 1, 'set'],\n ['1d', 0.0001, 'exp', 'fixed'],\n ],\n }\n}\n\n/** The layer played `count` times (a team `for` loop whose body draws numbers): each pass is its own layer, so the draws stay in the loop's order. */\nexport const sceneMany = (count: number, make: () => Layer): Layer[] => Array.from({ length: count }, make)\n\nexport type SceneRecipeOptions = {\n /** Named numbers drawn first (`PlayOptions.params` can override them). */\n readonly vars?: SoundRecipe['vars']\n readonly bus?: BusId\n readonly group?: string\n}\n\n/** A recipe in the art scene's mix: positional with the art scene's curve (`vol / (1 + d² × 0.008)`) and pan; `line` is the team code it comes from (`cena:<line>`). */\nexport function sceneRecipe(id: string, layers: readonly Layer[], line: string, options: SceneRecipeOptions = {}): SoundRecipe {\n return {\n id,\n bus: options.bus ?? 'world',\n pan: true,\n layers,\n falloff: DISTANCE_CURVES.art_scene,\n ...(options.vars ? { vars: options.vars } : {}),\n ...(options.group ? { group: options.group } : {}),\n sources: [`cena:${line}`],\n }\n}\n","// Foley of the hand: items picked up, opened, drunk and eaten, and the doors, lids and drawers of furniture and vehicles. Synthesised stand-ins under the\n// ids of the sound list (`sons/checklist-sons.md` 5.7 and the car doors of 5.6), so a recorded take filed under the same id replaces the recipe without\n// touching the code that plays it. Every recipe draws its numbers from ranges (pitch about ±4 %, timing and level), so no two plays are the same, and\n// falls off faster than a gunshot and loses its highs with distance: a latch is a near sound.\nimport type { Falloff, Layer, SoundBank, SoundRecipe } from '../recipe'\nimport { sceneMany as many, sceneNoise as noise, sceneTone as tone } from './scene'\n\n/** Small sounds of the hand: `vol / (1 + d² × 0.02)`, lowpass cutoffs `/ (1 + d × 0.04)`, silent below 0.004 (a latch at 10 m is a third, at 50 m gone). */\nexport const FOLEY_FALLOFF: Falloff = {\n model: 'inverse_square',\n k: 0.02,\n cutoffK: 0.04,\n minGain: 0.004,\n}\n\n/** ±`pct` around `f`: the range a recipe draws a frequency from. */\nconst vary = (f: number, pct = 0.04): readonly [number, number] => [Math.round(f * (1 - pct)), Math.round(f * (1 + pct))]\n\nconst foley = (id: string, layers: readonly Layer[], note: string): SoundRecipe => ({\n id,\n bus: 'world',\n pan: true,\n layers,\n falloff: FOLEY_FALLOFF,\n sources: [`sdk: ${note}`],\n})\n\n/** The click of a latch or a catch: a short band of noise and a tick of metal. */\nconst click = (f: number, vol: number, delay: readonly [number, number] | number = 0): Layer[] => [\n noise({\n type: 'bandpass',\n f: vary(f, 0.08),\n q: 4,\n d: [0.018, 0.03],\n vol: [vol * 0.85, vol * 1.1],\n delay,\n }),\n tone({\n f: vary(f * 0.8, 0.06),\n f2: Math.round(f * 0.62),\n d: [0.015, 0.025],\n vol: vol * 0.18,\n delay,\n }),\n]\n\n/** A leaf meeting its frame: the body (a falling tone), the board or panel (a band of noise) and the latch catching right after. */\nconst meet = (body: number, panel: number, vol: number, latch: number): Layer[] => [\n tone({\n f: vary(body),\n f2: Math.round(body * 0.5),\n d: [0.12, 0.16],\n vol: [vol * 0.9, vol * 1.1],\n }),\n noise({\n type: 'bandpass',\n f: vary(panel, 0.06),\n q: 1.2,\n d: [0.08, 0.12],\n vol: [vol * 0.9, vol * 1.1],\n wet: 0.25,\n }),\n ...click(latch, vol * 0.45, [0.012, 0.028]),\n]\n\n/** The doors and lids of furniture and vehicles, by what the leaf is (the room picks one from the item, else from the leaf's material). */\nexport const LEAF_FOLEY: readonly SoundRecipe[] = [\n // a wooden house door or wardrobe door: latch, a short creak, the leaf on the frame (the hard slam adds the frame rattling)\n foley('door_wood_open', click(2400, 0.4), 'the latch of a wooden door giving'),\n foley(\n 'door_creak',\n [\n tone({ f: [190, 240], f2: 310, d: [0.4, 0.55], vol: [0.04, 0.06] }),\n noise({\n type: 'bandpass',\n f: [480, 560],\n q: 6,\n a: 0.05,\n d: [0.35, 0.5],\n vol: [0.1, 0.14],\n }),\n ],\n 'a wooden hinge turning',\n ),\n foley('door_wood_close', meet(120, 600, 0.55, 2400), 'a wooden leaf meeting its frame'),\n foley(\n 'door_wood_slam',\n [\n ...meet(110, 560, 0.85, 2300),\n ...many(3, () =>\n noise({\n type: 'bandpass',\n f: [900, 1500],\n q: 3,\n d: 0.03,\n vol: [0.08, 0.14],\n delay: [0.05, 0.18],\n }),\n ),\n ],\n 'a wooden door slammed: the frame and the hinges rattle after the hit',\n ),\n // a metal door or gate: a hollow panel that rings a little\n foley('door_metal_open_close', [...meet(160, 900, 0.55, 2000), tone({ f: vary(1250), f2: 1150, d: [0.1, 0.16], vol: 0.06, wet: 0.3 })], 'a metal door or gate meeting its frame'),\n foley(\n 'door_creak_metal',\n [\n tone({ f: [620, 760], f2: 900, d: [0.3, 0.4], vol: [0.03, 0.045] }),\n noise({\n type: 'bandpass',\n f: [1300, 1500],\n q: 8,\n a: 0.04,\n d: [0.25, 0.35],\n vol: [0.07, 0.09],\n }),\n ],\n 'a metal hinge turning',\n ),\n // the handle of a locked door shaken: the latch knocking in its keeper, five to seven times in half a second\n foley(\n 'door_locked_rattle',\n [\n ...many(6, () =>\n noise({\n type: 'bandpass',\n f: [1600, 2600],\n q: 3,\n d: [0.025, 0.04],\n vol: [0.22, 0.34],\n delay: [0, 0.45],\n }),\n ),\n ...many(3, () =>\n tone({\n f: [170, 210],\n f2: 120,\n d: 0.05,\n vol: [0.12, 0.18],\n delay: [0.02, 0.4],\n }),\n ),\n ],\n 'the handle of a locked door shaken: latch knocks and the leaf thumping in its frame',\n ),\n // a fridge: the rubber seal lets go with a soft suck, the bottles in the door clink; closing it is a soft thump and the seal pulling shut\n foley(\n 'fridge_open',\n [\n noise({\n type: 'lowpass',\n f: [320, 380],\n a: 0.03,\n d: [0.14, 0.2],\n vol: [0.32, 0.4],\n }),\n noise({\n type: 'bandpass',\n f: [800, 950],\n f2: 1400,\n q: 2,\n a: 0.02,\n d: 0.12,\n vol: [0.08, 0.12],\n }),\n ...many(2, () =>\n tone({\n f: [2600, 4200],\n d: [0.04, 0.08],\n vol: [0.015, 0.03],\n delay: [0.08, 0.22],\n }),\n ),\n ],\n 'a fridge door: the seal letting go and the bottles in the door',\n ),\n foley(\n 'fridge_close',\n [\n tone({ f: vary(85), f2: 45, d: [0.1, 0.13], vol: [0.38, 0.46] }),\n noise({\n type: 'lowpass',\n f: [520, 620],\n d: [0.08, 0.12],\n vol: [0.3, 0.36],\n }),\n noise({\n type: 'lowpass',\n f: [260, 320],\n a: 0.02,\n d: 0.1,\n vol: [0.12, 0.18],\n delay: [0.04, 0.07],\n }),\n ...many(2, () =>\n tone({\n f: [2600, 4200],\n d: [0.04, 0.07],\n vol: [0.015, 0.03],\n delay: [0.03, 0.12],\n }),\n ),\n ],\n 'a fridge door shut: a soft thump, the seal pulling and the bottles',\n ),\n // a microwave: the spring catch of the door, plastic on plastic\n foley(\n 'microwave_open',\n [\n ...click(1800, 0.34),\n tone({\n f: [3000, 3400],\n f2: 2800,\n d: 0.05,\n vol: 0.025,\n delay: [0.01, 0.02],\n }),\n ],\n 'the spring catch of a microwave door',\n ),\n foley(\n 'microwave_close',\n [\n noise({\n type: 'bandpass',\n f: [1200, 1450],\n q: 2.5,\n d: [0.04, 0.06],\n vol: [0.36, 0.44],\n }),\n tone({ f: vary(180), f2: 120, d: 0.05, vol: [0.16, 0.22] }),\n ...click(2200, 0.2, [0.008, 0.016]),\n ],\n 'a microwave door clacking shut',\n ),\n foley('microwave_beep', [tone({ wave: 'square', f: 2000, d: 0.12, vol: 0.05 })], 'the beep of a microwave'),\n // drawers and sliding leaves: the runners, then the stop\n foley(\n 'drawer_open',\n [\n noise({\n type: 'bandpass',\n f: [620, 780],\n q: 2,\n a: 0.04,\n d: [0.28, 0.36],\n vol: [0.18, 0.24],\n }),\n noise({ type: 'bandpass', f: [2000, 2400], q: 5, d: 0.28, vol: 0.04 }),\n ...click(1400, 0.16, [0.28, 0.34]),\n ],\n 'a drawer on its runners and its stop',\n ),\n foley(\n 'drawer_close',\n [\n noise({\n type: 'bandpass',\n f: [620, 780],\n q: 2,\n a: 0.03,\n d: [0.2, 0.28],\n vol: [0.18, 0.24],\n }),\n tone({\n f: vary(150),\n f2: 90,\n d: 0.08,\n vol: [0.22, 0.3],\n delay: [0.2, 0.26],\n }),\n ],\n 'a drawer pushed home',\n ),\n]\n\n/** What the hand does with an item: picking it up by what it is made of, throwing it, and the uses (opening, drinking, eating, first aid). */\nexport const ITEM_FOLEY: readonly SoundRecipe[] = [\n // the hand closing on the item: a touch of skin and cloth, then the item's own small sound\n foley(\n 'item_pickup_metal',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n tone({\n f: [1900, 2600],\n f2: 1700,\n d: [0.05, 0.08],\n vol: [0.06, 0.09],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a metal thing',\n ),\n foley(\n 'item_pickup_plastic',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'bandpass',\n f: [1500, 1900],\n q: 3,\n d: 0.03,\n vol: [0.15, 0.21],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a plastic thing',\n ),\n foley(\n 'item_pickup_glass',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.15 }),\n tone({\n f: [3200, 4200],\n d: [0.05, 0.08],\n vol: [0.038, 0.06],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a glass thing',\n ),\n foley(\n 'item_pickup_paper',\n [\n noise({\n type: 'highpass',\n f: [2600, 3400],\n a: 0.01,\n d: [0.1, 0.14],\n vol: [0.12, 0.18],\n }),\n noise({ type: 'bandpass', f: [800, 1000], q: 1, d: 0.05, vol: 0.12 }),\n ],\n 'picking up paper or cardboard',\n ),\n foley(\n 'item_pickup_fabric',\n [\n noise({\n type: 'bandpass',\n f: [900, 1300],\n q: 0.8,\n a: 0.02,\n d: [0.12, 0.16],\n vol: [0.15, 0.21],\n }),\n ],\n 'picking up cloth',\n ),\n foley(\n 'item_pickup_wood',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'bandpass',\n f: [900, 1100],\n q: 2,\n d: 0.04,\n vol: [0.15, 0.21],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a wooden thing',\n ),\n foley(\n 'item_pickup_food',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'lowpass',\n f: [500, 650],\n d: 0.05,\n vol: 0.12,\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up food',\n ),\n foley(\n 'item_throw',\n [\n noise({\n type: 'bandpass',\n f: [450, 650],\n f2: 1400,\n q: 1.5,\n a: 0.05,\n d: 0.18,\n vol: [0.1, 0.14],\n }),\n ],\n 'the arm throwing something: air',\n ),\n // a can: the tab cracks, the gas hisses out; drinking is gulps; crushing it crumples the sheet\n foley(\n 'can_open',\n [\n ...click(3200, 0.36),\n noise({\n type: 'highpass',\n f: [3600, 4400],\n a: 0.005,\n d: [0.22, 0.3],\n vol: [0.16, 0.22],\n delay: [0.012, 0.02],\n }),\n ...many(5, () => tone({ f: [4000, 7000], d: 0.02, vol: 0.01, delay: [0.05, 0.4] })),\n ],\n 'the tab of a can and the gas hissing out',\n ),\n foley(\n 'can_crush',\n [\n noise({\n type: 'bandpass',\n f: [1600, 2200],\n q: 1.2,\n d: [0.18, 0.25],\n vol: [0.3, 0.38],\n }),\n ...many(6, () =>\n tone({\n f: [1200, 3400],\n f2: 900,\n d: 0.03,\n vol: [0.03, 0.06],\n delay: [0, 0.2],\n }),\n ),\n ],\n 'a can crushed in the hand',\n ),\n foley(\n 'can_puncture_spray',\n [\n noise({\n type: 'highpass',\n f: [2400, 3000],\n a: 0.005,\n d: [0.5, 0.7],\n vol: [0.2, 0.26],\n }),\n noise({ type: 'bandpass', f: [600, 800], q: 2, d: 0.4, vol: 0.06 }),\n ],\n 'a can holed: the jet hissing out',\n ),\n foley(\n 'bottle_open',\n [\n ...many(5, () =>\n noise({\n type: 'bandpass',\n f: [2200, 3000],\n q: 4,\n d: 0.008,\n vol: [0.1, 0.16],\n delay: [0, 0.18],\n }),\n ),\n noise({\n type: 'highpass',\n f: 3800,\n a: 0.005,\n d: 0.12,\n vol: [0.06, 0.1],\n delay: [0.18, 0.22],\n }),\n ],\n 'the screw cap of a bottle turning off',\n ),\n foley(\n 'drink_gulp',\n [\n noise({\n type: 'lowpass',\n f: [280, 360],\n a: 0.02,\n d: [0.1, 0.14],\n vol: [0.24, 0.3],\n }),\n tone({ f: [140, 170], f2: 85, d: [0.08, 0.11], vol: [0.12, 0.16] }),\n ],\n 'a gulp',\n ),\n foley(\n 'eat_crunch',\n [\n ...many(4, () =>\n noise({\n type: 'bandpass',\n f: [1800, 3200],\n q: 1.5,\n d: [0.02, 0.04],\n vol: [0.12, 0.2],\n delay: [0, 0.12],\n }),\n ),\n ],\n 'a bite of something crunchy',\n ),\n foley(\n 'eat_chew',\n [\n noise({\n type: 'lowpass',\n f: [450, 600],\n a: 0.03,\n d: [0.1, 0.14],\n vol: [0.12, 0.16],\n }),\n noise({\n type: 'bandpass',\n f: [1100, 1400],\n q: 2,\n d: 0.04,\n vol: 0.04,\n delay: [0.03, 0.06],\n }),\n ],\n 'chewing',\n ),\n foley(\n 'bandage_wrap',\n [\n noise({\n type: 'bandpass',\n f: [1400, 1800],\n f2: 2400,\n q: 1,\n a: 0.04,\n d: [0.3, 0.4],\n vol: [0.12, 0.16],\n }),\n ],\n 'a bandage unrolled round a limb',\n ),\n foley(\n 'pills_shake',\n [\n ...many(8, () =>\n tone({\n f: [2400, 3600],\n d: 0.015,\n vol: [0.03, 0.05],\n delay: [0, 0.25],\n }),\n ),\n noise({ type: 'bandpass', f: [1500, 1900], q: 2, d: 0.25, vol: 0.05 }),\n ],\n 'pills shaken in their bottle',\n ),\n foley(\n 'medkit_use',\n [\n ...click(1700, 0.24),\n noise({\n type: 'bandpass',\n f: [1000, 1400],\n q: 1,\n a: 0.03,\n d: [0.25, 0.32],\n vol: [0.08, 0.12],\n delay: [0.05, 0.08],\n }),\n ],\n 'a first aid kit opened and rummaged',\n ),\n foley('flashlight_click', click(2600, 0.3), 'the switch of a flashlight'),\n]\n\n/** The foley bank: register it in the engine (`engine.register(FOLEY_BANK)`). */\nexport const FOLEY_BANK: SoundBank = {\n id: 'foley',\n sounds: [...LEAF_FOLEY, ...ITEM_FOLEY],\n}\n\n/** What a picked-up item sounds like, by its heaviest material class. */\nexport const PICKUP_CLASSES = ['metal', 'plastic', 'glass', 'paper', 'fabric', 'wood', 'food'] as const\nexport type PickupClass = (typeof PICKUP_CLASSES)[number]\n\n/** The sound set of a leaf worked by hand: the ids it plays at the latch, while it turns, and as it meets the frame (gently, and slammed). */\nexport type LeafFoley = {\n readonly open: string\n readonly turn?: string\n readonly close: string\n readonly slam?: string\n readonly locked: string\n}\n\n/** The leaf sound sets the kit ships, by name; an item names one (`TestableItem.sounds.leaves`), else the room picks `wood_door` or `metal_door` by the leaf's material. */\nexport const LEAF_FOLEY_SETS: Readonly<Record<string, LeafFoley>> = {\n wood_door: {\n open: 'door_wood_open',\n turn: 'door_creak',\n close: 'door_wood_close',\n slam: 'door_wood_slam',\n locked: 'door_locked_rattle',\n },\n metal_door: {\n open: 'door_wood_open',\n turn: 'door_creak_metal',\n close: 'door_metal_open_close',\n locked: 'door_locked_rattle',\n },\n fridge: {\n open: 'fridge_open',\n close: 'fridge_close',\n locked: 'door_locked_rattle',\n },\n microwave: {\n open: 'microwave_open',\n close: 'microwave_close',\n locked: 'door_locked_rattle',\n },\n drawer: {\n open: 'drawer_open',\n close: 'drawer_close',\n locked: 'door_locked_rattle',\n },\n}\n","// The sounds of a body: footsteps by surface and gait, landings, the swing and the hit of each blow, hurt, bite and grab. Synthesised in the meantime\n// (the kit has no recorded take of these yet): each id is a set of four takes, with the numbers of each take apart, so the same action never\n// sounds twice the same. A recorded take replaces a variant by its id (`register` a bank with the same recipe id) without touching who plays it.\n//\n// How each one is built (what the ear picks first):\n// - a footstep is the heel (a low thump, how hollow the floor is) and then the roll to the toe (the surface's own texture: the grit of concrete,\n// the crunch of gravel, the ring of a metal sheet, the splash of water); a run hits harder, brighter and shorter, heel and toe almost together;\n// - a landing is the whole body's weight on the surface: a deeper thump, the surface texture longer, the clothes after;\n// - a swing is air: a band of noise sweeping up while the limb or the tool speeds up, loudest just before the contact, so it is started early\n// (`SWING_LEAD_SECONDS` of game-contracts) and the contact sound follows it;\n// - a hit on a body is skin (a slap), mass (a thud) and, for a blade, a wet tear; on an object it is only the striking part (knuckles, sole, steel)\n// and the material's own impact plays beside it.\nimport {\n BODY_SOUND_IDS,\n FOOTSTEP_SOUND_IDS,\n GAIT_IDS,\n LAND_SOUND_IDS,\n LANDING_IDS,\n SURFACE_IDS,\n SWING_LEAD_SECONDS,\n footstepSoundId,\n} from '@adatechnology/game-contracts'\nimport type { BlowId, BodySoundId, GaitId, LandingId, SurfaceId } from '@adatechnology/game-contracts'\n\nimport type { Falloff, Layer, SoundBank, SoundRecipe, SoundSet } from '../recipe'\nimport { sceneNoise, sceneTone, sceneVoice } from './scene'\n\n/** Takes per id. */\nexport const BODY_FOLEY_TAKES = 4\n\n/** How each take differs from the first: frequency factor, timing factor and level factor (fixed numbers, so takes are really apart). */\nconst TAKES: readonly { readonly f: number; readonly t: number; readonly v: number }[] = [\n { f: 1, t: 1, v: 1 },\n { f: 1.08, t: 0.9, v: 0.92 },\n { f: 0.93, t: 1.12, v: 1.05 },\n { f: 1.03, t: 1.05, v: 0.88 },\n]\n\n\n/** Footsteps fade fast with distance and lose their top: a step 10 m away is a quarter of the level, 30 m a few percent, and duller. */\nexport const FOOTSTEP_FALLOFF: Falloff = { model: 'inverse_square', k: 0.03, cutoffK: 0.03, minGain: 0.004 }\n/** Blows and body sounds carry further than a step. */\nexport const BODY_FALLOFF: Falloff = { model: 'inverse_square', k: 0.012, cutoffK: 0.015, minGain: 0.004 }\n\ntype Take = (typeof TAKES)[number]\n\n/** What a surface sounds like under a foot: the heel's thump and the texture of the roll. */\ntype SurfaceVoice = {\n /** The heel: thump pitch (Hz), its length (s) and level. */\n readonly heel: { readonly f: number; readonly d: number; readonly vol: number }\n /** The roll to the toe and the scuff: a filtered noise. */\n readonly roll: { readonly type: BiquadFilterType; readonly f: number; readonly q: number; readonly d: number; readonly vol: number }\n /** Grit, crunch or drips: short bursts spread after the heel. */\n readonly grains?: { readonly count: number; readonly f: number; readonly q: number; readonly spread: number; readonly vol: number }\n /** A ring of the floor itself (a hollow board, a metal sheet). */\n readonly ring?: readonly { readonly f: number; readonly d: number; readonly vol: number }[]\n /** Water: a sweep of the splash band. */\n readonly splash?: { readonly f: number; readonly f2: number; readonly d: number; readonly vol: number }\n}\n\nconst SURFACES: Readonly<Record<SurfaceId, SurfaceVoice>> = {\n concrete: { heel: { f: 95, d: 0.05, vol: 0.55 }, roll: { type: 'bandpass', f: 2300, q: 1.1, d: 0.05, vol: 0.38 }, grains: { count: 2, f: 4200, q: 2, spread: 0.04, vol: 0.08 } },\n asphalt: { heel: { f: 90, d: 0.05, vol: 0.5 }, roll: { type: 'bandpass', f: 1700, q: 0.9, d: 0.06, vol: 0.36 }, grains: { count: 4, f: 3600, q: 2.5, spread: 0.06, vol: 0.1 } },\n wood: { heel: { f: 130, d: 0.08, vol: 0.55 }, roll: { type: 'lowpass', f: 1300, q: 0.8, d: 0.06, vol: 0.3 }, ring: [{ f: 210, d: 0.1, vol: 0.18 }, { f: 470, d: 0.06, vol: 0.06 }] },\n tile: { heel: { f: 110, d: 0.04, vol: 0.45 }, roll: { type: 'bandpass', f: 3600, q: 2, d: 0.03, vol: 0.42 }, ring: [{ f: 1900, d: 0.03, vol: 0.05 }] },\n dirt: { heel: { f: 75, d: 0.06, vol: 0.45 }, roll: { type: 'lowpass', f: 750, q: 0.7, d: 0.09, vol: 0.4 }, grains: { count: 3, f: 1800, q: 1.5, spread: 0.07, vol: 0.06 } },\n grass: { heel: { f: 70, d: 0.05, vol: 0.32 }, roll: { type: 'highpass', f: 2600, q: 0.7, d: 0.13, vol: 0.28 }, grains: { count: 4, f: 5200, q: 1.2, spread: 0.1, vol: 0.07 } },\n gravel: { heel: { f: 80, d: 0.05, vol: 0.4 }, roll: { type: 'lowpass', f: 950, q: 0.8, d: 0.1, vol: 0.3 }, grains: { count: 8, f: 2600, q: 3, spread: 0.13, vol: 0.2 } },\n sand: { heel: { f: 65, d: 0.06, vol: 0.3 }, roll: { type: 'bandpass', f: 1500, q: 0.6, d: 0.16, vol: 0.3 }, grains: { count: 5, f: 4800, q: 1.5, spread: 0.12, vol: 0.05 } },\n metal: { heel: { f: 120, d: 0.05, vol: 0.5 }, roll: { type: 'bandpass', f: 2800, q: 1.5, d: 0.03, vol: 0.25 }, ring: [{ f: 420, d: 0.25, vol: 0.16 }, { f: 1130, d: 0.18, vol: 0.09 }, { f: 2470, d: 0.1, vol: 0.04 }] },\n water: { heel: { f: 70, d: 0.04, vol: 0.25 }, roll: { type: 'bandpass', f: 3000, q: 1.2, d: 0.1, vol: 0.18 }, splash: { f: 1100, f2: 380, d: 0.22, vol: 0.55 }, grains: { count: 4, f: 2400, q: 6, spread: 0.18, vol: 0.12 } },\n glass: { heel: { f: 90, d: 0.04, vol: 0.4 }, roll: { type: 'highpass', f: 4500, q: 0.8, d: 0.06, vol: 0.2 }, grains: { count: 9, f: 6200, q: 5, spread: 0.12, vol: 0.22 }, ring: [{ f: 3900, d: 0.04, vol: 0.04 }, { f: 5300, d: 0.03, vol: 0.03 }] },\n carpet: { heel: { f: 70, d: 0.05, vol: 0.32 }, roll: { type: 'lowpass', f: 420, q: 0.7, d: 0.07, vol: 0.3 } },\n}\n\nconst GAITS: Readonly<Record<GaitId, { readonly vol: number; readonly bright: number; readonly toe: number; readonly short: number }>> = {\n walk: { vol: 1, bright: 1, toe: 0.075, short: 1 },\n run: { vol: 1.35, bright: 1.25, toe: 0.035, short: 0.75 },\n}\n\nconst grainLayers = (g: NonNullable<SurfaceVoice['grains']>, take: Take, start: number, scale: number): Layer[] =>\n Array.from({ length: g.count }, (_, i) =>\n sceneNoise({ type: 'bandpass', f: [g.f * take.f * 0.85, g.f * take.f * 1.15], q: g.q, d: [0.008, 0.02], vol: g.vol * scale * take.v, delay: start + ((i + 0.5) / g.count) * g.spread * take.t }),\n )\n\nconst ringLayers = (rings: NonNullable<SurfaceVoice['ring']>, take: Take, scale: number, at = 0): Layer[] =>\n rings.map((r) => sceneTone({ f: r.f * take.f, d: r.d * take.t, vol: r.vol * scale * take.v, delay: at }))\n\n/** The layers of one foot on a surface: heel, roll to the toe, then grains, ring or splash. `weight` scales the heel (a landing is the whole body). */\nfunction footLayers(surface: SurfaceId, take: Take, gait: (typeof GAITS)[GaitId], weight = 1): Layer[] {\n const s = SURFACES[surface]\n const toe = gait.toe * take.t\n return [\n sceneTone({ f: s.heel.f * take.f * weight ** -0.3, f2: s.heel.f * take.f * 0.6, d: s.heel.d * gait.short * take.t * weight ** 0.5, vol: s.heel.vol * gait.vol * take.v * weight ** 0.5 }),\n sceneNoise({ type: 'lowpass', f: 500 * gait.bright, d: 0.02 * take.t, vol: 0.18 * gait.vol * take.v * weight ** 0.5 }),\n sceneNoise({ type: s.roll.type, f: [s.roll.f * take.f * gait.bright * 0.92, s.roll.f * take.f * gait.bright * 1.08], q: s.roll.q, d: s.roll.d * gait.short * take.t * weight ** 0.3, vol: s.roll.vol * gait.vol * take.v, delay: toe }),\n ...(s.grains ? grainLayers(s.grains, take, toe * 0.5, gait.vol * weight ** 0.5) : []),\n ...(s.ring ? ringLayers(s.ring, take, gait.vol * weight ** 0.5) : []),\n ...(s.splash ? [sceneNoise({ type: 'bandpass', f: s.splash.f * take.f, f2: s.splash.f2 * take.f, q: 1.4, d: s.splash.d * take.t * weight ** 0.4, vol: s.splash.vol * gait.vol * take.v * weight ** 0.5 })] : []),\n ]\n}\n\n/** The layers at `level` of their gain (a scene layer's gain is a number or a range). */\nconst quieter = (level: number, layers: readonly Layer[]): Layer[] =>\n layers.map((layer) => {\n const gain = layer.gain ?? 1\n if (typeof gain === 'number') return { ...layer, gain: gain * level }\n if (Array.isArray(gain)) return { ...layer, gain: [gain[0] * level, gain[1] * level] as const }\n return layer\n })\n\nconst recipe = (id: string, layers: readonly Layer[], falloff: Falloff, bus: SoundRecipe['bus'] = 'world'): SoundRecipe => ({ id, bus, pan: true, layers, falloff, sources: ['sdk'] })\n\nconst takeId = (id: string, index: number): string => `${id}_${String(index + 1).padStart(2, '0')}`\n\n/** The four takes of an id and the set that names them. */\nfunction takes(id: string, layersOf: (take: Take, index: number) => Layer[], falloff: Falloff, rate: readonly [number, number] = [0.96, 1.04], bus?: SoundRecipe['bus']): { sounds: SoundRecipe[]; set: SoundSet } {\n const sounds = TAKES.map((take, index) => recipe(takeId(id, index), layersOf(take, index), falloff, bus))\n return { sounds, set: { id, variants: sounds.map((sound) => sound.id), rate } }\n}\n\nconst footstep = (surface: SurfaceId, gait: GaitId) => takes(footstepSoundId(surface, gait), (take) => footLayers(surface, take, GAITS[gait]), FOOTSTEP_FALLOFF)\n\nconst LANDINGS: Readonly<Record<LandingId, { readonly weight: number; readonly cloth: number }>> = { light: { weight: 1.4, cloth: 0.12 }, heavy: { weight: 2.4, cloth: 0.22 } }\n\n/** A landing's layers are the feet's at the body's weight; this brings the whole of it under a blow on a body (C6). */\nconst LANDING_LEVEL = 0.65\n\nconst landing = (surface: SurfaceId, landing: LandingId) =>\n takes(\n `land_${surface}_${landing}`,\n (take) => quieter(LANDING_LEVEL, [\n // both feet, a hair apart, then the knees taking the weight (a low body thump) and the clothes settling\n ...footLayers(surface, take, GAITS.run, LANDINGS[landing].weight),\n ...footLayers(surface, { ...take, v: take.v * 0.6 }, GAITS.run, LANDINGS[landing].weight * 0.6).map((layer) => ({ ...layer, at: (typeof layer.at === 'number' ? layer.at : 0) + 0.018 * take.t })),\n sceneTone({ f: 60 * take.f, f2: 38, d: 0.14 * LANDINGS[landing].weight * take.t, vol: 0.22 * LANDINGS[landing].weight ** 0.7 * take.v, delay: 0.02 }),\n sceneNoise({ type: 'bandpass', f: [1800, 2600], q: 0.8, d: 0.18, vol: LANDINGS[landing].cloth * take.v, delay: 0.04 }),\n ]),\n FOOTSTEP_FALLOFF,\n )\n\nconst whoosh = (blow: BlowId, from: number, to: number, d: number, vol: number, q = 1.6): ((take: Take) => Layer[]) => (take) => [\n // the air: a band sweeping up as the limb speeds up; it peaks `SWING_LEAD_SECONDS` in, the moment before the contact, then dies away\n sceneNoise({ type: 'bandpass', f: from * take.f, f2: to * take.f, q, a: SWING_LEAD_SECONDS[blow], d: d * take.t, vol: vol * take.v }),\n sceneNoise({ type: 'lowpass', f: 600 * take.f, a: SWING_LEAD_SECONDS[blow], d: d * take.t * 0.8, vol: vol * 0.35 * take.v }),\n]\n\n/** Skin, mass and (optionally) bone: what a blow on a body is made of. */\nconst fleshHit = (o: { slap: number; slapF: number; thud: number; thudF: number; thudD: number; crack?: number; wet?: number }): ((take: Take) => Layer[]) => (take) => [\n sceneNoise({ type: 'bandpass', f: o.slapF * take.f, q: 1.2, d: 0.03 * take.t, vol: o.slap * take.v }),\n sceneNoise({ type: 'highpass', f: 3500 * take.f, d: 0.012, vol: o.slap * 0.4 * take.v }),\n sceneTone({ f: o.thudF * take.f, f2: o.thudF * 0.5, d: o.thudD * take.t, vol: o.thud * take.v }),\n sceneNoise({ type: 'lowpass', f: 600 * take.f, d: o.thudD * 1.2 * take.t, vol: o.thud * 0.5 * take.v }),\n ...(o.crack ? [sceneNoise({ type: 'highpass', f: 2500, d: 0.015, vol: o.crack * take.v, delay: 0.006 }), sceneTone({ wave: 'square', f: 900 * take.f, f2: 300, d: 0.02, vol: o.crack * 0.15 * take.v, delay: 0.006 })] : []),\n ...(o.wet ? [sceneNoise({ type: 'bandpass', f: 1400 * take.f, f2: 500, q: 2.5, d: 0.12 * take.t, vol: o.wet * take.v, delay: 0.01 })] : []),\n]\n\n/** What only the striking part sounds like on a hard thing (the material's impact plays beside it). */\nconst knock = (o: { clickF: number; click: number; tones: readonly (readonly [number, number, number])[] }): ((take: Take) => Layer[]) => (take) => [\n sceneNoise({ type: 'bandpass', f: o.clickF * take.f, q: 1.5, d: 0.018, vol: o.click * take.v }),\n ...o.tones.map(([f, d, vol]) => sceneTone({ f: f * take.f, d: d * take.t, vol: vol * take.v })),\n]\n\nconst voice = (o: { f0: number; f1: number; d: number; fA: number; fB: number; noise: number; vol: number }): ((take: Take) => Layer[]) => (take) => [\n sceneVoice({ f0: o.f0 * take.f, f1: o.f1 * take.f, d: o.d * take.t, fA: o.fA * take.f, fB: o.fB * take.f, noise: o.noise, vol: o.vol * take.v }),\n]\n\nconst BODY: Readonly<Record<BodySoundId, (take: Take) => Layer[]>> = {\n jump: (take) => [\n sceneNoise({ type: 'bandpass', f: 900 * take.f, f2: 1700 * take.f, q: 1, a: 0.03, d: 0.12, vol: 0.18 * take.v }),\n sceneNoise({ type: 'bandpass', f: 2200 * take.f, q: 0.8, d: 0.04, vol: 0.12 * take.v }),\n sceneTone({ f: 85 * take.f, f2: 60, d: 0.04, vol: 0.2 * take.v }),\n ],\n cloth_rustle: (take) => [\n { ...sceneNoise({ type: 'bandpass', f: 2400 * take.f, q: 0.8, a: 0.06, d: 0.22 * take.t, vol: 0.12 * take.v }), modulators: [{ target: 'gain', wave: 'triangle', rate: [9, 14], depth: 0.5 }] },\n ],\n body_fall: (take) => [\n sceneTone({ f: 58 * take.f, f2: 35, d: 0.28 * take.t, vol: 0.9 * take.v }),\n sceneNoise({ type: 'lowpass', f: 480 * take.f, d: 0.3 * take.t, vol: 0.55 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1300 * take.f, q: 1, d: 0.05, vol: 0.3 * take.v }),\n // the limbs a moment later, and the clothes\n sceneTone({ f: 75 * take.f, f2: 45, d: 0.12, vol: 0.4 * take.v, delay: 0.13 * take.t }),\n sceneNoise({ type: 'bandpass', f: 2200, q: 0.8, d: 0.2, vol: 0.12 * take.v, delay: 0.05 }),\n ],\n fall_damage: (take) => [\n ...BODY.body_fall(take),\n sceneNoise({ type: 'highpass', f: 2800, d: 0.02, vol: 0.35 * take.v, delay: 0.01 }),\n ...voice({ f0: 170, f1: 110, d: 0.32, fA: 650, fB: 1150, noise: 0.25, vol: 0.32 })(take).map((layer) => ({ ...layer, at: 0.08 })),\n ],\n player_hurt: voice({ f0: 150, f1: 105, d: 0.26, fA: 620, fB: 1100, noise: 0.3, vol: 0.35 }),\n player_breath_run: (take) => [\n sceneNoise({ type: 'bandpass', f: 1200 * take.f, q: 1, a: 0.08, d: 0.22 * take.t, vol: 0.25 * take.v }),\n sceneNoise({ type: 'bandpass', f: 900 * take.f, q: 1, a: 0.06, d: 0.26 * take.t, vol: 0.3 * take.v, delay: 0.3 * take.t }),\n ],\n player_death: voice({ f0: 135, f1: 68, d: 1, fA: 560, fB: 980, noise: 0.35, vol: 0.4 }),\n bite: (take) => [\n sceneNoise({ type: 'highpass', f: 2600, d: 0.015, vol: 0.4 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1600 * take.f, f2: 450, q: 2.2, d: 0.16 * take.t, vol: 0.55 * take.v, delay: 0.01 }),\n sceneNoise({ type: 'bandpass', f: 3200 * take.f, f2: 1800, q: 1.2, d: 0.22 * take.t, vol: 0.25 * take.v, delay: 0.09 }),\n sceneTone({ f: 120 * take.f, f2: 70, d: 0.06, vol: 0.3 * take.v }),\n ],\n grab: (take) => [\n sceneNoise({ type: 'bandpass', f: 1900 * take.f, q: 0.9, a: 0.004, d: 0.13 * take.t, vol: 0.32 * take.v }),\n sceneTone({ f: 95 * take.f, f2: 60, d: 0.07, vol: 0.3 * take.v }),\n sceneNoise({ type: 'lowpass', f: 700, d: 0.08, vol: 0.2 * take.v }),\n ],\n punch_swing: whoosh('punch', 450, 1500, 0.16, 0.9),\n punch_hit_body: fleshHit({ slap: 0.55, slapF: 1500, thud: 0.6, thudF: 115, thudD: 0.09 }),\n punch_hit_face: fleshHit({ slap: 0.75, slapF: 2300, thud: 0.45, thudF: 150, thudD: 0.07, crack: 0.25 }),\n punch_hit_object: knock({ clickF: 1800, click: 0.3, tones: [[210, 0.04, 0.25]] }),\n kick_swing: whoosh('kick', 280, 950, 0.22, 1, 1.3),\n kick_hit: fleshHit({ slap: 0.45, slapF: 1100, thud: 0.85, thudF: 82, thudD: 0.14 }),\n kick_hit_object: knock({ clickF: 1000, click: 0.3, tones: [[92, 0.08, 0.5]] }),\n shove_two_hands: (take) => [\n sceneNoise({ type: 'bandpass', f: 950 * take.f, q: 0.9, a: 0.01, d: 0.13 * take.t, vol: 0.38 * take.v }),\n sceneTone({ f: 100 * take.f, f2: 60, d: 0.1 * take.t, vol: 0.45 * take.v }),\n sceneNoise({ type: 'bandpass', f: 2300, q: 0.8, d: 0.16, vol: 0.12 * take.v, delay: 0.03 }),\n ],\n knife_swing: whoosh('blade', 1900, 4600, 0.12, 1.1, 2.2),\n knife_stab: fleshHit({ slap: 0.2, slapF: 1200, thud: 0.4, thudF: 160, thudD: 0.06, wet: 0.5 }),\n knife_slash: (take) => [\n sceneNoise({ type: 'highpass', f: 3200 * take.f, f2: 1800, d: 0.13 * take.t, vol: 0.35 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1300 * take.f, f2: 600, q: 2.5, d: 0.12 * take.t, vol: 0.35 * take.v, delay: 0.02 }),\n ],\n knife_hit_object: knock({ clickF: 3200, click: 0.25, tones: [[2800, 0.08, 0.07], [4150, 0.06, 0.05]] }),\n blunt_swing: whoosh('blunt', 220, 760, 0.28, 1.1, 1.5),\n blunt_hit: fleshHit({ slap: 0.35, slapF: 900, thud: 1, thudF: 70, thudD: 0.18, crack: 0.3 }),\n blunt_hit_object: knock({ clickF: 1400, click: 0.35, tones: [[300, 0.12, 0.25], [760, 0.08, 0.12]] }),\n axe_swing: whoosh('chop', 190, 620, 0.3, 1.2, 1.4),\n axe_chop: fleshHit({ slap: 0.3, slapF: 1400, thud: 0.75, thudF: 140, thudD: 0.1, crack: 0.35, wet: 0.45 }),\n axe_hit_object: knock({ clickF: 2200, click: 0.4, tones: [[1500, 0.15, 0.1], [2300, 0.1, 0.06], [140, 0.1, 0.35]] }),\n}\n\nconst BODY_BUS: Partial<Record<BodySoundId, SoundRecipe['bus']>> = { player_hurt: 'voices', player_death: 'voices', player_breath_run: 'voices', fall_damage: 'voices' }\n\nconst built = [\n ...SURFACE_IDS.flatMap((surface) => GAIT_IDS.map((gait) => footstep(surface, gait))),\n ...SURFACE_IDS.flatMap((surface) => LANDING_IDS.map((l) => landing(surface, l))),\n ...BODY_SOUND_IDS.map((id) => takes(id, BODY[id], BODY_FALLOFF, id.endsWith('_swing') ? [0.94, 1.06] : [0.96, 1.04], BODY_BUS[id])),\n]\n\n/**\n * Every body sound of `game-contracts`' `BODY_FOLEY_IDS` as a set of four takes (`footstep_concrete_walk` plays `footstep_concrete_walk_01`..`_04`,\n * never the same twice in a row, at ±4% of rate). Register it in the engine the body plays on.\n */\nexport const BODY_FOLEY_BANK: SoundBank = {\n id: 'body_foley',\n sounds: built.flatMap((entry) => entry.sounds),\n sets: built.map((entry) => entry.set),\n}\n\n/** The ids the bank answers (the sets), in the contract's order. */\nexport const BODY_FOLEY_SET_IDS: readonly string[] = [...FOOTSTEP_SOUND_IDS, ...LAND_SOUND_IDS, ...BODY_SOUND_IDS]\n","import type { AudioListener, AudioSink, LoopHandle, SoundHandle, SoundRequest } from '@adatechnology/game-contracts'\n\nimport type { SoundBank } from '../recipe'\nimport type { AudioEngine, VoiceHandle } from './engine'\n\n/** An `AudioSink` (what a host lends its modules) that carries the engine behind it, so a module that wants more than `play` can use the engine. */\nexport type EngineSink = AudioSink & { readonly engine: AudioEngine }\n\n/** Lends an engine as the host's `audio`: sounds by key, loops, the listener, and banks registered into the same engine. */\nexport function createAudioSink(engine: AudioEngine): EngineSink {\n const playing = new Map<number, VoiceHandle>()\n return {\n engine,\n play(request: SoundRequest): SoundHandle | null {\n const handle = engine.play(request.sound, {\n ...(request.position ? { position: request.position } : {}),\n ...(request.volume === undefined ? {} : { volume: request.volume }),\n ...(request.params ? { params: request.params } : {}),\n ...(request.seed === undefined ? {} : { seed: request.seed }),\n ...(request.delay === undefined ? {} : { delay: request.delay }),\n ...(request.urgent ? { urgent: true } : {}),\n })\n if (!handle) return null\n playing.set(handle.id, handle)\n return { id: handle.id }\n },\n stop(handle) {\n playing.get(handle.id)?.stop()\n playing.delete(handle.id)\n },\n loop(sound, options): LoopHandle {\n const loop = engine.loop(sound)\n // the loop's place comes with the first set; `params.cutoff` drives the first filter\n let position = options?.position\n return {\n set: (state) => {\n position = state.position ?? position\n const cutoff = state.params?.['cutoff']\n loop.set({\n ...(state.volume === undefined ? {} : { volume: state.volume }),\n ...(state.frequency === undefined ? {} : { frequency: state.frequency }),\n ...(position ? { position } : {}),\n ...(cutoff === undefined ? {} : { cutoff }),\n })\n },\n stop: () => loop.stop(),\n }\n },\n setListener(listener: AudioListener) {\n engine.setListener(listener)\n },\n register(bank: unknown) {\n engine.register(bank as SoundBank)\n },\n }\n}\n"],"mappings":"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","names":["landing"]}
|
|
1
|
+
{"version":3,"sources":["../src/recipes/scene.ts","../src/library/cabin.ts","../src/recipes/foley.ts","../src/recipes/body-foley.ts","../src/webaudio/sink.ts"],"sourcesContent":["// The art scene's synthesis primitives (cena L1322-L1328) as recipe layers, shared by every subject bank that ports a `sfx.*` of the page: the\n// materials in `destruction-three`, the voices and wounds in `characters-three`. Each helper writes the layer the team routine builds, with its\n// fields in the order the routine draws its random numbers, so a recipe built from them leaves the trace of the team code.\nimport { DISTANCE_CURVES } from '../falloff'\nimport type { BusId, Envelope, Layer, ParamRef, Range, SoundRecipe } from '../recipe'\n\nconst ATTACK = 0.002\n\n/** A length in seconds: a number, a `[min, max]` range or a named number. */\nexport type SceneLength = number | readonly [number, number] | ParamRef\n\n// the layer is `attack + d` long (the art scene's gain rises over `a` and falls over `d`)\nfunction lengthOf(d: SceneLength, attack: number): Range {\n if (typeof d === 'number') return attack + d\n if (Array.isArray(d)) return [attack + d[0], attack + d[1]] as const\n return { ...(d as ParamRef), add: ((d as ParamRef).add ?? 0) + attack }\n}\n\nconst envelope = (attack: number): Envelope => [\n [0, 0.0001, 'set', 'fixed'],\n [attack, 1, 'exp'],\n ['1d', 0.0001, 'exp', 'fixed'],\n]\n\nexport type SceneNoise = {\n readonly type?: BiquadFilterType\n readonly f: Range\n /** The filter slides here over `d` (needs a fixed `d`). */\n readonly f2?: number\n readonly q?: number\n readonly a?: number\n readonly d: SceneLength\n readonly vol: Range\n readonly wet?: number\n readonly delay?: Range\n}\n\n/** `sNoise` (cena L1323): noise from a random point, a filter (default lowpass, Q 0.7), the gain rising over `a` and falling over `d`. */\nexport function sceneNoise(o: SceneNoise): Layer {\n const a = o.a ?? ATTACK\n const over = typeof o.d === 'number' ? o.d : 0\n return {\n filters: {\n mode: 'serial',\n bank: [{ type: o.type ?? 'lowpass', frequency: o.f2 === undefined ? { set: o.f } : { set: o.f, to: o.f2, curve: 'exp', over }, q: o.q ?? 0.7 }],\n },\n duration: lengthOf(o.d, a),\n gain: o.vol,\n ...(o.delay === undefined ? {} : { at: o.delay }),\n ...(o.wet === undefined ? {} : { wet: o.wet }),\n source: { kind: 'noise', offset: 'random', offsetScale: 1.5, loop: true },\n envelope: envelope(a),\n }\n}\n\nexport type SceneTone = { readonly wave?: OscillatorType; readonly f: Range; readonly f2?: number; readonly d: SceneLength; readonly vol: Range; readonly wet?: number; readonly delay?: Range }\n\n/** `sTone` (cena L1324): an oscillator sliding from `f` to `f2` (back to `f` when none), the gain rising over 0.002 s and falling over `d`. */\nexport function sceneTone(o: SceneTone): Layer {\n return {\n source: { kind: 'osc', wave: o.wave ?? 'sine', frequency: { from: o.f, to: o.f2 ?? 'from', curve: 'exp', over: 'duration' } },\n duration: lengthOf(o.d, ATTACK),\n gain: o.vol,\n ...(o.delay === undefined ? {} : { at: o.delay }),\n ...(o.wet === undefined ? {} : { wet: o.wet }),\n envelope: envelope(ATTACK),\n }\n}\n\nexport type SceneVoice = {\n /** Start and end frequency of the sweep (the page ramps linearly from `f0` to `f1` over the length). */\n readonly f0: Range\n readonly f1: Range\n /** Length in seconds. */\n readonly d: SceneLength\n /** Centre of the first and second formant (Q 4 and 6) and of the breath band (Q 1.1). */\n readonly fA: Range\n readonly fB: Range\n /** Level of the breath noise. */\n readonly noise: Range\n readonly vol: Range\n readonly wave?: OscillatorType\n}\n\n/**\n * `voice` (cena L1325): an oscillator swept from `f0` to `f1` with a vibrato of 4 to 10 Hz (depth 0.08 of `f0`) through two formant bands plus a band of\n * breath noise, summed and boosted 3.2 times, the gain rising over 0.1 s, held to 0.6 of the length and falling; reverb send 0.45. It is the one\n * layer the page builds with `voice(...)`, so a scream is two of them.\n */\nexport function sceneVoice(o: SceneVoice): Layer {\n return {\n duration: lengthOf(o.d, 0),\n gain: o.vol,\n wet: 0.45,\n source: {\n kind: 'formant_voice',\n wave: o.wave ?? 'sawtooth',\n frequency: { from: o.f0, to: o.f1, curve: 'linear', over: 'duration' },\n vibrato: { rate: [4, 10], depth: 0.08 },\n formants: [\n { frequency: o.fA, q: 4 },\n { frequency: o.fB, q: 6 },\n ],\n breath: { frequency: o.fB, q: 1.1, gain: o.noise },\n mix: 3.2,\n },\n envelope: [\n [0, 0.0001, 'set', 'fixed'],\n [0.1, 1, 'exp'],\n ['0.6d', 1, 'set'],\n ['1d', 0.0001, 'exp', 'fixed'],\n ],\n }\n}\n\n/** The layer played `count` times (a team `for` loop whose body draws numbers): each pass is its own layer, so the draws stay in the loop's order. */\nexport const sceneMany = (count: number, make: () => Layer): Layer[] => Array.from({ length: count }, make)\n\nexport type SceneRecipeOptions = {\n /** Named numbers drawn first (`PlayOptions.params` can override them). */\n readonly vars?: SoundRecipe['vars']\n readonly bus?: BusId\n readonly group?: string\n}\n\n/** A recipe in the art scene's mix: positional with the art scene's curve (`vol / (1 + d² × 0.008)`) and pan; `line` is the team code it comes from (`cena:<line>`). */\nexport function sceneRecipe(id: string, layers: readonly Layer[], line: string, options: SceneRecipeOptions = {}): SoundRecipe {\n return {\n id,\n bus: options.bus ?? 'world',\n pan: true,\n layers,\n falloff: DISTANCE_CURVES.art_scene,\n ...(options.vars ? { vars: options.vars } : {}),\n ...(options.group ? { group: options.group } : {}),\n sources: [`cena:${line}`],\n }\n}\n","// The sounds of a vehicle's cabin and body switches (the turn signal relay, the starter, the alarm, the wipers, the belt chime, the lock chirp). Like the\n// library's horn, they live here until the vehicles package has a bank of its own (Q12). Synthesized; no recording.\nimport type { SoundBank, SoundRecipe } from '../recipe'\n\nexport const CABIN_SOUNDS: readonly SoundRecipe[] = [\n {\n id: 'blinker_tick',\n bus: 'world',\n duration: 0.03,\n layers: [\n // the relay: a click of bright noise and a short low knock\n { source: { kind: 'noise', offset: 'random' }, filters: { mode: 'serial', bank: [{ type: 'highpass', frequency: { set: 2600 } }] }, envelope: [[0, 0.22, 'set'], [0.025, 0.0001, 'exp', 'fixed']] },\n { source: { kind: 'osc', wave: 'triangle', frequency: { set: 180 } }, envelope: [[0, 0.12, 'set'], [0.03, 0.0001, 'exp', 'fixed']] },\n ],\n falloff: { model: 'none' },\n },\n {\n id: 'starter_crank',\n bus: 'world',\n duration: 0.9,\n layers: [\n // the starter motor turning the engine over: low noise chopped at the compression strokes\n {\n source: { kind: 'noise', offset: 'random' },\n filters: { mode: 'serial', bank: [{ type: 'lowpass', frequency: { set: 420 } }] },\n modulators: [{ target: 'gain', wave: 'square', rate: 11, depth: 0.08, base: 0.1 }],\n envelope: [[0, 0.0001, 'set', 'fixed'], [0.05, 0.25, 'linear'], [0.8, 0.22, 'set'], [0.9, 0.0001, 'exp', 'fixed']],\n },\n { source: { kind: 'osc', wave: 'sawtooth', frequency: { set: 95, to: 120, curve: 'linear', over: 0.9 } }, filters: { mode: 'serial', bank: [{ type: 'lowpass', frequency: { set: 300 } }] }, envelope: [[0, 0.04, 'set'], [0.9, 0.0001, 'exp', 'fixed']] },\n ],\n falloff: { model: 'none' },\n },\n {\n id: 'car_alarm',\n bus: 'world',\n order: 'siren',\n duration: 3,\n tail: 0.1,\n layers: [\n // the whoop of a car alarm: a square swept up and down three times a second\n {\n source: { kind: 'osc', wave: 'square', frequency: { set: 1100 } },\n modulators: [{ target: 'frequency', wave: 'triangle', rate: 3, depth: 420 }],\n filters: { mode: 'serial', bank: [{ type: 'lowpass', frequency: { set: 2600 } }] },\n envelope: [[0, 0.0001, 'set', 'fixed'], [0.05, 0.05, 'linear'], [2.9, 0.05, 'set'], [3, 0.0001, 'exp', 'fixed']],\n },\n ],\n falloff: { model: 'none' },\n },\n {\n id: 'alarm_chirp',\n bus: 'world',\n duration: 0.1,\n layers: [{ source: { kind: 'osc', wave: 'square', frequency: { set: 2300 } }, repeat: { count: 2, spacing: 0.16 }, envelope: [[0, 0.05, 'set'], [0.09, 0.0001, 'exp', 'fixed']] }],\n falloff: { model: 'none' },\n },\n {\n id: 'wiper_swish',\n bus: 'world',\n duration: 0.45,\n layers: [\n {\n source: { kind: 'noise', offset: 'random' },\n filters: { mode: 'serial', bank: [{ type: 'bandpass', frequency: { set: 700, to: 1100, curve: 'linear', over: 0.45 }, q: 1.2 }] },\n envelope: [[0, 0.0001, 'set', 'fixed'], [0.2, 0.06, 'linear'], [0.45, 0.0001, 'exp', 'fixed']],\n },\n ],\n falloff: { model: 'none' },\n },\n {\n id: 'seatbelt_chime',\n bus: 'world',\n duration: 0.5,\n layers: [{ source: { kind: 'osc', wave: 'sine', frequency: { set: 880 } }, repeat: { count: 3, spacing: 0.7 }, envelope: [[0, 0.06, 'set'], [0.5, 0.0001, 'exp', 'fixed']] }],\n falloff: { model: 'none' },\n },\n] as unknown as readonly SoundRecipe[]\n\nexport const CABIN_BANK: SoundBank = { id: 'vehicle_cabin', sounds: CABIN_SOUNDS, loops: [] }\n","// Foley of the hand: items picked up, opened, drunk and eaten, and the doors, lids and drawers of furniture and vehicles. Synthesised stand-ins under the\n// ids of the sound list (`sons/checklist-sons.md` 5.7 and the car doors of 5.6), so a recorded take filed under the same id replaces the recipe without\n// touching the code that plays it. Every recipe draws its numbers from ranges (pitch about ±4 %, timing and level), so no two plays are the same, and\n// falls off faster than a gunshot and loses its highs with distance: a latch is a near sound.\nimport type { Falloff, Layer, SoundBank, SoundRecipe } from '../recipe'\nimport { sceneMany as many, sceneNoise as noise, sceneTone as tone } from './scene'\n\n/** Small sounds of the hand: `vol / (1 + d² × 0.02)`, lowpass cutoffs `/ (1 + d × 0.04)`, silent below 0.004 (a latch at 10 m is a third, at 50 m gone). */\nexport const FOLEY_FALLOFF: Falloff = {\n model: 'inverse_square',\n k: 0.02,\n cutoffK: 0.04,\n minGain: 0.004,\n}\n\n/** ±`pct` around `f`: the range a recipe draws a frequency from. */\nconst vary = (f: number, pct = 0.04): readonly [number, number] => [Math.round(f * (1 - pct)), Math.round(f * (1 + pct))]\n\nconst foley = (id: string, layers: readonly Layer[], note: string): SoundRecipe => ({\n id,\n bus: 'world',\n pan: true,\n layers,\n falloff: FOLEY_FALLOFF,\n sources: [`sdk: ${note}`],\n})\n\n/** The click of a latch or a catch: a short band of noise and a tick of metal. */\nconst click = (f: number, vol: number, delay: readonly [number, number] | number = 0): Layer[] => [\n noise({\n type: 'bandpass',\n f: vary(f, 0.08),\n q: 4,\n d: [0.018, 0.03],\n vol: [vol * 0.85, vol * 1.1],\n delay,\n }),\n tone({\n f: vary(f * 0.8, 0.06),\n f2: Math.round(f * 0.62),\n d: [0.015, 0.025],\n vol: vol * 0.18,\n delay,\n }),\n]\n\n/** A leaf meeting its frame: the body (a falling tone), the board or panel (a band of noise) and the latch catching right after. */\nconst meet = (body: number, panel: number, vol: number, latch: number): Layer[] => [\n tone({\n f: vary(body),\n f2: Math.round(body * 0.5),\n d: [0.12, 0.16],\n vol: [vol * 0.9, vol * 1.1],\n }),\n noise({\n type: 'bandpass',\n f: vary(panel, 0.06),\n q: 1.2,\n d: [0.08, 0.12],\n vol: [vol * 0.9, vol * 1.1],\n wet: 0.25,\n }),\n ...click(latch, vol * 0.45, [0.012, 0.028]),\n]\n\n/** The doors and lids of furniture and vehicles, by what the leaf is (the room picks one from the item, else from the leaf's material). */\nexport const LEAF_FOLEY: readonly SoundRecipe[] = [\n // a wooden house door or wardrobe door: latch, a short creak, the leaf on the frame (the hard slam adds the frame rattling)\n foley('door_wood_open', click(2400, 0.4), 'the latch of a wooden door giving'),\n foley(\n 'door_creak',\n [\n tone({ f: [190, 240], f2: 310, d: [0.4, 0.55], vol: [0.04, 0.06] }),\n noise({\n type: 'bandpass',\n f: [480, 560],\n q: 6,\n a: 0.05,\n d: [0.35, 0.5],\n vol: [0.1, 0.14],\n }),\n ],\n 'a wooden hinge turning',\n ),\n foley('door_wood_close', meet(120, 600, 0.55, 2400), 'a wooden leaf meeting its frame'),\n foley(\n 'door_wood_slam',\n [\n ...meet(110, 560, 0.85, 2300),\n ...many(3, () =>\n noise({\n type: 'bandpass',\n f: [900, 1500],\n q: 3,\n d: 0.03,\n vol: [0.08, 0.14],\n delay: [0.05, 0.18],\n }),\n ),\n ],\n 'a wooden door slammed: the frame and the hinges rattle after the hit',\n ),\n // a metal door or gate: a hollow panel that rings a little\n foley('door_metal_open_close', [...meet(160, 900, 0.55, 2000), tone({ f: vary(1250), f2: 1150, d: [0.1, 0.16], vol: 0.06, wet: 0.3 })], 'a metal door or gate meeting its frame'),\n foley(\n 'door_creak_metal',\n [\n tone({ f: [620, 760], f2: 900, d: [0.3, 0.4], vol: [0.03, 0.045] }),\n noise({\n type: 'bandpass',\n f: [1300, 1500],\n q: 8,\n a: 0.04,\n d: [0.25, 0.35],\n vol: [0.07, 0.09],\n }),\n ],\n 'a metal hinge turning',\n ),\n // the handle of a locked door shaken: the latch knocking in its keeper, five to seven times in half a second\n foley(\n 'door_locked_rattle',\n [\n ...many(6, () =>\n noise({\n type: 'bandpass',\n f: [1600, 2600],\n q: 3,\n d: [0.025, 0.04],\n vol: [0.22, 0.34],\n delay: [0, 0.45],\n }),\n ),\n ...many(3, () =>\n tone({\n f: [170, 210],\n f2: 120,\n d: 0.05,\n vol: [0.12, 0.18],\n delay: [0.02, 0.4],\n }),\n ),\n ],\n 'the handle of a locked door shaken: latch knocks and the leaf thumping in its frame',\n ),\n // a fridge: the rubber seal lets go with a soft suck, the bottles in the door clink; closing it is a soft thump and the seal pulling shut\n foley(\n 'fridge_open',\n [\n noise({\n type: 'lowpass',\n f: [320, 380],\n a: 0.03,\n d: [0.14, 0.2],\n vol: [0.32, 0.4],\n }),\n noise({\n type: 'bandpass',\n f: [800, 950],\n f2: 1400,\n q: 2,\n a: 0.02,\n d: 0.12,\n vol: [0.08, 0.12],\n }),\n ...many(2, () =>\n tone({\n f: [2600, 4200],\n d: [0.04, 0.08],\n vol: [0.015, 0.03],\n delay: [0.08, 0.22],\n }),\n ),\n ],\n 'a fridge door: the seal letting go and the bottles in the door',\n ),\n foley(\n 'fridge_close',\n [\n tone({ f: vary(85), f2: 45, d: [0.1, 0.13], vol: [0.38, 0.46] }),\n noise({\n type: 'lowpass',\n f: [520, 620],\n d: [0.08, 0.12],\n vol: [0.3, 0.36],\n }),\n noise({\n type: 'lowpass',\n f: [260, 320],\n a: 0.02,\n d: 0.1,\n vol: [0.12, 0.18],\n delay: [0.04, 0.07],\n }),\n ...many(2, () =>\n tone({\n f: [2600, 4200],\n d: [0.04, 0.07],\n vol: [0.015, 0.03],\n delay: [0.03, 0.12],\n }),\n ),\n ],\n 'a fridge door shut: a soft thump, the seal pulling and the bottles',\n ),\n // a microwave: the spring catch of the door, plastic on plastic\n foley(\n 'microwave_open',\n [\n ...click(1800, 0.34),\n tone({\n f: [3000, 3400],\n f2: 2800,\n d: 0.05,\n vol: 0.025,\n delay: [0.01, 0.02],\n }),\n ],\n 'the spring catch of a microwave door',\n ),\n foley(\n 'microwave_close',\n [\n noise({\n type: 'bandpass',\n f: [1200, 1450],\n q: 2.5,\n d: [0.04, 0.06],\n vol: [0.36, 0.44],\n }),\n tone({ f: vary(180), f2: 120, d: 0.05, vol: [0.16, 0.22] }),\n ...click(2200, 0.2, [0.008, 0.016]),\n ],\n 'a microwave door clacking shut',\n ),\n foley('microwave_beep', [tone({ wave: 'square', f: 2000, d: 0.12, vol: 0.05 })], 'the beep of a microwave'),\n // drawers and sliding leaves: the runners, then the stop\n foley(\n 'drawer_open',\n [\n noise({\n type: 'bandpass',\n f: [620, 780],\n q: 2,\n a: 0.04,\n d: [0.28, 0.36],\n vol: [0.18, 0.24],\n }),\n noise({ type: 'bandpass', f: [2000, 2400], q: 5, d: 0.28, vol: 0.04 }),\n ...click(1400, 0.16, [0.28, 0.34]),\n ],\n 'a drawer on its runners and its stop',\n ),\n foley(\n 'drawer_close',\n [\n noise({\n type: 'bandpass',\n f: [620, 780],\n q: 2,\n a: 0.03,\n d: [0.2, 0.28],\n vol: [0.18, 0.24],\n }),\n tone({\n f: vary(150),\n f2: 90,\n d: 0.08,\n vol: [0.22, 0.3],\n delay: [0.2, 0.26],\n }),\n ],\n 'a drawer pushed home',\n ),\n]\n\n/** What the hand does with an item: picking it up by what it is made of, throwing it, and the uses (opening, drinking, eating, first aid). */\nexport const ITEM_FOLEY: readonly SoundRecipe[] = [\n // the hand closing on the item: a touch of skin and cloth, then the item's own small sound\n foley(\n 'item_pickup_metal',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n tone({\n f: [1900, 2600],\n f2: 1700,\n d: [0.05, 0.08],\n vol: [0.06, 0.09],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a metal thing',\n ),\n foley(\n 'item_pickup_plastic',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'bandpass',\n f: [1500, 1900],\n q: 3,\n d: 0.03,\n vol: [0.15, 0.21],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a plastic thing',\n ),\n foley(\n 'item_pickup_glass',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.15 }),\n tone({\n f: [3200, 4200],\n d: [0.05, 0.08],\n vol: [0.038, 0.06],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a glass thing',\n ),\n foley(\n 'item_pickup_paper',\n [\n noise({\n type: 'highpass',\n f: [2600, 3400],\n a: 0.01,\n d: [0.1, 0.14],\n vol: [0.12, 0.18],\n }),\n noise({ type: 'bandpass', f: [800, 1000], q: 1, d: 0.05, vol: 0.12 }),\n ],\n 'picking up paper or cardboard',\n ),\n foley(\n 'item_pickup_fabric',\n [\n noise({\n type: 'bandpass',\n f: [900, 1300],\n q: 0.8,\n a: 0.02,\n d: [0.12, 0.16],\n vol: [0.15, 0.21],\n }),\n ],\n 'picking up cloth',\n ),\n foley(\n 'item_pickup_wood',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'bandpass',\n f: [900, 1100],\n q: 2,\n d: 0.04,\n vol: [0.15, 0.21],\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up a wooden thing',\n ),\n foley(\n 'item_pickup_food',\n [\n noise({ type: 'bandpass', f: [700, 900], q: 1, d: 0.06, vol: 0.18 }),\n noise({\n type: 'lowpass',\n f: [500, 650],\n d: 0.05,\n vol: 0.12,\n delay: [0.01, 0.03],\n }),\n ],\n 'picking up food',\n ),\n foley(\n 'item_throw',\n [\n noise({\n type: 'bandpass',\n f: [450, 650],\n f2: 1400,\n q: 1.5,\n a: 0.05,\n d: 0.18,\n vol: [0.1, 0.14],\n }),\n ],\n 'the arm throwing something: air',\n ),\n // a can: the tab cracks, the gas hisses out; drinking is gulps; crushing it crumples the sheet\n foley(\n 'can_open',\n [\n ...click(3200, 0.36),\n noise({\n type: 'highpass',\n f: [3600, 4400],\n a: 0.005,\n d: [0.22, 0.3],\n vol: [0.16, 0.22],\n delay: [0.012, 0.02],\n }),\n ...many(5, () => tone({ f: [4000, 7000], d: 0.02, vol: 0.01, delay: [0.05, 0.4] })),\n ],\n 'the tab of a can and the gas hissing out',\n ),\n foley(\n 'can_crush',\n [\n noise({\n type: 'bandpass',\n f: [1600, 2200],\n q: 1.2,\n d: [0.18, 0.25],\n vol: [0.3, 0.38],\n }),\n ...many(6, () =>\n tone({\n f: [1200, 3400],\n f2: 900,\n d: 0.03,\n vol: [0.03, 0.06],\n delay: [0, 0.2],\n }),\n ),\n ],\n 'a can crushed in the hand',\n ),\n foley(\n 'can_puncture_spray',\n [\n noise({\n type: 'highpass',\n f: [2400, 3000],\n a: 0.005,\n d: [0.5, 0.7],\n vol: [0.2, 0.26],\n }),\n noise({ type: 'bandpass', f: [600, 800], q: 2, d: 0.4, vol: 0.06 }),\n ],\n 'a can holed: the jet hissing out',\n ),\n foley(\n 'bottle_open',\n [\n ...many(5, () =>\n noise({\n type: 'bandpass',\n f: [2200, 3000],\n q: 4,\n d: 0.008,\n vol: [0.1, 0.16],\n delay: [0, 0.18],\n }),\n ),\n noise({\n type: 'highpass',\n f: 3800,\n a: 0.005,\n d: 0.12,\n vol: [0.06, 0.1],\n delay: [0.18, 0.22],\n }),\n ],\n 'the screw cap of a bottle turning off',\n ),\n foley(\n 'drink_gulp',\n [\n noise({\n type: 'lowpass',\n f: [280, 360],\n a: 0.02,\n d: [0.1, 0.14],\n vol: [0.24, 0.3],\n }),\n tone({ f: [140, 170], f2: 85, d: [0.08, 0.11], vol: [0.12, 0.16] }),\n ],\n 'a gulp',\n ),\n foley(\n 'eat_crunch',\n [\n ...many(4, () =>\n noise({\n type: 'bandpass',\n f: [1800, 3200],\n q: 1.5,\n d: [0.02, 0.04],\n vol: [0.12, 0.2],\n delay: [0, 0.12],\n }),\n ),\n ],\n 'a bite of something crunchy',\n ),\n foley(\n 'eat_chew',\n [\n noise({\n type: 'lowpass',\n f: [450, 600],\n a: 0.03,\n d: [0.1, 0.14],\n vol: [0.12, 0.16],\n }),\n noise({\n type: 'bandpass',\n f: [1100, 1400],\n q: 2,\n d: 0.04,\n vol: 0.04,\n delay: [0.03, 0.06],\n }),\n ],\n 'chewing',\n ),\n foley(\n 'bandage_wrap',\n [\n noise({\n type: 'bandpass',\n f: [1400, 1800],\n f2: 2400,\n q: 1,\n a: 0.04,\n d: [0.3, 0.4],\n vol: [0.12, 0.16],\n }),\n ],\n 'a bandage unrolled round a limb',\n ),\n foley(\n 'pills_shake',\n [\n ...many(8, () =>\n tone({\n f: [2400, 3600],\n d: 0.015,\n vol: [0.03, 0.05],\n delay: [0, 0.25],\n }),\n ),\n noise({ type: 'bandpass', f: [1500, 1900], q: 2, d: 0.25, vol: 0.05 }),\n ],\n 'pills shaken in their bottle',\n ),\n foley(\n 'medkit_use',\n [\n ...click(1700, 0.24),\n noise({\n type: 'bandpass',\n f: [1000, 1400],\n q: 1,\n a: 0.03,\n d: [0.25, 0.32],\n vol: [0.08, 0.12],\n delay: [0.05, 0.08],\n }),\n ],\n 'a first aid kit opened and rummaged',\n ),\n foley('flashlight_click', click(2600, 0.3), 'the switch of a flashlight'),\n]\n\n/** The foley bank: register it in the engine (`engine.register(FOLEY_BANK)`). */\nexport const FOLEY_BANK: SoundBank = {\n id: 'foley',\n sounds: [...LEAF_FOLEY, ...ITEM_FOLEY],\n}\n\n/** What a picked-up item sounds like, by its heaviest material class. */\nexport const PICKUP_CLASSES = ['metal', 'plastic', 'glass', 'paper', 'fabric', 'wood', 'food'] as const\nexport type PickupClass = (typeof PICKUP_CLASSES)[number]\n\n/** The sound set of a leaf worked by hand: the ids it plays at the latch, while it turns, and as it meets the frame (gently, and slammed). */\nexport type LeafFoley = {\n readonly open: string\n readonly turn?: string\n readonly close: string\n readonly slam?: string\n readonly locked: string\n}\n\n/** The leaf sound sets the kit ships, by name; an item names one (`TestableItem.sounds.leaves`), else the room picks `wood_door` or `metal_door` by the leaf's material. */\nexport const LEAF_FOLEY_SETS: Readonly<Record<string, LeafFoley>> = {\n wood_door: {\n open: 'door_wood_open',\n turn: 'door_creak',\n close: 'door_wood_close',\n slam: 'door_wood_slam',\n locked: 'door_locked_rattle',\n },\n metal_door: {\n open: 'door_wood_open',\n turn: 'door_creak_metal',\n close: 'door_metal_open_close',\n locked: 'door_locked_rattle',\n },\n fridge: {\n open: 'fridge_open',\n close: 'fridge_close',\n locked: 'door_locked_rattle',\n },\n microwave: {\n open: 'microwave_open',\n close: 'microwave_close',\n locked: 'door_locked_rattle',\n },\n drawer: {\n open: 'drawer_open',\n close: 'drawer_close',\n locked: 'door_locked_rattle',\n },\n}\n","// The sounds of a body: footsteps by surface and gait, landings, the swing and the hit of each blow, hurt, bite and grab. Synthesised in the meantime\n// (the kit has no recorded take of these yet): each id is a set of four takes, with the numbers of each take apart, so the same action never\n// sounds twice the same. A recorded take replaces a variant by its id (`register` a bank with the same recipe id) without touching who plays it.\n//\n// How each one is built (what the ear picks first):\n// - a footstep is the heel (a low thump, how hollow the floor is) and then the roll to the toe (the surface's own texture: the grit of concrete,\n// the crunch of gravel, the ring of a metal sheet, the splash of water); a run hits harder, brighter and shorter, heel and toe almost together;\n// - a landing is the whole body's weight on the surface: a deeper thump, the surface texture longer, the clothes after;\n// - a swing is air: a band of noise sweeping up while the limb or the tool speeds up, loudest just before the contact, so it is started early\n// (`SWING_LEAD_SECONDS` of game-contracts) and the contact sound follows it;\n// - a hit on a body is skin (a slap), mass (a thud) and, for a blade, a wet tear; on an object it is only the striking part (knuckles, sole, steel)\n// and the material's own impact plays beside it.\nimport {\n BODY_SOUND_IDS,\n FOOTSTEP_SOUND_IDS,\n GAIT_IDS,\n LAND_SOUND_IDS,\n LANDING_IDS,\n SURFACE_IDS,\n SWING_LEAD_SECONDS,\n footstepSoundId,\n} from '@adatechnology/game-contracts'\nimport type { BlowId, BodySoundId, GaitId, LandingId, SurfaceId } from '@adatechnology/game-contracts'\n\nimport type { Falloff, Layer, SoundBank, SoundRecipe, SoundSet } from '../recipe'\nimport { sceneNoise, sceneTone, sceneVoice } from './scene'\n\n/** Takes per id. */\nexport const BODY_FOLEY_TAKES = 4\n\n/** How each take differs from the first: frequency factor, timing factor and level factor (fixed numbers, so takes are really apart). */\nconst TAKES: readonly { readonly f: number; readonly t: number; readonly v: number }[] = [\n { f: 1, t: 1, v: 1 },\n { f: 1.08, t: 0.9, v: 0.92 },\n { f: 0.93, t: 1.12, v: 1.05 },\n { f: 1.03, t: 1.05, v: 0.88 },\n]\n\n\n/** Footsteps fade fast with distance and lose their top: a step 10 m away is a quarter of the level, 30 m a few percent, and duller. */\nexport const FOOTSTEP_FALLOFF: Falloff = { model: 'inverse_square', k: 0.03, cutoffK: 0.03, minGain: 0.004 }\n/** Blows and body sounds carry further than a step. */\nexport const BODY_FALLOFF: Falloff = { model: 'inverse_square', k: 0.012, cutoffK: 0.015, minGain: 0.004 }\n\ntype Take = (typeof TAKES)[number]\n\n/** What a surface sounds like under a foot: the heel's thump and the texture of the roll. */\ntype SurfaceVoice = {\n /** The heel: thump pitch (Hz), its length (s) and level. */\n readonly heel: { readonly f: number; readonly d: number; readonly vol: number }\n /** The roll to the toe and the scuff: a filtered noise. */\n readonly roll: { readonly type: BiquadFilterType; readonly f: number; readonly q: number; readonly d: number; readonly vol: number }\n /** Grit, crunch or drips: short bursts spread after the heel. */\n readonly grains?: { readonly count: number; readonly f: number; readonly q: number; readonly spread: number; readonly vol: number }\n /** A ring of the floor itself (a hollow board, a metal sheet). */\n readonly ring?: readonly { readonly f: number; readonly d: number; readonly vol: number }[]\n /** Water: a sweep of the splash band. */\n readonly splash?: { readonly f: number; readonly f2: number; readonly d: number; readonly vol: number }\n}\n\nconst SURFACES: Readonly<Record<SurfaceId, SurfaceVoice>> = {\n concrete: { heel: { f: 95, d: 0.05, vol: 0.55 }, roll: { type: 'bandpass', f: 2300, q: 1.1, d: 0.05, vol: 0.38 }, grains: { count: 2, f: 4200, q: 2, spread: 0.04, vol: 0.08 } },\n asphalt: { heel: { f: 90, d: 0.05, vol: 0.5 }, roll: { type: 'bandpass', f: 1700, q: 0.9, d: 0.06, vol: 0.36 }, grains: { count: 4, f: 3600, q: 2.5, spread: 0.06, vol: 0.1 } },\n wood: { heel: { f: 130, d: 0.08, vol: 0.55 }, roll: { type: 'lowpass', f: 1300, q: 0.8, d: 0.06, vol: 0.3 }, ring: [{ f: 210, d: 0.1, vol: 0.18 }, { f: 470, d: 0.06, vol: 0.06 }] },\n tile: { heel: { f: 110, d: 0.04, vol: 0.45 }, roll: { type: 'bandpass', f: 3600, q: 2, d: 0.03, vol: 0.42 }, ring: [{ f: 1900, d: 0.03, vol: 0.05 }] },\n dirt: { heel: { f: 75, d: 0.06, vol: 0.45 }, roll: { type: 'lowpass', f: 750, q: 0.7, d: 0.09, vol: 0.4 }, grains: { count: 3, f: 1800, q: 1.5, spread: 0.07, vol: 0.06 } },\n grass: { heel: { f: 70, d: 0.05, vol: 0.32 }, roll: { type: 'highpass', f: 2600, q: 0.7, d: 0.13, vol: 0.28 }, grains: { count: 4, f: 5200, q: 1.2, spread: 0.1, vol: 0.07 } },\n gravel: { heel: { f: 80, d: 0.05, vol: 0.4 }, roll: { type: 'lowpass', f: 950, q: 0.8, d: 0.1, vol: 0.3 }, grains: { count: 8, f: 2600, q: 3, spread: 0.13, vol: 0.2 } },\n sand: { heel: { f: 65, d: 0.06, vol: 0.3 }, roll: { type: 'bandpass', f: 1500, q: 0.6, d: 0.16, vol: 0.3 }, grains: { count: 5, f: 4800, q: 1.5, spread: 0.12, vol: 0.05 } },\n metal: { heel: { f: 120, d: 0.05, vol: 0.5 }, roll: { type: 'bandpass', f: 2800, q: 1.5, d: 0.03, vol: 0.25 }, ring: [{ f: 420, d: 0.25, vol: 0.16 }, { f: 1130, d: 0.18, vol: 0.09 }, { f: 2470, d: 0.1, vol: 0.04 }] },\n water: { heel: { f: 70, d: 0.04, vol: 0.25 }, roll: { type: 'bandpass', f: 3000, q: 1.2, d: 0.1, vol: 0.18 }, splash: { f: 1100, f2: 380, d: 0.22, vol: 0.55 }, grains: { count: 4, f: 2400, q: 6, spread: 0.18, vol: 0.12 } },\n glass: { heel: { f: 90, d: 0.04, vol: 0.4 }, roll: { type: 'highpass', f: 4500, q: 0.8, d: 0.06, vol: 0.2 }, grains: { count: 9, f: 6200, q: 5, spread: 0.12, vol: 0.22 }, ring: [{ f: 3900, d: 0.04, vol: 0.04 }, { f: 5300, d: 0.03, vol: 0.03 }] },\n carpet: { heel: { f: 70, d: 0.05, vol: 0.32 }, roll: { type: 'lowpass', f: 420, q: 0.7, d: 0.07, vol: 0.3 } },\n}\n\nconst GAITS: Readonly<Record<GaitId, { readonly vol: number; readonly bright: number; readonly toe: number; readonly short: number }>> = {\n walk: { vol: 1, bright: 1, toe: 0.075, short: 1 },\n run: { vol: 1.35, bright: 1.25, toe: 0.035, short: 0.75 },\n}\n\nconst grainLayers = (g: NonNullable<SurfaceVoice['grains']>, take: Take, start: number, scale: number): Layer[] =>\n Array.from({ length: g.count }, (_, i) =>\n sceneNoise({ type: 'bandpass', f: [g.f * take.f * 0.85, g.f * take.f * 1.15], q: g.q, d: [0.008, 0.02], vol: g.vol * scale * take.v, delay: start + ((i + 0.5) / g.count) * g.spread * take.t }),\n )\n\nconst ringLayers = (rings: NonNullable<SurfaceVoice['ring']>, take: Take, scale: number, at = 0): Layer[] =>\n rings.map((r) => sceneTone({ f: r.f * take.f, d: r.d * take.t, vol: r.vol * scale * take.v, delay: at }))\n\n/** The layers of one foot on a surface: heel, roll to the toe, then grains, ring or splash. `weight` scales the heel (a landing is the whole body). */\nfunction footLayers(surface: SurfaceId, take: Take, gait: (typeof GAITS)[GaitId], weight = 1): Layer[] {\n const s = SURFACES[surface]\n const toe = gait.toe * take.t\n return [\n sceneTone({ f: s.heel.f * take.f * weight ** -0.3, f2: s.heel.f * take.f * 0.6, d: s.heel.d * gait.short * take.t * weight ** 0.5, vol: s.heel.vol * gait.vol * take.v * weight ** 0.5 }),\n sceneNoise({ type: 'lowpass', f: 500 * gait.bright, d: 0.02 * take.t, vol: 0.18 * gait.vol * take.v * weight ** 0.5 }),\n sceneNoise({ type: s.roll.type, f: [s.roll.f * take.f * gait.bright * 0.92, s.roll.f * take.f * gait.bright * 1.08], q: s.roll.q, d: s.roll.d * gait.short * take.t * weight ** 0.3, vol: s.roll.vol * gait.vol * take.v, delay: toe }),\n ...(s.grains ? grainLayers(s.grains, take, toe * 0.5, gait.vol * weight ** 0.5) : []),\n ...(s.ring ? ringLayers(s.ring, take, gait.vol * weight ** 0.5) : []),\n ...(s.splash ? [sceneNoise({ type: 'bandpass', f: s.splash.f * take.f, f2: s.splash.f2 * take.f, q: 1.4, d: s.splash.d * take.t * weight ** 0.4, vol: s.splash.vol * gait.vol * take.v * weight ** 0.5 })] : []),\n ]\n}\n\n/** The layers at `level` of their gain (a scene layer's gain is a number or a range). */\nconst quieter = (level: number, layers: readonly Layer[]): Layer[] =>\n layers.map((layer) => {\n const gain = layer.gain ?? 1\n if (typeof gain === 'number') return { ...layer, gain: gain * level }\n if (Array.isArray(gain)) return { ...layer, gain: [gain[0] * level, gain[1] * level] as const }\n return layer\n })\n\nconst recipe = (id: string, layers: readonly Layer[], falloff: Falloff, bus: SoundRecipe['bus'] = 'world'): SoundRecipe => ({ id, bus, pan: true, layers, falloff, sources: ['sdk'] })\n\nconst takeId = (id: string, index: number): string => `${id}_${String(index + 1).padStart(2, '0')}`\n\n/** The four takes of an id and the set that names them. */\nfunction takes(id: string, layersOf: (take: Take, index: number) => Layer[], falloff: Falloff, rate: readonly [number, number] = [0.96, 1.04], bus?: SoundRecipe['bus']): { sounds: SoundRecipe[]; set: SoundSet } {\n const sounds = TAKES.map((take, index) => recipe(takeId(id, index), layersOf(take, index), falloff, bus))\n return { sounds, set: { id, variants: sounds.map((sound) => sound.id), rate } }\n}\n\nconst footstep = (surface: SurfaceId, gait: GaitId) => takes(footstepSoundId(surface, gait), (take) => footLayers(surface, take, GAITS[gait]), FOOTSTEP_FALLOFF)\n\nconst LANDINGS: Readonly<Record<LandingId, { readonly weight: number; readonly cloth: number }>> = { light: { weight: 1.4, cloth: 0.12 }, heavy: { weight: 2.4, cloth: 0.22 } }\n\n/** A landing's layers are the feet's at the body's weight; this brings the whole of it under a blow on a body (C6). */\nconst LANDING_LEVEL = 0.65\n\nconst landing = (surface: SurfaceId, landing: LandingId) =>\n takes(\n `land_${surface}_${landing}`,\n (take) => quieter(LANDING_LEVEL, [\n // both feet, a hair apart, then the knees taking the weight (a low body thump) and the clothes settling\n ...footLayers(surface, take, GAITS.run, LANDINGS[landing].weight),\n ...footLayers(surface, { ...take, v: take.v * 0.6 }, GAITS.run, LANDINGS[landing].weight * 0.6).map((layer) => ({ ...layer, at: (typeof layer.at === 'number' ? layer.at : 0) + 0.018 * take.t })),\n sceneTone({ f: 60 * take.f, f2: 38, d: 0.14 * LANDINGS[landing].weight * take.t, vol: 0.22 * LANDINGS[landing].weight ** 0.7 * take.v, delay: 0.02 }),\n sceneNoise({ type: 'bandpass', f: [1800, 2600], q: 0.8, d: 0.18, vol: LANDINGS[landing].cloth * take.v, delay: 0.04 }),\n ]),\n FOOTSTEP_FALLOFF,\n )\n\nconst whoosh = (blow: BlowId, from: number, to: number, d: number, vol: number, q = 1.6): ((take: Take) => Layer[]) => (take) => [\n // the air: a band sweeping up as the limb speeds up; it peaks `SWING_LEAD_SECONDS` in, the moment before the contact, then dies away\n sceneNoise({ type: 'bandpass', f: from * take.f, f2: to * take.f, q, a: SWING_LEAD_SECONDS[blow], d: d * take.t, vol: vol * take.v }),\n sceneNoise({ type: 'lowpass', f: 600 * take.f, a: SWING_LEAD_SECONDS[blow], d: d * take.t * 0.8, vol: vol * 0.35 * take.v }),\n]\n\n/** Skin, mass and (optionally) bone: what a blow on a body is made of. */\nconst fleshHit = (o: { slap: number; slapF: number; thud: number; thudF: number; thudD: number; crack?: number; wet?: number }): ((take: Take) => Layer[]) => (take) => [\n sceneNoise({ type: 'bandpass', f: o.slapF * take.f, q: 1.2, d: 0.03 * take.t, vol: o.slap * take.v }),\n sceneNoise({ type: 'highpass', f: 3500 * take.f, d: 0.012, vol: o.slap * 0.4 * take.v }),\n sceneTone({ f: o.thudF * take.f, f2: o.thudF * 0.5, d: o.thudD * take.t, vol: o.thud * take.v }),\n sceneNoise({ type: 'lowpass', f: 600 * take.f, d: o.thudD * 1.2 * take.t, vol: o.thud * 0.5 * take.v }),\n ...(o.crack ? [sceneNoise({ type: 'highpass', f: 2500, d: 0.015, vol: o.crack * take.v, delay: 0.006 }), sceneTone({ wave: 'square', f: 900 * take.f, f2: 300, d: 0.02, vol: o.crack * 0.15 * take.v, delay: 0.006 })] : []),\n ...(o.wet ? [sceneNoise({ type: 'bandpass', f: 1400 * take.f, f2: 500, q: 2.5, d: 0.12 * take.t, vol: o.wet * take.v, delay: 0.01 })] : []),\n]\n\n/** What only the striking part sounds like on a hard thing (the material's impact plays beside it). */\nconst knock = (o: { clickF: number; click: number; tones: readonly (readonly [number, number, number])[] }): ((take: Take) => Layer[]) => (take) => [\n sceneNoise({ type: 'bandpass', f: o.clickF * take.f, q: 1.5, d: 0.018, vol: o.click * take.v }),\n ...o.tones.map(([f, d, vol]) => sceneTone({ f: f * take.f, d: d * take.t, vol: vol * take.v })),\n]\n\nconst voice = (o: { f0: number; f1: number; d: number; fA: number; fB: number; noise: number; vol: number }): ((take: Take) => Layer[]) => (take) => [\n sceneVoice({ f0: o.f0 * take.f, f1: o.f1 * take.f, d: o.d * take.t, fA: o.fA * take.f, fB: o.fB * take.f, noise: o.noise, vol: o.vol * take.v }),\n]\n\nconst BODY: Readonly<Record<BodySoundId, (take: Take) => Layer[]>> = {\n jump: (take) => [\n sceneNoise({ type: 'bandpass', f: 900 * take.f, f2: 1700 * take.f, q: 1, a: 0.03, d: 0.12, vol: 0.18 * take.v }),\n sceneNoise({ type: 'bandpass', f: 2200 * take.f, q: 0.8, d: 0.04, vol: 0.12 * take.v }),\n sceneTone({ f: 85 * take.f, f2: 60, d: 0.04, vol: 0.2 * take.v }),\n ],\n cloth_rustle: (take) => [\n { ...sceneNoise({ type: 'bandpass', f: 2400 * take.f, q: 0.8, a: 0.06, d: 0.22 * take.t, vol: 0.12 * take.v }), modulators: [{ target: 'gain', wave: 'triangle', rate: [9, 14], depth: 0.5 }] },\n ],\n body_fall: (take) => [\n sceneTone({ f: 58 * take.f, f2: 35, d: 0.28 * take.t, vol: 0.9 * take.v }),\n sceneNoise({ type: 'lowpass', f: 480 * take.f, d: 0.3 * take.t, vol: 0.55 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1300 * take.f, q: 1, d: 0.05, vol: 0.3 * take.v }),\n // the limbs a moment later, and the clothes\n sceneTone({ f: 75 * take.f, f2: 45, d: 0.12, vol: 0.4 * take.v, delay: 0.13 * take.t }),\n sceneNoise({ type: 'bandpass', f: 2200, q: 0.8, d: 0.2, vol: 0.12 * take.v, delay: 0.05 }),\n ],\n fall_damage: (take) => [\n ...BODY.body_fall(take),\n sceneNoise({ type: 'highpass', f: 2800, d: 0.02, vol: 0.35 * take.v, delay: 0.01 }),\n ...voice({ f0: 170, f1: 110, d: 0.32, fA: 650, fB: 1150, noise: 0.25, vol: 0.32 })(take).map((layer) => ({ ...layer, at: 0.08 })),\n ],\n player_hurt: voice({ f0: 150, f1: 105, d: 0.26, fA: 620, fB: 1100, noise: 0.3, vol: 0.35 }),\n player_breath_run: (take) => [\n sceneNoise({ type: 'bandpass', f: 1200 * take.f, q: 1, a: 0.08, d: 0.22 * take.t, vol: 0.25 * take.v }),\n sceneNoise({ type: 'bandpass', f: 900 * take.f, q: 1, a: 0.06, d: 0.26 * take.t, vol: 0.3 * take.v, delay: 0.3 * take.t }),\n ],\n player_death: voice({ f0: 135, f1: 68, d: 1, fA: 560, fB: 980, noise: 0.35, vol: 0.4 }),\n bite: (take) => [\n sceneNoise({ type: 'highpass', f: 2600, d: 0.015, vol: 0.4 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1600 * take.f, f2: 450, q: 2.2, d: 0.16 * take.t, vol: 0.55 * take.v, delay: 0.01 }),\n sceneNoise({ type: 'bandpass', f: 3200 * take.f, f2: 1800, q: 1.2, d: 0.22 * take.t, vol: 0.25 * take.v, delay: 0.09 }),\n sceneTone({ f: 120 * take.f, f2: 70, d: 0.06, vol: 0.3 * take.v }),\n ],\n grab: (take) => [\n sceneNoise({ type: 'bandpass', f: 1900 * take.f, q: 0.9, a: 0.004, d: 0.13 * take.t, vol: 0.32 * take.v }),\n sceneTone({ f: 95 * take.f, f2: 60, d: 0.07, vol: 0.3 * take.v }),\n sceneNoise({ type: 'lowpass', f: 700, d: 0.08, vol: 0.2 * take.v }),\n ],\n punch_swing: whoosh('punch', 450, 1500, 0.16, 0.9),\n punch_hit_body: fleshHit({ slap: 0.55, slapF: 1500, thud: 0.6, thudF: 115, thudD: 0.09 }),\n punch_hit_face: fleshHit({ slap: 0.75, slapF: 2300, thud: 0.45, thudF: 150, thudD: 0.07, crack: 0.25 }),\n punch_hit_object: knock({ clickF: 1800, click: 0.3, tones: [[210, 0.04, 0.25]] }),\n kick_swing: whoosh('kick', 280, 950, 0.22, 1, 1.3),\n kick_hit: fleshHit({ slap: 0.45, slapF: 1100, thud: 0.85, thudF: 82, thudD: 0.14 }),\n kick_hit_object: knock({ clickF: 1000, click: 0.3, tones: [[92, 0.08, 0.5]] }),\n shove_two_hands: (take) => [\n sceneNoise({ type: 'bandpass', f: 950 * take.f, q: 0.9, a: 0.01, d: 0.13 * take.t, vol: 0.38 * take.v }),\n sceneTone({ f: 100 * take.f, f2: 60, d: 0.1 * take.t, vol: 0.45 * take.v }),\n sceneNoise({ type: 'bandpass', f: 2300, q: 0.8, d: 0.16, vol: 0.12 * take.v, delay: 0.03 }),\n ],\n knife_swing: whoosh('blade', 1900, 4600, 0.12, 1.1, 2.2),\n knife_stab: fleshHit({ slap: 0.2, slapF: 1200, thud: 0.4, thudF: 160, thudD: 0.06, wet: 0.5 }),\n knife_slash: (take) => [\n sceneNoise({ type: 'highpass', f: 3200 * take.f, f2: 1800, d: 0.13 * take.t, vol: 0.35 * take.v }),\n sceneNoise({ type: 'bandpass', f: 1300 * take.f, f2: 600, q: 2.5, d: 0.12 * take.t, vol: 0.35 * take.v, delay: 0.02 }),\n ],\n knife_hit_object: knock({ clickF: 3200, click: 0.25, tones: [[2800, 0.08, 0.07], [4150, 0.06, 0.05]] }),\n blunt_swing: whoosh('blunt', 220, 760, 0.28, 1.1, 1.5),\n blunt_hit: fleshHit({ slap: 0.35, slapF: 900, thud: 1, thudF: 70, thudD: 0.18, crack: 0.3 }),\n blunt_hit_object: knock({ clickF: 1400, click: 0.35, tones: [[300, 0.12, 0.25], [760, 0.08, 0.12]] }),\n axe_swing: whoosh('chop', 190, 620, 0.3, 1.2, 1.4),\n axe_chop: fleshHit({ slap: 0.3, slapF: 1400, thud: 0.75, thudF: 140, thudD: 0.1, crack: 0.35, wet: 0.45 }),\n axe_hit_object: knock({ clickF: 2200, click: 0.4, tones: [[1500, 0.15, 0.1], [2300, 0.1, 0.06], [140, 0.1, 0.35]] }),\n}\n\nconst BODY_BUS: Partial<Record<BodySoundId, SoundRecipe['bus']>> = { player_hurt: 'voices', player_death: 'voices', player_breath_run: 'voices', fall_damage: 'voices' }\n\nconst built = [\n ...SURFACE_IDS.flatMap((surface) => GAIT_IDS.map((gait) => footstep(surface, gait))),\n ...SURFACE_IDS.flatMap((surface) => LANDING_IDS.map((l) => landing(surface, l))),\n ...BODY_SOUND_IDS.map((id) => takes(id, BODY[id], BODY_FALLOFF, id.endsWith('_swing') ? [0.94, 1.06] : [0.96, 1.04], BODY_BUS[id])),\n]\n\n/**\n * Every body sound of `game-contracts`' `BODY_FOLEY_IDS` as a set of four takes (`footstep_concrete_walk` plays `footstep_concrete_walk_01`..`_04`,\n * never the same twice in a row, at ±4% of rate). Register it in the engine the body plays on.\n */\nexport const BODY_FOLEY_BANK: SoundBank = {\n id: 'body_foley',\n sounds: built.flatMap((entry) => entry.sounds),\n sets: built.map((entry) => entry.set),\n}\n\n/** The ids the bank answers (the sets), in the contract's order. */\nexport const BODY_FOLEY_SET_IDS: readonly string[] = [...FOOTSTEP_SOUND_IDS, ...LAND_SOUND_IDS, ...BODY_SOUND_IDS]\n","import type { AudioListener, AudioSink, LoopHandle, SoundHandle, SoundRequest } from '@adatechnology/game-contracts'\n\nimport type { SoundBank } from '../recipe'\nimport type { AudioEngine, VoiceHandle } from './engine'\n\n/** An `AudioSink` (what a host lends its modules) that carries the engine behind it, so a module that wants more than `play` can use the engine. */\nexport type EngineSink = AudioSink & { readonly engine: AudioEngine }\n\n/** Lends an engine as the host's `audio`: sounds by key, loops, the listener, and banks registered into the same engine. */\nexport function createAudioSink(engine: AudioEngine): EngineSink {\n const playing = new Map<number, VoiceHandle>()\n return {\n engine,\n play(request: SoundRequest): SoundHandle | null {\n const handle = engine.play(request.sound, {\n ...(request.position ? { position: request.position } : {}),\n ...(request.volume === undefined ? {} : { volume: request.volume }),\n ...(request.params ? { params: request.params } : {}),\n ...(request.seed === undefined ? {} : { seed: request.seed }),\n ...(request.delay === undefined ? {} : { delay: request.delay }),\n ...(request.urgent ? { urgent: true } : {}),\n })\n if (!handle) return null\n playing.set(handle.id, handle)\n return { id: handle.id }\n },\n stop(handle) {\n playing.get(handle.id)?.stop()\n playing.delete(handle.id)\n },\n loop(sound, options): LoopHandle {\n const loop = engine.loop(sound)\n // the loop's place comes with the first set; `params.cutoff` drives the first filter\n let position = options?.position\n return {\n set: (state) => {\n position = state.position ?? position\n const cutoff = state.params?.['cutoff']\n loop.set({\n ...(state.volume === undefined ? {} : { volume: state.volume }),\n ...(state.frequency === undefined ? {} : { frequency: state.frequency }),\n ...(position ? { position } : {}),\n ...(cutoff === undefined ? {} : { cutoff }),\n })\n },\n stop: () => loop.stop(),\n }\n },\n setListener(listener: AudioListener) {\n engine.setListener(listener)\n },\n register(bank: unknown) {\n engine.register(bank as SoundBank)\n },\n }\n}\n"],"mappings":"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","names":["landing"]}
|