Skip to content

Sound descriptors

Описание звуков, categories, fallback formats и preload.

Практическая схема

  • Документация: NovaUIKit.
  • Раздел: Motion и Sound.
  • Тема страницы: Sound descriptors.
  • Переключатель TypeScript / DSL находится в панели навигации; вкладка Код в примере показывает файлы выбранного подхода.
Исполняемый примерSound mixerИнтерактивные pads и Sound Engine lifecycle.
import { Nova, NovaNode, type NovaSchema } from '@endge/nova'

// Документационный сценарий: nova-sound-mixer
class ExampleNode extends NovaNode<Record<string, Event>> {
  render(): void {
    const schema: NovaSchema = [
      {
        type: 'rect',
        x: 24,
        y: 24,
        width: this.width - 48,
        height: this.height - 48,
        styles: { background: '#0d2745' },
      },
      {
        type: 'text',
        x: 44,
        y: 44,
        width: this.width - 88,
        height: 32,
        text: 'Sound mixer',
        styles: { color: '#e8f5ff' },
      },
    ]

    this.renderer.schema(schema)
    this.setRenderBoundsFromSchema(schema)
  }
}

export function mountExample(canvas: HTMLCanvasElement) {
  const app = Nova.createApp({
    target: canvas,
    size: { width: canvas.clientWidth, height: canvas.clientHeight, maxDpr: 2 },
    scheduler: { loop: false },
  })
  const surface = app.surface({ id: 'sound-mixer' })
  surface.createNode(ExampleNode)

  return () => app.destroy()
}
interface · @endge/nova

NovaSoundEngine

App-level сервис для загрузки, кеширования и воспроизведения коротких UI/game sounds.

class NovaSoundEngine
Lifecycle
ПолеТипОписание
load(descriptor | descriptor[])Promise<void>Нормализует descriptors, выбирает source format и кеширует decoded resource по id.
preload(...)Promise<void>Алиас для фоновой загрузки sounds до первого interaction.
unlock()Promise<void>Разблокирует Web Audio context после пользовательского жеста.
destroy()voidОстанавливает handles, очищает кеши и освобождает backend resources.
Playback
ПолеТипОписание
play(id, options)NovaSoundHandleЗапускает one-shot или loop playback и возвращает управляемый handle.
stop(handle | id?)voidОстанавливает конкретный handle, все handles asset id или весь активный playback.
scope(name)NovaSoundScopeСоздает lifecycle-bound scope для scene/component sounds.
stats()NovaSoundStatsВозвращает loaded/active/played/skipped/decoded и текущие mute/volume flags.
Mix
ПолеТипОписание
setMuted(muted)voidПереключает master mute без изменения renderer state.
setVolume(volume)voidМеняет master volume в диапазоне 0..1.
setCategoryVolume(category, volume)voidМеняет GainNode категории: ui, fx, ambient или custom category.
interface · @endge/nova

NovaSoundDescriptor

Описание sound asset: id, source fallback, category, volume и ограничения playback.

interface NovaSoundDescriptor
Asset
ПолеТипОписание
idrequiredstringПубличный ключ asset для app.sound.play(id).
srcrequiredstring | string[]URL, data URI, nova-tone source или список format fallback.
categorystring'default'Mixer category для отдельной громкости.
preloadbooleanfalseМаркер намерения фоновой загрузки descriptor.
Playback defaults
ПолеТипОписание
volumenumber1Базовая громкость asset.
loopbooleanfalseDefault loop flag для play().
cooldownMsnumber0Минимальный интервал между playback одного dedupe key.
maxInstancesnumberЛимит одновременных instances одного asset.
prioritynumber0Приоритет при вытеснении из voice pool.
interface · @endge/nova

NovaSoundPlayOptions

Runtime overrides одного playback: mix, rate, pan, loop, dedupe и limits.

interface NovaSoundPlayOptions
Mix
ПолеТипОписание
volumenumberГромкость конкретного playback.
categorystringПереопределяет descriptor category.
pannumberStereo pan от -1 до 1, если backend поддерживает StereoPannerNode.
Behavior
ПолеТипОписание
ratenumber1Playback rate/pitch для коротких feedback sounds.
loopbooleanЗапускает loop playback, который нужно остановить handle/scope lifecycle.
dedupeKeystringОстанавливает предыдущий active playback того же key.
cooldownMsnumberЛокальный cooldown для rapid hover/click.
prioritynumberПриоритет вытеснения из maxVoices pool.

Как применять

Используйте страницу как короткую рабочую заметку: сначала определите границу ответственности, затем откройте пример и сравните TypeScript-реализацию с DSL-описанием. Runtime-код остается в Nova-слое, а Vue отвечает только за mount, layout shell и cleanup.