UNPKG

wam-community

Version:

A collection of prebuilt Web Audio Modules ready for use

258 lines 171 kB
/*
 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
/******/ var __webpack_modules__ = ({

/***/ "../../../node_modules/preact/dist/preact.module.js":
/*!**********************************************************!*\
  !*** ../../../node_modules/preact/dist/preact.module.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Component: () => (/* binding */ _),\n/* harmony export */   Fragment: () => (/* binding */ d),\n/* harmony export */   cloneElement: () => (/* binding */ B),\n/* harmony export */   createContext: () => (/* binding */ D),\n/* harmony export */   createElement: () => (/* binding */ v),\n/* harmony export */   createRef: () => (/* binding */ p),\n/* harmony export */   h: () => (/* binding */ v),\n/* harmony export */   hydrate: () => (/* binding */ q),\n/* harmony export */   isValidElement: () => (/* binding */ i),\n/* harmony export */   options: () => (/* binding */ l),\n/* harmony export */   render: () => (/* binding */ S),\n/* harmony export */   toChildArray: () => (/* binding */ A)\n/* harmony export */ });\nvar n,l,u,i,t,o,r,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function h(n){var l=n.parentNode;l&&l.removeChild(n)}function v(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return y(l,f,t,o,null)}function y(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null!=l.vnode&&l.vnode(f),f}function p(){return{current:null}}function d(n){return n.children}function _(n,l){this.props=n,this.context=l}function k(n,l){if(null==l)return n.__?k(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?k(n):null}function b(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return b(n)}}function m(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g.__r++||r!==l.debounceRendering)&&((r=l.debounceRendering)||o)(g)}function g(){for(var n;g.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=a({},t)).__v=t.__v+1,j(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?k(t):o,t.__h),z(u,t),t.__e!=o&&b(t)))})}function w(n,l,u,i,t,o,r,f,s,a){var h,v,p,_,b,m,g,w=i&&i.__k||c,A=w.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(_=u.__k[h]=null==(_=l[h])||\"boolean\"==typeof _?null:\"string\"==typeof _||\"number\"==typeof _||\"bigint\"==typeof _?y(null,_,null,null,_):Array.isArray(_)?y(d,{children:_},null,null,null):_.__b>0?y(_.type,_.props,_.key,null,_.__v):_)){if(_.__=u,_.__b=u.__b+1,null===(p=w[h])||p&&_.key==p.key&&_.type===p.type)w[h]=void 0;else for(v=0;v<A;v++){if((p=w[v])&&_.key==p.key&&_.type===p.type){w[v]=void 0;break}p=null}j(n,_,p=p||e,t,o,r,f,s,a),b=_.__e,(v=_.ref)&&p.ref!=v&&(g||(g=[]),p.ref&&g.push(p.ref,null,_),g.push(v,_.__c||b,_)),null!=b?(null==m&&(m=b),\"function\"==typeof _.type&&null!=_.__k&&_.__k===p.__k?_.__d=s=x(_,s,n):s=P(n,_,p,w,b,s),a||\"option\"!==u.type?\"function\"==typeof u.type&&(u.__d=s):n.value=\"\"):s&&p.__e==s&&s.parentNode!=n&&(s=k(p))}for(u.__e=m,h=A;h--;)null!=w[h]&&(\"function\"==typeof u.type&&null!=w[h].__e&&w[h].__e==u.__d&&(u.__d=k(i,h+1)),N(w[h],w[h]));if(g)for(h=0;h<g.length;h++)M(g[h],g[++h],g[++h])}function x(n,l,u){var i,t;for(i=0;i<n.__k.length;i++)(t=n.__k[i])&&(t.__=n,l=\"function\"==typeof t.type?x(t,l,u):P(u,t,t,n.__k,t.__e,l));return l}function A(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){A(n,l)}):l.push(n)),l}function P(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i)}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||s.test(l)?u:u+\"px\"}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T:I,o):n.removeEventListener(l,o?T:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink[H:h]/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function I(n){this.l[n.type+!1](l.event?l.event(n):n)}function T(n){this.l[n.type+!0](l.event?l.event(n):n)}function j(n,u,i,t,o,r,f,e,c){var s,h,v,y,p,k,b,m,g,x,A,P=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(s=l.__b)&&s(u);try{n:if(\"function\"==typeof P){if(m=u.props,g=(s=P.contextType)&&t[s.__c],x=s?g?g.props.value:s.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in P&&P.prototype.render?u.__c=h=new P(m,x):(u.__c=h=new _(m,x),h.constructor=P,h.render=O),g&&g.sub(h),h.props=m,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[]),null==h.__s&&(h.__s=h.state),null!=P.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=a({},h.__s)),a(h.__s,P.getDerivedStateFromProps(m,h.__s))),y=h.props,p=h.state,v)null==P.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(null==P.getDerivedStateFromProps&&m!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(m,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(m,h.__s,x)||u.__v===i.__v){h.props=m,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(m,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,p,k)})}h.context=x,h.props=m,h.state=h.__s,(s=l.__r)&&s(u),h.__d=!1,h.__v=u,h.__P=n,s=h.render(h.props,h.state,h.context),h.state=h.__s,null!=h.getChildContext&&(t=a(a({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,p)),A=null!=s&&s.type===d&&null==s.key?s.props.children:s,w(n,Array.isArray(A)?A:[A],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(s=l.diffed)&&s(u)}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l.__e(n,u,i)}}function z(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function L(l,u,i,t,o,r,f,c){var s,a,v,y=i.props,p=u.props,d=u.type,_=0;if(\"svg\"===d&&(o=!0),null!=r)for(;_<r.length;_++)if((s=r[_])&&(s===l||(d?s.localName==d:3==s.nodeType))){l=s,r[_]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1}if(null===d)y===p||c&&l.data===p||(l.data=p);else{if(r=r&&n.call(l.childNodes),a=(y=i.props||e).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},_=0;_<l.attributes.length;_++)y[l.attributes[_].name]=l.attributes[_].value;(v||a)&&(v&&(a&&v.__html==a.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"))}if(C(l,p,y,o,c),v)u.__k=[];else if(_=u.props.children,w(l,Array.isArray(_)?_:[_],u,i,t,o&&\"foreignObject\"!==d,r,f,r?r[0]:i.__k&&k(i,0),c),null!=r)for(_=r.length;_--;)null!=r[_]&&h(r[_]);c||(\"value\"in p&&void 0!==(_=p.value)&&(_!==l.value||\"progress\"===d&&!_)&&H(l,\"value\",_,y.value,!1),\"checked\"in p&&void 0!==(_=p.checked)&&_!==l.checked&&H(l,\"checked\",_,y.checked,!1))}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,i)}}function N(n,u,i){var t,o;if(l.unmount&&l.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(n){l.__e(n,u)}t.base=t.__P=null}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,\"function\"!=typeof n.type);i||null==n.__e||h(n.__e),n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function S(u,i,t){var o,r,f;l.__&&l.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,f=[],j(i,u=(!o&&t||i).__k=v(d,null,[u]),r||e,e,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,f,!o&&t?t:r?r.__e:i.firstChild,o),z(f,u)}function q(n,l){S(n,l,q)}function B(l,u,i){var t,o,r,f=a({},l.props);for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),y(l.type,f,t||l.key,o||l.ref,null)}function D(n,l){var u={__c:l=\"__cC\"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(m)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=c.slice,l={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},_.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=a({},this.state),\"function\"==typeof n&&(n=n(a({},u),this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),m(this))},_.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),m(this))},_.prototype.render=d,t=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,g.__r=0,f=0;\n//# sourceMappingURL=preact.module.js.map\n\n\n//# sourceURL=webpack://wam-reverb/../../../node_modules/preact/dist/preact.module.js?");

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/api.js":
/*!*****************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/api.js ***!
  \*****************************************************/
/***/ ((module) => {

eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = \"\";\n      var needLayer = typeof item[5] !== \"undefined\";\n\n      if (item[4]) {\n        content += \"@supports (\".concat(item[4], \") {\");\n      }\n\n      if (item[2]) {\n        content += \"@media \".concat(item[2], \" {\");\n      }\n\n      if (needLayer) {\n        content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n      }\n\n      content += cssWithMappingToString(item);\n\n      if (needLayer) {\n        content += \"}\";\n      }\n\n      if (item[2]) {\n        content += \"}\";\n      }\n\n      if (item[4]) {\n        content += \"}\";\n      }\n\n      return content;\n    }).join(\"\");\n  }; // import a list of modules into the list\n\n\n  list.i = function i(modules, media, dedupe, supports, layer) {\n    if (typeof modules === \"string\") {\n      modules = [[null, modules, undefined]];\n    }\n\n    var alreadyImportedModules = {};\n\n    if (dedupe) {\n      for (var k = 0; k < this.length; k++) {\n        var id = this[k][0];\n\n        if (id != null) {\n          alreadyImportedModules[id] = true;\n        }\n      }\n    }\n\n    for (var _k = 0; _k < modules.length; _k++) {\n      var item = [].concat(modules[_k]);\n\n      if (dedupe && alreadyImportedModules[item[0]]) {\n        continue;\n      }\n\n      if (typeof layer !== \"undefined\") {\n        if (typeof item[5] === \"undefined\") {\n          item[5] = layer;\n        } else {\n          item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n          item[5] = layer;\n        }\n      }\n\n      if (media) {\n        if (!item[2]) {\n          item[2] = media;\n        } else {\n          item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n          item[2] = media;\n        }\n      }\n\n      if (supports) {\n        if (!item[4]) {\n          item[4] = \"\".concat(supports);\n        } else {\n          item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n          item[4] = supports;\n        }\n      }\n\n      list.push(item);\n    }\n  };\n\n  return list;\n};\n\n//# sourceURL=webpack://wam-reverb/./node_modules/css-loader/dist/runtime/api.js?");

/***/ }),

/***/ "./node_modules/css-loader/dist/runtime/noSourceMaps.js":
/*!**************************************************************!*\
  !*** ./node_modules/css-loader/dist/runtime/noSourceMaps.js ***!
  \**************************************************************/
/***/ ((module) => {

eval("\n\nmodule.exports = function (i) {\n  return i[1];\n};\n\n//# sourceURL=webpack://wam-reverb/./node_modules/css-loader/dist/runtime/noSourceMaps.js?");

/***/ }),

/***/ "./src/ReverbView.scss":
/*!*****************************!*\
  !*** ./src/ReverbView.scss ***!
  \*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".ComponentWrapper {\\n  display: flex;\\n  flex-direction: column;\\n  align-items: center;\\n  text-align: center;\\n  flex: 1;\\n  padding: 4px;\\n}\\n\\n.Fader {\\n  margin-top: auto;\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.Knob {\\n  margin-top: auto;\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.ComponentSelect {\\n  margin-bottom: auto;\\n  margin-top: auto;\\n  margin-bottom: auto;\\n  display: flex;\\n  flex-direction: column;\\n}\\n\\n.GlowModalBackdrop {\\n  position: fixed;\\n  top: 0;\\n  bottom: 0;\\n  left: 0;\\n  right: 0;\\n  background-color: rgba(0, 0, 0, 0.3);\\n  padding: 50px;\\n  z-index: 99999998;\\n}\\n\\n.GlowModalContainer {\\n  position: fixed;\\n  top: 50%;\\n  left: 50%;\\n  transform: translate(-50%, -50%);\\n  margin: 0 auto;\\n  z-index: 99999998;\\n}\\n\\n.FrgVKjHB3hNbo1ZeYmGq {\\n  flex: 1;\\n  background-color: #631F87;\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: space-between;\\n  padding: 10px;\\n  color: white;\\n  font-family: var(--var-FontFamily, system-ui, -apple-system, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", \\\"Noto Sans\\\", \\\"Liberation Sans\\\", Arial, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");\\n}\", \"\"]);\n// Exports\n___CSS_LOADER_EXPORT___.locals = {\n\t\"reverbModule\": \"FrgVKjHB3hNbo1ZeYmGq\"\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://wam-reverb/./src/ReverbView.scss?");

/***/ }),

/***/ "./node_modules/preact/dist/preact.module.js":
/*!***************************************************!*\
  !*** ./node_modules/preact/dist/preact.module.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Component: () => (/* binding */ _),\n/* harmony export */   Fragment: () => (/* binding */ d),\n/* harmony export */   cloneElement: () => (/* binding */ B),\n/* harmony export */   createContext: () => (/* binding */ D),\n/* harmony export */   createElement: () => (/* binding */ v),\n/* harmony export */   createRef: () => (/* binding */ p),\n/* harmony export */   h: () => (/* binding */ v),\n/* harmony export */   hydrate: () => (/* binding */ q),\n/* harmony export */   isValidElement: () => (/* binding */ i),\n/* harmony export */   options: () => (/* binding */ l),\n/* harmony export */   render: () => (/* binding */ S),\n/* harmony export */   toChildArray: () => (/* binding */ A)\n/* harmony export */ });\nvar n,l,u,i,t,o,r,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function h(n){var l=n.parentNode;l&&l.removeChild(n)}function v(l,u,i){var t,o,r,f={};for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return y(l,f,t,o,null)}function y(n,i,t,o,r){var f={type:n,props:i,key:t,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==r?++u:r};return null!=l.vnode&&l.vnode(f),f}function p(){return{current:null}}function d(n){return n.children}function _(n,l){this.props=n,this.context=l}function k(n,l){if(null==l)return n.__?k(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?k(n):null}function b(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return b(n)}}function m(n){(!n.__d&&(n.__d=!0)&&t.push(n)&&!g.__r++||r!==l.debounceRendering)&&((r=l.debounceRendering)||o)(g)}function g(){for(var n;g.__r=t.length;)n=t.sort(function(n,l){return n.__v.__b-l.__v.__b}),t=[],n.some(function(n){var l,u,i,t,o,r;n.__d&&(o=(t=(l=n).__v).__e,(r=l.__P)&&(u=[],(i=a({},t)).__v=t.__v+1,j(r,t,i,l.__n,void 0!==r.ownerSVGElement,null!=t.__h?[o]:null,u,null==o?k(t):o,t.__h),z(u,t),t.__e!=o&&b(t)))})}function w(n,l,u,i,t,o,r,f,s,a){var h,v,p,_,b,m,g,w=i&&i.__k||c,A=w.length;for(u.__k=[],h=0;h<l.length;h++)if(null!=(_=u.__k[h]=null==(_=l[h])||\"boolean\"==typeof _?null:\"string\"==typeof _||\"number\"==typeof _||\"bigint\"==typeof _?y(null,_,null,null,_):Array.isArray(_)?y(d,{children:_},null,null,null):_.__b>0?y(_.type,_.props,_.key,null,_.__v):_)){if(_.__=u,_.__b=u.__b+1,null===(p=w[h])||p&&_.key==p.key&&_.type===p.type)w[h]=void 0;else for(v=0;v<A;v++){if((p=w[v])&&_.key==p.key&&_.type===p.type){w[v]=void 0;break}p=null}j(n,_,p=p||e,t,o,r,f,s,a),b=_.__e,(v=_.ref)&&p.ref!=v&&(g||(g=[]),p.ref&&g.push(p.ref,null,_),g.push(v,_.__c||b,_)),null!=b?(null==m&&(m=b),\"function\"==typeof _.type&&null!=_.__k&&_.__k===p.__k?_.__d=s=x(_,s,n):s=P(n,_,p,w,b,s),a||\"option\"!==u.type?\"function\"==typeof u.type&&(u.__d=s):n.value=\"\"):s&&p.__e==s&&s.parentNode!=n&&(s=k(p))}for(u.__e=m,h=A;h--;)null!=w[h]&&(\"function\"==typeof u.type&&null!=w[h].__e&&w[h].__e==u.__d&&(u.__d=k(i,h+1)),N(w[h],w[h]));if(g)for(h=0;h<g.length;h++)M(g[h],g[++h],g[++h])}function x(n,l,u){var i,t;for(i=0;i<n.__k.length;i++)(t=n.__k[i])&&(t.__=n,l=\"function\"==typeof t.type?x(t,l,u):P(u,t,t,n.__k,t.__e,l));return l}function A(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some(function(n){A(n,l)}):l.push(n)),l}function P(n,l,u,i,t,o){var r,f,e;if(void 0!==l.__d)r=l.__d,l.__d=void 0;else if(null==u||t!=o||null==t.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(t),r=null;else{for(f=o,e=0;(f=f.nextSibling)&&e<i.length;e+=2)if(f==t)break n;n.insertBefore(t,o),r=o}return void 0!==r?r:t.nextSibling}function C(n,l,u,i,t){var o;for(o in u)\"children\"===o||\"key\"===o||o in l||H(n,o,null,u[o],i);for(o in l)t&&\"function\"!=typeof l[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||u[o]===l[o]||H(n,o,l[o],u[o],i)}function $(n,l,u){\"-\"===l[0]?n.setProperty(l,u):n[l]=null==u?\"\":\"number\"!=typeof u||s.test(l)?u:u+\"px\"}function H(n,l,u,i,t){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof i&&(n.style.cssText=i=\"\"),i)for(l in i)u&&l in u||$(n.style,l,\"\");if(u)for(l in u)i&&u[l]===i[l]||$(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/Capture$/,\"\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?i||n.addEventListener(l,o?T:I,o):n.removeEventListener(l,o?T:I,o);else if(\"dangerouslySetInnerHTML\"!==l){if(t)l=l.replace(/xlink[H:h]/,\"h\").replace(/sName$/,\"s\");else if(\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null!=u&&(!1!==u||\"a\"===l[0]&&\"r\"===l[1])?n.setAttribute(l,u):n.removeAttribute(l))}}function I(n){this.l[n.type+!1](l.event?l.event(n):n)}function T(n){this.l[n.type+!0](l.event?l.event(n):n)}function j(n,u,i,t,o,r,f,e,c){var s,h,v,y,p,k,b,m,g,x,A,P=u.type;if(void 0!==u.constructor)return null;null!=i.__h&&(c=i.__h,e=u.__e=i.__e,u.__h=null,r=[e]),(s=l.__b)&&s(u);try{n:if(\"function\"==typeof P){if(m=u.props,g=(s=P.contextType)&&t[s.__c],x=s?g?g.props.value:s.__:t,i.__c?b=(h=u.__c=i.__c).__=h.__E:(\"prototype\"in P&&P.prototype.render?u.__c=h=new P(m,x):(u.__c=h=new _(m,x),h.constructor=P,h.render=O),g&&g.sub(h),h.props=m,h.state||(h.state={}),h.context=x,h.__n=t,v=h.__d=!0,h.__h=[]),null==h.__s&&(h.__s=h.state),null!=P.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=a({},h.__s)),a(h.__s,P.getDerivedStateFromProps(m,h.__s))),y=h.props,p=h.state,v)null==P.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(null==P.getDerivedStateFromProps&&m!==y&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(m,x),!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(m,h.__s,x)||u.__v===i.__v){h.props=m,h.state=h.__s,u.__v!==i.__v&&(h.__d=!1),h.__v=u,u.__e=i.__e,u.__k=i.__k,u.__k.forEach(function(n){n&&(n.__=u)}),h.__h.length&&f.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(m,h.__s,x),null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(y,p,k)})}h.context=x,h.props=m,h.state=h.__s,(s=l.__r)&&s(u),h.__d=!1,h.__v=u,h.__P=n,s=h.render(h.props,h.state,h.context),h.state=h.__s,null!=h.getChildContext&&(t=a(a({},t),h.getChildContext())),v||null==h.getSnapshotBeforeUpdate||(k=h.getSnapshotBeforeUpdate(y,p)),A=null!=s&&s.type===d&&null==s.key?s.props.children:s,w(n,Array.isArray(A)?A:[A],u,i,t,o,r,f,e,c),h.base=u.__e,u.__h=null,h.__h.length&&f.push(h),b&&(h.__E=h.__=null),h.__e=!1}else null==r&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=L(i.__e,u,i,t,o,r,f,c);(s=l.diffed)&&s(u)}catch(n){u.__v=null,(c||null!=r)&&(u.__e=e,u.__h=!!c,r[r.indexOf(e)]=null),l.__e(n,u,i)}}function z(n,u){l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function L(l,u,i,t,o,r,f,c){var s,a,v,y=i.props,p=u.props,d=u.type,_=0;if(\"svg\"===d&&(o=!0),null!=r)for(;_<r.length;_++)if((s=r[_])&&(s===l||(d?s.localName==d:3==s.nodeType))){l=s,r[_]=null;break}if(null==l){if(null===d)return document.createTextNode(p);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",d):document.createElement(d,p.is&&p),r=null,c=!1}if(null===d)y===p||c&&l.data===p||(l.data=p);else{if(r=r&&n.call(l.childNodes),a=(y=i.props||e).dangerouslySetInnerHTML,v=p.dangerouslySetInnerHTML,!c){if(null!=r)for(y={},_=0;_<l.attributes.length;_++)y[l.attributes[_].name]=l.attributes[_].value;(v||a)&&(v&&(a&&v.__html==a.__html||v.__html===l.innerHTML)||(l.innerHTML=v&&v.__html||\"\"))}if(C(l,p,y,o,c),v)u.__k=[];else if(_=u.props.children,w(l,Array.isArray(_)?_:[_],u,i,t,o&&\"foreignObject\"!==d,r,f,r?r[0]:i.__k&&k(i,0),c),null!=r)for(_=r.length;_--;)null!=r[_]&&h(r[_]);c||(\"value\"in p&&void 0!==(_=p.value)&&(_!==l.value||\"progress\"===d&&!_)&&H(l,\"value\",_,y.value,!1),\"checked\"in p&&void 0!==(_=p.checked)&&_!==l.checked&&H(l,\"checked\",_,y.checked,!1))}return l}function M(n,u,i){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,i)}}function N(n,u,i){var t,o;if(l.unmount&&l.unmount(n),(t=n.ref)&&(t.current&&t.current!==n.__e||M(t,null,u)),null!=(t=n.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount()}catch(n){l.__e(n,u)}t.base=t.__P=null}if(t=n.__k)for(o=0;o<t.length;o++)t[o]&&N(t[o],u,\"function\"!=typeof n.type);i||null==n.__e||h(n.__e),n.__e=n.__d=void 0}function O(n,l,u){return this.constructor(n,u)}function S(u,i,t){var o,r,f;l.__&&l.__(u,i),r=(o=\"function\"==typeof t)?null:t&&t.__k||i.__k,f=[],j(i,u=(!o&&t||i).__k=v(d,null,[u]),r||e,e,void 0!==i.ownerSVGElement,!o&&t?[t]:r?null:i.firstChild?n.call(i.childNodes):null,f,!o&&t?t:r?r.__e:i.firstChild,o),z(f,u)}function q(n,l){S(n,l,q)}function B(l,u,i){var t,o,r,f=a({},l.props);for(r in u)\"key\"==r?t=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):i),y(l.type,f,t||l.key,o||l.ref,null)}function D(n,l){var u={__c:l=\"__cC\"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,i;return this.getChildContext||(u=[],(i={})[l]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(m)},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=c.slice,l={__e:function(n,l){for(var u,i,t;l=l.__;)if((u=l.__c)&&!u.__)try{if((i=u.constructor)&&null!=i.getDerivedStateFromError&&(u.setState(i.getDerivedStateFromError(n)),t=u.__d),null!=u.componentDidCatch&&(u.componentDidCatch(n),t=u.__d),t)return u.__E=u}catch(l){n=l}throw n}},u=0,i=function(n){return null!=n&&void 0===n.constructor},_.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=a({},this.state),\"function\"==typeof n&&(n=n(a({},u),this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),m(this))},_.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),m(this))},_.prototype.render=d,t=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,g.__r=0,f=0;\n//# sourceMappingURL=preact.module.js.map\n\n\n//# sourceURL=webpack://wam-reverb/./node_modules/preact/dist/preact.module.js?");

/***/ }),

/***/ "./src/AudioPool.ts":
/*!**************************!*\
  !*** ./src/AudioPool.ts ***!
  \**************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   AudioPool: () => (/* binding */ AudioPool)\n/* harmony export */ });\nclass AudioPool {\n    constructor(audioContext) {\n        this.audioContext = audioContext;\n    }\n    loadSample(url, callback) {\n        var request = new XMLHttpRequest();\n        request.open('GET', url, true);\n        request.responseType = 'arraybuffer';\n        request.onload = () => {\n            this.audioContext.decodeAudioData(request.response, (buffer) => {\n                callback(buffer);\n            });\n        };\n        request.send();\n    }\n}\n\n\n//# sourceURL=webpack://wam-reverb/./src/AudioPool.ts?");

/***/ }),

/***/ "./src/Node.ts":
/*!*********************!*\
  !*** ./src/Node.ts ***!
  \*********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ConvolutionReverbNode)\n/* harmony export */ });\n/* harmony import */ var _webaudiomodules_sdk_parammgr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @webaudiomodules/sdk-parammgr */ \"../../../node_modules/@webaudiomodules/sdk-parammgr/dist/index.js\");\n/* harmony import */ var _AudioPool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./AudioPool */ \"./src/AudioPool.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\n\n\nclass ConvolutionReverbNode extends _webaudiomodules_sdk_parammgr__WEBPACK_IMPORTED_MODULE_0__.CompositeAudioNode {\n    constructor(audioContext, baseUrl, options = {}) {\n        super(audioContext, options);\n        this._wamNode = undefined;\n        this.state = {\n            reverbTime: 1,\n            ir: \"large-1\"\n        };\n        this.renderedReverbTime = -1;\n        this.isEnabled = true;\n        this.baseUrl = baseUrl;\n        console.log(\"ConvolutionReverbNode constructor()\");\n        this.audioPool = new _AudioPool__WEBPACK_IMPORTED_MODULE_1__.AudioPool(audioContext);\n        this.createNodes();\n    }\n    get paramMgr() {\n        return this._wamNode;\n    }\n    setup(paramMgr) {\n        this._wamNode = paramMgr;\n    }\n    set status(_sig) {\n        this.isEnabled = _sig;\n    }\n    IRs() {\n        return [\n            {\n                id: \"small-1\",\n                name: \"Small\",\n                url: `${this.baseUrl}/assets/small.wav`\n            },\n            {\n                id: \"medium-1\",\n                name: \"Medium\",\n                url: `${this.baseUrl}/assets/medium.wav`\n            },\n            {\n                id: \"large-1\",\n                name: \"Large 1\",\n                url: `${this.baseUrl}/assets/large1.wav`\n            }, {\n                id: \"large-2\",\n                name: \"Large 2\",\n                url: `${this.baseUrl}/assets/large2.wav`\n            }, {\n                id: \"large-3\",\n                name: \"Large 3\",\n                url: `${this.baseUrl}/assets/large3.wav`\n            },\n            {\n                id: \"xlarge-1\",\n                name: \"Extra Large\",\n                url: `${this.baseUrl}/assets/xlarge.wav`\n            },\n            {\n                id: \"bloom-1\",\n                name: \"Bloom\",\n                url: `${this.baseUrl}/assets/bloom.wav`\n            },\n        ];\n    }\n    createNodes() {\n        this.reverb = this.context.createConvolver();\n        this.input = this.context.createGain();\n        this.output = this.context.createGain();\n        this.wet = this.context.createGain();\n        this.dry = this.context.createGain();\n        this.input.connect(this.wet);\n        this.wet.connect(this.reverb);\n        this.reverb.connect(this.output);\n        this.input.connect(this.dry);\n        this.dry.connect(this.output);\n        this._input = this.input;\n        super.connect(this._input);\n        this._output = this.output;\n        this.updateFromState();\n    }\n    processMIDIEvents(midiEvents) {\n    }\n    renderTail() {\n        let length = this.context.sampleRate * this.state.reverbTime;\n        var buffer = this.context.createBuffer(2, length, this.context.sampleRate);\n        for (var j = 0; j < 2; j++) {\n            var noise = buffer.getChannelData(j);\n            for (var i = 0; i < length; i++) {\n                noise[i] = ((Math.random() * 2) - 1) * (1 - (i / length));\n            }\n        }\n        this.reverb.buffer = buffer;\n        this.renderedReverbTime = this.state.reverbTime;\n    }\n    loadIR() {\n        var url;\n        if (this.state.ir.startsWith(\"https\")) {\n            url = this.state.ir;\n        }\n        else if (this.state.ir.startsWith(\"wam-asset\")) {\n        }\n        else {\n            let entry = this.IRs().find(e => e.id == this.state.ir);\n            if (entry) {\n                url = entry.url;\n            }\n        }\n        if (url) {\n            this.audioPool.loadSample(url, (buffer) => {\n                this.reverb.buffer = buffer;\n                this.loadedIR = this.state.ir;\n            });\n        }\n    }\n    getState() {\n        const _super = Object.create(null, {\n            getState: { get: () => super.getState }\n        });\n        return __awaiter(this, void 0, void 0, function* () {\n            let params = yield _super.getState.call(this);\n            return Object.assign(Object.assign({}, this.state), { params });\n        });\n    }\n    setState(state) {\n        const _super = Object.create(null, {\n            setState: { get: () => super.setState }\n        });\n        return __awaiter(this, void 0, void 0, function* () {\n            if (state.params) {\n                yield _super.setState.call(this, state.params);\n            }\n            if (state.ir) {\n                this.state.ir = state.ir;\n            }\n            if (state.reverbTime) {\n                this.state.reverbTime = state.reverbTime;\n            }\n            this.updateFromState();\n        });\n    }\n    updateFromState() {\n        if (this.state.ir != this.loadedIR) {\n            this.loadIR();\n        }\n        if (this.state.reverbTime != this.renderedReverbTime) {\n        }\n    }\n}\n\n\n//# sourceURL=webpack://wam-reverb/./src/Node.ts?");

/***/ }),

/***/ "./src/ReverbView.tsx":
/*!****************************!*\
  !*** ./src/ReverbView.tsx ***!
  \****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ConvolutionReverbView: () => (/* binding */ ConvolutionReverbView)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"./node_modules/preact/dist/preact.module.js\");\n/* harmony import */ var _shared_ui_Knob__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../shared/ui/Knob */ \"../shared/ui/Knob.tsx\");\n/* harmony import */ var _shared_ui_Select__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../shared/ui/Select */ \"../shared/ui/Select.tsx\");\n/* harmony import */ var _ReverbView_scss__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ReverbView.scss */ \"./src/ReverbView.scss\");\n\n\n\n\nlet styles = _ReverbView_scss__WEBPACK_IMPORTED_MODULE_3__[\"default\"].locals;\nclass ConvolutionReverbView extends preact__WEBPACK_IMPORTED_MODULE_0__.Component {\n    constructor() {\n        super();\n        this.state = {\n            IRList: []\n        };\n    }\n    componentWillMount() {\n        this.setState({\n            IRList: this.props.plugin.audioNode.IRs()\n        });\n    }\n    componentWillUnmount() {\n    }\n    paramChanged(param, value) {\n        this.props.plugin.audioNode.paramMgr.setParamValue(param, value);\n    }\n    updateIR(id) {\n        this.props.plugin.audioNode.setState({ ir: id });\n    }\n    render() {\n        (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", {});\n        let params = this.props.plugin.audioNode.paramMgr;\n        let irOptions = this.state.IRList.map(e => e.name);\n        let irValues = this.state.IRList.map(e => e.id);\n        return ((0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { class: styles.reverbModule },\n            (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { style: \"display: flex\" },\n                (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(_shared_ui_Select__WEBPACK_IMPORTED_MODULE_2__.Select, { options: irOptions, values: irValues, value: () => this.props.plugin.audioNode.state.ir, label: \"Model\", onChange: (v) => this.updateIR(v) }),\n                (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(_shared_ui_Knob__WEBPACK_IMPORTED_MODULE_1__.Knob, { label: \"Mix\", size: 40, value: () => params.getParamValue(\"wet\"), minimumValue: 0.0, maximumValue: 1, onChange: (v) => this.paramChanged(\"wet\", v) })),\n            (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { style: \"flex: 1\" })));\n    }\n}\n\n\n//# sourceURL=webpack://wam-reverb/./src/ReverbView.tsx?");

/***/ }),

/***/ "./src/index.tsx":
/*!***********************!*\
  !*** ./src/index.tsx ***!
  \***********************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ ConvolutionReverb)\n/* harmony export */ });\n/* harmony import */ var _webaudiomodules_sdk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @webaudiomodules/sdk */ \"../../../node_modules/@webaudiomodules/sdk/dist/index.js\");\n/* harmony import */ var _webaudiomodules_sdk_parammgr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @webaudiomodules/sdk-parammgr */ \"../../../node_modules/@webaudiomodules/sdk-parammgr/dist/index.js\");\n/* harmony import */ var _Node__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Node */ \"./src/Node.ts\");\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! preact */ \"./node_modules/preact/dist/preact.module.js\");\n/* harmony import */ var _ReverbView__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ReverbView */ \"./src/ReverbView.tsx\");\n/* harmony import */ var _shared_getBaseUrl__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../shared/getBaseUrl */ \"../shared/getBaseUrl.tsx\");\n/* harmony import */ var _ReverbView_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ReverbView.scss */ \"./src/ReverbView.scss\");\n/* harmony import */ var _shared_insertStyle__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../shared/insertStyle */ \"../shared/insertStyle.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\n\n\n\n\n\n\n\n\nclass ConvolutionReverb extends _webaudiomodules_sdk__WEBPACK_IMPORTED_MODULE_0__.WebAudioModule {\n    constructor() {\n        super(...arguments);\n        this._baseURL = (0,_shared_getBaseUrl__WEBPACK_IMPORTED_MODULE_5__.getBaseUrl)(new URL('.', __webpack_require__.p));\n        this._descriptorUrl = `${this._baseURL}/descriptor.json`;\n    }\n    _loadDescriptor() {\n        return __awaiter(this, void 0, void 0, function* () {\n            const url = this._descriptorUrl;\n            if (!url)\n                throw new TypeError('Descriptor not found');\n            const response = yield fetch(url);\n            const descriptor = yield response.json();\n            Object.assign(this._descriptor, descriptor);\n            return descriptor;\n        });\n    }\n    initialize(state) {\n        const _super = Object.create(null, {\n            initialize: { get: () => super.initialize }\n        });\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this._loadDescriptor();\n            return _super.initialize.call(this, state);\n        });\n    }\n    createAudioNode(initialState) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const synthNode = new _Node__WEBPACK_IMPORTED_MODULE_2__[\"default\"](this.audioContext, this._baseURL);\n            const paramsConfig = {\n                wet: {\n                    defaultValue: 0.3,\n                    minValue: 0,\n                    maxValue: 1\n                }\n            };\n            const internalParamsConfig = {\n                wet: synthNode.wet.gain,\n                dry: synthNode.dry.gain\n            };\n            const paramsMapping = {\n                wet: {\n                    wet: {\n                        sourceRange: [0, 1],\n                        targetRange: [0, 1],\n                    },\n                    dry: {\n                        sourceRange: [0, 1],\n                        targetRange: [1, 0],\n                    }\n                }\n            };\n            const optionsIn = { internalParamsConfig, paramsConfig, paramsMapping };\n            const paramMgrNode = yield _webaudiomodules_sdk_parammgr__WEBPACK_IMPORTED_MODULE_1__.ParamMgrFactory.create(this, optionsIn);\n            synthNode.setup(paramMgrNode);\n            if (initialState)\n                synthNode.setState(initialState);\n            return synthNode;\n        });\n    }\n    createGui() {\n        return __awaiter(this, void 0, void 0, function* () {\n            const div = document.createElement('div');\n            (0,preact__WEBPACK_IMPORTED_MODULE_3__.h)(\"div\", {});\n            div.setAttribute(\"style\", \"height: 100%; width: 100%; display: flex; flex: 1;\");\n            div.setAttribute(\"width\", \"220\");\n            div.setAttribute(\"height\", \"120\");\n            var shadow = div.attachShadow({ mode: 'open' });\n            (0,_shared_insertStyle__WEBPACK_IMPORTED_MODULE_7__.insertStyle)(shadow, _ReverbView_scss__WEBPACK_IMPORTED_MODULE_6__[\"default\"].toString());\n            (0,preact__WEBPACK_IMPORTED_MODULE_3__.render)((0,preact__WEBPACK_IMPORTED_MODULE_3__.h)(_ReverbView__WEBPACK_IMPORTED_MODULE_4__.ConvolutionReverbView, { plugin: this }), shadow);\n            return div;\n        });\n    }\n    destroyGui(el) {\n        (0,preact__WEBPACK_IMPORTED_MODULE_3__.render)(null, el.shadowRoot);\n    }\n}\n\n\n//# sourceURL=webpack://wam-reverb/./src/index.tsx?");

/***/ }),

/***/ "../shared/getBaseUrl.tsx":
/*!********************************!*\
  !*** ../shared/getBaseUrl.tsx ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getBaseUrl: () => (/* binding */ getBaseUrl)\n/* harmony export */ });\nconst getBaseUrl = (relativeURL) => {\n    const baseURL = relativeURL.href.substring(0, relativeURL.href.lastIndexOf('/'));\n    return baseURL;\n};\n\n\n//# sourceURL=webpack://wam-reverb/../shared/getBaseUrl.tsx?");

/***/ }),

/***/ "../shared/insertStyle.ts":
/*!********************************!*\
  !*** ../shared/insertStyle.ts ***!
  \********************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   insertStyle: () => (/* binding */ insertStyle)\n/* harmony export */ });\nfunction insertStyle(shadow, style) {\n    const el = document.createElement('style');\n    el.textContent = style;\n    shadow.appendChild(el);\n}\n\n\n//# sourceURL=webpack://wam-reverb/../shared/insertStyle.ts?");

/***/ }),

/***/ "../shared/ui/Knob.tsx":
/*!*****************************!*\
  !*** ../shared/ui/Knob.tsx ***!
  \*****************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Knob: () => (/* binding */ Knob)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"../../../node_modules/preact/dist/preact.module.js\");\n/* harmony import */ var _svg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svg */ \"../shared/ui/svg.ts\");\n\n\nclass Knob extends preact__WEBPACK_IMPORTED_MODULE_0__.Component {\n    constructor() {\n        super();\n        this.pressed = false;\n        this.onMousemove = this.onMousemove.bind(this);\n        this.onMouseup = this.onMouseup.bind(this);\n        this.animationFrame = this.animationFrame.bind(this);\n        this.scheduleFrame = this.scheduleFrame.bind(this);\n        this.scheduleAnimation = this.scheduleAnimation.bind(this);\n    }\n    componentDidMount() {\n    }\n    componentWillUnmount() {\n        if (this.pressed) {\n            window.removeEventListener('mousemove', this.onMousemove);\n            window.removeEventListener('mouseup', this.onMouseup);\n        }\n        this.cancelAnimation();\n    }\n    cancelAnimation() {\n        if (this.animationTimeout != undefined) {\n            window.clearTimeout(this.animationTimeout);\n            this.animationTimeout = undefined;\n        }\n        if (this.animationRequest != undefined) {\n            window.cancelAnimationFrame(this.animationRequest);\n            this.animationRequest = undefined;\n        }\n    }\n    scheduleAnimation() {\n        this.animationTimeout = window.setTimeout(this.scheduleFrame, this.pressed ? 10 : 100);\n    }\n    scheduleFrame() {\n        this.animationRequest = window.requestAnimationFrame(this.animationFrame);\n    }\n    animationFrame() {\n        let newValue = this.props.value();\n        if (newValue == this.lastValue) {\n            this.scheduleAnimation();\n            return;\n        }\n        this.lastValue = newValue;\n        if (this.valueLabel) {\n            if (this.props.valueString) {\n                this.valueLabel.innerText = this.props.valueString(newValue);\n            }\n            else if (this.props.integer) {\n                this.valueLabel.innerText = `${newValue.toFixed(0)}${this.props.units}`;\n            }\n            else {\n                this.valueLabel.innerText = `${newValue.toFixed(this.props.decimals)}${this.props.units}`;\n            }\n        }\n        if (this.props.bipolar) {\n            let midValue = (this.props.maximumValue + this.props.minimumValue) / 2;\n            let percent = (newValue - midValue) / (midValue - this.props.minimumValue);\n            (0,_svg__WEBPACK_IMPORTED_MODULE_1__.svg_update_arc)(this.arc, this.center, this.radii, [270, 135 * percent], 0);\n        }\n        else {\n            let percent = (newValue - this.props.minimumValue) / (this.props.maximumValue - this.props.minimumValue);\n            (0,_svg__WEBPACK_IMPORTED_MODULE_1__.svg_update_arc)(this.arc, this.center, this.radii, [135, 270 * percent], 0);\n        }\n        this.scheduleAnimation();\n    }\n    setup(ref) {\n        if (ref == null) {\n            return;\n        }\n        if (this.ref == ref) {\n            return;\n        }\n        this.ref = ref;\n        ref.innerHTML = \"\";\n        this.svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n        this.svg.setAttribute('style', \"stroke:var(--var-ControlBackground, black); fill:none; stroke-width:2\");\n        this.svg.setAttribute('width', `${this.props.size}`);\n        this.svg.setAttribute('height', `${this.props.size * 4 / 5}`);\n        this.center = [this.props.size / 2, this.props.size / 2];\n        this.radii = [this.center[0] - this.props.padding, this.center[1] - this.props.padding];\n        this.range = (0,_svg__WEBPACK_IMPORTED_MODULE_1__.svg_arc)(this.center, this.radii, [136, 270], 0);\n        this.range.setAttribute('style', 'stroke:var(--var-ControlBackground, black);');\n        this.svg.appendChild(this.range);\n        ref.appendChild(this.svg);\n        this.arc = (0,_svg__WEBPACK_IMPORTED_MODULE_1__.svg_create)(\"path\");\n        this.arc.setAttribute('style', `stroke:${this.props.color};`);\n        this.svg.appendChild(this.arc);\n        this.cancelAnimation();\n        this.animationFrame();\n    }\n    onDoubleClick(e) {\n        if (this.props.defaultValue !== undefined) {\n            this.setValue(this.props.defaultValue);\n        }\n    }\n    onMousedown(e) {\n        this.pressed = true;\n        this.position = { x: e.screenX, y: e.screenY };\n        this.dragStartValue = this.props.value();\n        window.addEventListener('mousemove', this.onMousemove);\n        window.addEventListener('mouseup', this.onMouseup);\n    }\n    onMouseup(e) {\n        this.pressed = false;\n        this.dragStartValue = undefined;\n        window.removeEventListener('mousemove', this.onMousemove);\n        window.removeEventListener('mouseup', this.onMouseup);\n    }\n    onMousemove(e) {\n        if (this.pressed) {\n            let distance = (e.screenX - this.position.x) - (e.screenY - this.position.y);\n            if (!this.props.integer || Math.abs(distance) > 0.5) {\n                this.setValue(this.dragStartValue + (distance * 0.005 * (this.props.maximumValue - this.props.minimumValue)));\n            }\n        }\n    }\n    setValue(v) {\n        if (v > this.props.maximumValue) {\n            v = this.props.maximumValue;\n        }\n        if (v < this.props.minimumValue) {\n            v = this.props.minimumValue;\n        }\n        if (this.props.onChange) {\n            this.props.onChange(v);\n        }\n    }\n    render() {\n        (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", {});\n        let value;\n        if (this.props.showValue) {\n            value = (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"small\", null,\n                (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"label\", { ref: ref => { this.valueLabel = ref; this.lastValue = undefined; } }));\n        }\n        return ((0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { class: \"ComponentWrapper\" },\n            (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"label\", null, this.props.label),\n            (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { ref: (ref) => this.setup(ref), class: \"Knob\", style: `height: ${this.props.size}px; width: ${this.props.size}px;`, onMouseDown: (e) => this.onMousedown(e), onDblClick: (e) => this.onDoubleClick(e) }),\n            value));\n    }\n}\nKnob.defaultProps = {\n    minimumValue: 0.0,\n    maximumValue: 1.0,\n    size: 50,\n    value: 0.5,\n    padding: 3,\n    integer: false,\n    color: 'yellow',\n    label: \"\",\n    bipolar: false,\n    units: \"\",\n    decimals: 2,\n    showValue: true,\n};\n\n\n//# sourceURL=webpack://wam-reverb/../shared/ui/Knob.tsx?");

/***/ }),

/***/ "../shared/ui/Select.tsx":
/*!*******************************!*\
  !*** ../shared/ui/Select.tsx ***!
  \*******************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Select: () => (/* binding */ Select)\n/* harmony export */ });\n/* harmony import */ var preact__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! preact */ \"../../../node_modules/preact/dist/preact.module.js\");\n\nclass Select extends preact__WEBPACK_IMPORTED_MODULE_0__.Component {\n    constructor() {\n        super();\n        this.lastRenderedValue = \"-1\";\n        this.animationFrame = this.animationFrame.bind(this);\n        this.scheduleFrame = this.scheduleFrame.bind(this);\n        this.scheduleAnimation = this.scheduleAnimation.bind(this);\n    }\n    onChange(e) {\n        if (this.props.onChange) {\n            this.props.onChange(e.target.value);\n        }\n    }\n    cancelAnimation() {\n        if (this.animationTimeout != undefined) {\n            window.clearTimeout(this.animationTimeout);\n            this.animationTimeout = undefined;\n        }\n        if (this.animationRequest != undefined) {\n            window.cancelAnimationFrame(this.animationRequest);\n            this.animationRequest = undefined;\n        }\n    }\n    scheduleAnimation() {\n        this.animationTimeout = window.setTimeout(this.scheduleFrame, 100);\n    }\n    scheduleFrame() {\n        this.animationRequest = window.requestAnimationFrame(this.animationFrame);\n    }\n    componentWillUnmount() {\n        this.cancelAnimation();\n    }\n    animationFrame() {\n        let newValue = this.props.value();\n        if (this.lastRenderedValue == newValue) {\n            this.scheduleAnimation();\n            return;\n        }\n        this.lastRenderedValue = newValue;\n        for (let option of this.select.options) {\n            option.selected = (option.value == newValue);\n        }\n        this.scheduleAnimation();\n    }\n    setup(ref) {\n        if (ref == null) {\n            return;\n        }\n        if (ref == this.ref && this.sameArray(this.props.options, this.renderedOptions) && this.sameArray(this.props.values, this.renderedValues)) {\n            return;\n        }\n        this.ref = ref;\n        ref.innerHTML = \"\";\n        if (this.props.value === undefined || this.props.value === null) {\n            throw `Select with label ${this.props.label} values ${this.props.values} has null value`;\n        }\n        if (!this.select) {\n            this.select = document.createElement(\"select\");\n            this.select.addEventListener(\"change\", e => this.onChange(e));\n        }\n        else {\n            while (this.select.firstChild) {\n                this.select.removeChild(this.select.firstChild);\n            }\n            try {\n                this.ref.removeChild(this.select);\n            }\n            catch (e) {\n            }\n        }\n        this.ref.appendChild(this.select);\n        this.props.options.forEach((name, index) => {\n            let option = document.createElement(\"option\");\n            option.text = name;\n            option.value = (this.props.values) ? this.props.values[index].toString() : index.toString();\n            this.select.appendChild(option);\n        });\n        this.lastRenderedValue = \"-1\";\n        this.renderedOptions = this.props.options;\n        this.renderedValues = this.props.values;\n        this.cancelAnimation();\n        this.animationFrame();\n    }\n    render() {\n        (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", {});\n        let style = this.props.style ? this.props.style : \"\";\n        return (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { class: \"ComponentWrapper\", style: style },\n            this.props.label && (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"label\", null, this.props.label),\n            (0,preact__WEBPACK_IMPORTED_MODULE_0__.h)(\"div\", { ref: (e) => this.setup(e), style: \"color: black;\", class: \"ComponentSelect\" }));\n    }\n    sameArray(lhs, rhs) {\n        if (lhs === undefined && rhs === undefined) {\n            return true;\n        }\n        if (lhs === undefined || rhs === undefined) {\n            return false;\n        }\n        return (lhs.length == rhs.length && lhs.every((l, i) => l == rhs[i]));\n    }\n}\n\n\n//# sourceURL=webpack://wam-reverb/../shared/ui/Select.tsx?");

/***/ }),

/***/ "../shared/ui/svg.ts":
/*!***************************!*\
  !*** ../shared/ui/svg.ts ***!
  \***************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   svg_arc: () => (/* binding */ svg_arc),\n/* harmony export */   svg_create: () => (/* binding */ svg_create),\n/* harmony export */   svg_line: () => (/* binding */ svg_line),\n/* harmony export */   svg_rectangle: () => (/* binding */ svg_rectangle),\n/* harmony export */   svg_text: () => (/* binding */ svg_text),\n/* harmony export */   svg_update_arc: () => (/* binding */ svg_update_arc),\n/* harmony export */   svg_update_line: () => (/* binding */ svg_update_line),\n/* harmony export */   svg_update_rectangle: () => (/* binding */ svg_update_rectangle)\n/* harmony export */ });\n\nconst svgns = \"http://www.w3.org/2000/svg\";\nconst cos = Math.cos;\nconst sin = Math.sin;\nconst π = Math.PI;\nconst f_matrix_times = (([[a, b], [c, d]], [x, y]) => [a * x + b * y, c * x + d * y]);\nconst f_rotate_matrix = ((x) => {\n    const cosx = cos(x);\n    const sinx = sin(x);\n    return [[cosx, -sinx], [sinx, cosx]];\n});\nconst f_vec_add = (([a1, a2], [b1, b2]) => [a1 + b1, a2 + b2]);\nfunction svg_create(type) {\n    return document.createElementNS(svgns, type);\n}\nfunction svg_arc([cx, cy], [rx, ry], [t1, Δ], φ) {\n    const path = document.createElementNS(svgns, \"path\");\n    svg_update_arc(path, [cx, cy], [rx, ry], [t1, Δ], φ);\n    return path;\n}\n;\nfunction svg_update_arc(arc, [cx, cy], [rx, ry], [t1, Δ], φ) {\n    Δ = Δ / 180 * π;\n    Δ = Δ % (2 * π);\n    t1 = t1 / 180 * π;\n    const rotMatrix = f_rotate_matrix(φ);\n    const [sX, sY] = (f_vec_add(f_matrix_times(rotMatrix, [rx * cos(t1), ry * sin(t1)]), [cx, cy]));\n    const [eX, eY] = (f_vec_add(f_matrix_times(rotMatrix, [rx * cos(t1 + Δ), ry * sin(t1 + Δ)]), [cx, cy]));\n    const fA = ((Δ > π) ? 1 : 0);\n    const fS = ((Δ > 0) ? 1 : 0);\n    let cmd = [\" M \", sX, \" \", sY, \" A \", rx, ry, φ / π * 180, fA, fS, eX, eY].join(\" \");\n    arc.setAttribute(\"d\", cmd);\n}\nfunction svg_rectangle(x, y, width, height, fill) {\n    var rect = document.createElementNS(svgns, 'rect');\n    svg_update_rectangle(rect, x, y, width, height, fill);\n    return rect;\n}\nfunction svg_update_rectangle(rect, x, y, width, height, fill) {\n    rect.setAttributeNS(null, 'x', x.toString());\n    rect.setAttributeNS(null, 'y', y.toString());\n    rect.setAttributeNS(null, 'height', height.toString());\n    rect.setAttributeNS(null, 'width', width.toString());\n    rect.setAttributeNS(null, 'fill', fill);\n}\nfunction svg_text(x, y, size, content, fill) {\n    var element = document.createElementNS(svgns, 'text');\n    element.setAttribute('x', x.toString());\n    element.setAttribute('y', y.toString());\n    element.setAttribute('fill', fill);\n    element.setAttribute('font-size', size.toString());\n    var txt = document.createTextNode(content);\n    element.appendChild(txt);\n    return element;\n}\nfunction svg_line(x1, y1, x2, y2, stroke) {\n    var line = document.createElementNS(svgns, 'line');\n    svg_update_line(line, x1, y1, x2, y2, stroke);\n    return line;\n}\nfunction svg_update_line(line, x1, y1, x2, y2, stroke) {\n    line.setAttribute('x1', x1.toString());\n    line.setAttribute('y1', y1.toString());\n    line.setAttribute('x2', x2.toString());\n    line.setAttribute('y2', y2.toString());\n    line.setAttribute(\"stroke\", stroke);\n}\n\n\n//# sourceURL=webpack://wam-reverb/../shared/ui/svg.ts?");

/***/ }),

/***/ "../../../node_modules/@webaudiomodules/sdk-parammgr/dist/index.js":
/*!*************************************************************************!*\
  !*** ../../../node_modules/@webaudiomodules/sdk-parammgr/dist/index.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   CompositeAudioNode: () => (/* binding */ CompositeAudioNode),\n/* harmony export */   ParamMgrFactory: () => (/* binding */ ParamMgrFactory)\n/* harmony export */ });\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __publicField = (obj, key, value) => {\n  __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n  return value;\n};\n\n// src/CompositeAudioNode.js\nvar CompositeAudioNode = class extends GainNode {\n  constructor() {\n    super(...arguments);\n    /**\n     * @type {AudioNode}\n     */\n    __publicField(this, \"_output\");\n    /**\n     * @type {WamNode}\n     */\n    __publicField(this, \"_wamNode\");\n  }\n  get groupId() {\n    return this.module.groupId;\n  }\n  get moduleId() {\n    return this.module.moduleId;\n  }\n  get instanceId() {\n    return this.module.instanceId;\n  }\n  get module() {\n    return this._wamNode.module;\n  }\n  /**\n   * @param {Parameters<WamNode['addEventListener']>} args\n   */\n  addEventListener(...args) {\n    return this._wamNode.addEventListener(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['removeEventListener']>} args\n   */\n  removeEventListener(...args) {\n    return this._wamNode.removeEventListener(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['dispatchEvent']>} args\n   */\n  dispatchEvent(...args) {\n    return this._wamNode.dispatchEvent(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['getParameterInfo']>} args\n   */\n  getParameterInfo(...args) {\n    return this._wamNode.getParameterInfo(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['getParameterValues']>} args\n   */\n  getParameterValues(...args) {\n    return this._wamNode.getParameterValues(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['setParameterValues']>} args\n   */\n  setParameterValues(...args) {\n    return this._wamNode.setParameterValues(...args);\n  }\n  getState() {\n    return this._wamNode.getState();\n  }\n  /**\n   * @param {Parameters<WamNode['setState']>} args\n   */\n  setState(...args) {\n    return this._wamNode.setState(...args);\n  }\n  getCompensationDelay() {\n    return this._wamNode.getCompensationDelay();\n  }\n  /**\n   * @param {Parameters<WamNode['scheduleEvents']>} args\n   */\n  scheduleEvents(...args) {\n    return this._wamNode.scheduleEvents(...args);\n  }\n  clearEvents() {\n    return this._wamNode.clearEvents();\n  }\n  /**\n   * @param {Parameters<WamNode['connectEvents']>} args\n   */\n  connectEvents(...args) {\n    return this._wamNode.connectEvents(...args);\n  }\n  /**\n   * @param {Parameters<WamNode['disconnectEvents']>} args\n   */\n  disconnectEvents(...args) {\n    return this._wamNode.disconnectEvents(...args);\n  }\n  destroy() {\n    return this._wamNode.destroy();\n  }\n  set channelCount(count) {\n    if (this._output)\n      this._output.channelCount = count;\n    else\n      super.channelCount = count;\n  }\n  get channelCount() {\n    if (this._output)\n      return this._output.channelCount;\n    return super.channelCount;\n  }\n  set channelCountMode(mode) {\n    if (this._output)\n      this._output.channelCountMode = mode;\n    else\n      super.channelCountMode = mode;\n  }\n  get channelCountMode() {\n    if (this._output)\n      return this._output.channelCountMode;\n    return super.channelCountMode;\n  }\n  set channelInterpretation(interpretation) {\n    if (this._output)\n      this._output.channelInterpretation = interpretation;\n    else\n      super.channelInterpretation = interpretation;\n  }\n  get channelInterpretation() {\n    if (this._output)\n      return this._output.channelInterpretation;\n    return super.channelInterpretation;\n  }\n  get numberOfInputs() {\n    return super.numberOfInputs;\n  }\n  get numberOfOutputs() {\n    if (this._output)\n      return this._output.numberOfOutputs;\n    return super.numberOfOutputs;\n  }\n  get gain() {\n    return void 0;\n  }\n  connect(...args) {\n    if (this._output && this._output !== this)\n      return this._output.connect(...args);\n    return super.connect(...args);\n  }\n  disconnect(...args) {\n    if (this._output && this._output !== this)\n      return this._output.disconnect(...args);\n    return super.disconnect(...args);\n  }\n};\n\n// src/sdk/src/addFunctionModule.js\nvar addFunctionModule = (audioWorklet, processorFunction, ...injection) => {\n  const text = `(${processorFunction.toString()})(${injection.map((s) => JSON.stringify(s)).join(\", \")});`;\n  const url = URL.createObjectURL(new Blob([text], { type: \"text/javascript\" }));\n  return audioWorklet.addModule(url);\n};\nvar addFunctionModule_default = addFunctionModule;\n\n// src/ParamMgrProcessor.js\nvar processor = (moduleId, paramsConfig) => {\n  const audioWorkletGlobalScope = globalThis;\n  const {\n    AudioWorkletProcessor,\n    registerProcessor,\n    webAudioModules\n  } = audioWorkletGlobalScope;\n  const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n  const supportSharedArrayBuffer = !!globalThis.SharedArrayBuffer;\n  const SharedArrayBuffer = globalThis.SharedArrayBuffer || globalThis.ArrayBuffer;\n  const normExp = (x, e) => e === 0 ? x : x ** 1.5 ** -e;\n  const normalizeE = (x, min, max, e = 0) => min === 0 && max === 1 ? normExp(x, e) : normExp((x - min) / (max - min) || 0, e);\n  const normalize = (x, min, max) => min === 0 && max === 1 ? x : (x - min) / (max - min) || 0;\n  const denormalize = (x, min, max) => min === 0 && max === 1 ? x : x * (max - min) + min;\n  const mapValue = (x, eMin, eMax, sMin, sMax, tMin, tMax) => denormalize(\n    normalize(\n      normalize(\n        Math.min(sMax, Math.max(sMin, x)),\n        eMin,\n        eMax\n      ),\n      normalize(sMin, eMin, eMax),\n      normalize(sMax, eMin, eMax)\n    ),\n    tMin,\n    tMax\n  );\n  class ParamMgrProcessor extends AudioWorkletProcessor {\n    static get parameterDescriptors() {\n      return Object.entries(paramsConfig).map(([name, { defaultValue, minValue, maxValue }]) => ({\n        name,\n        defaultValue,\n        minValue,\n        maxValue\n      }));\n    }\n    /**\n     * @param {ParamMgrProcessorOptions} options\n     */\n    constructor(options) {\n      super();\n      this.destroyed = false;\n      this.supportSharedArrayBuffer = supportSharedArrayBuffer;\n      const {\n        paramsMapping,\n        internalParamsMinValues,\n        internalParams,\n        groupId,\n        instanceId\n      } = options.processorOptions;\n      this.groupId = groupId;\n      this.moduleId = moduleId;\n      this.instanceId = instanceId;\n      this.internalParamsMinValues = internalParamsMinValues;\n      this.paramsConfig = paramsConfig;\n      this.paramsMapping = paramsMapping;\n      this.paramsValues = {};\n      Object.entries(paramsConfig).forEach(([name, { defaultValue }]) => {\n        this.paramsValues[name] = defaultValue;\n      });\n      this.internalParams = internalParams;\n      this.internalParamsCount = this.internalParams.length;\n      this.buffer = new SharedArrayBuffer((this.internalParamsCount + 1) * Float32Array.BYTES_PER_ELEMENT);\n      this.$lock = new Int32Array(this.buffer, 0, 1);\n      this.$internalParamsBuffer = new Float32Array(this.buffer, 4, this.internalParamsCount);\n      this.eventQueue = [];\n      this.handleEvent = null;\n      audioWorkletGlobalScope.webAudioModules.addWam(this);\n      if (!ModuleScope.paramMgrProcessors)\n        ModuleScope.paramMgrProcessors = {};\n      ModuleScope.paramMgrProcessors[this.instanceId] = this;\n      this.messagePortRequestId = -1;\n      const resolves = {};\n      const rejects = {};\n      this.call = (call, ...args) => new Promise((resolve, reject) => {\n        const id = this.messagePortRequestId--;\n        resolves[id] = resolve;\n        rejects[id] = reject;\n        this.port.postMessage({ id, call, args });\n      });\n      this.handleMessage = ({ data }) => {\n        var _a, _b;\n        const { id, call, args, value, error } = data;\n        if (call) {\n          const r = { id };\n          try {\n            r.value = this[call](...args);\n          } catch (e) {\n            r.error = e;\n          }\n          this.port.postMessage(r);\n        } else {\n          if (error)\n            (_a = rejects[id]) == null ? void 0 : _a.call(rejects, error);\n          else\n            (_b = resolves[id]) == null ? void 0 : _b.call(resolves, value);\n          delete resolves[id];\n          delete rejects[id];\n        }\n      };\n      this.port.start();\n      this.port.addEventListener(\"message\", this.handleMessage);\n    }\n    /**\n     * @param {ParametersMapping} mapping\n     */\n    setParamsMapping(mapping) {\n      this.paramsMapping = mapping;\n    }\n    getBuffer() {\n      return { lock: this.$lock, paramsBuffer: this.$internalParamsBuffer };\n    }\n    getCompensationDelay() {\n      return 128;\n    }\n    /**\n     * @param {string[]} parameterIdQuery\n     */\n    getParameterInfo(...parameterIdQuery) {\n      if (parameterIdQuery.length === 0)\n        parameterIdQuery = Object.keys(this.paramsConfig);\n      const parameterInfo = {};\n      parameterIdQuery.forEach((parameterId) => {\n        parameterInfo[parameterId] = this.paramsConfig[parameterId];\n      });\n      return parameterInfo;\n    }\n    /**\n     * @param {boolean} [normalized]\n     * @param {string[]} parameterIdQuery\n     */\n    getParameterValues(normalized, ...parameterIdQuery) {\n      if (parameterIdQuery.length === 0)\n        parameterIdQuery = Object.keys(this.paramsConfig);\n      const parameterValues = {};\n      parameterIdQuery.forEach((parameterId) => {\n        if (!(parameterId in this.paramsValues))\n          return;\n        const { minValue, maxValue, exponent } = this.paramsConfig[parameterId];\n        const value = this.paramsValues[parameterId];\n        parameterValues[parameterId] = {\n          id: parameterId,\n          value: normalized ? normalizeE(value, minValue, maxValue, exponent) : value,\n          normalized\n        };\n      });\n      return parameterValues;\n    }\n    /**\n     * @param {WamEvent[]} events\n     */\n    scheduleEvents(...events) {\n      this.eventQueue.push(...events);\n      const { currentTime } = audioWorkletGlobalScope;\n      this.eventQueue.sort((a, b) => (a.time || currentTime) - (b.time || currentTime));\n    }\n    /**\n     * @param {WamEvent[]} events\n     */\n    emitEvents(...events) {\n      webAudioModules.emitEvents(this, ...events);\n    }\n    clearEvents() {\n      this.eventQueue = [];\n    }\n    lock() {\n      if (globalThis.Atomics)\n        Atomics.store(this.$lock, 0, 1);\n    }\n    unlock() {\n      if (globalThis.Atomics)\n        Atomics.store(this.$lock, 0, 0);\n    }\n    /**\n     * Main process\n     *\n     * @param {Float32Array[][]} inputs\n     * @param {Float32Array[][]} outputs\n     * @param {Record<string, Float32Array>} parameters\n     */\n    process(inputs, outputs, parameters) {\n      if (this.destroyed)\n        return false;\n      const outputOffset = 1;\n      this.lock();\n      Object.entries(this.paramsConfig).forEach(([name, { minValue, maxValue }]) => {\n        const raw = parameters[name];\n        if (name in this.paramsValues)\n          this.paramsValues[name] = raw[raw.length - 1];\n        if (!this.paramsMapping[name])\n          return;\n        Object.entries(this.paramsMapping[name]).forEach(([targetName, targetMapping]) => {\n          var _a, _b;\n          const j = this.internalParams.indexOf(targetName);\n          if (j === -1)\n            return;\n          const intrinsicValue = this.internalParamsMinValues[j];\n          const { sourceRange, targetRange } = targetMapping;\n          const [sMin, sMax] = sourceRange;\n          const [tMin, tMax] = targetRange;\n          let out;\n          if (minValue !== tMin || maxValue !== tMax || minValue !== sMin || maxValue !== sMax) {\n            out = raw.map((v) => {\n              const mappedValue = mapValue(v, minValue, maxValue, sMin, sMax, tMin, tMax);\n              return mappedValue - intrinsicValue;\n            });\n          } else if (intrinsicValue) {\n            out = raw.map((v) => v - intrinsicValue);\n          } else {\n            out = raw;\n          }\n          if (out.length === 1)\n            (_a = outputs[j + outputOffset][0]) == null ? void 0 : _a.fill(out[0]);\n          else\n            (_b = outputs[j + outputOffset][0]) == null ? void 0 : _b.set(out);\n          this.$internalParamsBuffer[j] = out[0];\n        });\n      });\n      this.unlock();\n      if (!this.supportSharedArrayBuffer) {\n        this.call(\"setBuffer\", { lock: this.$lock, paramsBuffer: this.$internalParamsBuffer });\n      }\n      const { currentTime } = audioWorkletGlobalScope;\n      let $event;\n      for ($event = 0; $event < this.eventQueue.length; $event++) {\n        const event = this.eventQueue[$event];\n        if (event.time && event.time > currentTime)\n          break;\n        if (typeof this.handleEvent === \"function\")\n          this.handleEvent(event);\n        this.call(\"dispatchWamEvent\", event);\n      }\n      if ($event)\n        this.eventQueue.splice(0, $event);\n      return true;\n    }\n    /**\n     * @param {string} wamInstanceId\n     * @param {number} [output]\n     */\n    connectEvents(wamInstanceId, output) {\n      webAudioModules.connectEvents(this.groupId, this.instanceId, wamInstanceId, output);\n    }\n    /**\n     * @param {string} [wamInstanceId]\n     * @param {number} [output]\n     */\n    disconnectEvents(wamInstanceId, output) {\n      if (typeof wamInstanceId === \"undefined\") {\n        webAudioModules.disconnectEvents(this.groupId, this.instanceId);\n        return;\n      }\n      webAudioModules.disconnectEvents(this.groupId, this.instanceId, wamInstanceId, output);\n    }\n    destroy() {\n      audioWorkletGlobalScope.webAudioModules.removeWam(this);\n      if (ModuleScope.paramMgrProcessors)\n        delete ModuleScope.paramMgrProcessors[this.instanceId];\n      this.destroyed = true;\n      this.port.close();\n    }\n  }\n  try {\n    registerProcessor(moduleId, ParamMgrProcessor);\n  } catch (error) {\n    console.warn(error);\n  }\n};\nvar ParamMgrProcessor_default = processor;\n\n// src/sdk/src/WamParameterInfo.js\nvar getWamParameterInfo = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  const normExp = (x, e) => e === 0 ? x : x ** 1.5 ** -e;\n  const denormExp = (x, e) => e === 0 ? x : x ** 1.5 ** e;\n  const normalize = (x, min, max, e = 0) => min === 0 && max === 1 ? normExp(x, e) : normExp((x - min) / (max - min) || 0, e);\n  const denormalize = (x, min, max, e = 0) => min === 0 && max === 1 ? denormExp(x, e) : denormExp(x, e) * (max - min) + min;\n  const inRange = (x, min, max) => x >= min && x <= max;\n  class WamParameterInfo2 {\n    /**\n     * @param {string} id\n     * @param {WamParameterConfiguration} [config]\n     */\n    constructor(id, config = {}) {\n      let {\n        type,\n        label,\n        defaultValue,\n        minValue,\n        maxValue,\n        discreteStep,\n        exponent,\n        choices,\n        units\n      } = config;\n      if (type === void 0)\n        type = \"float\";\n      if (label === void 0)\n        label = \"\";\n      if (defaultValue === void 0)\n        defaultValue = 0;\n      if (choices === void 0)\n        choices = [];\n      if (type === \"boolean\" || type === \"choice\") {\n        discreteStep = 1;\n        minValue = 0;\n        if (choices.length)\n          maxValue = choices.length - 1;\n        else\n          maxValue = 1;\n      } else {\n        if (minValue === void 0)\n          minValue = 0;\n        if (maxValue === void 0)\n          maxValue = 1;\n        if (discreteStep === void 0)\n          discreteStep = 0;\n        if (exponent === void 0)\n          exponent = 0;\n        if (units === void 0)\n          units = \"\";\n      }\n      const errBase = `Param config error | ${id}: `;\n      if (minValue >= maxValue)\n        throw Error(errBase.concat(\"minValue must be less than maxValue\"));\n      if (!inRange(defaultValue, minValue, maxValue))\n        throw Error(errBase.concat(\"defaultValue out of range\"));\n      if (discreteStep % 1 || discreteStep < 0) {\n        throw Error(errBase.concat(\"discreteStep must be a non-negative integer\"));\n      } else if (discreteStep > 0 && (minValue % 1 || maxValue % 1 || defaultValue % 1)) {\n        throw Error(errBase.concat(\"non-zero discreteStep requires integer minValue, maxValue, and defaultValue\"));\n      }\n      if (type === \"choice\" && !choices.length) {\n        throw Error(errBase.concat(\"choice type parameter requires list of strings in choices\"));\n      }\n      this.id = id;\n      this.label = label;\n      this.type = type;\n      this.defaultValue = defaultValue;\n      this.minValue = minValue;\n      this.maxValue = maxValue;\n      this.discreteStep = discreteStep;\n      this.exponent = exponent;\n      this.choices = choices;\n      this.units = units;\n    }\n    /**\n     * Convert a value from the parameter's denormalized range\n     * `[minValue, maxValue]` to normalized range `[0, 1]`.\n     * @param {number} value\n     */\n    normalize(value) {\n      return normalize(value, this.minValue, this.maxValue, this.exponent);\n    }\n    /**\n     * Convert a value from normalized range `[0, 1]` to the\n     * parameter's denormalized range `[minValue, maxValue]`.\n     * @param {number} valueNorm\n     */\n    denormalize(valueNorm) {\n      return denormalize(valueNorm, this.minValue, this.maxValue, this.exponent);\n    }\n    /**\n     * Get a human-readable string representing the given value,\n     * including units if applicable.\n     * @param {number} value\n     */\n    valueString(value) {\n      if (this.choices)\n        return this.choices[value];\n      if (this.units !== \"\")\n        return `${value} ${this.units}`;\n      return `${value}`;\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamParameterInfo)\n      ModuleScope.WamParameterInfo = WamParameterInfo2;\n  }\n  return WamParameterInfo2;\n};\nvar WamParameterInfo_default = getWamParameterInfo;\n\n// src/ParamConfigurator.js\nvar WamParameterInfo = WamParameterInfo_default();\nvar ParamMappingConfigurator = class {\n  /**\n   * @param {ParametersMappingConfiguratorOptions} [options = {}]\n   */\n  constructor(options = {}) {\n    /**\n     * @private\n     * @type {Record<string, WamParameterConfiguration>}\n     */\n    __publicField(this, \"_paramsConfig\");\n    /**\n     * @private\n     * @type {InternalParametersDescriptor}\n     */\n    __publicField(this, \"_internalParamsConfig\");\n    /**\n     * @private\n     * @type {ParametersMapping}\n     */\n    __publicField(this, \"_paramsMapping\", {});\n    const { paramsConfig, paramsMapping, internalParamsConfig } = options;\n    this._paramsConfig = paramsConfig;\n    this._paramsMapping = paramsMapping;\n    this._internalParamsConfig = internalParamsConfig;\n  }\n  /**\n   * Auto-completed `paramsConfig`:\n   *\n   * if no `paramsConfig` is defined while initializing, this will be be filled from the internalParamsConfig;\n   *\n   * if a parameter is not fully configured, the incompleted properties will have the same value as in the internalParamsConfig.\n   *\n   * @type {WamParameterInfoMap}\n   */\n  get paramsConfig() {\n    const { internalParamsConfig } = this;\n    return Object.entries(this._paramsConfig || internalParamsConfig).reduce((configs, [id, config]) => {\n      var _a, _b, _c, _d;\n      const internalParam = internalParamsConfig[id];\n      configs[id] = new WamParameterInfo(id, __spreadProps(__spreadValues({}, config), {\n        label: (_a = config.label) != null ? _a : id,\n        defaultValue: (_b = config.defaultValue) != null ? _b : internalParam == null ? void 0 : internalParam.defaultValue,\n        minValue: (_c = config.minValue) != null ? _c : internalParam == null ? void 0 : internalParam.minValue,\n        maxValue: (_d = config.maxValue) != null ? _d : internalParam == null ? void 0 : internalParam.maxValue\n      }));\n      return configs;\n    }, {});\n  }\n  /**\n   * Auto-completed configuration of the `internalParamsConfig`\n   *\n   * Internal Parameters Config contains all the automatable parameters' information.\n   *\n   * An automatable parameter could be a `WebAudio` `AudioParam`\n   * or a config with an `onChange` callback that will be called while the value has been changed.\n   *\n   * @type {InternalParametersDescriptor}\n   */\n  get internalParamsConfig() {\n    return Object.entries(this._internalParamsConfig || {}).reduce((configs, [name, config]) => {\n      if (config instanceof AudioParam)\n        configs[name] = config;\n      else {\n        const defaultConfig = {\n          minValue: 0,\n          maxValue: 1,\n          defaultValue: 0,\n          automationRate: 30\n        };\n        configs[name] = __spreadValues(__spreadValues({}, defaultConfig), config);\n      }\n      return configs;\n    }, {});\n  }\n  /**\n   * Auto-completed `paramsMapping`,\n   * the mapping can be omitted while initialized,\n   * but is useful when an exposed param (in the `paramsConfig`) should automate\n   * several internal params (in the `internalParamsConfig`) or has a different range there.\n   *\n   * If a parameter is present in both `paramsConfig` and `internalParamsConfig` (or the `paramsConfig` is not configured),\n   * a map of this parameter will be there automatically, if not declared explicitly.\n   *\n   * @type {ParametersMapping}\n   */\n  get paramsMapping() {\n    const declared = this._paramsMapping || {};\n    const externalParams = this.paramsConfig;\n    const internalParams = this.internalParamsConfig;\n    return Object.entries(externalParams).reduce((mapping, [name, { minValue, maxValue }]) => {\n      const sourceRange = [minValue, maxValue];\n      const defaultMapping = { sourceRange, targetRange: [...sourceRange] };\n      if (declared[name]) {\n        const declaredTargets = Object.entries(declared[name]).reduce((targets, [targetName, targetMapping]) => {\n          if (internalParams[targetName]) {\n            targets[targetName] = __spreadValues(__spreadValues({}, defaultMapping), targetMapping);\n          }\n          return targets;\n        }, {});\n        mapping[name] = declaredTargets;\n      } else if (internalParams[name]) {\n        mapping[name] = { [name]: __spreadValues({}, defaultMapping) };\n      }\n      return mapping;\n    }, {});\n  }\n};\n\n// src/MgrAudioParam.js\nvar MgrAudioParam = class extends AudioParam {\n  constructor() {\n    super(...arguments);\n    /**\n     * @type {WamParameterInfo}\n     */\n    __publicField(this, \"_info\");\n  }\n  get exponent() {\n    return this.info.exponent;\n  }\n  get info() {\n    return this._info;\n  }\n  set info(info) {\n    this._info = info;\n  }\n  set normalizedValue(valueIn) {\n    this.value = this.info.denormalize(valueIn);\n  }\n  get normalizedValue() {\n    return this.info.normalize(this.value);\n  }\n  setValueAtTime(value, startTime) {\n    return super.setValueAtTime(value, startTime);\n  }\n  setNormalizedValueAtTime(valueIn, startTime) {\n    const value = this.info.denormalize(valueIn);\n    return this.setValueAtTime(value, startTime);\n  }\n  linearRampToValueAtTime(value, endTime) {\n    return super.linearRampToValueAtTime(value, endTime);\n  }\n  linearRampToNormalizedValueAtTime(valueIn, endTime) {\n    const value = this.info.denormalize(valueIn);\n    return this.linearRampToValueAtTime(value, endTime);\n  }\n  exponentialRampToValueAtTime(value, endTime) {\n    return super.exponentialRampToValueAtTime(value, endTime);\n  }\n  exponentialRampToNormalizedValueAtTime(valueIn, endTime) {\n    const value = this.info.denormalize(valueIn);\n    return this.exponentialRampToValueAtTime(value, endTime);\n  }\n  setTargetAtTime(target, startTime, timeConstant) {\n    return super.setTargetAtTime(target, startTime, timeConstant);\n  }\n  setNormalizedTargetAtTime(targetIn, startTime, timeConstant) {\n    const target = this.info.denormalize(targetIn);\n    return this.setTargetAtTime(target, startTime, timeConstant);\n  }\n  setValueCurveAtTime(values, startTime, duration) {\n    return super.setValueCurveAtTime(values, startTime, duration);\n  }\n  setNormalizedValueCurveAtTime(valuesIn, startTime, duration) {\n    const values = Array.from(valuesIn).map((v) => this.info.denormalize(v));\n    return this.setValueCurveAtTime(values, startTime, duration);\n  }\n  cancelScheduledParamValues(cancelTime) {\n    return super.cancelScheduledValues(cancelTime);\n  }\n  cancelAndHoldParamAtTime(cancelTime) {\n    return super.cancelAndHoldAtTime(cancelTime);\n  }\n};\n\n// src/ParamMgrNode.js\nvar AudioWorkletNode = globalThis.AudioWorkletNode;\nvar ParamMgrNode = class extends AudioWorkletNode {\n  /**\n      * @param {WebAudioModule} module\n      * @param {ParamMgrOptions} options\n      */\n  constructor(module, options) {\n    super(module.audioContext, module.moduleId, {\n      numberOfInputs: 0,\n      numberOfOutputs: 1 + options.processorOptions.internalParams.length,\n      parameterData: options.parameterData,\n      processorOptions: options.processorOptions\n    });\n    /**\n     * @param {string} name\n     */\n    __publicField(this, \"requestDispatchIParamChange\", (name) => {\n      const config = this.internalParamsConfig[name];\n      if (!(\"onChange\" in config))\n        return;\n      const { automationRate, onChange } = config;\n      if (typeof automationRate !== \"number\" || !automationRate)\n        return;\n      const interval = 1e3 / automationRate;\n      const i = this.internalParams.indexOf(name);\n      if (i === -1)\n        return;\n      if (i >= this.internalParams.length)\n        return;\n      if (typeof this.paramsUpdateCheckFnRef[i] === \"number\") {\n        window.clearTimeout(this.paramsUpdateCheckFnRef[i]);\n      }\n      this.paramsUpdateCheckFn[i] = () => {\n        const prev = this.$prevParamsBuffer[i];\n        const cur = this.$paramsBuffer[i];\n        if (cur !== prev) {\n          onChange(cur, prev);\n          this.$prevParamsBuffer[i] = cur;\n        }\n        this.paramsUpdateCheckFnRef[i] = window.setTimeout(this.paramsUpdateCheckFn[i], interval);\n      };\n      this.paramsUpdateCheckFn[i]();\n    });\n    const { processorOptions, internalParamsConfig } = options;\n    this.initialized = false;\n    this.module = module;\n    this.instanceId = options.processorOptions.instanceId;\n    this.groupId = options.processorOptions.groupId;\n    this.paramsConfig = processorOptions.paramsConfig;\n    this.internalParams = processorOptions.internalParams;\n    this.internalParamsConfig = internalParamsConfig;\n    this.$prevParamsBuffer = new Float32Array(this.internalParams.length);\n    this.paramsUpdateCheckFn = [];\n    this.paramsUpdateCheckFnRef = [];\n    this.messageRequestId = 0;\n    this.dummyGainNode = module.audioContext.createGain();\n    Object.entries(this.getParams()).forEach(([name, param]) => {\n      Object.setPrototypeOf(param, MgrAudioParam.prototype);\n      param._info = this.paramsConfig[name];\n    });\n    const resolves = {};\n    const rejects = {};\n    this.call = (call, ...args) => {\n      const id = this.messageRequestId;\n      this.messageRequestId += 1;\n      return new Promise((resolve, reject) => {\n        resolves[id] = resolve;\n        rejects[id] = reject;\n        this.port.postMessage({ id, call, args });\n      });\n    };\n    this.handleMessage = ({ data }) => {\n      var _a, _b;\n      const { id, call, args, value, error } = data;\n      if (call) {\n        const r = { id };\n        try {\n          r.value = this[call](...args);\n        } catch (e) {\n          r.error = e;\n        }\n        this.port.postMessage(r);\n      } else {\n        if (error)\n          (_a = rejects[id]) == null ? void 0 : _a.call(rejects, error);\n        else\n          (_b = resolves[id]) == null ? void 0 : _b.call(resolves, value);\n        delete resolves[id];\n        delete rejects[id];\n      }\n    };\n    this.port.start();\n    this.port.addEventListener(\"message\", this.handleMessage);\n  }\n  /**\n   * @returns {ReadonlyMap<string, MgrAudioParam>}\n   */\n  get parameters() {\n    return super.parameters;\n  }\n  get moduleId() {\n    return this.module.moduleId;\n  }\n  async initialize() {\n    const response = await this.call(\"getBuffer\");\n    const { lock, paramsBuffer } = response;\n    this.$lock = lock;\n    this.$paramsBuffer = paramsBuffer;\n    const offset = 1;\n    Object.entries(this.internalParamsConfig).forEach(([name, config], i) => {\n      if (this.context.state === \"suspended\")\n        this.$paramsBuffer[i] = config.defaultValue;\n      if (config instanceof AudioParam) {\n        try {\n          config.automationRate = \"a-rate\";\n        } catch (e) {\n        } finally {\n          config.value = Math.max(0, config.minValue);\n          this.connect(config, offset + i);\n          this.connect(this.dummyGainNode, offset + i, 0);\n        }\n      } else if (config instanceof AudioNode) {\n        this.connect(config, offset + i);\n      } else {\n        this.requestDispatchIParamChange(name);\n      }\n    });\n    this.connect(this.module.audioContext.destination, 0, 0);\n    this.initialized = true;\n    return this;\n  }\n  /**\n   * @param {ReturnType<ParamMgrCallToProcessor['getBuffer']>} buffer\n   */\n  setBuffer({ lock, paramsBuffer }) {\n    this.$lock = lock;\n    this.$paramsBuffer = paramsBuffer;\n  }\n  setParamsMapping(paramsMapping) {\n    return this.call(\"setParamsMapping\", paramsMapping);\n  }\n  getCompensationDelay() {\n    return this.call(\"getCompensationDelay\");\n  }\n  getParameterInfo(...parameterIdQuery) {\n    return this.call(\"getParameterInfo\", ...parameterIdQuery);\n  }\n  getParameterValues(normalized, ...parameterIdQuery) {\n    return this.call(\"getParameterValues\", normalized, ...parameterIdQuery);\n  }\n  /**\n   * @param {WamAutomationEvent} event\n   */\n  scheduleAutomation(event) {\n    const time = event.time || this.context.currentTime;\n    const { id, normalized, value } = event.data;\n    const audioParam = this.getParam(id);\n    if (!audioParam)\n      return;\n    if (audioParam.info.type === \"float\") {\n      if (normalized)\n        audioParam.linearRampToNormalizedValueAtTime(value, time);\n      else\n        audioParam.linearRampToValueAtTime(value, time);\n    } else {\n      if (normalized)\n        audioParam.setNormalizedValueAtTime(value, time);\n      else\n        audioParam.setValueAtTime(value, time);\n    }\n  }\n  /**\n   * @param {WamEvent[]} events\n   */\n  scheduleEvents(...events) {\n    events.forEach((event) => {\n      if (event.type === \"wam-automation\") {\n        this.scheduleAutomation(event);\n      }\n    });\n    this.call(\"scheduleEvents\", ...events);\n  }\n  /**\n   * @param {WamEvent[]} events\n   */\n  emitEvents(...events) {\n    this.call(\"emitEvents\", ...events);\n  }\n  clearEvents() {\n    this.call(\"clearEvents\");\n  }\n  /**\n   * @param {WamEvent} event\n   */\n  dispatchWamEvent(event) {\n    if (event.type === \"wam-automation\") {\n      this.scheduleAutomation(event);\n    } else {\n      this.dispatchEvent(new CustomEvent(event.type, { detail: event }));\n    }\n  }\n  /**\n   * @param {WamParameterValueMap} parameterValues\n   */\n  async setParameterValues(parameterValues) {\n    Object.keys(parameterValues).forEach((parameterId) => {\n      const parameterUpdate = parameterValues[parameterId];\n      const parameter = this.parameters.get(parameterId);\n      if (!parameter)\n        return;\n      if (!parameterUpdate.normalized)\n        parameter.value = parameterUpdate.value;\n      else\n        parameter.normalizedValue = parameterUpdate.value;\n    });\n  }\n  async getState() {\n    return this.getParamsValues();\n  }\n  async setState(state) {\n    this.setParamsValues(state);\n  }\n  convertTimeToFrame(time) {\n    return Math.round(time * this.context.sampleRate);\n  }\n  convertFrameToTime(frame) {\n    return frame / this.context.sampleRate;\n  }\n  /**\n   * @param {string} name\n   */\n  getIParamIndex(name) {\n    const i = this.internalParams.indexOf(name);\n    return i === -1 ? null : i;\n  }\n  /**\n   * @param {string} name\n   * @param {AudioParam | AudioNode} dest\n   * @param {number} index\n   */\n  connectIParam(name, dest, index) {\n    const offset = 1;\n    const i = this.getIParamIndex(name);\n    if (i !== null) {\n      if (dest instanceof AudioNode) {\n        if (typeof index === \"number\")\n          this.connect(dest, offset + i, index);\n        else\n          this.connect(dest, offset + i);\n      } else {\n        this.connect(dest, offset + i);\n      }\n    }\n  }\n  /**\n   * @param {string} name\n   * @param {AudioParam | AudioNode} dest\n   * @param {number} index\n   */\n  disconnectIParam(name, dest, index) {\n    const offset = 1;\n    const i = this.getIParamIndex(name);\n    if (i !== null) {\n      if (dest instanceof AudioNode) {\n        if (typeof index === \"number\")\n          this.disconnect(dest, offset + i, index);\n        else\n          this.disconnect(dest, offset + i);\n      } else {\n        this.disconnect(dest, offset + i);\n      }\n    }\n  }\n  getIParamValue(name) {\n    const i = this.getIParamIndex(name);\n    return i !== null ? this.$paramsBuffer[i] : null;\n  }\n  getIParamsValues() {\n    const values = {};\n    this.internalParams.forEach((name, i) => {\n      values[name] = this.$paramsBuffer[i];\n    });\n    return values;\n  }\n  getParam(name) {\n    return this.parameters.get(name) || null;\n  }\n  getParams() {\n    return Object.fromEntries(this.parameters);\n  }\n  getParamValue(name) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.value;\n  }\n  setParamValue(name, value) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return;\n    param.value = value;\n  }\n  getParamsValues() {\n    const values = {};\n    this.parameters.forEach((v, k) => {\n      values[k] = v.value;\n    });\n    return values;\n  }\n  /**\n   * @param {Record<string, number>} values\n   */\n  setParamsValues(values) {\n    if (!values)\n      return;\n    Object.entries(values).forEach(([k, v]) => {\n      this.setParamValue(k, v);\n    });\n  }\n  getNormalizedParamValue(name) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.normalizedValue;\n  }\n  setNormalizedParamValue(name, value) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return;\n    param.normalizedValue = value;\n  }\n  getNormalizedParamsValues() {\n    const values = {};\n    this.parameters.forEach((v, k) => {\n      values[k] = this.getNormalizedParamValue(k);\n    });\n    return values;\n  }\n  setNormalizedParamsValues(values) {\n    if (!values)\n      return;\n    Object.entries(values).forEach(([k, v]) => {\n      this.setNormalizedParamValue(k, v);\n    });\n  }\n  setParamValueAtTime(name, value, startTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setValueAtTime(value, startTime);\n  }\n  setNormalizedParamValueAtTime(name, value, startTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setNormalizedValueAtTime(value, startTime);\n  }\n  linearRampToParamValueAtTime(name, value, endTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.linearRampToValueAtTime(value, endTime);\n  }\n  linearRampToNormalizedParamValueAtTime(name, value, endTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.linearRampToNormalizedValueAtTime(value, endTime);\n  }\n  exponentialRampToParamValueAtTime(name, value, endTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.exponentialRampToValueAtTime(value, endTime);\n  }\n  exponentialRampToNormalizedParamValueAtTime(name, value, endTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.exponentialRampToNormalizedValueAtTime(value, endTime);\n  }\n  setParamTargetAtTime(name, target, startTime, timeConstant) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setTargetAtTime(target, startTime, timeConstant);\n  }\n  setNormalizedParamTargetAtTime(name, target, startTime, timeConstant) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setNormalizedTargetAtTime(target, startTime, timeConstant);\n  }\n  setParamValueCurveAtTime(name, values, startTime, duration) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setValueCurveAtTime(values, startTime, duration);\n  }\n  setNormalizedParamValueCurveAtTime(name, values, startTime, duration) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.setNormalizedValueCurveAtTime(values, startTime, duration);\n  }\n  cancelScheduledParamValues(name, cancelTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.cancelScheduledValues(cancelTime);\n  }\n  cancelAndHoldParamAtTime(name, cancelTime) {\n    const param = this.parameters.get(name);\n    if (!param)\n      return null;\n    return param.cancelAndHoldAtTime(cancelTime);\n  }\n  /**\n   * @param {string} toId\n   * @param {number} [output]\n   */\n  connectEvents(toId, output) {\n    this.call(\"connectEvents\", toId, output);\n  }\n  /**\n   * @param {string} [toId]\n   * @param {number} [output]\n   */\n  disconnectEvents(toId, output) {\n    this.call(\"disconnectEvents\", toId, output);\n  }\n  async destroy() {\n    this.disconnect();\n    this.paramsUpdateCheckFnRef.forEach((ref) => {\n      if (typeof ref === \"number\")\n        window.clearTimeout(ref);\n    });\n    await this.call(\"destroy\");\n    this.port.close();\n  }\n};\n\n// src/ParamMgrFactory.js\nvar ParamMgrFactory = class {\n  /**\n   * @param {WebAudioModule} module\n   * @param {ParametersMappingConfiguratorOptions} [optionsIn = {}]\n   */\n  static async create(module, optionsIn = {}) {\n    const { audioContext, moduleId } = module;\n    const instanceId = optionsIn.instanceId || module.instanceId;\n    const groupId = optionsIn.groupId || module.groupId;\n    const { paramsConfig, paramsMapping, internalParamsConfig } = new ParamMappingConfigurator(optionsIn);\n    const initialParamsValue = Object.entries(paramsConfig).reduce((currentParams, [name, { defaultValue }]) => {\n      currentParams[name] = defaultValue;\n      return currentParams;\n    }, {});\n    const serializableParamsConfig = Object.entries(paramsConfig).reduce((currentParams, [name, { id, label, type, defaultValue, minValue, maxValue, discreteStep, exponent, choices, units }]) => {\n      currentParams[name] = { id, label, type, defaultValue, minValue, maxValue, discreteStep, exponent, choices, units };\n      return currentParams;\n    }, {});\n    await addFunctionModule_default(audioContext.audioWorklet, ParamMgrProcessor_default, moduleId, serializableParamsConfig);\n    const options = {\n      internalParamsConfig,\n      parameterData: initialParamsValue,\n      processorOptions: {\n        paramsConfig,\n        paramsMapping,\n        internalParamsMinValues: Object.values(internalParamsConfig).map((config) => Math.max(0, (config == null ? void 0 : config.minValue) || 0)),\n        internalParams: Object.keys(internalParamsConfig),\n        groupId,\n        instanceId,\n        moduleId\n      }\n    };\n    const node = new ParamMgrNode(module, options);\n    await node.initialize();\n    return node;\n  }\n};\n\n//# sourceMappingURL=index.js.map\n\n\n//# sourceURL=webpack://wam-reverb/../../../node_modules/@webaudiomodules/sdk-parammgr/dist/index.js?");

/***/ }),

/***/ "../../../node_modules/@webaudiomodules/sdk/dist/index.js":
/*!****************************************************************!*\
  !*** ../../../node_modules/@webaudiomodules/sdk/dist/index.js ***!
  \****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {

eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   WamNode: () => (/* binding */ WamNode),\n/* harmony export */   WebAudioModule: () => (/* binding */ WebAudioModule_default),\n/* harmony export */   addFunctionModule: () => (/* binding */ addFunctionModule_default),\n/* harmony export */   apiVersion: () => (/* binding */ apiVersion_default),\n/* harmony export */   getRingBuffer: () => (/* binding */ RingBuffer_default),\n/* harmony export */   getWamArrayRingBuffer: () => (/* binding */ WamArrayRingBuffer_default),\n/* harmony export */   getWamEventRingBuffer: () => (/* binding */ WamEventRingBuffer_default),\n/* harmony export */   getWamParameter: () => (/* binding */ WamParameter_default),\n/* harmony export */   getWamParameterInfo: () => (/* binding */ WamParameterInfo_default),\n/* harmony export */   getWamParameterInterpolator: () => (/* binding */ WamParameterInterpolator_default),\n/* harmony export */   getWamProcessor: () => (/* binding */ WamProcessor_default),\n/* harmony export */   initializeWamEnv: () => (/* binding */ WamEnv_default),\n/* harmony export */   initializeWamGroup: () => (/* binding */ WamGroup_default),\n/* harmony export */   initializeWamHost: () => (/* binding */ initializeWamHost_default)\n/* harmony export */ });\n// src/WebAudioModule.js\nvar WebAudioModule = class {\n  static get isWebAudioModuleConstructor() {\n    return true;\n  }\n  static createInstance(groupId, audioContext, initialState) {\n    return new this(groupId, audioContext).initialize(initialState);\n  }\n  constructor(groupId, audioContext) {\n    this._groupId = groupId;\n    this._audioContext = audioContext;\n    this._initialized = false;\n    this._audioNode = void 0;\n    this._timestamp = performance.now();\n    this._guiModuleUrl = void 0;\n    this._descriptorUrl = \"./descriptor.json\";\n    this._descriptor = {\n      identifier: `com.webaudiomodule.default`,\n      name: `WebAudioModule_${this.constructor.name}`,\n      vendor: \"WebAudioModuleVendor\",\n      description: \"\",\n      version: \"0.0.0\",\n      apiVersion: \"2.0.0\",\n      thumbnail: \"\",\n      keywords: [],\n      isInstrument: false,\n      website: \"\",\n      hasAudioInput: true,\n      hasAudioOutput: true,\n      hasAutomationInput: true,\n      hasAutomationOutput: true,\n      hasMidiInput: true,\n      hasMidiOutput: true,\n      hasMpeInput: true,\n      hasMpeOutput: true,\n      hasOscInput: true,\n      hasOscOutput: true,\n      hasSysexInput: true,\n      hasSysexOutput: true\n    };\n  }\n  get isWebAudioModule() {\n    return true;\n  }\n  get groupId() {\n    return this._groupId;\n  }\n  get moduleId() {\n    return this.descriptor.identifier;\n  }\n  get instanceId() {\n    return this.moduleId + this._timestamp;\n  }\n  get descriptor() {\n    return this._descriptor;\n  }\n  get identifier() {\n    return this.descriptor.identifier;\n  }\n  get name() {\n    return this.descriptor.name;\n  }\n  get vendor() {\n    return this.descriptor.vendor;\n  }\n  get audioContext() {\n    return this._audioContext;\n  }\n  get audioNode() {\n    if (!this.initialized)\n      console.warn(\"WAM should be initialized before getting the audioNode\");\n    return this._audioNode;\n  }\n  set audioNode(node) {\n    this._audioNode = node;\n  }\n  get initialized() {\n    return this._initialized;\n  }\n  set initialized(value) {\n    this._initialized = value;\n  }\n  async createAudioNode(initialState) {\n    throw new TypeError(\"createAudioNode() not provided\");\n  }\n  async initialize(state) {\n    if (!this._audioNode)\n      this.audioNode = await this.createAudioNode();\n    this.initialized = true;\n    return this;\n  }\n  async _loadGui() {\n    const url = this._guiModuleUrl;\n    if (!url)\n      throw new TypeError(\"Gui module not found\");\n    return import(\n      /* webpackIgnore: true */\n      url\n    );\n  }\n  async _loadDescriptor() {\n    const url = this._descriptorUrl;\n    if (!url)\n      throw new TypeError(\"Descriptor not found\");\n    const response = await fetch(url);\n    const descriptor = await response.json();\n    Object.assign(this._descriptor, descriptor);\n    return this._descriptor;\n  }\n  async createGui() {\n    if (!this.initialized)\n      console.warn(\"Plugin should be initialized before getting the gui\");\n    if (!this._guiModuleUrl)\n      return void 0;\n    const { createElement } = await this._loadGui();\n    return createElement(this);\n  }\n  destroyGui() {\n  }\n};\nvar WebAudioModule_default = WebAudioModule;\n\n// src/RingBuffer.js\nvar getRingBuffer = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  class RingBuffer2 {\n    static getStorageForCapacity(capacity, Type) {\n      if (!Type.BYTES_PER_ELEMENT) {\n        throw new Error(\"Pass in a ArrayBuffer subclass\");\n      }\n      const bytes = 8 + (capacity + 1) * Type.BYTES_PER_ELEMENT;\n      return new SharedArrayBuffer(bytes);\n    }\n    constructor(sab, Type) {\n      if (!Type.BYTES_PER_ELEMENT) {\n        throw new Error(\"Pass a concrete typed array class as second argument\");\n      }\n      this._Type = Type;\n      this._capacity = (sab.byteLength - 8) / Type.BYTES_PER_ELEMENT;\n      this.buf = sab;\n      this.write_ptr = new Uint32Array(this.buf, 0, 1);\n      this.read_ptr = new Uint32Array(this.buf, 4, 1);\n      this.storage = new Type(this.buf, 8, this._capacity);\n    }\n    get type() {\n      return this._Type.name;\n    }\n    push(elements) {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      if ((wr + 1) % this._storageCapacity() === rd) {\n        return 0;\n      }\n      const toWrite = Math.min(this._availableWrite(rd, wr), elements.length);\n      const firstPart = Math.min(this._storageCapacity() - wr, toWrite);\n      const secondPart = toWrite - firstPart;\n      this._copy(elements, 0, this.storage, wr, firstPart);\n      this._copy(elements, firstPart, this.storage, 0, secondPart);\n      Atomics.store(this.write_ptr, 0, (wr + toWrite) % this._storageCapacity());\n      return toWrite;\n    }\n    pop(elements) {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      if (wr === rd) {\n        return 0;\n      }\n      const isArray = !Number.isInteger(elements);\n      const toRead = Math.min(this._availableRead(rd, wr), isArray ? elements.length : elements);\n      if (isArray) {\n        const firstPart = Math.min(this._storageCapacity() - rd, toRead);\n        const secondPart = toRead - firstPart;\n        this._copy(this.storage, rd, elements, 0, firstPart);\n        this._copy(this.storage, 0, elements, firstPart, secondPart);\n      }\n      Atomics.store(this.read_ptr, 0, (rd + toRead) % this._storageCapacity());\n      return toRead;\n    }\n    get empty() {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      return wr === rd;\n    }\n    get full() {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      return (wr + 1) % this._capacity !== rd;\n    }\n    get capacity() {\n      return this._capacity - 1;\n    }\n    get availableRead() {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      return this._availableRead(rd, wr);\n    }\n    get availableWrite() {\n      const rd = Atomics.load(this.read_ptr, 0);\n      const wr = Atomics.load(this.write_ptr, 0);\n      return this._availableWrite(rd, wr);\n    }\n    _availableRead(rd, wr) {\n      if (wr > rd) {\n        return wr - rd;\n      }\n      return wr + this._storageCapacity() - rd;\n    }\n    _availableWrite(rd, wr) {\n      let rv = rd - wr - 1;\n      if (wr >= rd) {\n        rv += this._storageCapacity();\n      }\n      return rv;\n    }\n    _storageCapacity() {\n      return this._capacity;\n    }\n    _copy(input, offsetInput, output, offsetOutput, size) {\n      for (let i = 0; i < size; i++) {\n        output[offsetOutput + i] = input[offsetInput + i];\n      }\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.RingBuffer)\n      ModuleScope.RingBuffer = RingBuffer2;\n  }\n  return RingBuffer2;\n};\nvar RingBuffer_default = getRingBuffer;\n\n// src/WamArrayRingBuffer.js\nvar getWamArrayRingBuffer = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  class WamArrayRingBuffer {\n    static DefaultArrayCapacity = 2;\n    static getStorageForEventCapacity(RingBuffer2, arrayLength, arrayType, maxArrayCapacity = void 0) {\n      if (maxArrayCapacity === void 0)\n        maxArrayCapacity = WamArrayRingBuffer.DefaultArrayCapacity;\n      else\n        maxArrayCapacity = Math.max(maxArrayCapacity, WamArrayRingBuffer.DefaultArrayCapacity);\n      if (!arrayType.BYTES_PER_ELEMENT) {\n        throw new Error(\"Pass in a ArrayBuffer subclass\");\n      }\n      const capacity = arrayLength * maxArrayCapacity;\n      return RingBuffer2.getStorageForCapacity(capacity, arrayType);\n    }\n    constructor(RingBuffer2, sab, arrayLength, arrayType, maxArrayCapacity = void 0) {\n      if (!arrayType.BYTES_PER_ELEMENT) {\n        throw new Error(\"Pass in a ArrayBuffer subclass\");\n      }\n      this._arrayLength = arrayLength;\n      this._arrayType = arrayType;\n      this._arrayElementSizeBytes = arrayType.BYTES_PER_ELEMENT;\n      this._arraySizeBytes = this._arrayLength * this._arrayElementSizeBytes;\n      this._sab = sab;\n      if (maxArrayCapacity === void 0)\n        maxArrayCapacity = WamArrayRingBuffer.DefaultArrayCapacity;\n      else\n        maxArrayCapacity = Math.max(maxArrayCapacity, WamArrayRingBuffer.DefaultArrayCapacity);\n      this._arrayArray = new arrayType(this._arrayLength);\n      this._rb = new RingBuffer2(this._sab, arrayType);\n    }\n    write(array) {\n      if (array.length !== this._arrayLength)\n        return false;\n      const elementsAvailable = this._rb.availableWrite;\n      if (elementsAvailable < this._arrayLength)\n        return false;\n      let success = true;\n      const elementsWritten = this._rb.push(array);\n      if (elementsWritten != this._arrayLength)\n        success = false;\n      return success;\n    }\n    read(array, newest) {\n      if (array.length !== this._arrayLength)\n        return false;\n      const elementsAvailable = this._rb.availableRead;\n      if (elementsAvailable < this._arrayLength)\n        return false;\n      if (newest && elementsAvailable > this._arrayLength)\n        this._rb.pop(elementsAvailable - this._arrayLength);\n      let success = false;\n      const elementsRead = this._rb.pop(array);\n      if (elementsRead === this._arrayLength)\n        success = true;\n      return success;\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamArrayRingBuffer)\n      ModuleScope.WamArrayRingBuffer = WamArrayRingBuffer;\n  }\n  return WamArrayRingBuffer;\n};\nvar WamArrayRingBuffer_default = getWamArrayRingBuffer;\n\n// src/WamEnv.js\nvar initializeWamEnv = (apiVersion) => {\n  const audioWorkletGlobalScope = globalThis;\n  if (audioWorkletGlobalScope.AudioWorkletProcessor && audioWorkletGlobalScope.webAudioModules)\n    return;\n  const moduleScopes = /* @__PURE__ */ new Map();\n  const groups = /* @__PURE__ */ new Map();\n  class WamEnv {\n    constructor() {\n    }\n    get apiVersion() {\n      return apiVersion;\n    }\n    getModuleScope(moduleId) {\n      if (!moduleScopes.has(moduleId))\n        moduleScopes.set(moduleId, {});\n      return moduleScopes.get(moduleId);\n    }\n    getGroup(groupId, groupKey) {\n      const group = groups.get(groupId);\n      if (group.validate(groupKey))\n        return group;\n      else\n        throw \"Invalid key\";\n    }\n    addGroup(group) {\n      if (!groups.has(group.groupId))\n        groups.set(group.groupId, group);\n    }\n    removeGroup(group) {\n      groups.delete(group.groupId);\n    }\n    addWam(wam) {\n      const group = groups.get(wam.groupId);\n      group.addWam(wam);\n    }\n    removeWam(wam) {\n      const group = groups.get(wam.groupId);\n      group.removeWam(wam);\n    }\n    connectEvents(groupId, fromId, toId, output = 0) {\n      const group = groups.get(groupId);\n      group.connectEvents(fromId, toId, output);\n    }\n    disconnectEvents(groupId, fromId, toId, output) {\n      const group = groups.get(groupId);\n      group.disconnectEvents(fromId, toId, output);\n    }\n    emitEvents(from, ...events) {\n      const group = groups.get(from.groupId);\n      group.emitEvents(from, ...events);\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    if (!audioWorkletGlobalScope.webAudioModules)\n      audioWorkletGlobalScope.webAudioModules = new WamEnv();\n  }\n};\nvar WamEnv_default = initializeWamEnv;\n\n// src/WamGroup.js\nvar initializeWamGroup = (groupId, groupKey) => {\n  const audioWorkletGlobalScope = globalThis;\n  class WamGroup {\n    constructor(groupId2, groupKey2) {\n      this._groupId = groupId2;\n      this._validate = (key) => {\n        return key == groupKey2;\n      };\n      this._processors = /* @__PURE__ */ new Map();\n      this._eventGraph = /* @__PURE__ */ new Map();\n    }\n    get groupId() {\n      return this._groupId;\n    }\n    get processors() {\n      return this._processors;\n    }\n    get eventGraph() {\n      return this._eventGraph;\n    }\n    validate(groupKey2) {\n      return this._validate(groupKey2);\n    }\n    addWam(wam) {\n      this._processors.set(wam.instanceId, wam);\n    }\n    removeWam(wam) {\n      if (this._eventGraph.has(wam))\n        this._eventGraph.delete(wam);\n      this._eventGraph.forEach((outputMap) => {\n        outputMap.forEach((set) => {\n          if (set && set.has(wam))\n            set.delete(wam);\n        });\n      });\n      this._processors.delete(wam.instanceId);\n    }\n    connectEvents(fromId, toId, output) {\n      const from = this._processors.get(fromId);\n      const to = this._processors.get(toId);\n      let outputMap;\n      if (this._eventGraph.has(from)) {\n        outputMap = this._eventGraph.get(from);\n      } else {\n        outputMap = [];\n        this._eventGraph.set(from, outputMap);\n      }\n      if (outputMap[output]) {\n        outputMap[output].add(to);\n      } else {\n        const set = /* @__PURE__ */ new Set();\n        set.add(to);\n        outputMap[output] = set;\n      }\n    }\n    disconnectEvents(fromId, toId, output) {\n      const from = this._processors.get(fromId);\n      if (!this._eventGraph.has(from))\n        return;\n      const outputMap = this._eventGraph.get(from);\n      if (typeof toId === \"undefined\") {\n        outputMap.forEach((set) => {\n          if (set)\n            set.clear();\n        });\n        return;\n      }\n      const to = this._processors.get(toId);\n      if (typeof output === \"undefined\") {\n        outputMap.forEach((set) => {\n          if (set)\n            set.delete(to);\n        });\n        return;\n      }\n      if (!outputMap[output])\n        return;\n      outputMap[output].delete(to);\n    }\n    emitEvents(from, ...events) {\n      if (!this._eventGraph.has(from))\n        return;\n      const downstream = this._eventGraph.get(from);\n      downstream.forEach((set) => {\n        if (set)\n          set.forEach((wam) => wam.scheduleEvents(...events));\n      });\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    audioWorkletGlobalScope.webAudioModules.addGroup(new WamGroup(groupId, groupKey));\n  }\n};\nvar WamGroup_default = initializeWamGroup;\n\n// src/WamEventRingBuffer.js\nvar getWamEventRingBuffer = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  class WamEventRingBuffer2 {\n    static DefaultExtraBytesPerEvent = 64;\n    static WamEventBaseBytes = 4 + 1 + 8;\n    static WamAutomationEventBytes = WamEventRingBuffer2.WamEventBaseBytes + 2 + 8 + 1;\n    static WamTransportEventBytes = WamEventRingBuffer2.WamEventBaseBytes + 4 + 8 + 8 + 1 + 1 + 1;\n    static WamMidiEventBytes = WamEventRingBuffer2.WamEventBaseBytes + 1 + 1 + 1;\n    static WamBinaryEventBytes = WamEventRingBuffer2.WamEventBaseBytes + 4;\n    static getStorageForEventCapacity(RingBuffer2, eventCapacity, maxBytesPerEvent = void 0) {\n      if (maxBytesPerEvent === void 0)\n        maxBytesPerEvent = WamEventRingBuffer2.DefaultExtraBytesPerEvent;\n      else\n        maxBytesPerEvent = Math.max(maxBytesPerEvent, WamEventRingBuffer2.DefaultExtraBytesPerEvent);\n      const capacity = (Math.max(WamEventRingBuffer2.WamAutomationEventBytes, WamEventRingBuffer2.WamTransportEventBytes, WamEventRingBuffer2.WamMidiEventBytes, WamEventRingBuffer2.WamBinaryEventBytes) + maxBytesPerEvent) * eventCapacity;\n      return RingBuffer2.getStorageForCapacity(capacity, Uint8Array);\n    }\n    constructor(RingBuffer2, sab, parameterIds, maxBytesPerEvent = void 0) {\n      this._eventSizeBytes = {};\n      this._encodeEventType = {};\n      this._decodeEventType = {};\n      const wamEventTypes = [\"wam-automation\", \"wam-transport\", \"wam-midi\", \"wam-sysex\", \"wam-mpe\", \"wam-osc\", \"wam-info\"];\n      wamEventTypes.forEach((type, encodedType) => {\n        let byteSize = 0;\n        switch (type) {\n          case \"wam-automation\":\n            byteSize = WamEventRingBuffer2.WamAutomationEventBytes;\n            break;\n          case \"wam-transport\":\n            byteSize = WamEventRingBuffer2.WamTransportEventBytes;\n            break;\n          case \"wam-mpe\":\n          case \"wam-midi\":\n            byteSize = WamEventRingBuffer2.WamMidiEventBytes;\n            break;\n          case \"wam-osc\":\n          case \"wam-sysex\":\n          case \"wam-info\":\n            byteSize = WamEventRingBuffer2.WamBinaryEventBytes;\n            break;\n          default:\n            break;\n        }\n        this._eventSizeBytes[type] = byteSize;\n        this._encodeEventType[type] = encodedType;\n        this._decodeEventType[encodedType] = type;\n      });\n      this._parameterCode = 0;\n      this._parameterCodes = {};\n      this._encodeParameterId = {};\n      this._decodeParameterId = {};\n      this.setParameterIds(parameterIds);\n      this._sab = sab;\n      if (maxBytesPerEvent === void 0)\n        maxBytesPerEvent = WamEventRingBuffer2.DefaultExtraBytesPerEvent;\n      else\n        maxBytesPerEvent = Math.max(maxBytesPerEvent, WamEventRingBuffer2.DefaultExtraBytesPerEvent);\n      this._eventBytesAvailable = Math.max(WamEventRingBuffer2.WamAutomationEventBytes, WamEventRingBuffer2.WamTransportEventBytes, WamEventRingBuffer2.WamMidiEventBytes, WamEventRingBuffer2.WamBinaryEventBytes) + maxBytesPerEvent;\n      this._eventBytes = new ArrayBuffer(this._eventBytesAvailable);\n      this._eventBytesView = new DataView(this._eventBytes);\n      this._rb = new RingBuffer2(this._sab, Uint8Array);\n      this._eventSizeArray = new Uint8Array(this._eventBytes, 0, 4);\n      this._eventSizeView = new DataView(this._eventBytes, 0, 4);\n    }\n    _writeHeader(byteSize, type, time) {\n      let byteOffset = 0;\n      this._eventBytesView.setUint32(byteOffset, byteSize);\n      byteOffset += 4;\n      this._eventBytesView.setUint8(byteOffset, this._encodeEventType[type]);\n      byteOffset += 1;\n      this._eventBytesView.setFloat64(byteOffset, Number.isFinite(time) ? time : -1);\n      byteOffset += 8;\n      return byteOffset;\n    }\n    _encode(event) {\n      let byteOffset = 0;\n      const { type, time } = event;\n      switch (event.type) {\n        case \"wam-automation\":\n          {\n            if (!(event.data.id in this._encodeParameterId))\n              break;\n            const byteSize = this._eventSizeBytes[type];\n            byteOffset = this._writeHeader(byteSize, type, time);\n            const { data } = event;\n            const encodedParameterId = this._encodeParameterId[data.id];\n            const { value, normalized } = data;\n            this._eventBytesView.setUint16(byteOffset, encodedParameterId);\n            byteOffset += 2;\n            this._eventBytesView.setFloat64(byteOffset, value);\n            byteOffset += 8;\n            this._eventBytesView.setUint8(byteOffset, normalized ? 1 : 0);\n            byteOffset += 1;\n          }\n          break;\n        case \"wam-transport\":\n          {\n            const byteSize = this._eventSizeBytes[type];\n            byteOffset = this._writeHeader(byteSize, type, time);\n            const { data } = event;\n            const {\n              currentBar,\n              currentBarStarted,\n              tempo,\n              timeSigNumerator,\n              timeSigDenominator,\n              playing\n            } = data;\n            this._eventBytesView.setUint32(byteOffset, currentBar);\n            byteOffset += 4;\n            this._eventBytesView.setFloat64(byteOffset, currentBarStarted);\n            byteOffset += 8;\n            this._eventBytesView.setFloat64(byteOffset, tempo);\n            byteOffset += 8;\n            this._eventBytesView.setUint8(byteOffset, timeSigNumerator);\n            byteOffset += 1;\n            this._eventBytesView.setUint8(byteOffset, timeSigDenominator);\n            byteOffset += 1;\n            this._eventBytesView.setUint8(byteOffset, playing ? 1 : 0);\n            byteOffset += 1;\n          }\n          break;\n        case \"wam-mpe\":\n        case \"wam-midi\":\n          {\n            const byteSize = this._eventSizeBytes[type];\n            byteOffset = this._writeHeader(byteSize, type, time);\n            const { data } = event;\n            const { bytes } = data;\n            let b = 0;\n            while (b < 3) {\n              this._eventBytesView.setUint8(byteOffset, bytes[b]);\n              byteOffset += 1;\n              b++;\n            }\n          }\n          break;\n        case \"wam-osc\":\n        case \"wam-sysex\":\n        case \"wam-info\":\n          {\n            let bytes = null;\n            if (event.type === \"wam-info\") {\n              const { data } = event;\n              bytes = new TextEncoder().encode(data.instanceId);\n            } else {\n              const { data } = event;\n              bytes = data.bytes;\n            }\n            const numBytes = bytes.length;\n            const byteSize = this._eventSizeBytes[type];\n            byteOffset = this._writeHeader(byteSize + numBytes, type, time);\n            this._eventBytesView.setUint32(byteOffset, numBytes);\n            byteOffset += 4;\n            const bytesRequired = byteOffset + numBytes;\n            if (bytesRequired > this._eventBytesAvailable)\n              console.error(`Event requires ${bytesRequired} bytes but only ${this._eventBytesAvailable} have been allocated!`);\n            const buffer = new Uint8Array(this._eventBytes, byteOffset, numBytes);\n            buffer.set(bytes);\n            byteOffset += numBytes;\n          }\n          break;\n        default:\n          break;\n      }\n      return new Uint8Array(this._eventBytes, 0, byteOffset);\n    }\n    _decode() {\n      let byteOffset = 0;\n      const type = this._decodeEventType[this._eventBytesView.getUint8(byteOffset)];\n      byteOffset += 1;\n      let time = this._eventBytesView.getFloat64(byteOffset);\n      if (time === -1)\n        time = void 0;\n      byteOffset += 8;\n      switch (type) {\n        case \"wam-automation\": {\n          const encodedParameterId = this._eventBytesView.getUint16(byteOffset);\n          byteOffset += 2;\n          const value = this._eventBytesView.getFloat64(byteOffset);\n          byteOffset += 8;\n          const normalized = !!this._eventBytesView.getUint8(byteOffset);\n          byteOffset += 1;\n          if (!(encodedParameterId in this._decodeParameterId))\n            break;\n          const id = this._decodeParameterId[encodedParameterId];\n          const event = {\n            type,\n            time,\n            data: {\n              id,\n              value,\n              normalized\n            }\n          };\n          return event;\n        }\n        case \"wam-transport\": {\n          const currentBar = this._eventBytesView.getUint32(byteOffset);\n          byteOffset += 4;\n          const currentBarStarted = this._eventBytesView.getFloat64(byteOffset);\n          byteOffset += 8;\n          const tempo = this._eventBytesView.getFloat64(byteOffset);\n          byteOffset += 8;\n          const timeSigNumerator = this._eventBytesView.getUint8(byteOffset);\n          byteOffset += 1;\n          const timeSigDenominator = this._eventBytesView.getUint8(byteOffset);\n          byteOffset += 1;\n          const playing = this._eventBytesView.getUint8(byteOffset) == 1;\n          byteOffset += 1;\n          const event = {\n            type,\n            time,\n            data: {\n              currentBar,\n              currentBarStarted,\n              tempo,\n              timeSigNumerator,\n              timeSigDenominator,\n              playing\n            }\n          };\n          return event;\n        }\n        case \"wam-mpe\":\n        case \"wam-midi\": {\n          const bytes = [0, 0, 0];\n          let b = 0;\n          while (b < 3) {\n            bytes[b] = this._eventBytesView.getUint8(byteOffset);\n            byteOffset += 1;\n            b++;\n          }\n          const event = {\n            type,\n            time,\n            data: { bytes }\n          };\n          return event;\n        }\n        case \"wam-osc\":\n        case \"wam-sysex\":\n        case \"wam-info\": {\n          const numBytes = this._eventBytesView.getUint32(byteOffset);\n          byteOffset += 4;\n          const bytes = new Uint8Array(numBytes);\n          bytes.set(new Uint8Array(this._eventBytes, byteOffset, numBytes));\n          byteOffset += numBytes;\n          if (type === \"wam-info\") {\n            const instanceId = new TextDecoder().decode(bytes);\n            const data = { instanceId };\n            return { type, time, data };\n          } else {\n            const data = { bytes };\n            return { type, time, data };\n          }\n        }\n        default:\n          break;\n      }\n      return false;\n    }\n    write(...events) {\n      const numEvents = events.length;\n      let bytesAvailable = this._rb.availableWrite;\n      let numSkipped = 0;\n      let i = 0;\n      while (i < numEvents) {\n        const event = events[i];\n        const bytes = this._encode(event);\n        const eventSizeBytes = bytes.byteLength;\n        let bytesWritten = 0;\n        if (bytesAvailable >= eventSizeBytes) {\n          if (eventSizeBytes === 0)\n            numSkipped++;\n          else\n            bytesWritten = this._rb.push(bytes);\n        } else\n          break;\n        bytesAvailable -= bytesWritten;\n        i++;\n      }\n      return i - numSkipped;\n    }\n    read() {\n      if (this._rb.empty)\n        return [];\n      const events = [];\n      let bytesAvailable = this._rb.availableRead;\n      let bytesRead = 0;\n      while (bytesAvailable > 0) {\n        bytesRead = this._rb.pop(this._eventSizeArray);\n        bytesAvailable -= bytesRead;\n        const eventSizeBytes = this._eventSizeView.getUint32(0);\n        const eventBytes = new Uint8Array(this._eventBytes, 0, eventSizeBytes - 4);\n        bytesRead = this._rb.pop(eventBytes);\n        bytesAvailable -= bytesRead;\n        const decodedEvent = this._decode();\n        if (decodedEvent)\n          events.push(decodedEvent);\n      }\n      return events;\n    }\n    setParameterIds(parameterIds) {\n      this._encodeParameterId = {};\n      this._decodeParameterId = {};\n      parameterIds.forEach((parameterId) => {\n        let parameterCode = -1;\n        if (parameterId in this._parameterCodes)\n          parameterCode = this._parameterCodes[parameterId];\n        else {\n          parameterCode = this._generateParameterCode();\n          this._parameterCodes[parameterId] = parameterCode;\n        }\n        this._encodeParameterId[parameterId] = parameterCode;\n        this._decodeParameterId[parameterCode] = parameterId;\n      });\n    }\n    _generateParameterCode() {\n      if (this._parameterCode > 65535)\n        throw Error(\"Too many parameters have been registered!\");\n      return this._parameterCode++;\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamEventRingBuffer)\n      ModuleScope.WamEventRingBuffer = WamEventRingBuffer2;\n  }\n  return WamEventRingBuffer2;\n};\nvar WamEventRingBuffer_default = getWamEventRingBuffer;\n\n// src/addFunctionModule.js\nvar addFunctionModule = (audioWorklet, processorFunction, ...injection) => {\n  const text = `(${processorFunction.toString()})(${injection.map((s) => JSON.stringify(s)).join(\", \")});`;\n  const url = URL.createObjectURL(new Blob([text], { type: \"text/javascript\" }));\n  return audioWorklet.addModule(url);\n};\nvar addFunctionModule_default = addFunctionModule;\n\n// src/WamParameter.js\nvar getWamParameter = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  class WamParameter {\n    constructor(info) {\n      this.info = info;\n      this._value = info.defaultValue;\n    }\n    set value(value) {\n      this._value = value;\n    }\n    get value() {\n      return this._value;\n    }\n    set normalizedValue(valueNorm) {\n      this.value = this.info.denormalize(valueNorm);\n    }\n    get normalizedValue() {\n      return this.info.normalize(this.value);\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamParameter)\n      ModuleScope.WamParameter = WamParameter;\n  }\n  return WamParameter;\n};\nvar WamParameter_default = getWamParameter;\n\n// src/WamParameterInfo.js\nvar getWamParameterInfo = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  const normExp = (x, e) => e === 0 ? x : x ** 1.5 ** -e;\n  const denormExp = (x, e) => e === 0 ? x : x ** 1.5 ** e;\n  const normalize = (x, min, max, e = 0) => min === 0 && max === 1 ? normExp(x, e) : normExp((x - min) / (max - min) || 0, e);\n  const denormalize = (x, min, max, e = 0) => min === 0 && max === 1 ? denormExp(x, e) : denormExp(x, e) * (max - min) + min;\n  const inRange = (x, min, max) => x >= min && x <= max;\n  class WamParameterInfo {\n    constructor(id, config = {}) {\n      let {\n        type,\n        label,\n        defaultValue,\n        minValue,\n        maxValue,\n        discreteStep,\n        exponent,\n        choices,\n        units\n      } = config;\n      if (type === void 0)\n        type = \"float\";\n      if (label === void 0)\n        label = \"\";\n      if (defaultValue === void 0)\n        defaultValue = 0;\n      if (choices === void 0)\n        choices = [];\n      if (type === \"boolean\" || type === \"choice\") {\n        discreteStep = 1;\n        minValue = 0;\n        if (choices.length)\n          maxValue = choices.length - 1;\n        else\n          maxValue = 1;\n      } else {\n        if (minValue === void 0)\n          minValue = 0;\n        if (maxValue === void 0)\n          maxValue = 1;\n        if (discreteStep === void 0)\n          discreteStep = 0;\n        if (exponent === void 0)\n          exponent = 0;\n        if (units === void 0)\n          units = \"\";\n      }\n      const errBase = `Param config error | ${id}: `;\n      if (minValue >= maxValue)\n        throw Error(errBase.concat(\"minValue must be less than maxValue\"));\n      if (!inRange(defaultValue, minValue, maxValue))\n        throw Error(errBase.concat(\"defaultValue out of range\"));\n      if (discreteStep % 1 || discreteStep < 0) {\n        throw Error(errBase.concat(\"discreteStep must be a non-negative integer\"));\n      } else if (discreteStep > 0 && (minValue % 1 || maxValue % 1 || defaultValue % 1)) {\n        throw Error(errBase.concat(\"non-zero discreteStep requires integer minValue, maxValue, and defaultValue\"));\n      }\n      if (type === \"choice\" && !choices.length) {\n        throw Error(errBase.concat(\"choice type parameter requires list of strings in choices\"));\n      }\n      this.id = id;\n      this.label = label;\n      this.type = type;\n      this.defaultValue = defaultValue;\n      this.minValue = minValue;\n      this.maxValue = maxValue;\n      this.discreteStep = discreteStep;\n      this.exponent = exponent;\n      this.choices = choices;\n      this.units = units;\n    }\n    normalize(value) {\n      return normalize(value, this.minValue, this.maxValue, this.exponent);\n    }\n    denormalize(valueNorm) {\n      return denormalize(valueNorm, this.minValue, this.maxValue, this.exponent);\n    }\n    valueString(value) {\n      if (this.choices)\n        return this.choices[value];\n      if (this.units !== \"\")\n        return `${value} ${this.units}`;\n      return `${value}`;\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamParameterInfo)\n      ModuleScope.WamParameterInfo = WamParameterInfo;\n  }\n  return WamParameterInfo;\n};\nvar WamParameterInfo_default = getWamParameterInfo;\n\n// src/WamParameterInterpolator.js\nvar getWamParameterInterpolator = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  const samplesPerQuantum = 128;\n  const nullTableKey = \"0_0\";\n  class WamParameterInterpolator {\n    static _tables;\n    static _tableReferences;\n    constructor(info, samplesPerInterpolation, skew = 0) {\n      if (!WamParameterInterpolator._tables) {\n        WamParameterInterpolator._tables = { nullTableKey: new Float32Array(0) };\n        WamParameterInterpolator._tableReferences = { nullTableKey: [] };\n      }\n      this.info = info;\n      this.values = new Float32Array(samplesPerQuantum);\n      this._tableKey = nullTableKey;\n      this._table = WamParameterInterpolator._tables[this._tableKey];\n      this._skew = 2;\n      const { discreteStep } = info;\n      this._discrete = !!discreteStep;\n      this._N = this._discrete ? 0 : samplesPerInterpolation;\n      this._n = 0;\n      this._startValue = info.defaultValue;\n      this._endValue = info.defaultValue;\n      this._currentValue = info.defaultValue;\n      this._deltaValue = 0;\n      this._inverted = false;\n      this._changed = true;\n      this._filled = 0;\n      if (!this._discrete)\n        this.setSkew(skew);\n      else\n        this._skew = 0;\n      this.setStartValue(this._startValue);\n    }\n    _removeTableReference(oldKey) {\n      if (oldKey === nullTableKey)\n        return;\n      const { id } = this.info;\n      const references = WamParameterInterpolator._tableReferences[oldKey];\n      if (references) {\n        const index = references.indexOf(id);\n        if (index !== -1)\n          references.splice(index, 1);\n        if (references.length === 0) {\n          delete WamParameterInterpolator._tables[oldKey];\n          delete WamParameterInterpolator._tableReferences[oldKey];\n        }\n      }\n    }\n    setSkew(skew) {\n      if (this._skew === skew || this._discrete)\n        return;\n      if (skew < -1 || skew > 1)\n        throw Error(\"skew must be in range [-1.0, 1.0]\");\n      const newKey = [this._N, skew].join(\"_\");\n      const oldKey = this._tableKey;\n      const { id } = this.info;\n      if (newKey === oldKey)\n        return;\n      if (WamParameterInterpolator._tables[newKey]) {\n        const references = WamParameterInterpolator._tableReferences[newKey];\n        if (references)\n          references.push(id);\n        else\n          WamParameterInterpolator._tableReferences[newKey] = [id];\n      } else {\n        let e = Math.abs(skew);\n        e = Math.pow(3 - e, e * (e + 2));\n        const linear = e === 1;\n        const N = this._N;\n        const table = new Float32Array(N + 1);\n        if (linear)\n          for (let n = 0; n <= N; ++n)\n            table[n] = n / N;\n        else\n          for (let n = 0; n <= N; ++n)\n            table[n] = (n / N) ** e;\n        WamParameterInterpolator._tables[newKey] = table;\n        WamParameterInterpolator._tableReferences[newKey] = [id];\n      }\n      this._removeTableReference(oldKey);\n      this._skew = skew;\n      this._tableKey = newKey;\n      this._table = WamParameterInterpolator._tables[this._tableKey];\n    }\n    setStartValue(value, fill = true) {\n      this._n = this._N;\n      this._startValue = value;\n      this._endValue = value;\n      this._currentValue = value;\n      this._deltaValue = 0;\n      this._inverted = false;\n      if (fill) {\n        this.values.fill(value);\n        this._changed = true;\n        this._filled = this.values.length;\n      } else {\n        this._changed = false;\n        this._filled = 0;\n      }\n    }\n    setEndValue(value) {\n      if (value === this._endValue)\n        return;\n      this._n = 0;\n      this._startValue = this._currentValue;\n      this._endValue = value;\n      this._deltaValue = this._endValue - this._startValue;\n      this._inverted = this._deltaValue > 0 && this._skew >= 0 || this._deltaValue <= 0 && this._skew < 0;\n      this._changed = false;\n      this._filled = 0;\n    }\n    process(startSample, endSample) {\n      if (this.done)\n        return;\n      const length = endSample - startSample;\n      let fill = 0;\n      const change = this._N - this._n;\n      if (this._discrete || !change)\n        fill = length;\n      else {\n        if (change < length) {\n          fill = Math.min(length - change, samplesPerQuantum);\n          endSample -= fill;\n        }\n        if (endSample > startSample) {\n          if (this._inverted) {\n            for (let i = startSample; i < endSample; ++i) {\n              const tableValue = 1 - this._table[this._N - ++this._n];\n              this.values[i] = this._startValue + tableValue * this._deltaValue;\n            }\n          } else {\n            for (let i = startSample; i < endSample; ++i) {\n              const tableValue = this._table[++this._n];\n              this.values[i] = this._startValue + tableValue * this._deltaValue;\n            }\n          }\n        }\n        if (fill > 0) {\n          startSample = endSample;\n          endSample += fill;\n        }\n      }\n      if (fill > 0) {\n        this.values.fill(this._endValue, startSample, endSample);\n        this._filled += fill;\n      }\n      this._currentValue = this.values[endSample - 1];\n      if (this._n === this._N) {\n        if (!this._changed)\n          this._changed = true;\n        else if (this._filled >= this.values.length) {\n          this.setStartValue(this._endValue, false);\n          this._changed = true;\n          this._filled = this.values.length;\n        }\n      }\n    }\n    get done() {\n      return this._changed && this._filled === this.values.length;\n    }\n    is(value) {\n      return this._endValue === value && this.done;\n    }\n    destroy() {\n      this._removeTableReference(this._tableKey);\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n    if (!ModuleScope.WamParameterInterpolator)\n      ModuleScope.WamParameterInterpolator = WamParameterInterpolator;\n  }\n  return WamParameterInterpolator;\n};\nvar WamParameterInterpolator_default = getWamParameterInterpolator;\n\n// src/WamProcessor.js\nvar getWamProcessor = (moduleId) => {\n  const audioWorkletGlobalScope = globalThis;\n  const {\n    AudioWorkletProcessor,\n    webAudioModules\n  } = audioWorkletGlobalScope;\n  const ModuleScope = audioWorkletGlobalScope.webAudioModules.getModuleScope(moduleId);\n  const {\n    RingBuffer: RingBuffer2,\n    WamEventRingBuffer: WamEventRingBuffer2,\n    WamParameter,\n    WamParameterInterpolator\n  } = ModuleScope;\n  class WamProcessor extends AudioWorkletProcessor {\n    constructor(options) {\n      super();\n      const {\n        groupId,\n        moduleId: moduleId2,\n        instanceId,\n        useSab\n      } = options.processorOptions;\n      if (!moduleId2)\n        throw Error(\"must provide moduleId argument in processorOptions!\");\n      if (!instanceId)\n        throw Error(\"must provide instanceId argument in processorOptions!\");\n      this.groupId = groupId;\n      this.moduleId = moduleId2;\n      this.instanceId = instanceId;\n      this._samplesPerQuantum = 128;\n      this._compensationDelay = 0;\n      this._parameterInfo = {};\n      this._parameterState = {};\n      this._parameterInterpolators = {};\n      this._eventQueue = [];\n      this._pendingResponses = {};\n      this._useSab = !!useSab && !!globalThis.SharedArrayBuffer;\n      this._eventSabReady = false;\n      this._audioToMainEventSab = null;\n      this._mainToAudioEventSab = null;\n      this._eventWriter = null;\n      this._eventReader = null;\n      this._initialized = false;\n      this._destroyed = false;\n      webAudioModules.addWam(this);\n      this.port.onmessage = this._onMessage.bind(this);\n      if (this._useSab)\n        this._configureSab();\n    }\n    getCompensationDelay() {\n      return this._compensationDelay;\n    }\n    scheduleEvents(...events) {\n      let i = 0;\n      while (i < events.length) {\n        this._eventQueue.push({ id: 0, event: events[i] });\n        i++;\n      }\n      this._eventQueue.sort((a, b) => a.event.time - b.event.time);\n    }\n    emitEvents(...events) {\n      webAudioModules.emitEvents(this, ...events);\n    }\n    clearEvents() {\n      this._eventQueue = [];\n    }\n    process(inputs, outputs, parameters) {\n      if (!this._initialized)\n        return true;\n      if (this._destroyed)\n        return false;\n      if (this._eventSabReady)\n        this.scheduleEvents(...this._eventReader.read());\n      const processingSlices = this._getProcessingSlices();\n      let i = 0;\n      while (i < processingSlices.length) {\n        const { range, events } = processingSlices[i];\n        const [startSample, endSample] = range;\n        let j = 0;\n        while (j < events.length) {\n          this._processEvent(events[j]);\n          j++;\n        }\n        this._interpolateParameterValues(startSample, endSample);\n        this._process(startSample, endSample, inputs, outputs, parameters);\n        i++;\n      }\n      return true;\n    }\n    destroy() {\n      this._destroyed = true;\n      this.port.close();\n      webAudioModules.removeWam(this);\n    }\n    _generateWamParameterInfo() {\n      return {};\n    }\n    _initialize() {\n      this._parameterState = {};\n      this._parameterInterpolators = {};\n      this._parameterInfo = this._generateWamParameterInfo();\n      Object.keys(this._parameterInfo).forEach((parameterId) => {\n        const info = this._parameterInfo[parameterId];\n        this._parameterState[parameterId] = new WamParameter(this._parameterInfo[parameterId]);\n        this._parameterInterpolators[parameterId] = new WamParameterInterpolator(info, 256);\n      });\n    }\n    _configureSab() {\n      const eventCapacity = 2 ** 10;\n      const parameterIds = Object.keys(this._parameterInfo);\n      if (this._eventSabReady) {\n        this._eventWriter.setParameterIds(parameterIds);\n        this._eventReader.setParameterIds(parameterIds);\n      }\n      this.port.postMessage({ eventSab: { eventCapacity, parameterIds } });\n    }\n    async _onMessage(message) {\n      if (message.data.request) {\n        const {\n          id,\n          request,\n          content\n        } = message.data;\n        const response = { id, response: request };\n        const requestComponents = request.split(\"/\");\n        const verb = requestComponents[0];\n        const noun = requestComponents[1];\n        response.content = \"error\";\n        if (verb === \"get\") {\n          if (noun === \"parameterInfo\") {\n            let { parameterIds } = content;\n            if (!parameterIds.length)\n              parameterIds = Object.keys(this._parameterInfo);\n            const parameterInfo = {};\n            let i = 0;\n            while (i < parameterIds.length) {\n              const parameterId = parameterIds[i];\n              parameterInfo[parameterId] = this._parameterInfo[parameterId];\n              i++;\n            }\n            response.content = parameterInfo;\n          } else if (noun === \"parameterValues\") {\n            let { normalized, parameterIds } = content;\n            response.content = this._getParameterValues(normalized, parameterIds);\n          } else if (noun === \"state\") {\n            response.content = this._getState();\n          } else if (noun === \"compensationDelay\") {\n            response.content = this.getCompensationDelay();\n          }\n        } else if (verb === \"set\") {\n          if (noun === \"parameterValues\") {\n            const { parameterValues } = content;\n            this._setParameterValues(parameterValues, true);\n            delete response.content;\n          } else if (noun === \"state\") {\n            const { state } = content;\n            this._setState(state);\n            delete response.content;\n          }\n        } else if (verb === \"add\") {\n          if (noun === \"event\") {\n            const { event } = content;\n            this._eventQueue.push({ id, event });\n            return;\n          }\n        } else if (verb === \"remove\") {\n          if (noun === \"events\") {\n            const ids = this._eventQueue.map((queued) => queued.id);\n            this.clearEvents();\n            response.content = ids;\n          }\n        } else if (verb === \"connect\") {\n          if (noun === \"events\") {\n            const { wamInstanceId, output } = content;\n            this._connectEvents(wamInstanceId, output);\n            delete response.content;\n          }\n        } else if (verb === \"disconnect\") {\n          if (noun === \"events\") {\n            const { wamInstanceId, output } = content;\n            this._disconnectEvents(wamInstanceId, output);\n            delete response.content;\n          }\n        } else if (verb === \"initialize\") {\n          if (noun === \"processor\") {\n            this._initialize();\n            this._initialized = true;\n            delete response.content;\n          } else if (noun === \"eventSab\") {\n            const { mainToAudioEventSab, audioToMainEventSab } = content;\n            this._audioToMainEventSab = audioToMainEventSab;\n            this._mainToAudioEventSab = mainToAudioEventSab;\n            const parameterIds = Object.keys(this._parameterInfo);\n            this._eventWriter = new WamEventRingBuffer2(RingBuffer2, this._audioToMainEventSab, parameterIds);\n            this._eventReader = new WamEventRingBuffer2(RingBuffer2, this._mainToAudioEventSab, parameterIds);\n            this._eventSabReady = true;\n            delete response.content;\n          }\n        }\n        this.port.postMessage(response);\n      } else if (message.data.destroy) {\n        this.destroy();\n      }\n    }\n    _onTransport(transportData) {\n      console.error(\"_onTransport not implemented!\");\n    }\n    _onMidi(midiData) {\n      console.error(\"_onMidi not implemented!\");\n    }\n    _onSysex(sysexData) {\n      console.error(\"_onMidi not implemented!\");\n    }\n    _onMpe(mpeData) {\n      console.error(\"_onMpe not implemented!\");\n    }\n    _onOsc(oscData) {\n      console.error(\"_onOsc not implemented!\");\n    }\n    _setState(state) {\n      if (state.parameterValues)\n        this._setParameterValues(state.parameterValues, false);\n    }\n    _getState() {\n      return { parameterValues: this._getParameterValues(false) };\n    }\n    _getParameterValues(normalized, parameterIds) {\n      const parameterValues = {};\n      if (!parameterIds || !parameterIds.length)\n        parameterIds = Object.keys(this._parameterState);\n      let i = 0;\n      while (i < parameterIds.length) {\n        const id = parameterIds[i];\n        const parameter = this._parameterState[id];\n        parameterValues[id] = {\n          id,\n          value: normalized ? parameter.normalizedValue : parameter.value,\n          normalized\n        };\n        i++;\n      }\n      return parameterValues;\n    }\n    _setParameterValues(parameterUpdates, interpolate) {\n      const parameterIds = Object.keys(parameterUpdates);\n      let i = 0;\n      while (i < parameterIds.length) {\n        this._setParameterValue(parameterUpdates[parameterIds[i]], interpolate);\n        i++;\n      }\n    }\n    _setParameterValue(parameterUpdate, interpolate) {\n      const { id, value, normalized } = parameterUpdate;\n      const parameter = this._parameterState[id];\n      if (!parameter)\n        return;\n      if (!normalized)\n        parameter.value = value;\n      else\n        parameter.normalizedValue = value;\n      const interpolator = this._parameterInterpolators[id];\n      if (interpolate)\n        interpolator.setEndValue(parameter.value);\n      else\n        interpolator.setStartValue(parameter.value);\n    }\n    _interpolateParameterValues(startIndex, endIndex) {\n      const parameterIds = Object.keys(this._parameterInterpolators);\n      let i = 0;\n      while (i < parameterIds.length) {\n        this._parameterInterpolators[parameterIds[i]].process(startIndex, endIndex);\n        i++;\n      }\n    }\n    _connectEvents(wamInstanceId, output) {\n      webAudioModules.connectEvents(this.groupId, this.instanceId, wamInstanceId, output);\n    }\n    _disconnectEvents(wamInstanceId, output) {\n      if (typeof wamInstanceId === \"undefined\") {\n        webAudioModules.disconnectEvents(this.groupId, this.instanceId);\n        return;\n      }\n      webAudioModules.disconnectEvents(this.groupId, this.instanceId, wamInstanceId, output);\n    }\n    _getProcessingSlices() {\n      const response = \"add/event\";\n      const { currentTime, sampleRate } = audioWorkletGlobalScope;\n      const eventsBySampleIndex = {};\n      let i = 0;\n      while (i < this._eventQueue.length) {\n        const { id, event } = this._eventQueue[i];\n        const offsetSec = event.time - currentTime;\n        const sampleIndex = offsetSec > 0 ? Math.round(offsetSec * sampleRate) : 0;\n        if (sampleIndex < this._samplesPerQuantum) {\n          if (eventsBySampleIndex[sampleIndex])\n            eventsBySampleIndex[sampleIndex].push(event);\n          else\n            eventsBySampleIndex[sampleIndex] = [event];\n          if (id)\n            this.port.postMessage({ id, response });\n          else if (this._eventSabReady)\n            this._eventWriter.write(event);\n          else\n            this.port.postMessage({ event });\n          this._eventQueue.shift();\n          i = -1;\n        } else\n          break;\n        i++;\n      }\n      const processingSlices = [];\n      const keys = Object.keys(eventsBySampleIndex);\n      if (keys[0] !== \"0\") {\n        keys.unshift(\"0\");\n        eventsBySampleIndex[\"0\"] = [];\n      }\n      const lastIndex = keys.length - 1;\n      i = 0;\n      while (i < keys.length) {\n        const key = keys[i];\n        const startSample = parseInt(key);\n        const endSample = i < lastIndex ? parseInt(keys[i + 1]) : this._samplesPerQuantum;\n        processingSlices.push({ range: [startSample, endSample], events: eventsBySampleIndex[key] });\n        i++;\n      }\n      return processingSlices;\n    }\n    _processEvent(event) {\n      switch (event.type) {\n        case \"wam-automation\":\n          this._setParameterValue(event.data, true);\n          break;\n        case \"wam-transport\":\n          this._onTransport(event.data);\n          break;\n        case \"wam-midi\":\n          this._onMidi(event.data);\n          break;\n        case \"wam-sysex\":\n          this._onSysex(event.data);\n          break;\n        case \"wam-mpe\":\n          this._onMpe(event.data);\n          break;\n        case \"wam-osc\":\n          this._onOsc(event.data);\n          break;\n        default:\n          break;\n      }\n    }\n    _process(startSample, endSample, inputs, outputs, parameters) {\n      console.error(\"_process not implemented!\");\n    }\n  }\n  if (audioWorkletGlobalScope.AudioWorkletProcessor) {\n    if (!ModuleScope.WamProcessor)\n      ModuleScope.WamProcessor = WamProcessor;\n  }\n  return WamProcessor;\n};\nvar WamProcessor_default = getWamProcessor;\n\n// src/WamNode.js\nvar RingBuffer = RingBuffer_default();\nvar WamEventRingBuffer = WamEventRingBuffer_default();\nvar WamNode = class extends AudioWorkletNode {\n  static async addModules(audioContext, moduleId) {\n    const { audioWorklet } = audioContext;\n    await addFunctionModule_default(audioWorklet, RingBuffer_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamEventRingBuffer_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamArrayRingBuffer_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamParameter_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamParameterInfo_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamParameterInterpolator_default, moduleId);\n    await addFunctionModule_default(audioWorklet, WamProcessor_default, moduleId);\n  }\n  constructor(module, options) {\n    const { audioContext, groupId, moduleId, instanceId } = module;\n    options.processorOptions = {\n      groupId,\n      moduleId,\n      instanceId,\n      ...options.processorOptions\n    };\n    super(audioContext, moduleId, options);\n    this.module = module;\n    this._supportedEventTypes = /* @__PURE__ */ new Set([\"wam-automation\", \"wam-transport\", \"wam-midi\", \"wam-sysex\", \"wam-mpe\", \"wam-osc\"]);\n    this._messageId = 1;\n    this._pendingResponses = {};\n    this._pendingEvents = {};\n    this._useSab = false;\n    this._eventSabReady = false;\n    this._destroyed = false;\n    this.port.onmessage = this._onMessage.bind(this);\n  }\n  get groupId() {\n    return this.module.groupId;\n  }\n  get moduleId() {\n    return this.module.moduleId;\n  }\n  get instanceId() {\n    return this.module.instanceId;\n  }\n  async getParameterInfo(...parameterIds) {\n    const request = \"get/parameterInfo\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { parameterIds }\n      });\n    });\n  }\n  async getParameterValues(normalized, ...parameterIds) {\n    const request = \"get/parameterValues\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { normalized, parameterIds }\n      });\n    });\n  }\n  async setParameterValues(parameterValues) {\n    const request = \"set/parameterValues\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { parameterValues }\n      });\n    });\n  }\n  async getState() {\n    const request = \"get/state\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({ id, request });\n    });\n  }\n  async setState(state) {\n    const request = \"set/state\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { state }\n      });\n    });\n  }\n  async getCompensationDelay() {\n    const request = \"get/compensationDelay\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({ id, request });\n    });\n  }\n  addEventListener(type, callback, options) {\n    if (this._supportedEventTypes.has(type))\n      super.addEventListener(type, callback, options);\n  }\n  removeEventListener(type, callback, options) {\n    if (this._supportedEventTypes.has(type))\n      super.removeEventListener(type, callback, options);\n  }\n  scheduleEvents(...events) {\n    let i = 0;\n    const numEvents = events.length;\n    if (this._eventSabReady) {\n      i = this._eventWriter.write(...events);\n    }\n    while (i < numEvents) {\n      const event = events[i];\n      const request = \"add/event\";\n      const id = this._generateMessageId();\n      let processed = false;\n      new Promise((resolve, reject) => {\n        this._pendingResponses[id] = resolve;\n        this._pendingEvents[id] = () => {\n          if (!processed)\n            reject();\n        };\n        this.port.postMessage({\n          id,\n          request,\n          content: { event }\n        });\n      }).then((resolved) => {\n        processed = true;\n        delete this._pendingEvents[id];\n        this._onEvent(event);\n      }).catch((rejected) => {\n        delete this._pendingResponses[id];\n      });\n      i++;\n    }\n  }\n  async clearEvents() {\n    const request = \"remove/events\";\n    const id = this._generateMessageId();\n    const ids = Object.keys(this._pendingEvents);\n    if (ids.length) {\n      return new Promise((resolve) => {\n        this._pendingResponses[id] = resolve;\n        this.port.postMessage({ id, request });\n      }).then((clearedIds) => {\n        clearedIds.forEach((clearedId) => {\n          this._pendingEvents[clearedId]();\n          delete this._pendingEvents[clearedId];\n        });\n      });\n    }\n  }\n  connectEvents(toId, output) {\n    const request = \"connect/events\";\n    const id = this._generateMessageId();\n    new Promise((resolve, reject) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { wamInstanceId: toId, output }\n      });\n    });\n  }\n  disconnectEvents(toId, output) {\n    const request = \"disconnect/events\";\n    const id = this._generateMessageId();\n    new Promise((resolve, reject) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({\n        id,\n        request,\n        content: { wamInstanceId: toId, output }\n      });\n    });\n  }\n  destroy() {\n    if (this._audioToMainInterval)\n      clearInterval(this._audioToMainInterval);\n    this.port.postMessage({ destroy: true });\n    this.port.close();\n    this.disconnect();\n    this._destroyed = true;\n  }\n  _generateMessageId() {\n    return this._messageId++;\n  }\n  async _initialize() {\n    const request = \"initialize/processor\";\n    const id = this._generateMessageId();\n    return new Promise((resolve) => {\n      this._pendingResponses[id] = resolve;\n      this.port.postMessage({ id, request });\n    });\n  }\n  _onMessage(message) {\n    const { data } = message;\n    const { response, event, eventSab } = data;\n    if (response) {\n      const { id, content } = data;\n      const resolvePendingResponse = this._pendingResponses[id];\n      if (resolvePendingResponse) {\n        delete this._pendingResponses[id];\n        resolvePendingResponse(content);\n      }\n    } else if (eventSab) {\n      this._useSab = true;\n      const { eventCapacity, parameterIds } = eventSab;\n      if (this._eventSabReady) {\n        this._eventWriter.setParameterIds(parameterIds);\n        this._eventReader.setParameterIds(parameterIds);\n        return;\n      }\n      this._mainToAudioEventSab = WamEventRingBuffer.getStorageForEventCapacity(RingBuffer, eventCapacity);\n      this._audioToMainEventSab = WamEventRingBuffer.getStorageForEventCapacity(RingBuffer, eventCapacity);\n      this._eventWriter = new WamEventRingBuffer(RingBuffer, this._mainToAudioEventSab, parameterIds);\n      this._eventReader = new WamEventRingBuffer(RingBuffer, this._audioToMainEventSab, parameterIds);\n      const request = \"initialize/eventSab\";\n      const id = this._generateMessageId();\n      new Promise((resolve, reject) => {\n        this._pendingResponses[id] = resolve;\n        this.port.postMessage({\n          id,\n          request,\n          content: {\n            mainToAudioEventSab: this._mainToAudioEventSab,\n            audioToMainEventSab: this._audioToMainEventSab\n          }\n        });\n      }).then((resolved) => {\n        this._eventSabReady = true;\n        this._audioToMainInterval = setInterval(() => {\n          const events = this._eventReader.read();\n          events.forEach((e) => {\n            this._onEvent(e);\n          });\n        }, 100);\n      });\n    } else if (event)\n      this._onEvent(event);\n  }\n  _onEvent(event) {\n    const { type } = event;\n    this.dispatchEvent(new CustomEvent(type, {\n      bubbles: true,\n      detail: event\n    }));\n  }\n};\n\n// src/apiVersion.js\nvar apiVersion_default = \"2.0.0-alpha.4\";\n\n// src/initializeWamHost.js\nvar initializeWamHost = async (audioContext, hostGroupId = `wam-host-${performance.now().toString()}`, hostGroupKey = performance.now().toString()) => {\n  await addFunctionModule_default(audioContext.audioWorklet, WamEnv_default, apiVersion_default);\n  await addFunctionModule_default(audioContext.audioWorklet, WamGroup_default, hostGroupId, hostGroupKey);\n  return [hostGroupId, hostGroupKey];\n};\nvar initializeWamHost_default = initializeWamHost;\n\n//# sourceMappingURL=index.js.map\n\n\n//# sourceURL=webpack://wam-reverb/../../../node_modules/@webaudiomodules/sdk/dist/index.js?");

/***/ })

/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/ 
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ 	// Check if module is in cache
/******/ 	var cachedModule = __webpack_module_cache__[moduleId];
/******/ 	if (cachedModule !== undefined) {
/******/ 		return cachedModule.exports;
/******/ 	}
/******/ 	// Create a new module (and put it into the cache)
/******/ 	var module = __webpack_module_cache__[moduleId] = {
/******/ 		id: moduleId,
/******/ 		// no module.loaded needed
/******/ 		exports: {}
/******/ 	};
/******/ 
/******/ 	// Execute the module function
/******/ 	__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 
/******/ 	// Return the exports of the module
/******/ 	return module.exports;
/******/ }
/******/ 
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ (() => {
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = (module) => {
/******/ 		var getter = module && module.__esModule ?
/******/ 			() => (module['default']) :
/******/ 			() => (module);
/******/ 		__webpack_require__.d(getter, { a: getter });
/******/ 		return getter;
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ 	// define getter functions for harmony exports
/******/ 	__webpack_require__.d = (exports, definition) => {
/******/ 		for(var key in definition) {
/******/ 			if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 				Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 			}
/******/ 		}
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ 	__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/ 
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = (exports) => {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/ })();
/******/ 
/******/ /* webpack/runtime/publicPath */
/******/ (() => {
/******/ 	var scriptUrl;
/******/ 	if (typeof import.meta.url === "string") scriptUrl = import.meta.url
/******/ 	// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
/******/ 	// or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
/******/ 	if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
/******/ 	scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
/******/ 	__webpack_require__.p = scriptUrl;
/******/ })();
/******/ 
/************************************************************************/
/******/ 
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval devtool is used.
/******/ var __webpack_exports__ = __webpack_require__("./src/index.tsx");
/******/ var __webpack_exports__default = __webpack_exports__["default"];
/******/ export { __webpack_exports__default as default };
/******/