{"version":3,"sources":["../src/player/connect.ts","../src/player/signals.ts","../src/player/volume.ts","../src/player/channel.ts","../src/player/sorted-queue.ts","../src/player/queued-player.ts","../src/player/sample-player.ts","../src/player/default-player.ts","../src/player/load-audio.ts","../src/storage.ts","../src/drum-machine/dm-instrument.ts","../src/drum-machine/drum-machine.ts","../src/player/midi.ts","../src/sfz/sfz-load.ts","../src/sfz/sfz-regions.ts","../src/sfz/sfz-sampler.ts","../src/tremolo.ts","../src/electric-piano.ts","../src/player/layers.ts","../src/player/region-player.ts","../src/sfz2.ts","../src/versilian.ts","../src/mallet.ts","../src/mellotron.ts","../src/reverb/processor.min.ts","../src/reverb/reverb.ts","../src/sampler.ts","../src/smolken.ts","../src/soundfont/soundfont-instrument.ts","../src/soundfont/soundfont-loops.ts","../src/soundfont/soundfont.ts","../src/soundfont2.ts","../src/splendid-grand-piano.ts"],"sourcesContent":["export type AudioInsert = {\n  input: AudioNode;\n  output: AudioNode;\n};\n\nexport function connectSerial(nodes: (AudioNode | AudioInsert | undefined)[]) {\n  const _nodes = nodes.filter((x): x is AudioNode | AudioInsert => !!x);\n  _nodes.reduce((a, b) => {\n    const left = \"output\" in a ? a.output : a;\n    const right = \"input\" in b ? b.input : b;\n    left.connect(right);\n    return b;\n  });\n\n  return () => {\n    _nodes.reduce((a, b) => {\n      const left = \"output\" in a ? a.output : a;\n      const right = \"input\" in b ? b.input : b;\n      left.disconnect(right);\n      return b;\n    });\n  };\n}\n\nexport function connectAudioBus(\n  node: AudioNode,\n  destination: AudioNode,\n  gain: number\n) {\n  const mix = node.context.createGain();\n  mix.gain.value = gain;\n  node.connect(mix);\n  mix.connect(destination);\n\n  return () => {\n    node.disconnect(mix);\n    mix.disconnect(destination);\n  };\n}\n","/**\n * A function to unsubscribe from an event or control\n */\nexport type Unsubscribe = () => void;\n/**\n * A function that listener to event or control changes\n */\nexport type Listener<T> = (value: T) => void;\n/**\n * A function to subscribe an trigger or control events\n */\nexport type Subscribe<T> = (listener: Listener<T>) => Unsubscribe;\n\n/**\n * A trigger is a subscribable event\n */\nexport type Trigger<T> = {\n  subscribe: Subscribe<T>;\n  trigger: (event: T) => void;\n};\n\n/**\n * A control is a subscribable value\n */\nexport type Control<T> = {\n  subscribe: Subscribe<T>;\n  set: (value: T) => void;\n  get: () => T;\n};\n\n/**\n * Create a control signal\n * @param initialValue\n * @returns Control\n */\nexport function createControl<T>(initialValue: T): Control<T> {\n  let current = initialValue;\n  const listeners = new Set<Listener<T>>();\n\n  function subscribe(listener: Listener<T>) {\n    listeners.add(listener);\n    listener(current);\n    return () => {\n      listeners.delete(listener);\n    };\n  }\n\n  function set(value: T) {\n    current = value;\n    listeners.forEach((listener) => listener(current));\n  }\n\n  function get(): T {\n    return current;\n  }\n  return { subscribe, set, get };\n}\n\nexport function createTrigger<T>(): Trigger<T> {\n  const listeners = new Set<Listener<T>>();\n\n  function subscribe(listener: Listener<T>) {\n    listeners.add(listener);\n    return () => {\n      listeners.delete(listener);\n    };\n  }\n\n  function trigger(value: T) {\n    listeners.forEach((listener) => listener(value));\n  }\n\n  return { subscribe, trigger };\n}\n\nexport function unsubscribeAll(unsubscribe: Array<Unsubscribe | undefined>) {\n  let done = false;\n  return () => {\n    if (done) return;\n    done = true;\n    unsubscribe.forEach((cb) => cb?.());\n  };\n}\n","/// This is how the MIDI association converts midi velocity [0..127] into gain [0..1]\n/// @see https://www.midi.org/specifications/file-format-specifications/dls-downloadable-sounds/dls-level-1\nexport function midiVelToGain(vel: number) {\n  return (vel * vel) / 16129; // 16129 = 127 * 127\n}\n\nexport function dbToGain(decibels: number) {\n  return Math.pow(10, decibels / 20);\n}\n","import { AudioInsert, connectSerial } from \"./connect\";\nimport { createControl } from \"./signals\";\nimport { midiVelToGain } from \"./volume\";\n\nexport type ChannelConfig = {\n  destination: AudioNode;\n  volume: number;\n  volumeToGain: (volume: number) => number;\n};\n\nexport type OutputChannel = Omit<Channel, \"input\">;\n\ntype Send = {\n  name: string;\n  mix: GainNode;\n  disconnect: () => void;\n};\n\n/**\n * An output channel with audio effects\n * @private\n */\nexport class Channel {\n  public readonly setVolume: (vol: number) => void;\n  public readonly input: AudioNode;\n\n  #volume: GainNode;\n  #sends?: Send[];\n  #inserts?: (AudioNode | AudioInsert)[];\n  #disconnect: () => void;\n  #unsubscribe: () => void;\n  #config: Readonly<ChannelConfig>;\n  #disconnected = false;\n\n  constructor(\n    public readonly context: BaseAudioContext,\n    options?: Partial<ChannelConfig>\n  ) {\n    this.#config = {\n      destination: options?.destination ?? context.destination,\n      volume: options?.volume ?? 100,\n      volumeToGain: options?.volumeToGain ?? midiVelToGain,\n    };\n\n    this.input = context.createGain();\n    this.#volume = context.createGain();\n\n    this.#disconnect = connectSerial([\n      this.input,\n      this.#volume,\n      this.#config.destination,\n    ]);\n\n    const volume = createControl(this.#config.volume);\n    this.setVolume = volume.set;\n    this.#unsubscribe = volume.subscribe((volume) => {\n      this.#volume.gain.value = this.#config.volumeToGain(volume);\n    });\n  }\n\n  addInsert(effect: AudioNode | AudioInsert) {\n    if (this.#disconnected) {\n      throw Error(\"Can't add insert to disconnected channel\");\n    }\n    this.#inserts ??= [];\n    this.#inserts.push(effect);\n    this.#disconnect();\n    this.#disconnect = connectSerial([\n      this.input,\n      ...this.#inserts,\n      this.#volume,\n      this.#config.destination,\n    ]);\n  }\n\n  addEffect(\n    name: string,\n    effect: AudioNode | { input: AudioNode },\n    mixValue: number\n  ) {\n    if (this.#disconnected) {\n      throw Error(\"Can't add effect to disconnected channel\");\n    }\n    const mix = this.context.createGain();\n    mix.gain.value = mixValue;\n    const input = \"input\" in effect ? effect.input : effect;\n    const disconnect = connectSerial([this.#volume, mix, input]);\n\n    this.#sends ??= [];\n    this.#sends.push({ name, mix, disconnect });\n  }\n\n  sendEffect(name: string, mix: number) {\n    if (this.#disconnected) {\n      throw Error(\"Can't send effect to disconnected channel\");\n    }\n\n    const send = this.#sends?.find((send) => send.name === name);\n    if (send) {\n      send.mix.gain.value = mix;\n    } else {\n      console.warn(\"Send bus not found: \" + name);\n    }\n  }\n\n  disconnect() {\n    if (this.#disconnected) return;\n    this.#disconnected = true;\n    this.#disconnect();\n    this.#unsubscribe();\n    this.#sends?.forEach((send) => send.disconnect());\n    this.#sends = undefined;\n  }\n}\n","/**\n * A sorted items that uses binary search to insert items in sorted order.\n * @private\n */\nexport class SortedQueue<T> {\n  #items: T[] = [];\n  constructor(public readonly compare: (a: T, b: T) => number) {}\n\n  push(item: T) {\n    const len = this.#items.length;\n\n    let left = 0;\n    let right = len - 1;\n    let index = len;\n\n    while (left <= right) {\n      const mid = Math.floor((left + right) / 2);\n      if (this.compare(item, this.#items[mid]) < 0) {\n        index = mid;\n        right = mid - 1;\n      } else {\n        left = mid + 1;\n      }\n    }\n\n    this.#items.splice(index, 0, item);\n  }\n\n  pop() {\n    return this.#items.shift();\n  }\n\n  peek(): T | undefined {\n    return this.#items[0];\n  }\n\n  removeAll(predicate: (item: T) => boolean) {\n    const len = this.#items.length;\n    this.#items = this.#items.filter((item) => !predicate(item));\n    return this.#items.length !== len;\n  }\n\n  clear() {\n    this.#items = [];\n  }\n\n  size() {\n    return this.#items.length;\n  }\n}\n","import { SortedQueue } from \"./sorted-queue\";\nimport { InternalPlayer, SampleStart, SampleStop } from \"./types\";\n\ntype SampleStartWithTime = SampleStart & { time: number };\n\nfunction compose<T>(a?: (x: T) => void, b?: (x: T) => void) {\n  return a && b\n    ? (x: T) => {\n        a(x);\n        b(x);\n      }\n    : a ?? b;\n}\n\nexport type QueuedPlayerConfig = {\n  disableScheduler: boolean;\n  scheduleLookaheadMs: number;\n  scheduleIntervalMs: number;\n  onStart?: (sample: SampleStart) => void;\n  onEnded?: (sample: SampleStart) => void;\n};\n\nfunction getConfig(options: Partial<QueuedPlayerConfig>) {\n  const config: QueuedPlayerConfig = {\n    disableScheduler: options.disableScheduler ?? false,\n    scheduleLookaheadMs: options.scheduleLookaheadMs ?? 200,\n    scheduleIntervalMs: options.scheduleIntervalMs ?? 50,\n    onStart: options.onStart,\n    onEnded: options.onEnded,\n  };\n\n  if (config.scheduleLookaheadMs < 1) {\n    throw Error(\"scheduleLookaheadMs must be greater than 0\");\n  }\n  if (config.scheduleIntervalMs < 1) {\n    throw Error(\"scheduleIntervalMs must be greater than 0\");\n  }\n  if (config.scheduleLookaheadMs < config.scheduleIntervalMs) {\n    throw Error(\"scheduleLookaheadMs must be greater than scheduleIntervalMs\");\n  }\n\n  return config;\n}\n\n/**\n * A SamplePlayer that queues up samples to be played in the future.\n *\n * @private\n */\nexport class QueuedPlayer implements InternalPlayer {\n  private readonly player: InternalPlayer;\n  #config: QueuedPlayerConfig;\n  #queue: SortedQueue<SampleStartWithTime>;\n  #intervalId: NodeJS.Timeout | undefined;\n\n  public constructor(\n    player: InternalPlayer,\n    options: Partial<QueuedPlayerConfig> = {}\n  ) {\n    this.#config = getConfig(options);\n\n    this.#queue = new SortedQueue<SampleStartWithTime>(\n      (a, b) => a.time - b.time\n    );\n    this.player = player;\n  }\n\n  get context() {\n    return this.player.context;\n  }\n\n  get buffers() {\n    return this.player.buffers;\n  }\n\n  get isRunning() {\n    return this.#intervalId !== undefined;\n  }\n\n  start(sample: SampleStart) {\n    if (this.#config.disableScheduler) {\n      return this.player.start(sample);\n    }\n    const context = this.player.context;\n    const now = context.currentTime;\n    const startAt = sample.time ?? now;\n    const lookAhead = this.#config.scheduleLookaheadMs / 1000;\n    sample.onStart = compose(sample.onStart, this.#config.onStart);\n    sample.onEnded = compose(sample.onEnded, this.#config.onEnded);\n\n    if (startAt < now + lookAhead) {\n      return this.player.start(sample);\n    }\n    this.#queue.push({ ...sample, time: startAt });\n\n    if (!this.#intervalId) {\n      this.#intervalId = setInterval(() => {\n        const nextTick = context.currentTime + lookAhead;\n        while (this.#queue.size() && this.#queue.peek()!.time <= nextTick) {\n          const sample = this.#queue.pop();\n          if (sample) {\n            this.player.start(sample);\n          }\n        }\n        if (!this.#queue.size()) {\n          clearInterval(this.#intervalId!);\n          this.#intervalId = undefined;\n        }\n      }, this.#config.scheduleIntervalMs);\n    }\n\n    return (time?: number) => {\n      if (!time || time < startAt) {\n        if (!this.#queue.removeAll((item) => item === sample)) {\n          this.player.stop({ ...sample, time });\n        }\n      } else {\n        this.player.stop({ ...sample, time });\n      }\n    };\n  }\n\n  stop(sample?: SampleStop) {\n    if (this.#config.disableScheduler) {\n      return this.player.stop(sample);\n    }\n\n    this.player.stop(sample);\n\n    if (!sample) {\n      this.#queue.clear();\n      return;\n    }\n\n    const time = sample?.time ?? 0;\n    const stopId = sample?.stopId;\n    if (stopId) {\n      this.#queue.removeAll((item) =>\n        item.time >= time && item.stopId\n          ? item.stopId === stopId\n          : item.note === stopId\n      );\n    } else {\n      this.#queue.removeAll((item) => item.time >= time);\n    }\n  }\n\n  disconnect() {\n    this.player.disconnect();\n  }\n}\n","import { connectSerial } from \"./connect\";\nimport { AudioBuffers } from \"./load-audio\";\nimport { Trigger, createTrigger, unsubscribeAll } from \"./signals\";\nimport {\n  InternalPlayer,\n  SampleOptions,\n  SampleStart,\n  SampleStop,\n} from \"./types\";\nimport { midiVelToGain } from \"./volume\";\n\nexport type SamplePlayerConfig = {\n  velocityToGain: (velocity: number) => number;\n  destination: AudioNode;\n} & SampleOptions;\n\n/**\n * A sample player. This is used internally by the Sampler.\n *\n * @private Not intended for public use\n */\nexport class SamplePlayer implements InternalPlayer {\n  public readonly buffers: AudioBuffers;\n  #config: SamplePlayerConfig;\n  #disconnected = false;\n  #stop: Trigger<SampleStop | undefined>;\n\n  public constructor(\n    public readonly context: BaseAudioContext,\n    private readonly options: Partial<SamplePlayerConfig>\n  ) {\n    this.#config = {\n      velocityToGain: options.velocityToGain ?? midiVelToGain,\n      destination: options.destination ?? context.destination,\n    };\n    this.buffers = {};\n    this.#stop = createTrigger();\n  }\n\n  public start(sample: SampleStart) {\n    if (this.#disconnected) {\n      throw new Error(\"Can't start a sample on disconnected player\");\n    }\n    const context = this.context;\n    const buffer =\n      (sample.name && this.buffers[sample.name]) || this.buffers[sample.note];\n    if (!buffer) {\n      console.warn(`Sample not found: '${sample.note}'`);\n      return () => undefined;\n    }\n\n    const source = context.createBufferSource();\n    source.buffer = buffer;\n\n    // Seems that detune is not implemented in Safari (and therefore, in standardized-audio-context)\n    const cents = sample.detune ?? this.options.detune ?? 0;\n    if (source.detune) {\n      source.detune.value = cents;\n    } else if (source.playbackRate) {\n      source.playbackRate.value = Math.pow(2, cents / 1200);\n    }\n\n    // Low pass filter\n    const lpfCutoffHz = sample.lpfCutoffHz ?? this.options.lpfCutoffHz;\n    const lpf = lpfCutoffHz ? context.createBiquadFilter() : undefined;\n    if (lpfCutoffHz && lpf) {\n      lpf.type = \"lowpass\";\n      lpf.frequency.value = lpfCutoffHz;\n    }\n\n    // Sample volume\n    const volume = context.createGain();\n    const velocity = sample.velocity ?? this.options.velocity ?? 100;\n    volume.gain.value = this.#config.velocityToGain(velocity);\n\n    const loop = sample.loop ?? this.options.loop;\n    if (loop) {\n      source.loop = true;\n      source.loopStart = sample.loopStart ?? 0;\n      source.loopEnd = sample.loopEnd ?? buffer.duration;\n    }\n\n    // Stop with decay\n    const decayTime = sample.decayTime ?? this.options.decayTime;\n    const [decay, startDecay] = createDecayEnvelope(context, decayTime);\n    function stop(time?: number) {\n      time ??= context.currentTime;\n      if (time <= startAt) {\n        source.stop(time);\n      } else {\n        const stopAt = startDecay(time);\n        source.stop(stopAt);\n      }\n    }\n\n    // Compensate gain\n    const gainCompensation = sample.gainOffset\n      ? context.createGain()\n      : undefined;\n    if (gainCompensation && sample.gainOffset) {\n      gainCompensation.gain.value = sample.gainOffset;\n    }\n\n    const stopId = sample.stopId ?? sample.note;\n    const cleanup = unsubscribeAll([\n      connectSerial([\n        source,\n        lpf,\n        volume,\n        decay,\n        gainCompensation,\n        this.#config.destination,\n      ]),\n      sample.stop?.(stop),\n      this.#stop.subscribe((event) => {\n        if (!event || event.stopId === undefined || event.stopId === stopId) {\n          stop(event?.time);\n        }\n      }),\n    ]);\n    source.onended = () => {\n      cleanup();\n      sample.onEnded?.(sample);\n    };\n\n    sample.onStart?.(sample);\n    const startAt = Math.max(sample.time ?? 0, context.currentTime);\n    source.start(sample.time);\n\n    let duration = sample.duration ?? buffer.duration;\n    if (typeof sample.duration == \"number\") {\n      stop(startAt + duration);\n    }\n\n    return stop;\n  }\n\n  stop(sample?: SampleStop) {\n    this.#stop.trigger(sample);\n  }\n\n  public disconnect() {\n    if (this.#disconnected) return;\n    this.#disconnected = true;\n    this.stop();\n    Object.keys(this.buffers).forEach((key) => {\n      delete this.buffers[key];\n    });\n  }\n\n  public get connected() {\n    return !this.#disconnected;\n  }\n}\n\nfunction createDecayEnvelope(\n  context: BaseAudioContext,\n  envelopeTime = 0.2\n): [AudioNode, (time: number) => number] {\n  let stopAt = 0;\n  const envelope = context.createGain();\n  envelope.gain.value = 1.0;\n\n  function start(time: number): number {\n    if (stopAt) return stopAt;\n    envelope.gain.cancelScheduledValues(time);\n    const envelopeAt = time || context.currentTime;\n    stopAt = envelopeAt + envelopeTime;\n    envelope.gain.setValueAtTime(1.0, envelopeAt);\n    envelope.gain.linearRampToValueAtTime(0, stopAt);\n\n    return stopAt;\n  }\n\n  return [envelope, start];\n}\n","import { SamplerConfig } from \"../sampler\";\nimport { Channel, ChannelConfig, OutputChannel } from \"./channel\";\nimport { QueuedPlayer, QueuedPlayerConfig } from \"./queued-player\";\nimport { SamplePlayer } from \"./sample-player\";\nimport { InternalPlayer, SampleStart, SampleStop } from \"./types\";\n\nexport type DefaultPlayerConfig = ChannelConfig &\n  SamplerConfig &\n  QueuedPlayerConfig;\n\n/**\n * Player used by instruments\n * @private\n */\nexport class DefaultPlayer implements InternalPlayer {\n  public readonly output: OutputChannel;\n  private readonly player: InternalPlayer;\n\n  constructor(\n    public readonly context: BaseAudioContext,\n    options?: Partial<DefaultPlayerConfig>\n  ) {\n    const channel = new Channel(context, options);\n    this.player = new QueuedPlayer(\n      new SamplePlayer(context, { ...options, destination: channel.input }),\n      options\n    );\n    this.output = channel;\n  }\n\n  get buffers() {\n    return this.player.buffers;\n  }\n\n  public start(sample: SampleStart) {\n    return this.player.start(sample);\n  }\n\n  public stop(sample?: SampleStop | string | number) {\n    this.player.stop(\n      typeof sample === \"object\"\n        ? sample\n        : sample !== undefined\n        ? { stopId: sample }\n        : undefined\n    );\n  }\n\n  disconnect() {\n    this.output.disconnect();\n    this.player.disconnect();\n  }\n}\n","import { Storage } from \"../storage\";\n\nexport type AudioBuffers = Record<string | number, AudioBuffer | undefined>;\n\n/**\n * A function that downloads audio into a AudioBuffers\n */\nexport type AudioBuffersLoader = (\n  context: BaseAudioContext,\n  buffers: AudioBuffers\n) => Promise<void>;\n\nexport async function loadAudioBuffer(\n  context: BaseAudioContext,\n  url: string,\n  storage: Storage\n): Promise<AudioBuffer | undefined> {\n  url = url.replace(/#/g, \"%23\").replace(/([^:]\\/)\\/+/g, \"$1\");\n  const response = await storage.fetch(url);\n  if (response.status !== 200) {\n    console.warn(\n      \"Error loading buffer. Invalid status: \",\n      response.status,\n      url\n    );\n    return;\n  }\n  try {\n    const audioData = await response.arrayBuffer();\n    const buffer = await context.decodeAudioData(audioData);\n    return buffer;\n  } catch (error) {\n    console.warn(\"Error loading buffer\", error, url);\n  }\n}\n\nexport function findFirstSupportedFormat(formats: string[]): string | null {\n  if (typeof document === \"undefined\") return null;\n\n  const audio = document.createElement(\"audio\");\n  for (let i = 0; i < formats.length; i++) {\n    const format = formats[i];\n    const canPlay = audio.canPlayType(`audio/${format}`);\n    if (canPlay === \"probably\" || canPlay === \"maybe\") {\n      return format;\n    }\n    // check Safari for aac format\n    if (format === \"m4a\") {\n      const canPlay = audio.canPlayType(`audio/aac`);\n      if (canPlay === \"probably\" || canPlay === \"maybe\") {\n        return format;\n      }\n    }\n  }\n  return null;\n}\n\nexport function getPreferredAudioExtension() {\n  const format = findFirstSupportedFormat([\"ogg\", \"m4a\"]) ?? \"ogg\";\n  return \".\" + format;\n}\n","export type StorageResponse = {\n  readonly status: number;\n  arrayBuffer(): Promise<ArrayBuffer>;\n  json(): Promise<any>;\n  text(): Promise<string>;\n};\n\nexport type Storage = {\n  fetch: (url: string) => Promise<StorageResponse>;\n};\n\nexport const HttpStorage: Storage = {\n  fetch(url) {\n    return fetch(url);\n  },\n};\n\nexport class CacheStorage implements Storage {\n  #cache: Promise<Cache>;\n\n  constructor(name = \"smplr\") {\n    if (typeof window === \"undefined\" || !(\"caches\" in window)) {\n      this.#cache = Promise.reject(\"CacheStorage not supported\");\n    } else {\n      this.#cache = caches.open(name);\n    }\n  }\n\n  async fetch(url: string): Promise<StorageResponse> {\n    const request = new Request(url);\n    try {\n      return await this.#tryFromCache(request);\n    } catch (err) {\n      const response = await fetch(request);\n      await this.#saveResponse(request, response);\n      return response;\n    }\n  }\n\n  async #tryFromCache(request: Request): Promise<StorageResponse> {\n    const cache = await this.#cache;\n    const response = await cache.match(request);\n    if (response) return response;\n    else throw Error(\"Not found\");\n  }\n\n  async #saveResponse(request: Request, response: Response) {\n    try {\n      const cache = await this.#cache;\n      await cache.put(request, response.clone());\n    } catch (err) {}\n  }\n}\n","import { Storage } from \"../storage\";\n\nexport function isDrumMachineInstrument(\n  instrument: any\n): instrument is DrumMachineInstrument {\n  return (\n    typeof instrument === \"object\" &&\n    typeof instrument.baseUrl === \"string\" &&\n    typeof instrument.name === \"string\" &&\n    Array.isArray(instrument.samples) &&\n    Array.isArray(instrument.groupNames) &&\n    typeof instrument.nameToSampleName === \"object\" &&\n    typeof instrument.sampleGroupVariations === \"object\"\n  );\n}\n\nexport type DrumMachineInstrument = {\n  baseUrl: string;\n  name: string;\n  samples: string[];\n  groupNames: string[];\n  nameToSampleName: Record<string, string | undefined>;\n  sampleGroupVariations: Record<string, string[]>;\n};\nexport const EMPTY_INSTRUMENT: DrumMachineInstrument = {\n  baseUrl: \"\",\n  name: \"\",\n  samples: [],\n  groupNames: [],\n  nameToSampleName: {},\n  sampleGroupVariations: {},\n};\n\nexport async function fetchDrumMachineInstrument(\n  url: string,\n  storage: Storage\n): Promise<DrumMachineInstrument> {\n  const res = await storage.fetch(url);\n  const json = await res.json();\n  // need to fix json\n  json.baseUrl = url.replace(\"/dm.json\", \"\");\n  json.groupNames = [];\n  json.nameToSampleName = {};\n  json.sampleGroupVariations = {};\n  for (const sample of json.samples) {\n    json.nameToSampleName[sample] = sample;\n    const separator = sample.indexOf(\"/\") !== -1 ? \"/\" : \"-\";\n    const [base, variation] = sample.split(separator);\n    if (!json.groupNames.includes(base)) {\n      json.groupNames.push(base);\n    }\n    json.nameToSampleName[base] ??= sample;\n    json.sampleGroupVariations[base] ??= [];\n    if (variation) {\n      json.sampleGroupVariations[base].push(`${base}${separator}${variation}`);\n    }\n  }\n\n  return json;\n}\n","import { OutputChannel } from \"../player/channel\";\nimport { DefaultPlayer, DefaultPlayerConfig } from \"../player/default-player\";\nimport {\n  AudioBuffers,\n  findFirstSupportedFormat,\n  loadAudioBuffer,\n} from \"../player/load-audio\";\nimport { SampleStart, SampleStop } from \"../player/types\";\nimport { HttpStorage, Storage } from \"../storage\";\nimport {\n  DrumMachineInstrument,\n  EMPTY_INSTRUMENT,\n  fetchDrumMachineInstrument,\n  isDrumMachineInstrument,\n} from \"./dm-instrument\";\n\nexport function getDrumMachineNames() {\n  return Object.keys(INSTRUMENTS);\n}\n\nconst INSTRUMENTS: Record<string, string> = {\n  \"TR-808\": \"https://smpldsnds.github.io/drum-machines/TR-808/dm.json\",\n  \"Casio-RZ1\": \"https://smpldsnds.github.io/drum-machines/Casio-RZ1/dm.json\",\n  \"LM-2\": \"https://smpldsnds.github.io/drum-machines/LM-2/dm.json\",\n  \"MFB-512\": \"https://smpldsnds.github.io/drum-machines/MFB-512/dm.json\",\n  \"Roland CR-8000\":\n    \"https://smpldsnds.github.io/drum-machines/Roland-CR-8000/dm.json\",\n};\n\ntype DrumMachineConfig = {\n  instrument: string | DrumMachineInstrument;\n  url: string;\n  storage: Storage;\n};\n\nexport type DrumMachineOptions = Partial<\n  DrumMachineConfig & DefaultPlayerConfig\n>;\n\nfunction getConfig(options?: DrumMachineOptions): DrumMachineConfig {\n  const config = {\n    instrument: options?.instrument ?? \"TR-808\",\n    storage: options?.storage ?? HttpStorage,\n    url: options?.url ?? \"\",\n  };\n  if (typeof config.instrument === \"string\") {\n    config.url ||= INSTRUMENTS[config.instrument];\n    if (!config.url)\n      throw new Error(\"Invalid instrument: \" + config.instrument);\n  } else if (!isDrumMachineInstrument(config.instrument)) {\n    throw new Error(\"Invalid instrument: \" + config.instrument);\n  }\n\n  return config;\n}\n\nexport class DrumMachine {\n  #instrument = EMPTY_INSTRUMENT;\n  private readonly player: DefaultPlayer;\n  public readonly load: Promise<this>;\n  public readonly output: OutputChannel;\n\n  public constructor(context: AudioContext, options?: DrumMachineOptions) {\n    const config = getConfig(options);\n\n    const instrument = isDrumMachineInstrument(config.instrument)\n      ? Promise.resolve(config.instrument)\n      : fetchDrumMachineInstrument(config.url, config.storage);\n    this.player = new DefaultPlayer(context, options);\n    this.output = this.player.output;\n    this.load = drumMachineLoader(\n      context,\n      this.player.buffers,\n      instrument,\n      config.storage\n    ).then(() => this);\n\n    instrument.then((instrument) => {\n      this.#instrument = instrument;\n    });\n  }\n\n  getSampleNames(): string[] {\n    return this.#instrument.samples.slice();\n  }\n\n  getGroupNames(): string[] {\n    return this.#instrument.groupNames.slice();\n  }\n\n  getSampleNamesForGroup(groupName: string): string[] {\n    return this.#instrument.sampleGroupVariations[groupName] ?? [];\n  }\n\n  start(sample: SampleStart) {\n    const sampleName = this.#instrument.nameToSampleName[sample.note];\n    return this.player.start({\n      ...sample,\n      note: sampleName ? sampleName : sample.note,\n      stopId: sample.stopId ?? sample.note,\n    });\n  }\n\n  stop(sample: SampleStop) {\n    return this.player.stop(sample);\n  }\n\n  /** @deprecated */\n  async loaded() {\n    console.warn(\"deprecated: use load instead\");\n    return this.load;\n  }\n  /** @deprecated */\n  get sampleNames(): string[] {\n    console.log(\"deprecated: Use getGroupNames instead\");\n    return this.#instrument.groupNames.slice();\n  }\n  /** @deprecated */\n  getVariations(groupName: string): string[] {\n    console.warn(\"deprecated: use getSampleNamesForGroup\");\n    return this.#instrument.sampleGroupVariations[groupName] ?? [];\n  }\n}\n\nfunction drumMachineLoader(\n  context: BaseAudioContext,\n  buffers: AudioBuffers,\n  instrument: Promise<DrumMachineInstrument>,\n  storage: Storage\n) {\n  const format = findFirstSupportedFormat([\"ogg\", \"m4a\"]) ?? \"ogg\";\n  return instrument.then((data) =>\n    Promise.all(\n      data.samples.map(async (sampleName) => {\n        const url = `${data.baseUrl}/${sampleName}.${format}`;\n        const buffer = await loadAudioBuffer(context, url, storage);\n        if (buffer) buffers[sampleName] = buffer;\n      })\n    )\n  );\n}\n","function noteNameToMidi(note: string): number | undefined {\n  const REGEX = /^([a-gA-G]?)(#{1,}|b{1,}|)(-?\\d+)$/;\n  const m = REGEX.exec(note);\n  if (!m) return;\n  const letter = m[1].toUpperCase();\n  if (!letter) return;\n\n  const acc = m[2];\n  const alt = acc[0] === \"b\" ? -acc.length : acc.length;\n  const oct = m[3] ? +m[3] : 4;\n\n  const step = (letter.charCodeAt(0) + 3) % 7;\n  return [0, 2, 4, 5, 7, 9, 11][step] + alt + 12 * (oct + 1);\n}\n\nexport function toMidi(note: string | number | undefined): number | undefined {\n  return note === undefined\n    ? undefined\n    : typeof note === \"number\"\n    ? note\n    : noteNameToMidi(note);\n}\n\nexport function findNearestMidi(\n  midi: number,\n  isAvailable: Record<string | number, unknown>\n): [number, number] {\n  let i = 0;\n  while (isAvailable[midi + i] === undefined && i < 128) {\n    if (i > 0) i = -i;\n    else i = -i + 1;\n  }\n\n  return i === 127 ? [midi, 0] : [midi + i, -i * 100];\n}\n","import {\n  AudioBuffers,\n  findFirstSupportedFormat,\n  loadAudioBuffer,\n} from \"../player/load-audio\";\nimport { Storage } from \"../storage\";\nimport { SfzInstrument } from \"./sfz-kits\";\nimport { Websfz, WebsfzGroup } from \"./websfz\";\n\nexport async function loadSfzBuffers(\n  context: AudioContext,\n  buffers: AudioBuffers,\n  websfz: Websfz,\n  storage: Storage\n) {\n  websfz.groups.forEach((group) => {\n    const urls = getWebsfzGroupUrls(websfz, group);\n    return loadAudioBuffers(context, buffers, urls, storage);\n  });\n}\n\nexport async function SfzInstrumentLoader(\n  instrument: string | Websfz | SfzInstrument,\n  storage: Storage\n): Promise<Websfz> {\n  const isWebsfz = (inst: any): inst is Websfz => \"global\" in inst;\n  const isSfzInstrument = (inst: any): inst is SfzInstrument =>\n    \"websfzUrl\" in inst;\n\n  if (typeof instrument === \"string\") {\n    return fetchWebSfz(instrument, storage);\n  } else if (isWebsfz(instrument)) {\n    return instrument;\n  } else if (isSfzInstrument(instrument)) {\n    const websfz = await fetchWebSfz(instrument.websfzUrl, storage);\n    websfz.meta ??= {};\n    if (instrument.name) websfz.meta.name = instrument.name;\n    if (instrument.baseUrl) websfz.meta.baseUrl = instrument.baseUrl;\n    if (instrument.formats) websfz.meta.formats = instrument.formats;\n    return websfz;\n  } else {\n    throw new Error(\"Invalid instrument: \" + JSON.stringify(instrument));\n  }\n}\n\n// @private\nasync function loadAudioBuffers(\n  context: AudioContext,\n  buffers: AudioBuffers,\n  urls: Record<string, string>,\n  storage: Storage\n) {\n  await Promise.all(\n    Object.keys(urls).map(async (sampleId) => {\n      if (buffers[sampleId]) return;\n\n      const buffer = await loadAudioBuffer(context, urls[sampleId], storage);\n      if (buffer) buffers[sampleId] = buffer;\n      return buffers;\n    })\n  );\n}\n\n// @private\nasync function fetchWebSfz(url: string, storage: Storage): Promise<Websfz> {\n  try {\n    const response = await fetch(url);\n    const json = await response.json();\n    return json as Websfz;\n  } catch (error) {\n    console.warn(`Can't load SFZ file ${url}`, error);\n    throw new Error(`Can't load SFZ file ${url}`);\n  }\n}\n\n// @private\nexport function getWebsfzGroupUrls(websfz: Websfz, group: WebsfzGroup) {\n  const urls: Record<string, string> = {};\n  const baseUrl = websfz.meta.baseUrl ?? \"\";\n  const format = findFirstSupportedFormat(websfz.meta.formats ?? []) ?? \"ogg\";\n\n  const prefix = websfz.global[\"default_path\"] ?? \"\";\n\n  if (!group) return urls;\n\n  return group.regions.reduce((urls, region) => {\n    if (region.sample) {\n      urls[region.sample] = `${baseUrl}/${prefix}${region.sample}.${format}`;\n    }\n    return urls;\n  }, urls);\n}\n","import { Websfz, WebsfzGroup, WebsfzRegion } from \"./websfz\";\n\nfunction checkRange(value?: number, low?: number, hi?: number) {\n  const isAboveLow = low === undefined || (value !== undefined && value >= low);\n  const isBelowHi = hi === undefined || (value !== undefined && value <= hi);\n  return isAboveLow && isBelowHi;\n}\n\nexport function findRegions(\n  websfz: Websfz,\n  note: { midi?: number; velocity?: number; cc64?: number }\n): [WebsfzGroup, WebsfzRegion][] {\n  const regions: [WebsfzGroup, WebsfzRegion][] = [];\n  for (const group of websfz.groups) {\n    if (\n      checkRange(note.midi, group.lokey, group.hikey) &&\n      checkRange(note.velocity, group.lovel, group.hivel) &&\n      checkRange(note.cc64, group.locc64, group.hicc64)\n    ) {\n      for (const region of group.regions) {\n        if (\n          checkRange(note.midi, region.lokey, region.hikey) &&\n          checkRange(note.velocity, region.lovel, region.hivel) &&\n          checkRange(note.cc64, group.locc64, group.hicc64)\n        ) {\n          regions.push([group, region]);\n        }\n      }\n    }\n  }\n  return regions;\n}\n","import { DefaultPlayer, DefaultPlayerConfig } from \"../player/default-player\";\nimport { toMidi } from \"../player/midi\";\nimport { SampleStart, SampleStop } from \"../player/types\";\nimport { HttpStorage, Storage } from \"../storage\";\nimport { SfzInstrument } from \"./sfz-kits\";\nimport { SfzInstrumentLoader, loadSfzBuffers } from \"./sfz-load\";\nimport { findRegions } from \"./sfz-regions\";\nimport { Websfz } from \"./websfz\";\n\nexport type SfzSamplerConfig = {\n  instrument: SfzInstrument | Websfz | string;\n  storage: Storage;\n  destination: AudioNode;\n  volume: number;\n  velocity: number;\n  detune: number;\n  decayTime?: number;\n  lpfCutoffHz?: number;\n};\n\nconst EMPTY_WEBSFZ: Websfz = Object.freeze({\n  meta: {},\n  global: {},\n  groups: [],\n});\n\nexport class SfzSampler {\n  public readonly options: Readonly<SfzSamplerConfig>;\n  private readonly player: DefaultPlayer;\n  #websfz: Websfz;\n  public readonly load: Promise<this>;\n\n  constructor(\n    public readonly context: AudioContext,\n    options: Partial<SfzSamplerConfig & DefaultPlayerConfig> &\n      Pick<SfzSamplerConfig, \"instrument\">\n  ) {\n    this.options = Object.freeze(\n      Object.assign(\n        {\n          volume: 100,\n          velocity: 100,\n          storage: HttpStorage,\n          detune: 0,\n          destination: context.destination,\n        },\n        options\n      )\n    );\n    this.player = new DefaultPlayer(context, options);\n    this.#websfz = EMPTY_WEBSFZ;\n\n    this.load = SfzInstrumentLoader(options.instrument, this.options.storage)\n      .then((result) => {\n        this.#websfz = Object.freeze(result);\n        return loadSfzBuffers(\n          context,\n          this.player.buffers,\n          this.#websfz,\n          this.options.storage\n        );\n      })\n      .then(() => this);\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  async loaded() {\n    console.warn(\"deprecated: use load instead\");\n    return this.load;\n  }\n\n  start(sample: SampleStart | string | number) {\n    this.#startLayers(typeof sample === \"object\" ? sample : { note: sample });\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    this.player.stop(sample);\n  }\n\n  disconnect() {\n    this.player.disconnect();\n  }\n\n  #startLayers(sample: SampleStart) {\n    const midi = toMidi(sample.note);\n    if (midi === undefined) return () => undefined;\n\n    const velocity = sample.velocity ?? this.options.velocity;\n    const regions = findRegions(this.#websfz, { midi, velocity });\n\n    const onEnded = () => {\n      sample.onEnded?.(sample);\n    };\n\n    const stopAll = regions.map(([group, region]) => {\n      let target = region.pitch_keycenter ?? region.key ?? midi;\n      const detune = (midi - target) * 100;\n      return this.player.start({\n        ...sample,\n        note: region.sample,\n        decayTime: sample.decayTime,\n        detune: detune + (sample.detune ?? this.options.detune),\n        onEnded,\n        stopId: midi,\n      });\n    });\n\n    switch (stopAll.length) {\n      case 0:\n        return () => undefined;\n      case 1:\n        return stopAll[0];\n      default:\n        return (time?: number) => stopAll.forEach((stop) => stop(time));\n    }\n  }\n}\n","import { AudioInsert } from \"./player/connect\";\nimport { Subscribe } from \"./player/signals\";\n\n// @private\nexport function createTremolo(\n  context: AudioContext,\n  depth: Subscribe<number>\n): AudioInsert {\n  const input = context.createGain();\n  const output = context.createGain();\n\n  // force mono sources to be stereo\n  input.channelCount = 2;\n  input.channelCountMode = \"explicit\";\n\n  const splitter = context.createChannelSplitter(2);\n  const ampL = context.createGain();\n  const ampR = context.createGain();\n  const merger = context.createChannelMerger(2);\n\n  const lfoL = context.createOscillator();\n  lfoL.type = \"sine\";\n  lfoL.frequency.value = 1;\n  lfoL.start();\n  const lfoLAmp = context.createGain();\n  const lfoR = context.createOscillator();\n  lfoR.type = \"sine\";\n  lfoR.frequency.value = 1.1;\n  lfoR.start();\n  const lfoRAmp = context.createGain();\n\n  input.connect(splitter);\n  splitter.connect(ampL, 0);\n  splitter.connect(ampR, 1);\n  ampL.connect(merger, 0, 0);\n  ampR.connect(merger, 0, 1);\n  lfoL.connect(lfoLAmp);\n  lfoLAmp.connect(ampL.gain);\n  lfoR.connect(lfoRAmp);\n  lfoRAmp.connect(ampR.gain);\n  merger.connect(output);\n\n  const unsubscribe = depth((depth) => {\n    lfoLAmp.gain.value = depth;\n    lfoRAmp.gain.value = depth;\n  });\n\n  input.disconnect = () => {\n    unsubscribe();\n    lfoL.stop();\n    lfoR.stop();\n    input.disconnect(splitter);\n    splitter.disconnect(ampL, 0);\n    splitter.disconnect(ampR, 1);\n    ampL.disconnect(merger, 0, 0);\n    ampR.disconnect(merger, 0, 1);\n    lfoL.disconnect(ampL);\n    lfoR.disconnect(ampR);\n    merger.disconnect(output);\n  };\n\n  return { input, output };\n}\n","import { createControl } from \"./player/signals\";\nimport { midiVelToGain } from \"./player/volume\";\nimport { SfzSampler, SfzSamplerConfig } from \"./sfz/sfz-sampler\";\nimport { createTremolo } from \"./tremolo\";\n\nexport function getElectricPianoNames() {\n  return Object.keys(INSTRUMENTS);\n}\n\nconst INSTRUMENTS: Record<string, string> = {\n  CP80: \"https://danigb.github.io/samples/gs-e-pianos/CP80/cp80.websfz.json\",\n  PianetT:\n    \"https://danigb.github.io/samples/gs-e-pianos/Pianet T/pianet-t.websfz.json\",\n  WurlitzerEP200:\n    \"https://danigb.github.io/samples/gs-e-pianos/Wurlitzer EP200/wurlitzer-ep200.websfz.json\",\n  TX81Z:\n    \"https://danigb.github.io/samples/vcsl/TX81Z/tx81z-fm-piano.websfz.json\",\n};\n\nexport class ElectricPiano extends SfzSampler {\n  public readonly tremolo: Readonly<{ level: (value: number) => void }>;\n  constructor(\n    context: AudioContext,\n    options: Partial<SfzSamplerConfig> & { instrument: string }\n  ) {\n    super(context, {\n      ...options,\n      instrument: INSTRUMENTS[options.instrument] ?? options.instrument,\n    });\n    const depth = createControl(0);\n    this.tremolo = {\n      level: (level) => depth.set(midiVelToGain(level)),\n    };\n    const tremolo = createTremolo(context, depth.subscribe);\n    this.output.addInsert(tremolo);\n  }\n}\n","import { toMidi } from \"./midi\";\nimport {\n  RegionGroup,\n  SampleOptions,\n  SampleRegion,\n  SampleStart,\n  SamplerInstrument,\n} from \"./types\";\nimport { dbToGain } from \"./volume\";\n\nexport function createEmptySamplerInstrument(\n  options: Partial<SampleOptions> = {}\n): SamplerInstrument {\n  return { groups: [], options };\n}\n\nexport function createEmptyRegionGroup(): RegionGroup {\n  return { regions: [] };\n}\n\nexport function findSamplesInRegions(\n  group: RegionGroup,\n  sample: SampleStart,\n  seqNumber?: number | undefined,\n  options?: Partial<SampleOptions>\n): SampleStart[] {\n  const results: SampleStart[] = [];\n  const midi = toMidi(sample.note);\n  if (midi === undefined) return results;\n\n  for (const region of group.regions) {\n    const found = findSampleInRegion(\n      midi,\n      seqNumber ?? 0,\n      sample,\n      region,\n      options\n    );\n    if (found) results.push(found);\n  }\n  return results;\n}\n\nexport function findFirstSampleInRegions(\n  group: RegionGroup,\n  sample: SampleStart,\n  seqNumber?: number | undefined,\n  options?: SampleOptions\n): SampleStart | undefined {\n  const midi = toMidi(sample.note);\n\n  if (midi === undefined) return undefined;\n\n  for (const region of group.regions) {\n    const found = findSampleInRegion(\n      midi,\n      seqNumber ?? 0,\n      sample,\n      region,\n      options\n    );\n    if (found) return found;\n  }\n  return undefined;\n}\n\nfunction findSampleInRegion(\n  midi: number,\n  seqNum: number,\n  sample: SampleStart,\n  region: SampleRegion,\n  defaults?: Partial<SampleOptions>\n): SampleStart | undefined {\n  const matchMidi =\n    midi >= (region.midiLow ?? 0) && midi < (region.midiHigh ?? 127) + 1;\n  if (!matchMidi) return undefined;\n  const matchVelocity =\n    sample.velocity === undefined ||\n    (sample.velocity >= (region.velLow ?? 0) &&\n      sample.velocity <= (region.velHigh ?? 127));\n  if (!matchVelocity) return undefined;\n\n  if (region.seqLength) {\n    const currentSeq = seqNum % region.seqLength;\n    const regionIndex = (region.seqPosition ?? 1) - 1;\n    if (currentSeq !== regionIndex) return undefined;\n  }\n\n  const semitones = midi - region.midiPitch;\n  const velocity = sample.velocity ?? defaults?.velocity;\n  const regionGainOffset = region.volume ? dbToGain(region.volume) : 0;\n  const sampleGainOffset = sample.gainOffset ?? defaults?.gainOffset ?? 0;\n  const sampleDetune = sample.detune ?? 0;\n  return {\n    decayTime:\n      sample?.decayTime ?? region.sample?.decayTime ?? defaults?.decayTime,\n    detune: 100 * (semitones + (region.tune ?? 0)) + sampleDetune,\n    duration: sample?.duration ?? region.sample?.duration ?? defaults?.duration,\n    gainOffset: sampleGainOffset + regionGainOffset || undefined,\n    loop: sample?.loop ?? region.sample?.loop ?? defaults?.loop,\n    loopEnd: sample?.loopEnd ?? region.sample?.loopEnd ?? defaults?.loopEnd,\n    loopStart:\n      sample?.loopStart ?? region.sample?.loopStart ?? defaults?.loopStart,\n    lpfCutoffHz:\n      sample?.lpfCutoffHz ??\n      region.sample?.lpfCutoffHz ??\n      defaults?.lpfCutoffHz,\n    name: region.sampleName,\n    note: midi,\n    onEnded: sample.onEnded,\n    onStart: sample.onStart,\n    stopId: sample.name,\n    time: sample.time,\n    velocity: velocity == undefined ? undefined : velocity,\n  };\n}\n\nexport function spreadRegions(regions: SampleRegion[]) {\n  if (regions.length === 0) return [];\n  regions.sort((a, b) => a.midiPitch - b.midiPitch);\n  regions[0].midiLow = 0;\n  regions[0].midiHigh = 127;\n  if (regions.length === 1) return regions;\n\n  for (let i = 1; i < regions.length; i++) {\n    const prev = regions[i - 1];\n    const curr = regions[i];\n    const mid = Math.floor((prev.midiPitch + curr.midiPitch) / 2);\n    prev.midiHigh = mid;\n    curr.midiLow = mid + 1;\n  }\n  regions[regions.length - 1].midiHigh = 127;\n\n  return regions;\n}\n","import { Channel, ChannelConfig, OutputChannel } from \"./channel\";\nimport { createEmptySamplerInstrument, findSamplesInRegions } from \"./layers\";\nimport { toMidi } from \"./midi\";\nimport { QueuedPlayer, QueuedPlayerConfig } from \"./queued-player\";\nimport { SamplePlayer } from \"./sample-player\";\nimport {\n  InternalPlayer,\n  SampleOptions,\n  SampleStart,\n  SampleStop,\n  SamplerInstrument,\n  StopFn,\n} from \"./types\";\n\nexport type RegionPlayerOptions = ChannelConfig &\n  SampleOptions &\n  QueuedPlayerConfig;\n\n/**\n * A player with an channel output and a region group to read samples info from\n * @private\n */\nexport class RegionPlayer implements InternalPlayer {\n  public readonly output: OutputChannel;\n  public instrument: SamplerInstrument;\n  private readonly player: InternalPlayer;\n  private seqNum = 0;\n\n  constructor(\n    public readonly context: BaseAudioContext,\n    options: Partial<RegionPlayerOptions>\n  ) {\n    const channel = new Channel(context, options);\n    this.instrument = createEmptySamplerInstrument(options);\n    this.player = new QueuedPlayer(\n      new SamplePlayer(context, { ...options, destination: channel.input }),\n      options\n    );\n    this.output = channel;\n  }\n\n  get buffers() {\n    return this.player.buffers;\n  }\n\n  start(sample: SampleStart | string | number) {\n    const stopAll: StopFn[] = [];\n    const sampleStart = typeof sample === \"object\" ? sample : { note: sample };\n    for (const group of this.instrument.groups) {\n      const found = findSamplesInRegions(group, sampleStart, this.seqNum);\n      this.seqNum++;\n      for (const sample of found) {\n        let stop = this.player.start(sample);\n        stopAll.push(stop);\n      }\n    }\n    return (time?: number) => stopAll.forEach((stop) => stop(time));\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    if (sample == undefined) {\n      this.player.stop();\n      return;\n    }\n\n    const toStop = typeof sample === \"object\" ? sample : { stopId: sample };\n    const midi = toMidi(toStop.stopId);\n    if (!midi) return;\n    toStop.stopId = midi;\n    this.player.stop(toStop);\n  }\n\n  disconnect() {\n    this.output.disconnect();\n    this.player.disconnect();\n  }\n}\n","import {\n  AudioBuffers,\n  getPreferredAudioExtension,\n  loadAudioBuffer,\n} from \"./player/load-audio\";\nimport { RegionGroup, SampleRegion } from \"./player/types\";\nimport { Storage } from \"./storage\";\n\nexport type SfzLoaderConfig = {\n  urlFromSampleName: (sampleName: string, audioExt: string) => string;\n  buffers: AudioBuffers;\n  group: RegionGroup;\n};\n\nexport function SfzInstrumentLoader(url: string, config: SfzLoaderConfig) {\n  const audioExt = getPreferredAudioExtension();\n\n  return async (\n    context: BaseAudioContext,\n    storage: Storage\n  ): Promise<RegionGroup> => {\n    const sfz = await fetch(url).then((res) => res.text());\n    const errors = sfzToLayer(sfz, config.group);\n    if (errors.length) {\n      console.warn(\"Problems converting sfz\", errors);\n    }\n    const sampleNames = new Set<string>();\n    config.group.regions.forEach((r) => sampleNames.add(r.sampleName));\n    return Promise.all(\n      Array.from(sampleNames).map(async (sampleName) => {\n        const sampleUrl = config.urlFromSampleName(sampleName, audioExt);\n        const buffer = await loadAudioBuffer(context, sampleUrl, storage);\n        config.buffers[sampleName] = buffer;\n      })\n    ).then(() => config.group);\n  };\n}\n\nexport function sfzToLayer(sfz: string, group: RegionGroup) {\n  let mode = \"global\";\n  const tokens = sfz\n    .split(\"\\n\")\n    .map(parseToken)\n    .filter((x): x is Token => !!x);\n\n  const scope = new Scope();\n  let errors: (string | undefined)[] = [];\n\n  for (const token of tokens) {\n    switch (token.type) {\n      case \"mode\":\n        errors.push(scope.closeScope(mode, group));\n        mode = token.value;\n\n        break;\n\n      case \"prop:num\":\n      case \"prop:str\":\n      case \"prop:num_arr\":\n        scope.push(token.key, token.value);\n        break;\n\n      case \"unknown\":\n        console.warn(\"Unknown SFZ token\", token.value);\n        break;\n    }\n  }\n  closeScope(mode, scope, group);\n\n  return errors.filter((x) => !!x) as string[];\n\n  function closeScope(mode: string, scope: Scope, group: RegionGroup) {}\n}\n\ntype Token =\n  | { type: \"unknown\"; value: string }\n  | { type: \"mode\"; value: string }\n  | { type: \"prop:num\"; key: string; value: number }\n  | { type: \"prop:num_arr\"; key: string; value: [number, number] }\n  | { type: \"prop:str\"; key: string; value: string };\n\nconst MODE_REGEX = /^<([^>]+)>$/;\nconst PROP_NUM_REGEX = /^([^=]+)=([-\\.\\d]+)$/;\nconst PROP_STR_REGEX = /^([^=]+)=(.+)$/;\nconst PROP_NUM_ARR_REGEX = /^([^=]+)_(\\d+)=(\\d+)$/;\nfunction parseToken(line: string): Token | undefined {\n  line = line.trim();\n  if (line === \"\") return undefined;\n  if (line.startsWith(\"//\")) return undefined;\n\n  const modeMatch = line.match(MODE_REGEX);\n  if (modeMatch) return { type: \"mode\", value: modeMatch[1] };\n\n  const propNumArrMatch = line.match(PROP_NUM_ARR_REGEX);\n  if (propNumArrMatch)\n    return {\n      type: \"prop:num_arr\",\n      key: propNumArrMatch[1],\n      value: [Number(propNumArrMatch[2]), Number(propNumArrMatch[3])],\n    };\n\n  const propNumMatch = line.match(PROP_NUM_REGEX);\n  if (propNumMatch)\n    return {\n      type: \"prop:num\",\n      key: propNumMatch[1],\n      value: Number(propNumMatch[2]),\n    };\n\n  const propStrMatch = line.match(PROP_STR_REGEX);\n  if (propStrMatch)\n    return {\n      type: \"prop:str\",\n      key: propStrMatch[1],\n      value: propStrMatch[2],\n    };\n\n  return { type: \"unknown\", value: line };\n}\n\ntype DestKey = keyof SampleRegion | \"ignore\";\n\nclass Scope {\n  values: Record<string, any> = {};\n  global: Partial<SampleRegion> = {};\n  group: Partial<SampleRegion> = {};\n\n  closeScope(mode: string, group: RegionGroup) {\n    if (mode === \"global\") {\n      // Save global properties\n      this.#closeRegion(this.global as SampleRegion);\n    } else if (mode === \"group\") {\n      // Save group properties\n      this.group = this.#closeRegion({} as SampleRegion);\n    } else if (mode === \"region\") {\n      const region = this.#closeRegion({\n        sampleName: \"\",\n        midiPitch: -1,\n        ...this.global,\n        ...this.group,\n      });\n\n      if (region.sampleName === \"\") {\n        return \"Missing sample name\";\n      }\n      if (region.midiPitch === -1) {\n        // By default, if pitch_keycenter is not specified, the sampler will often use the value\n        // of lokey as the pitch key center.\n        if (region.midiLow !== undefined) {\n          region.midiPitch = region.midiLow;\n        } else {\n          return \"Missing pitch_keycenter\";\n        }\n      }\n\n      // Set default sequence number\n      if (region.seqLength && region.seqPosition === undefined) {\n        region.seqPosition = 1;\n      }\n\n      // Move amp_release to sample options\n      if (region.ampRelease) {\n        region.sample = { decayTime: region.ampRelease };\n        delete region.ampRelease;\n      }\n      group.regions.push(region);\n    }\n  }\n\n  #closeRegion(region: SampleRegion) {\n    this.popStr(\"sample\", region, \"sampleName\");\n    this.popNum(\"pitch_keycenter\", region, \"midiPitch\");\n\n    this.popNum(\"ampeg_attack\", region, \"ampAttack\");\n    this.popNum(\"ampeg_release\", region, \"ampRelease\");\n    this.popNum(\"bend_down\", region, \"bendDown\");\n    this.popNum(\"bend_up\", region, \"bendUp\");\n    this.popNum(\"group\", region, \"group\");\n    this.popNum(\"hikey\", region, \"midiHigh\");\n    this.popNum(\"hivel\", region, \"velHigh\");\n    this.popNum(\"lokey\", region, \"midiLow\");\n    this.popNum(\"offset\", region, \"offset\");\n    this.popNum(\"lovel\", region, \"velLow\");\n    this.popNum(\"off_by\", region, \"groupOffBy\");\n    this.popNum(\"pitch_keytrack\", region, \"ignore\");\n    this.popNum(\"seq_length\", region, \"seqLength\");\n    this.popNum(\"seq_position\", region, \"seqPosition\");\n    this.popNum(\"tune\", region, \"tune\");\n    this.popNum(\"volume\", region, \"volume\");\n    this.popNumArr(\"amp_velcurve\", region, \"ampVelCurve\");\n\n    // Enable only this while development\n    // const remainingKeys = Object.keys(this.values);\n    // if (remainingKeys.length) {\n    //   console.warn(\"Remaining keys in scope: \", remainingKeys);\n    // }\n    this.values = {};\n    return region;\n  }\n\n  get empty() {\n    return Object.keys(this.values).length === 0;\n  }\n\n  get keys() {\n    return Object.keys(this.values);\n  }\n\n  push(key: string, value: any) {\n    this.values[key] = value;\n  }\n\n  popNum(key: string, dest: Record<string, any>, destKey: DestKey): boolean {\n    if (typeof this.values[key] !== \"number\") return false;\n    dest[destKey] = this.values[key];\n    delete this.values[key];\n    return true;\n  }\n\n  popStr(key: string, dest: Record<string, any>, destKey: DestKey): boolean {\n    if (typeof this.values[key] !== \"string\") return false;\n    dest[destKey] = this.values[key];\n    delete this.values[key];\n    return true;\n  }\n\n  popNumArr(key: string, dest: Record<string, any>, destKey: DestKey): boolean {\n    if (!Array.isArray(this.values[key])) return false;\n    dest[destKey] = this.values[key];\n    delete this.values[key];\n    return true;\n  }\n}\n","import { DefaultPlayerConfig } from \"./player/default-player\";\nimport { createEmptyRegionGroup } from \"./player/layers\";\nimport { AudioBuffers } from \"./player/load-audio\";\nimport { RegionPlayer } from \"./player/region-player\";\nimport { InternalPlayer, SampleStart, SampleStop } from \"./player/types\";\nimport { SfzInstrumentLoader } from \"./sfz2\";\nimport { HttpStorage, Storage } from \"./storage\";\n\nlet instruments: string[] = [];\n\nconst BASE_URL = \"https://smpldsnds.github.io/sgossner-vcsl/\";\n\nexport async function getVersilianInstruments(): Promise<string[]> {\n  if (instruments.length) return instruments;\n\n  instruments = await fetch(BASE_URL + \"sfz_files.json\").then((res) =>\n    res.json()\n  );\n  return instruments;\n}\n\nfunction getVcslInstrumentSfzUrl(instrument: string) {\n  return BASE_URL + instrument + \".sfz\";\n}\n\nexport function VcslInstrumentLoader(\n  instrument: string,\n  buffers: AudioBuffers\n) {\n  const url = getVcslInstrumentSfzUrl(instrument);\n  const base = instrument.slice(0, instrument.lastIndexOf(\"/\") + 1);\n  const sampleBase = `https://smpldsnds.github.io/sgossner-vcsl/${base}`;\n  const group = createEmptyRegionGroup();\n  return SfzInstrumentLoader(url, {\n    buffers: buffers,\n    group: group,\n    urlFromSampleName: (sampleName, audioExt) => {\n      return sampleBase + \"/\" + sampleName.replace(\".wav\", audioExt);\n    },\n  });\n}\n\nexport type VersilianConfig = {\n  instrument: string;\n  storage: Storage;\n};\nexport type VersilianOptions = Partial<VersilianConfig & DefaultPlayerConfig>;\n\n/**\n * Versilian\n *\n * The Versilian Community Sample Library is an open CC0 general-purpose sample library created by Versilian Studios LLC\n * for the purpose of introducing a set of quality, publicly available samples suitable for use in software and media of all kinds.\n */\nexport class Versilian implements InternalPlayer {\n  private readonly player: RegionPlayer;\n  public readonly load: Promise<this>;\n  private config: VersilianConfig;\n\n  constructor(context: BaseAudioContext, options: VersilianOptions = {}) {\n    this.config = {\n      instrument: options.instrument ?? \"Arco\",\n      storage: options.storage ?? HttpStorage,\n    };\n    this.player = new RegionPlayer(context, options);\n\n    const loader = VcslInstrumentLoader(\n      this.config.instrument,\n      this.player.buffers\n    );\n    this.load = loader(context, this.config.storage).then((group) => {\n      this.player.instrument.groups.push(group);\n      return this;\n    });\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  get buffers(): AudioBuffers {\n    return this.player.buffers;\n  }\n\n  get context(): BaseAudioContext {\n    return this.player.context;\n  }\n\n  start(sample: SampleStart | string | number) {\n    return this.player.start(sample);\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    return this.player.stop(sample);\n  }\n\n  disconnect(): void {\n    this.player.disconnect();\n  }\n}\n","import { Versilian, VersilianOptions } from \"./versilian\";\n\nexport function getMalletNames() {\n  return Object.keys(NAME_TO_PATH) as MalletName[];\n}\n\nexport class Mallet extends Versilian {\n  constructor(context: AudioContext, options: VersilianOptions) {\n    super(context, {\n      ...options,\n      instrument: NAME_TO_PATH[options.instrument ?? \"\"],\n    });\n  }\n}\n\nconst BASE_URL = \"https://danigb.github.io/samples/vcsl/\";\nconst EXT = \".websfz.json\";\n\ntype MalletName = keyof typeof NAME_TO_PATH;\n\nexport const NAME_TO_PATH: Record<string, string | undefined> = {\n  \"Balafon - Hard Mallet\": \"Idiophones/Struck Idiophones/Balafon - Hard Mallet\",\n  \"Balafon - Keyswitch\": \"Idiophones/Struck Idiophones/Balafon - Keyswitch\",\n  \"Balafon - Soft Mallet\": \"Idiophones/Struck Idiophones/Balafon - Soft Mallet\",\n  \"Balafon - Traditional Mallet\":\n    \"Idiophones/Struck Idiophones/Balafon - Traditional Mallet\",\n\n  \"Tubular Bells 1\": \"Idiophones/Struck Idiophones/Tubular Bells 1\",\n  \"Tubular Bells 2\": \"Idiophones/Struck Idiophones/Tubular Bells 2\",\n\n  \"Vibraphone - Bowed\": \"Idiophones/Struck Idiophones/Vibraphone - Bowed\",\n  \"Vibraphone - Hard Mallets\":\n    \"Idiophones/Struck Idiophones/Vibraphone - Hard Mallets\",\n  \"Vibraphone - Keyswitch\":\n    \"Idiophones/Struck Idiophones/Vibraphone - Keyswitch\",\n  \"Vibraphone - Soft Mallets\":\n    \"Idiophones/Struck Idiophones/Vibraphone - Soft Mallets\",\n\n  \"Xylophone - Hard Mallets\":\n    \"Idiophones/Struck Idiophones/Xylophone - Hard Mallets\",\n  \"Xylophone - Keyswitch\": \"Idiophones/Struck Idiophones/Xylophone - Keyswitch\",\n  \"Xylophone - Medium Mallets\":\n    \"Idiophones/Struck Idiophones/Xylophone - Medium Mallets\",\n  \"Xylophone - Soft Mallets\":\n    \"Idiophones/Struck Idiophones/Xylophone - Soft Mallets\",\n} as const;\n","import { ChannelConfig } from \"./player/channel\";\nimport { DefaultPlayer, DefaultPlayerConfig } from \"./player/default-player\";\nimport {\n  createEmptyRegionGroup,\n  findFirstSampleInRegions,\n  spreadRegions,\n} from \"./player/layers\";\nimport {\n  AudioBuffers,\n  getPreferredAudioExtension,\n  loadAudioBuffer,\n} from \"./player/load-audio\";\nimport { toMidi } from \"./player/midi\";\nimport {\n  InternalPlayer,\n  RegionGroup,\n  SampleOptions,\n  SampleStart,\n  SampleStop,\n} from \"./player/types\";\nimport { HttpStorage, Storage } from \"./storage\";\n\nconst INSTRUMENT_VARIATIONS: Record<string, [string, string]> = {\n  \"300 STRINGS CELLO\": [\"300 STRINGS\", \"CELL\"],\n  \"300 STRINGS VIOLA\": [\"300 STRINGS\", \"VIOL\"],\n};\n\nexport function getMellotronNames() {\n  return [\n    \"300 STRINGS CELLO\",\n    \"300 STRINGS VIOLA\",\n    \"8VOICE CHOIR\",\n    \"BASSA+STRNGS\",\n    \"BOYS CHOIR\",\n    \"CHA CHA FLT\",\n    \"CHM CLARINET\",\n    \"CHMB 3 VLNS\",\n    \"CHMB ALTOSAX\",\n    \"CHMB FEMALE\",\n    \"CHMB MALE VC\",\n    \"CHMB TNR SAX\",\n    \"CHMB TRMBONE\",\n    \"CHMB TRUMPET\",\n    \"CHMBLN CELLO\",\n    \"CHMBLN FLUTE\",\n    \"CHMBLN OBOE\",\n    \"DIXIE+TRMBN\",\n    \"FOXTROT+SAX\",\n    \"HALFSP.BRASS\",\n    \"MIXED STRGS\",\n    \"MKII BRASS\",\n    \"MKII GUITAR\",\n    \"MKII ORGAN\",\n    \"MKII SAX\",\n    \"MKII VIBES\",\n    \"MKII VIOLINS\",\n    \"MOVE BS+STGS\",\n    \"STRGS+BRASS\",\n    \"TROMB+TRMPT\",\n    \"TRON 16VLNS\",\n    \"TRON CELLO\",\n    \"TRON FLUTE\",\n    \"TRON VIOLA\",\n  ];\n}\n\nexport type MellotronConfig = {\n  instrument: string;\n  storage: Storage;\n};\n\nexport type MellotronOptions = Partial<MellotronConfig & DefaultPlayerConfig>;\n\nexport class Mellotron implements InternalPlayer {\n  private readonly config: MellotronConfig;\n  private readonly player: DefaultPlayer;\n  private readonly group: RegionGroup;\n  readonly load: Promise<this>;\n\n  public constructor(\n    public readonly context: BaseAudioContext,\n    private readonly options: MellotronOptions\n  ) {\n    this.config = getMellotronConfig(options);\n    this.player = new DefaultPlayer(context, options);\n    this.group = createEmptyRegionGroup();\n\n    const loader = loadMellotronInstrument(\n      this.config.instrument,\n      this.player.buffers,\n      this.group\n    );\n    this.load = loader(context, this.config.storage).then(() => this);\n  }\n\n  get buffers() {\n    return this.player.buffers;\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  start(sample: SampleStart | string | number) {\n    const found = findFirstSampleInRegions(\n      this.group,\n      typeof sample === \"object\" ? sample : { note: sample },\n      undefined,\n      this.options\n    );\n\n    if (!found) return () => undefined;\n\n    return this.player.start(found);\n  }\n  stop(sample?: SampleStop | string | number) {\n    this.player.stop(sample);\n  }\n  disconnect() {\n    this.player.disconnect();\n  }\n}\n\nfunction getMellotronConfig(\n  options: Partial<SampleOptions & ChannelConfig & MellotronConfig>\n): MellotronConfig {\n  return {\n    instrument: options.instrument ?? \"MKII VIOLINS\",\n    storage: options.storage ?? HttpStorage,\n  };\n}\nfunction loadMellotronInstrument(\n  instrument: string,\n  buffers: AudioBuffers,\n  group: RegionGroup\n) {\n  let variation = INSTRUMENT_VARIATIONS[instrument];\n  if (variation) instrument = variation[0];\n\n  return (context: BaseAudioContext, storage: Storage) => {\n    const baseUrl = `https://smpldsnds.github.io/archiveorg-mellotron/${instrument}/`;\n    const audioExt = getPreferredAudioExtension();\n    return fetch(baseUrl + \"files.json\")\n      .then((res) => res.json() as Promise<string[]>)\n      .then((sampleNames) =>\n        Promise.all(\n          sampleNames.map((sampleName) => {\n            if (variation && !sampleName.includes(variation[1])) return;\n\n            const midi = toMidi(sampleName.split(\" \")[0] ?? \"\");\n            if (!midi) return;\n\n            const sampleUrl = baseUrl + sampleName + audioExt;\n            loadAudioBuffer(context, sampleUrl, storage).then((audioBuffer) => {\n              buffers[sampleName] = audioBuffer;\n              const duration = audioBuffer?.duration ?? 0;\n              group.regions.push({\n                sampleName: sampleName,\n                midiPitch: midi,\n                sample: {\n                  loop: true,\n                  loopStart: duration / 10,\n                  loopEnd: duration - duration / 10,\n                },\n              });\n            });\n          })\n        )\n      )\n      .then(() => {\n        spreadRegions(group.regions);\n      });\n  };\n}\n","export const PROCESSOR = `\"use strict\";(()=>{var f=class extends AudioWorkletProcessor{_pDLength;_preDelay;_pDWrite;_lp1;_lp2;_lp3;_excPhase;_taps;_Delays;sampleRate;static get parameterDescriptors(){return[[\"preDelay\",0,0,sampleRate-1,\"k-rate\"],[\"bandwidth\",.9999,0,1,\"k-rate\"],[\"inputDiffusion1\",.75,0,1,\"k-rate\"],[\"inputDiffusion2\",.625,0,1,\"k-rate\"],[\"decay\",.5,0,1,\"k-rate\"],[\"decayDiffusion1\",.7,0,.999999,\"k-rate\"],[\"decayDiffusion2\",.5,0,.999999,\"k-rate\"],[\"damping\",.005,0,1,\"k-rate\"],[\"excursionRate\",.5,0,2,\"k-rate\"],[\"excursionDepth\",.7,0,2,\"k-rate\"],[\"wet\",1,0,1,\"k-rate\"],[\"dry\",0,0,1,\"k-rate\"]].map(e=>new Object({name:e[0],defaultValue:e[1],minValue:e[2],maxValue:e[3],automationRate:e[4]}))}constructor(e){super(),this.sampleRate=sampleRate,this._Delays=[],this._pDLength=sampleRate+(128-sampleRate%128),this._preDelay=new Float32Array(this._pDLength),this._pDWrite=0,this._lp1=0,this._lp2=0,this._lp3=0,this._excPhase=0,[.004771345,.003595309,.012734787,.009307483,.022579886,.149625349,.060481839,.1249958,.030509727,.141695508,.089244313,.106280031].forEach(a=>this.makeDelay(a,sampleRate)),this._taps=Int16Array.from([.008937872,.099929438,.064278754,.067067639,.066866033,.006283391,.035818689,.011861161,.121870905,.041262054,.08981553,.070931756,.011256342,.004065724],a=>Math.round(a*sampleRate))}makeDelay(e,a){let t=Math.round(e*a),s=2**Math.ceil(Math.log2(t));this._Delays.push([new Float32Array(s),t-1,0,s-1])}writeDelay(e,a){return this._Delays[e][0][this._Delays[e][1]]=a}readDelay(e){return this._Delays[e][0][this._Delays[e][2]]}readDelayAt(e,a){let t=this._Delays[e];return t[0][t[2]+a&t[3]]}readDelayCAt(e,a){let t=this._Delays[e],s=a-~~a,d=~~a+t[2]-1,r=t[3],D=t[0][d++&r],l=t[0][d++&r],h=t[0][d++&r],y=t[0][d&r],u=(3*(l-h)-D+y)/2,m=2*h+D-(5*l+y)/2,c=(h-D)/2;return((u*s+m)*s+c)*s+l}process(e,a,t){let s=~~t.preDelay[0],d=t.bandwidth[0],r=t.inputDiffusion1[0],D=t.inputDiffusion2[0],l=t.decay[0],h=t.decayDiffusion1[0],y=t.decayDiffusion2[0],u=1-t.damping[0],m=t.excursionRate[0]/sampleRate,c=t.excursionDepth[0]*sampleRate/1e3,w=t.wet[0]*.6,A=t.dry[0];if(e[0].length==2)for(let i=127;i>=0;i--)this._preDelay[this._pDWrite+i]=(e[0][0][i]+e[0][1][i])*.5,a[0][0][i]=e[0][0][i]*A,a[0][1][i]=e[0][1][i]*A;else if(e[0].length>0){this._preDelay.set(e[0][0],this._pDWrite);for(let i=127;i>=0;i--)a[0][0][i]=a[0][1][i]=e[0][0][i]*A}else this._preDelay.set(new Float32Array(128),this._pDWrite);let o=0;for(;o<128;){let i=0,b=0;this._lp1+=d*(this._preDelay[(this._pDLength+this._pDWrite-s+o)%this._pDLength]-this._lp1);let p=this.writeDelay(0,this._lp1-r*this.readDelay(0));p=this.writeDelay(1,r*(p-this.readDelay(1))+this.readDelay(0)),p=this.writeDelay(2,r*p+this.readDelay(1)-D*this.readDelay(2)),p=this.writeDelay(3,D*(p-this.readDelay(3))+this.readDelay(2));let k=D*p+this.readDelay(3),g=c*(1+Math.cos(this._excPhase*6.28)),x=c*(1+Math.sin(this._excPhase*6.2847)),_=this.writeDelay(4,k+l*this.readDelay(11)+h*this.readDelayCAt(4,g));this.writeDelay(5,this.readDelayCAt(4,g)-h*_),this._lp2+=u*(this.readDelay(5)-this._lp2),_=this.writeDelay(6,l*this._lp2-y*this.readDelay(6)),this.writeDelay(7,this.readDelay(6)+y*_),_=this.writeDelay(8,k+l*this.readDelay(7)+h*this.readDelayCAt(8,x)),this.writeDelay(9,this.readDelayCAt(8,x)-h*_),this._lp3+=u*(this.readDelay(9)-this._lp3),_=this.writeDelay(10,l*this._lp3-y*this.readDelay(10)),this.writeDelay(11,this.readDelay(10)+y*_),i=this.readDelayAt(9,this._taps[0])+this.readDelayAt(9,this._taps[1])-this.readDelayAt(10,this._taps[2])+this.readDelayAt(11,this._taps[3])-this.readDelayAt(5,this._taps[4])-this.readDelayAt(6,this._taps[5])-this.readDelayAt(7,this._taps[6]),b=this.readDelayAt(5,this._taps[7])+this.readDelayAt(5,this._taps[8])-this.readDelayAt(6,this._taps[9])+this.readDelayAt(7,this._taps[10])-this.readDelayAt(9,this._taps[11])-this.readDelayAt(10,this._taps[12])-this.readDelayAt(11,this._taps[13]),a[0][0][o]+=i*w,a[0][1][o]+=b*w,this._excPhase+=m,o++;for(let R=0,n=this._Delays[0];R<this._Delays.length;n=this._Delays[++R])n[1]=n[1]+1&n[3],n[2]=n[2]+1&n[3]}return this._pDWrite=(this._pDWrite+128)%this._pDLength,!0}};registerProcessor(\"DattorroReverb\",f);})();`;\n","import { PROCESSOR } from \"./processor.min\";\n\nconst PARAMS = [\n  \"preDelay\",\n  \"bandwidth\",\n  \"inputDiffusion1\",\n  \"inputDiffusion2\",\n  \"decay\",\n  \"decayDiffusion1\",\n  \"decayDiffusion2\",\n  \"damping\",\n  \"excursionRate\",\n  \"excursionDepth\",\n  \"wet\",\n  \"dry\",\n] as const;\n\nconst init = new WeakMap<AudioContext, Promise<void>>();\n\nasync function createDattorroReverbEffect(context: AudioContext) {\n  let ready = init.get(context);\n  if (!ready) {\n    const blob = new Blob([PROCESSOR], { type: \"application/javascript\" });\n    const url = URL.createObjectURL(blob);\n    ready = context.audioWorklet.addModule(url);\n    init.set(context, ready);\n  }\n  await ready;\n\n  const reverb = new AudioWorkletNode(context, \"DattorroReverb\", {\n    outputChannelCount: [2],\n  });\n  return reverb;\n}\n\nexport class Reverb {\n  #effect: AudioWorkletNode | undefined;\n  #ready: Promise<this>;\n  public readonly input: AudioNode;\n  #output: AudioNode;\n\n  constructor(context: AudioContext) {\n    this.input = context.createGain();\n    this.#output = context.destination;\n    this.#ready = createDattorroReverbEffect(context).then((reverb) => {\n      this.input.connect(reverb);\n      reverb.connect(this.#output);\n      this.#effect = reverb;\n      return this;\n    });\n  }\n\n  get paramNames() {\n    return PARAMS;\n  }\n\n  getParam(name: (typeof PARAMS)[number]): AudioParam | undefined {\n    return this.#effect?.parameters.get(\"preDelay\");\n  }\n\n  get isReady(): boolean {\n    return this.#effect !== undefined;\n  }\n\n  ready(): Promise<this> {\n    return this.#ready;\n  }\n\n  connect(output: AudioNode) {\n    if (this.#effect) {\n      this.#effect.disconnect(this.#output);\n      this.#effect.connect(output);\n    }\n    this.#output = output;\n  }\n}\n","import { DefaultPlayer } from \"./player/default-player\";\nimport {\n  AudioBuffers,\n  AudioBuffersLoader,\n  loadAudioBuffer,\n} from \"./player/load-audio\";\nimport { SampleStart, SampleStop } from \"./player/types\";\nimport { midiVelToGain } from \"./player/volume\";\nimport { HttpStorage, Storage } from \"./storage\";\n\nexport type SamplerConfig = {\n  storage?: Storage;\n  detune: number;\n  volume: number;\n  velocity: number;\n  decayTime?: number;\n  lpfCutoffHz?: number;\n  destination: AudioNode;\n\n  buffers: Record<string | number, string | AudioBuffers> | AudioBuffersLoader;\n  volumeToGain: (volume: number) => number;\n};\n\n/**\n * A Sampler instrument\n *\n * @private\n */\nexport class Sampler {\n  #options: SamplerConfig;\n  private readonly player: DefaultPlayer;\n  public readonly load: Promise<this>;\n\n  public constructor(\n    public readonly context: AudioContext,\n    options: Partial<SamplerConfig> = {}\n  ) {\n    this.#options = {\n      destination: options.destination ?? context.destination,\n      detune: 0,\n      volume: options.volume ?? 100,\n      velocity: options.velocity ?? 100,\n      buffers: options.buffers ?? {},\n      volumeToGain: options.volumeToGain ?? midiVelToGain,\n    };\n    this.player = new DefaultPlayer(context, this.#options);\n    const storage = options.storage ?? HttpStorage;\n    const loader =\n      typeof this.#options.buffers === \"function\"\n        ? this.#options.buffers\n        : createAudioBuffersLoader(this.#options.buffers, storage);\n    this.load = loader(context, this.player.buffers).then(() => this);\n  }\n\n  async loaded() {\n    console.warn(\"deprecated: use load instead\");\n    return this.load;\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  start(sample: SampleStart | string | number) {\n    return this.player.start(\n      typeof sample === \"object\" ? sample : { note: sample }\n    );\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    return this.player.stop(\n      typeof sample === \"object\"\n        ? sample\n        : sample === undefined\n        ? undefined\n        : { stopId: sample }\n    );\n  }\n\n  disconnect() {\n    return this.player.disconnect();\n  }\n}\n\nfunction createAudioBuffersLoader(\n  source: Record<string | number, string | AudioBuffers>,\n  storage: Storage\n): AudioBuffersLoader {\n  return async (context, buffers) => {\n    await Promise.all([\n      Object.keys(source).map(async (key) => {\n        const value = source[key];\n        if (value instanceof AudioBuffer) {\n          buffers[key] = value;\n        } else if (typeof value === \"string\") {\n          const buffer = await loadAudioBuffer(context, value, storage);\n          if (buffer) buffers[key] = buffer;\n        }\n      }),\n    ]);\n  };\n}\n","import { DefaultPlayer, DefaultPlayerConfig } from \"./player/default-player\";\nimport { createEmptyRegionGroup, findSamplesInRegions } from \"./player/layers\";\nimport { AudioBuffers } from \"./player/load-audio\";\nimport { toMidi } from \"./player/midi\";\nimport {\n  InternalPlayer,\n  RegionGroup,\n  SampleStart,\n  SampleStop,\n} from \"./player/types\";\nimport { SfzInstrumentLoader } from \"./sfz2\";\nimport { HttpStorage, Storage } from \"./storage\";\n\nexport function getSmolkenNames() {\n  return [\"Pizzicato\", \"Arco\", \"Switched\"];\n}\n\nfunction getSmolkenUrl(instrument: string) {\n  const FILES: Record<string, string> = {\n    Arco: \"arco\",\n    Pizzicato: \"pizz\",\n    Switched: \"switched\",\n  };\n  return `https://smpldsnds.github.io/sfzinstruments-dsmolken-double-bass/d_smolken_rubner_bass_${FILES[instrument]}.sfz`;\n}\n\nexport type SmolkenConfig = {\n  instrument: string;\n  storage: Storage;\n};\nexport type SmolkenOptions = Partial<SmolkenConfig & DefaultPlayerConfig>;\n\nexport class Smolken implements InternalPlayer {\n  private readonly player: DefaultPlayer;\n  private readonly group: RegionGroup;\n  public readonly load: Promise<this>;\n  private config: SmolkenConfig;\n  private seqNum = 0;\n\n  constructor(context: BaseAudioContext, options: SmolkenOptions = {}) {\n    this.config = {\n      instrument: options.instrument ?? \"Arco\",\n      storage: options.storage ?? HttpStorage,\n    };\n    this.player = new DefaultPlayer(context, options);\n    this.group = createEmptyRegionGroup();\n    const url = getSmolkenUrl(this.config.instrument);\n\n    const loader = SfzInstrumentLoader(url, {\n      buffers: this.player.buffers,\n      group: this.group,\n      urlFromSampleName: (sampleName, audioExt) => {\n        const samplePath = sampleName\n          .replace(\"\\\\\", \"/\")\n          .replace(\".wav\", audioExt);\n        return `https://smpldsnds.github.io/sfzinstruments-dsmolken-double-bass/${samplePath}`;\n      },\n    });\n    this.load = loader(context, this.config.storage).then(() => this);\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  get buffers(): AudioBuffers {\n    return this.player.buffers;\n  }\n\n  get context(): BaseAudioContext {\n    return this.player.context;\n  }\n\n  start(sample: SampleStart | string | number) {\n    const found = findSamplesInRegions(\n      this.group,\n      typeof sample === \"object\" ? sample : { note: sample },\n      this.seqNum\n    );\n    this.seqNum++;\n    const stopAll = found.map((sample) => this.player.start(sample));\n    return (time?: number) => stopAll.forEach((stop) => stop(time));\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    if (sample == undefined) {\n      this.player.stop();\n      return;\n    }\n\n    const toStop = typeof sample === \"object\" ? sample : { stopId: sample };\n    const midi = toMidi(toStop.stopId);\n    if (!midi) return;\n    toStop.stopId = midi;\n    this.player.stop(toStop);\n  }\n\n  disconnect(): void {\n    this.player.disconnect();\n  }\n}\n","import { spreadRegions } from \"../player/layers\";\nimport { AudioBuffers, findFirstSupportedFormat } from \"../player/load-audio\";\nimport { toMidi } from \"../player/midi\";\nimport { RegionGroup } from \"../player/types\";\nimport { Storage } from \"../storage\";\n\nexport function gleitzKitUrl(name: string, kit: string) {\n  const format = findFirstSupportedFormat([\"ogg\", \"mp3\"]) ?? \"mp3\";\n  return `https://gleitz.github.io/midi-js-soundfonts/${kit}/${name}-${format}.js`;\n}\n\nexport function soundfontInstrumentLoader(\n  url: string,\n  buffers: AudioBuffers,\n  group: RegionGroup\n) {\n  return async (context: BaseAudioContext, storage: Storage) => {\n    const sourceFile = await (await storage.fetch(url)).text();\n    const json = midiJsToJson(sourceFile);\n\n    const noteNames = Object.keys(json);\n    await Promise.all(\n      noteNames.map(async (noteName) => {\n        const midi = toMidi(noteName);\n        if (!midi) return;\n        const audioData = base64ToArrayBuffer(\n          removeBase64Prefix(json[noteName])\n        );\n        const buffer = await context.decodeAudioData(audioData);\n        buffers[noteName] = buffer;\n        group.regions.push({\n          sampleName: noteName,\n          midiPitch: midi,\n        });\n      })\n    );\n    spreadRegions(group.regions);\n  };\n}\n\n// convert a MIDI.js javascript soundfont file to json\nfunction midiJsToJson(source: string) {\n  const header = source.indexOf(\"MIDI.Soundfont.\");\n  if (header < 0) throw Error(\"Invalid MIDI.js Soundfont format\");\n  const start = source.indexOf(\"=\", header) + 2;\n  const end = source.lastIndexOf(\",\");\n  return JSON.parse(source.slice(start, end) + \"}\");\n}\n\nfunction removeBase64Prefix(audioBase64: string) {\n  return audioBase64.slice(audioBase64.indexOf(\",\") + 1);\n}\n\nfunction base64ToArrayBuffer(base64: string) {\n  const decoded = window.atob(base64);\n  const len = decoded.length;\n  const bytes = new Uint8Array(len);\n  for (let i = 0; i < len; i++) {\n    bytes[i] = decoded.charCodeAt(i);\n  }\n  return bytes.buffer;\n}\n\nexport const SOUNDFONT_KITS = [\"MusyngKite\", \"FluidR3_GM\"];\n\nexport const SOUNDFONT_INSTRUMENTS = [\n  \"accordion\",\n  \"acoustic_bass\",\n  \"acoustic_grand_piano\",\n  \"acoustic_guitar_nylon\",\n  \"acoustic_guitar_steel\",\n  \"agogo\",\n  \"alto_sax\",\n  \"applause\",\n  \"bagpipe\",\n  \"banjo\",\n  \"baritone_sax\",\n  \"bassoon\",\n  \"bird_tweet\",\n  \"blown_bottle\",\n  \"brass_section\",\n  \"breath_noise\",\n  \"bright_acoustic_piano\",\n  \"celesta\",\n  \"cello\",\n  \"choir_aahs\",\n  \"church_organ\",\n  \"clarinet\",\n  \"clavinet\",\n  \"contrabass\",\n  \"distortion_guitar\",\n  \"drawbar_organ\",\n  \"dulcimer\",\n  \"electric_bass_finger\",\n  \"electric_bass_pick\",\n  \"electric_grand_piano\",\n  \"electric_guitar_clean\",\n  \"electric_guitar_jazz\",\n  \"electric_guitar_muted\",\n  \"electric_piano_1\",\n  \"electric_piano_2\",\n  \"english_horn\",\n  \"fiddle\",\n  \"flute\",\n  \"french_horn\",\n  \"fretless_bass\",\n  \"fx_1_rain\",\n  \"fx_2_soundtrack\",\n  \"fx_3_crystal\",\n  \"fx_4_atmosphere\",\n  \"fx_5_brightness\",\n  \"fx_6_goblins\",\n  \"fx_7_echoes\",\n  \"fx_8_scifi\",\n  \"glockenspiel\",\n  \"guitar_fret_noise\",\n  \"guitar_harmonics\",\n  \"gunshot\",\n  \"harmonica\",\n  \"harpsichord\",\n  \"helicopter\",\n  \"honkytonk_piano\",\n  \"kalimba\",\n  \"koto\",\n  \"lead_1_square\",\n  \"lead_2_sawtooth\",\n  \"lead_3_calliope\",\n  \"lead_4_chiff\",\n  \"lead_5_charang\",\n  \"lead_6_voice\",\n  \"lead_7_fifths\",\n  \"lead_8_bass__lead\",\n  \"marimba\",\n  \"melodic_tom\",\n  \"music_box\",\n  \"muted_trumpet\",\n  \"oboe\",\n  \"ocarina\",\n  \"orchestra_hit\",\n  \"orchestral_harp\",\n  \"overdriven_guitar\",\n  \"pad_1_new_age\",\n  \"pad_2_warm\",\n  \"pad_3_polysynth\",\n  \"pad_4_choir\",\n  \"pad_5_bowed\",\n  \"pad_6_metallic\",\n  \"pad_7_halo\",\n  \"pad_8_sweep\",\n  \"pan_flute\",\n  \"percussive_organ\",\n  \"piccolo\",\n  \"pizzicato_strings\",\n  \"recorder\",\n  \"reed_organ\",\n  \"reverse_cymbal\",\n  \"rock_organ\",\n  \"seashore\",\n  \"shakuhachi\",\n  \"shamisen\",\n  \"shanai\",\n  \"sitar\",\n  \"slap_bass_1\",\n  \"slap_bass_2\",\n  \"soprano_sax\",\n  \"steel_drums\",\n  \"string_ensemble_1\",\n  \"string_ensemble_2\",\n  \"synth_bass_1\",\n  \"synth_bass_2\",\n  \"synth_brass_1\",\n  \"synth_brass_2\",\n  \"synth_choir\",\n  \"synth_drum\",\n  \"synth_strings_1\",\n  \"synth_strings_2\",\n  \"taiko_drum\",\n  \"tango_accordion\",\n  \"telephone_ring\",\n  \"tenor_sax\",\n  \"timpani\",\n  \"tinkle_bell\",\n  \"tremolo_strings\",\n  \"trombone\",\n  \"trumpet\",\n  \"tuba\",\n  \"tubular_bells\",\n  \"vibraphone\",\n  \"viola\",\n  \"violin\",\n  \"voice_oohs\",\n  \"whistle\",\n  \"woodblock\",\n  \"xylophone\",\n];\n","import { toMidi } from \"../player/midi\";\n\nexport type LoopData = Record<number, [number, number]>;\n\nexport function getGoldstSoundfontLoopsUrl(instrument: string, kit: string) {\n  if (instrument.startsWith(\"http\")) return undefined;\n  return `https://goldst.dev/midi-js-soundfonts/${kit}/${instrument}-loop.json`;\n}\n\n/**\n *\n * @see https://github.com/goldst/midi-js-soundfonts\n * @see https://github.com/danigb/smplr/issues/23\n */\nexport async function fetchSoundfontLoopData(\n  url?: string,\n  sampleRate = 44100\n): Promise<LoopData | undefined> {\n  if (!url) return undefined;\n  try {\n    const req = await fetch(url);\n    if (req.status !== 200) return;\n\n    const raw = await req.json();\n    const loopData: LoopData = {};\n    Object.keys(raw).forEach((key) => {\n      const midi = toMidi(key);\n      if (midi) {\n        const offsets = raw[key];\n        loopData[midi] = [offsets[0] / sampleRate, offsets[1] / sampleRate];\n      }\n    });\n    return loopData;\n  } catch (err) {\n    return undefined;\n  }\n}\n","import { DefaultPlayer, DefaultPlayerConfig } from \"../player/default-player\";\nimport {\n  createEmptyRegionGroup,\n  findFirstSampleInRegions,\n} from \"../player/layers\";\nimport { AudioBuffers } from \"../player/load-audio\";\nimport { RegionGroup, SampleStart, SampleStop } from \"../player/types\";\nimport { HttpStorage, Storage } from \"../storage\";\nimport {\n  SOUNDFONT_INSTRUMENTS,\n  SOUNDFONT_KITS,\n  gleitzKitUrl,\n  soundfontInstrumentLoader,\n} from \"./soundfont-instrument\";\nimport {\n  fetchSoundfontLoopData,\n  getGoldstSoundfontLoopsUrl,\n} from \"./soundfont-loops\";\n\nexport function getSoundfontKits() {\n  return SOUNDFONT_KITS;\n}\n\nexport function getSoundfontNames() {\n  return SOUNDFONT_INSTRUMENTS;\n}\n\ntype SoundfontConfig = {\n  kit: \"FluidR3_GM\" | \"MusyngKite\" | string;\n  instrument?: string;\n  instrumentUrl: string;\n  storage: Storage;\n  extraGain: number;\n  loadLoopData: boolean;\n  loopDataUrl?: string;\n};\n\nexport type SoundfontOptions = Partial<SoundfontConfig & DefaultPlayerConfig>;\n\nexport class Soundfont {\n  public readonly config: Readonly<SoundfontConfig>;\n  private readonly player: DefaultPlayer;\n  public readonly load: Promise<this>;\n  public readonly group: RegionGroup;\n  #hasLoops: boolean;\n\n  constructor(\n    public readonly context: AudioContext,\n    options: SoundfontOptions\n  ) {\n    this.config = getSoundfontConfig(options);\n    this.player = new DefaultPlayer(context, options);\n    this.group = createEmptyRegionGroup();\n\n    this.#hasLoops = false;\n    const loader = soundfontLoader(\n      this.config.instrumentUrl,\n      this.config.loopDataUrl,\n      this.player.buffers,\n      this.group\n    );\n    this.load = loader(context, this.config.storage).then((hasLoops) => {\n      this.#hasLoops = hasLoops;\n      return this;\n    });\n\n    const gain = context.createGain();\n    gain.gain.value = this.config.extraGain;\n    this.player.output.addInsert(gain);\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  get hasLoops() {\n    return this.#hasLoops;\n  }\n\n  async loaded() {\n    console.warn(\"deprecated: use load instead\");\n    return this.load;\n  }\n\n  public disconnect() {\n    this.player.disconnect();\n  }\n\n  start(sample: SampleStart | string | number) {\n    const found = findFirstSampleInRegions(\n      this.group,\n      typeof sample === \"object\" ? sample : { note: sample }\n    );\n    if (!found) return () => undefined;\n\n    return this.player.start(found);\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    return this.player.stop(sample);\n  }\n}\n\nfunction soundfontLoader(\n  url: string,\n  loopsUrl: string | undefined,\n  buffers: AudioBuffers,\n  group: RegionGroup\n) {\n  const loadInstrument = soundfontInstrumentLoader(url, buffers, group);\n  return async (context: BaseAudioContext, storage: Storage) => {\n    const [_, loops] = await Promise.all([\n      loadInstrument(context, storage),\n      fetchSoundfontLoopData(loopsUrl),\n    ]);\n\n    if (loops) {\n      group.regions.forEach((region) => {\n        const loop = loops[region.midiPitch];\n        if (loop) {\n          region.sample ??= {};\n          region.sample.loop = true;\n          region.sample.loopStart = loop[0];\n          region.sample.loopEnd = loop[1];\n        }\n      });\n    }\n    return !!loops;\n  };\n}\n\nfunction getSoundfontConfig(options: SoundfontOptions): SoundfontConfig {\n  if (!options.instrument && !options.instrumentUrl) {\n    throw Error(\"Soundfont: instrument or instrumentUrl is required\");\n  }\n  const config = {\n    kit: \"MusyngKite\",\n    instrument: options.instrument,\n    storage: options.storage ?? HttpStorage,\n    // This is to compensate the low volume of the original samples\n    extraGain: options.extraGain ?? 5,\n    loadLoopData: options.loadLoopData ?? false,\n    loopDataUrl: options.loopDataUrl,\n    instrumentUrl: options.instrumentUrl ?? \"\",\n  };\n  if (config.instrument && config.instrument.startsWith(\"http\")) {\n    console.warn(\n      \"Use 'instrumentUrl' instead of 'instrument' to load from a URL\"\n    );\n    config.instrumentUrl = config.instrument;\n    config.instrument = undefined;\n  }\n  if (config.instrument && !config.instrumentUrl) {\n    config.instrumentUrl = gleitzKitUrl(config.instrument, config.kit);\n  }\n\n  if (config.loadLoopData && config.instrument && !config.loopDataUrl) {\n    config.loopDataUrl = getGoldstSoundfontLoopsUrl(\n      config.instrument,\n      config.kit\n    );\n  }\n\n  return config;\n}\n","import { RegionPlayer, RegionPlayerOptions } from \"./player/region-player\";\nimport {\n  RegionGroup,\n  SampleRegion,\n  SampleStart,\n  SampleStop,\n  SamplerInstrument,\n} from \"./player/types\";\n\ntype Sf2 = {\n  instruments: Sf2Instrument[];\n};\n\ntype Sf2Instrument = {\n  header: {\n    name: string;\n  };\n  zones: Sf2Zone[];\n};\n\ntype Sf2Zone = {\n  sample: Sf2Sample;\n  keyRange?: { lo: number; hi: number };\n};\n\ntype Sf2Sample = {\n  data: Int16Array;\n  header: {\n    name: string;\n    sampleRate: number;\n    originalPitch: number;\n    pitchCorrection: number;\n    start: number;\n    end: number;\n    startLoop: number;\n    endLoop: number;\n  };\n};\n\nexport type Soundfont2Options = Partial<RegionPlayerOptions> & {\n  url: string;\n  createSoundfont: (data: Uint8Array) => Sf2;\n};\n\nexport class Soundfont2Sampler {\n  player: RegionPlayer;\n  soundfont: Sf2 | undefined;\n  load: Promise<this>;\n  #instrumentNames: string[] = [];\n\n  constructor(\n    public readonly context: AudioContext,\n    public readonly options: Soundfont2Options\n  ) {\n    this.player = new RegionPlayer(context, options);\n    this.load = loadSoundfont(options)\n      .then((soundfont) => {\n        this.soundfont = soundfont;\n        this.#instrumentNames = soundfont.instruments.map(\n          (instrument) => instrument.header.name\n        );\n      })\n      .then(() => this);\n  }\n\n  get instrumentNames() {\n    return this.#instrumentNames;\n  }\n\n  loadInstrument(instrumentName: string) {\n    const sf2instrument = this.soundfont?.instruments.find(\n      (inst) => inst.header.name === instrumentName\n    );\n    if (!sf2instrument) return;\n\n    const buffers = this.player.buffers;\n    const group: RegionGroup = {\n      regions: [],\n    };\n\n    for (const zone of sf2instrument.zones) {\n      const sample = zone.sample;\n      const header = sample.header;\n      const buffer = getAudioBufferFromSample(this.context, sample);\n      let region: SampleRegion = {\n        sampleName: sample.header.name,\n        midiPitch: sample.header.originalPitch,\n        midiLow: zone.keyRange?.lo,\n        midiHigh: zone.keyRange?.hi,\n        sample: {\n          loop: header.startLoop >= 0 && header.endLoop > header.startLoop,\n          loopStart: header.startLoop / header.sampleRate,\n          loopEnd: header.endLoop / header.sampleRate,\n        },\n      };\n      group.regions.push(region);\n      buffers[region.sampleName] = buffer;\n    }\n\n    const instrument: SamplerInstrument = {\n      groups: [group],\n      options: this.options,\n    };\n\n    this.player.instrument = instrument;\n\n    return [instrument, buffers];\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  start(sample: SampleStart | string | number) {\n    return this.player.start(sample);\n  }\n\n  stop(sample?: SampleStop | string | number) {\n    return this.player.stop(sample);\n  }\n\n  disconnect(): void {\n    this.player.disconnect();\n  }\n}\n\nfunction getAudioBufferFromSample(\n  context: AudioContext,\n  sample: Sf2Sample\n): AudioBuffer {\n  const { header, data: int16 } = sample;\n  const float32 = new Float32Array(int16.length);\n  for (let i = 0; i < int16.length; i++) {\n    float32[i] = int16[i] / 32768;\n  }\n  const audioBuffer = context.createBuffer(\n    1,\n    float32.length,\n    header.sampleRate\n  );\n  const channelData = audioBuffer.getChannelData(0);\n  channelData.set(float32);\n  return audioBuffer;\n}\n\nasync function loadSoundfont(options: Soundfont2Options) {\n  const buffer = await fetch(options.url).then((res) => res.arrayBuffer());\n  const data = new Uint8Array(buffer);\n  return options.createSoundfont(data);\n}\n","import { DefaultPlayer, DefaultPlayerConfig } from \"./player/default-player\";\nimport {\n  AudioBuffers,\n  AudioBuffersLoader,\n  findFirstSupportedFormat,\n  loadAudioBuffer,\n} from \"./player/load-audio\";\nimport { toMidi } from \"./player/midi\";\nimport { SampleStart, SampleStop } from \"./player/types\";\nimport { HttpStorage, Storage } from \"./storage\";\n\n/**\n * Splendid Grand Piano options\n */\nexport type SplendidGrandPianoConfig = {\n  baseUrl: string;\n  storage: Storage;\n  detune: number;\n  velocity: number;\n  decayTime: number;\n  notesToLoad?: {\n    notes: number[];\n    velocityRange: [number, number];\n  };\n} & Partial<DefaultPlayerConfig>;\n\nconst BASE_URL = \"https://danigb.github.io/samples/splendid-grand-piano\";\n\nexport class SplendidGrandPiano {\n  options: Readonly<SplendidGrandPianoConfig>;\n  private readonly player: DefaultPlayer;\n  public readonly load: Promise<this>;\n\n  constructor(\n    public readonly context: AudioContext,\n    options?: Partial<SplendidGrandPianoConfig>\n  ) {\n    this.options = Object.assign(\n      {\n        baseUrl: BASE_URL,\n        storage: HttpStorage,\n        detune: 0,\n        volume: 100,\n        velocity: 100,\n        decayTime: 0.5,\n      },\n      options\n    );\n    this.player = new DefaultPlayer(context, this.options);\n    const loader = splendidGrandPianoLoader(\n      this.options.baseUrl,\n      this.options.storage,\n      this.options.notesToLoad\n    );\n    this.load = loader(context, this.player.buffers).then(() => this);\n  }\n\n  get output() {\n    return this.player.output;\n  }\n\n  get buffers() {\n    return this.player.buffers;\n  }\n\n  async loaded() {\n    console.warn(\"deprecated: use load instead\");\n    return this.load;\n  }\n\n  start(sampleOrNote: SampleStart | number | string) {\n    const sample =\n      typeof sampleOrNote === \"object\"\n        ? { ...sampleOrNote }\n        : { note: sampleOrNote };\n\n    const found = this.#sampleToMidi(sample);\n    if (!found) return () => undefined;\n    sample.note = found[0];\n    sample.stopId = sample.stopId ?? found[1];\n    sample.detune = found[2] + (sample.detune ?? this.options.detune);\n    return this.player.start(sample);\n  }\n\n  #sampleToMidi(sample: SampleStart): [string, number, number] | undefined {\n    const midi = toMidi(sample.note);\n    if (!midi) return;\n\n    const vel = sample.velocity ?? this.options.velocity;\n    const layerIdx = LAYERS.findIndex(\n      (layer) => vel >= layer.vel_range[0] && vel <= layer.vel_range[1]\n    );\n    const layer = LAYERS[layerIdx];\n    if (!layer) return;\n\n    return findNearestMidiInLayer(layer.name, midi, this.player.buffers);\n  }\n\n  stop(sample?: SampleStop | number | string) {\n    if (typeof sample === \"string\") {\n      return this.player.stop(toMidi(sample) ?? sample);\n    } else if (typeof sample === \"object\") {\n      const midi = toMidi(sample.stopId);\n      return this.player.stop(\n        midi !== undefined ? { ...sample, stopId: midi } : sample\n      );\n    } else {\n      return this.player.stop(sample);\n    }\n  }\n}\n\nfunction findNearestMidiInLayer(\n  prefix: string,\n  midi: number,\n  buffers: AudioBuffers\n): [string, number, number] {\n  let i = 0;\n  while (buffers[prefix + (midi + i)] === undefined && i < 128) {\n    if (i > 0) i = -i;\n    else i = -i + 1;\n  }\n\n  return i === 127\n    ? [prefix + midi, midi, 0]\n    : [prefix + (midi + i), midi, -i * 100];\n}\n\nfunction splendidGrandPianoLoader(\n  baseUrl: string,\n  storage: Storage,\n  notesToLoad?: {\n    notes: number[];\n    velocityRange: [number, number];\n  }\n): AudioBuffersLoader {\n  const format = findFirstSupportedFormat([\"ogg\", \"m4a\"]) ?? \"ogg\";\n  let layers = notesToLoad\n    ? LAYERS.filter(\n        (layer) =>\n          layer.vel_range[0] <= notesToLoad.velocityRange[1] &&\n          layer.vel_range[1] >= notesToLoad.velocityRange[0]\n      )\n    : LAYERS;\n\n  return async (context, buffers) => {\n    for (const layer of layers) {\n      const samples = notesToLoad\n        ? layer.samples.filter((sample) =>\n            notesToLoad.notes.includes(sample[0] as number)\n          )\n        : layer.samples;\n\n      await Promise.all(\n        samples.map(async ([midi, name]) => {\n          const url = `${baseUrl}/${name}.${format}`;\n          const buffer = await loadAudioBuffer(context, url, storage);\n          if (buffer) buffers[layer.name + midi] = buffer;\n        })\n      );\n    }\n  };\n}\n\nexport const LAYERS = [\n  {\n    name: \"PPP\",\n    vel_range: [1, 40],\n    cutoff: 1000,\n    samples: [\n      [23, \"PP-B-1\"],\n      [27, \"PP-D#0\"],\n      [29, \"PP-F0\"],\n      [31, \"PP-G0\"],\n      [33, \"PP-A0\"],\n      [35, \"PP-B0\"],\n      [37, \"PP-C#1\"],\n      [38, \"PP-D1\"],\n      [40, \"PP-E1\"],\n      [41, \"PP-F1\"],\n      [43, \"PP-G1\"],\n      [45, \"PP-A1\"],\n      [47, \"PP-B1\"],\n      [48, \"PP-C2\"],\n      [50, \"PP-D2\"],\n      [52, \"PP-E2\"],\n      [53, \"PP-F2\"],\n      [55, \"PP-G2\"],\n      [56, \"PP-G#2\"],\n      [57, \"PP-A2\"],\n      [58, \"PP-A#2\"],\n      [59, \"PP-B2\"],\n      [60, \"PP-C3\"],\n      [62, \"PP-D3\"],\n      [64, \"PP-E3\"],\n      [65, \"PP-F3\"],\n      [67, \"PP-G3\"],\n      [69, \"PP-A3\"],\n      [71, \"PP-B3\"],\n      [72, \"PP-C4\"],\n      [74, \"PP-D4\"],\n      [76, \"PP-E4\"],\n      [77, \"PP-F4\"],\n      [79, \"PP-G4\"],\n      [80, \"PP-G#4\"],\n      [81, \"PP-A4\"],\n      [82, \"PP-A#4\"],\n      [83, \"PP-B4\"],\n      [85, \"PP-C#5\"],\n      [86, \"PP-D5\"],\n      [87, \"PP-D#5\"],\n      [89, \"PP-F5\"],\n      [90, \"PP-F#5\"],\n      [91, \"PP-G5\"],\n      [92, \"PP-G#5\"],\n      [93, \"PP-A5\"],\n      [94, \"PP-A#5\"],\n      [95, \"PP-B5\"],\n      [96, \"PP-C6\"],\n      [97, \"PP-C#6\"],\n      [98, \"PP-D6\"],\n      [99, \"PP-D#6\"],\n      [100, \"PP-E6\"],\n      [101, \"PP-F6\"],\n      [102, \"PP-F#6\"],\n      [103, \"PP-G6\"],\n      [104, \"PP-G#6\"],\n      [105, \"PP-A6\"],\n      [106, \"PP-A#6\"],\n      [107, \"PP-B6\"],\n      [108, \"PP-C7\"],\n    ],\n  },\n  {\n    name: \"PP\",\n    vel_range: [41, 67],\n    samples: [\n      [23, \"PP-B-1\"],\n      [27, \"PP-D#0\"],\n      [29, \"PP-F0\"],\n      [31, \"PP-G0\"],\n      [33, \"PP-A0\"],\n      [35, \"PP-B0\"],\n      [37, \"PP-C#1\"],\n      [38, \"PP-D1\"],\n      [40, \"PP-E1\"],\n      [41, \"PP-F1\"],\n      [43, \"PP-G1\"],\n      [45, \"PP-A1\"],\n      [47, \"PP-B1\"],\n      [48, \"PP-C2\"],\n      [50, \"PP-D2\"],\n      [52, \"PP-E2\"],\n      [53, \"PP-F2\"],\n      [55, \"PP-G2\"],\n      [56, \"PP-G#2\"],\n      [57, \"PP-A2\"],\n      [58, \"PP-A#2\"],\n      [59, \"PP-B2\"],\n      [60, \"PP-C3\"],\n      [62, \"PP-D3\"],\n      [64, \"PP-E3\"],\n      [65, \"PP-F3\"],\n      [67, \"PP-G3\"],\n      [69, \"PP-A3\"],\n      [71, \"PP-B3\"],\n      [72, \"PP-C4\"],\n      [74, \"PP-D4\"],\n      [76, \"PP-E4\"],\n      [77, \"PP-F4\"],\n      [79, \"PP-G4\"],\n      [80, \"PP-G#4\"],\n      [81, \"PP-A4\"],\n      [82, \"PP-A#4\"],\n      [83, \"PP-B4\"],\n      [85, \"PP-C#5\"],\n      [86, \"PP-D5\"],\n      [87, \"PP-D#5\"],\n      [89, \"PP-F5\"],\n      [90, \"PP-F#5\"],\n      [91, \"PP-G5\"],\n      [92, \"PP-G#5\"],\n      [93, \"PP-A5\"],\n      [94, \"PP-A#5\"],\n      [95, \"PP-B5\"],\n      [96, \"PP-C6\"],\n      [97, \"PP-C#6\"],\n      [98, \"PP-D6\"],\n      [99, \"PP-D#6\"],\n      [100, \"PP-E6\"],\n      [101, \"PP-F6\"],\n      [102, \"PP-F#6\"],\n      [103, \"PP-G6\"],\n      [104, \"PP-G#6\"],\n      [105, \"PP-A6\"],\n      [106, \"PP-A#6\"],\n      [107, \"PP-B6\"],\n      [108, \"PP-C7\"],\n    ],\n  },\n  {\n    name: \"MP\",\n    vel_range: [68, 84],\n    samples: [\n      [23, \"Mp-B-1\"],\n      [27, \"Mp-D#0\"],\n      [29, \"Mp-F0\"],\n      [31, \"Mp-G0\"],\n      [33, \"Mp-A0\"],\n      [35, \"Mp-B0\"],\n      [37, \"Mp-C#1\"],\n      [38, \"Mp-D1\"],\n      [40, \"Mp-E1\"],\n      [41, \"Mp-F1\"],\n      [43, \"Mp-G1\"],\n      [45, \"Mp-A1\"],\n      [47, \"Mp-B1\"],\n      [48, \"Mp-C2\"],\n      [50, \"Mp-D2\"],\n      [52, \"Mp-E2\"],\n      [53, \"Mp-F2\"],\n      [55, \"Mp-G2\"],\n      [56, \"Mp-G#2\"],\n      [57, \"Mp-A2\"],\n      [58, \"Mp-A#2\"],\n      [59, \"Mp-B2\"],\n      [60, \"Mp-C3\"],\n      [62, \"Mp-D3\"],\n      [64, \"Mp-E3\"],\n      [65, \"Mp-F3\"],\n      [67, \"Mp-G3\"],\n      [69, \"Mp-A3\"],\n      [71, \"Mp-B3\"],\n      [72, \"Mp-C4\"],\n      [74, \"Mp-D4\"],\n      [76, \"Mp-E4\"],\n      [77, \"Mp-F4\"],\n      [79, \"Mp-G4\"],\n      [80, \"Mp-G#4\"],\n      [81, \"Mp-A4\"],\n      [82, \"Mp-A#4\"],\n      [83, \"Mp-B4\"],\n      [85, \"Mp-C#5\"],\n      [86, \"Mp-D5\"],\n      [87, \"Mp-D#5\"],\n      [88, \"Mp-E5\"],\n      [89, \"Mp-F5\"],\n      [90, \"Mp-F#5\"],\n      [91, \"Mp-G5\"],\n      [92, \"Mp-G#5\"],\n      [93, \"Mp-A5\"],\n      [94, \"Mp-A#5\"],\n      [95, \"Mp-B5\"],\n      [96, \"Mp-C6\"],\n      [97, \"Mp-C#6\"],\n      [98, \"Mp-D6\"],\n      [99, \"Mp-D#6\"],\n      [100, \"PP-E6\"],\n      [101, \"Mp-F6\"],\n      [102, \"Mp-F#6\"],\n      [103, \"Mp-G6\"],\n      [104, \"Mp-G#6\"],\n      [105, \"Mp-A6\"],\n      [106, \"Mp-A#6\"],\n      [107, \"PP-B6\"],\n      [108, \"PP-C7\"],\n    ],\n  },\n  {\n    name: \"MF\",\n    vel_range: [85, 100],\n    samples: [\n      [23, \"Mf-B-1\"],\n      [27, \"Mf-D#0\"],\n      [29, \"Mf-F0\"],\n      [31, \"Mf-G0\"],\n      [33, \"Mf-A0\"],\n      [35, \"Mf-B0\"],\n      [37, \"Mf-C#1\"],\n      [38, \"Mf-D1\"],\n      [40, \"Mf-E1\"],\n      [41, \"Mf-F1\"],\n      [43, \"Mf-G1\"],\n      [45, \"Mf-A1\"],\n      [47, \"Mf-B1\"],\n      [48, \"Mf-C2\"],\n      [50, \"Mf-D2\"],\n      [52, \"Mf-E2\"],\n      [53, \"Mf-F2\"],\n      [55, \"Mf-G2\"],\n      [56, \"Mf-G#2\"],\n      [57, \"Mf-A2\"],\n      [58, \"Mf-A#2\"],\n      [59, \"Mf-B2\"],\n      [60, \"Mf-C3\"],\n      [62, \"Mf-D3\"],\n      [64, \"Mf-E3\"],\n      [65, \"Mf-F3\"],\n      [67, \"Mf-G3\"],\n      [69, \"Mf-A3\"],\n      [71, \"Mf-B3\"],\n      [72, \"Mf-C4\"],\n      [74, \"Mf-D4\"],\n      [76, \"Mf-E4\"],\n      [77, \"Mf-F4\"],\n      [79, \"Mf-G4\"],\n      [80, \"Mf-G#4\"],\n      [81, \"Mf-A4\"],\n      [82, \"Mf-A#4\"],\n      [83, \"Mf-B4\"],\n      [85, \"Mf-C#5\"],\n      [86, \"Mf-D5\"],\n      [87, \"Mf-D#5\"],\n      [88, \"Mf-E5\"],\n      [89, \"Mf-F5\"],\n      [90, \"Mf-F#5\"],\n      [91, \"Mf-G5\"],\n      [92, \"Mf-G#5\"],\n      [93, \"Mf-A5\"],\n      [94, \"Mf-A#5\"],\n      [95, \"Mf-B5\"],\n      [96, \"Mf-C6\"],\n      [97, \"Mf-C#6\"],\n      [98, \"Mf-D6\"],\n      [99, \"Mf-D#6\"],\n      [100, \"Mf-E6\"],\n      [101, \"Mf-F6\"],\n      [102, \"Mf-F#6\"],\n      [103, \"Mf-G6\"],\n      [104, \"Mf-G#6\"],\n      [105, \"Mf-A6\"],\n      [106, \"Mf-A#6\"],\n      [107, \"Mf-B6\"],\n      [108, \"PP-C7\"],\n    ],\n  },\n  {\n    name: \"FF\",\n    vel_range: [101, 127],\n    samples: [\n      [23, \"FF-B-1\"],\n      [27, \"FF-D#0\"],\n      [29, \"FF-F0\"],\n      [31, \"FF-G0\"],\n      [33, \"FF-A0\"],\n      [35, \"FF-B0\"],\n      [37, \"FF-C#1\"],\n      [38, \"FF-D1\"],\n      [40, \"FF-E1\"],\n      [41, \"FF-F1\"],\n      [43, \"FF-G1\"],\n      [45, \"FF-A1\"],\n      [47, \"FF-B1\"],\n      [48, \"FF-C2\"],\n      [50, \"FF-D2\"],\n      [52, \"FF-E2\"],\n      [53, \"FF-F2\"],\n      [55, \"FF-G2\"],\n      [56, \"FF-G#2\"],\n      [57, \"FF-A2\"],\n      [58, \"FF-A#2\"],\n      [59, \"FF-B2\"],\n      [60, \"FF-C3\"],\n      [62, \"FF-D3\"],\n      [64, \"FF-E3\"],\n      [65, \"FF-F3\"],\n      [67, \"FF-G3\"],\n      [69, \"FF-A3\"],\n      [71, \"FF-B3\"],\n      [72, \"FF-C4\"],\n      [74, \"FF-D4\"],\n      [76, \"FF-E4\"],\n      [77, \"FF-F4\"],\n      [79, \"FF-G4\"],\n      [80, \"FF-G#4\"],\n      [81, \"FF-A4\"],\n      [82, \"FF-A#4\"],\n      [83, \"FF-B4\"],\n      [85, \"FF-C#5\"],\n      [86, \"FF-D5\"],\n      [88, \"FF-E5\"],\n      [89, \"FF-F5\"],\n      [91, \"FF-G5\"],\n      [93, \"FF-A5\"],\n      [95, \"Mf-B5\"],\n      [96, \"Mf-C6\"],\n      [97, \"Mf-C#6\"],\n      [98, \"Mf-D6\"],\n      [99, \"Mf-D#6\"],\n      [100, \"Mf-E6\"],\n      [102, \"Mf-F#6\"],\n      [103, \"Mf-G6\"],\n      [104, \"Mf-G#6\"],\n      [105, \"Mf-A6\"],\n      [106, \"Mf-A#6\"],\n      [107, \"Mf-B6\"],\n      [108, \"Mf-C7\"],\n    ],\n  },\n];\n"],"mappings":"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C,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,OAAO;AAAA,MACZ,CAAC,IAAI,QAAQ;AAAA,MACb,CAA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","names":["volume","send","_config","sample","_config","_disconnected","_a","canPlay","getConfig","instrument","urls","_a","depth","INSTRUMENTS","sample","SfzInstrumentLoader","mode","scope","group","SfzInstrumentLoader","_a","SfzInstrumentLoader","sample","BASE_URL","layer"]}