rlo-engine 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +15 -4
  2. package/dist/Core/AudioMath.d.ts +29 -0
  3. package/dist/Core/AudioMath.d.ts.map +1 -0
  4. package/dist/Core/AudioMath.js +64 -0
  5. package/dist/Core/AudioMath.js.map +1 -0
  6. package/dist/Core/InstrumentMap.d.ts +36 -0
  7. package/dist/Core/InstrumentMap.d.ts.map +1 -0
  8. package/dist/Core/InstrumentMap.js +62 -0
  9. package/dist/Core/InstrumentMap.js.map +1 -0
  10. package/dist/Core/RLOCore.d.ts +49 -0
  11. package/dist/Core/RLOCore.d.ts.map +1 -0
  12. package/dist/Core/RLOCore.js +188 -0
  13. package/dist/Core/RLOCore.js.map +1 -0
  14. package/dist/Core/SequenceBuilder.d.ts +23 -0
  15. package/dist/Core/SequenceBuilder.d.ts.map +1 -0
  16. package/dist/Core/SequenceBuilder.js +31 -0
  17. package/dist/Core/SequenceBuilder.js.map +1 -0
  18. package/dist/Instruments/Analog/AnalogSynthBase.d.ts +17 -7
  19. package/dist/Instruments/Analog/AnalogSynthBase.d.ts.map +1 -1
  20. package/dist/Instruments/Analog/AnalogSynthBase.js +27 -16
  21. package/dist/Instruments/Analog/AnalogSynthBase.js.map +1 -1
  22. package/dist/Instruments/Analog/BassSynth.d.ts +12 -5
  23. package/dist/Instruments/Analog/BassSynth.d.ts.map +1 -1
  24. package/dist/Instruments/Analog/BassSynth.js +17 -10
  25. package/dist/Instruments/Analog/BassSynth.js.map +1 -1
  26. package/dist/Instruments/Analog/ChiptuneSynth.d.ts +11 -4
  27. package/dist/Instruments/Analog/ChiptuneSynth.d.ts.map +1 -1
  28. package/dist/Instruments/Analog/ChiptuneSynth.js +12 -5
  29. package/dist/Instruments/Analog/ChiptuneSynth.js.map +1 -1
  30. package/dist/Instruments/Analog/FMSynth.d.ts +11 -4
  31. package/dist/Instruments/Analog/FMSynth.d.ts.map +1 -1
  32. package/dist/Instruments/Analog/FMSynth.js +14 -7
  33. package/dist/Instruments/Analog/FMSynth.js.map +1 -1
  34. package/dist/Instruments/Analog/FormantSynth.d.ts +11 -4
  35. package/dist/Instruments/Analog/FormantSynth.d.ts.map +1 -1
  36. package/dist/Instruments/Analog/FormantSynth.js +12 -5
  37. package/dist/Instruments/Analog/FormantSynth.js.map +1 -1
  38. package/dist/Instruments/Analog/LeadSynth.d.ts +11 -4
  39. package/dist/Instruments/Analog/LeadSynth.d.ts.map +1 -1
  40. package/dist/Instruments/Analog/LeadSynth.js +14 -7
  41. package/dist/Instruments/Analog/LeadSynth.js.map +1 -1
  42. package/dist/Instruments/Analog/OrganSynth.d.ts +11 -4
  43. package/dist/Instruments/Analog/OrganSynth.d.ts.map +1 -1
  44. package/dist/Instruments/Analog/OrganSynth.js +17 -10
  45. package/dist/Instruments/Analog/OrganSynth.js.map +1 -1
  46. package/dist/Instruments/Analog/PadSynth.js +7 -7
  47. package/dist/Instruments/Analog/PadSynth.js.map +1 -1
  48. package/dist/Instruments/Analog/ReeseBassSynth.d.ts +11 -4
  49. package/dist/Instruments/Analog/ReeseBassSynth.d.ts.map +1 -1
  50. package/dist/Instruments/Analog/ReeseBassSynth.js +13 -6
  51. package/dist/Instruments/Analog/ReeseBassSynth.js.map +1 -1
  52. package/dist/Instruments/Analog/StringSynth.js +4 -4
  53. package/dist/Instruments/Analog/StringSynth.js.map +1 -1
  54. package/dist/Instruments/Analog/WoodwindSynth.d.ts +11 -4
  55. package/dist/Instruments/Analog/WoodwindSynth.d.ts.map +1 -1
  56. package/dist/Instruments/Analog/WoodwindSynth.js +19 -12
  57. package/dist/Instruments/Analog/WoodwindSynth.js.map +1 -1
  58. package/dist/Instruments/CoreSynthBase.d.ts +31 -24
  59. package/dist/Instruments/CoreSynthBase.d.ts.map +1 -1
  60. package/dist/Instruments/CoreSynthBase.js +53 -34
  61. package/dist/Instruments/CoreSynthBase.js.map +1 -1
  62. package/dist/Instruments/Decay/AdditiveSynth.d.ts +12 -5
  63. package/dist/Instruments/Decay/AdditiveSynth.d.ts.map +1 -1
  64. package/dist/Instruments/Decay/AdditiveSynth.js +9 -2
  65. package/dist/Instruments/Decay/AdditiveSynth.js.map +1 -1
  66. package/dist/Instruments/Decay/BrassSynth.d.ts +11 -4
  67. package/dist/Instruments/Decay/BrassSynth.d.ts.map +1 -1
  68. package/dist/Instruments/Decay/BrassSynth.js +22 -15
  69. package/dist/Instruments/Decay/BrassSynth.js.map +1 -1
  70. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts +12 -5
  71. package/dist/Instruments/Decay/ChromaticPercussionSynth.d.ts.map +1 -1
  72. package/dist/Instruments/Decay/ChromaticPercussionSynth.js +16 -9
  73. package/dist/Instruments/Decay/ChromaticPercussionSynth.js.map +1 -1
  74. package/dist/Instruments/Decay/DecaySynthBase.d.ts +14 -8
  75. package/dist/Instruments/Decay/DecaySynthBase.d.ts.map +1 -1
  76. package/dist/Instruments/Decay/DecaySynthBase.js +22 -15
  77. package/dist/Instruments/Decay/DecaySynthBase.js.map +1 -1
  78. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts +12 -5
  79. package/dist/Instruments/Decay/ElectricGuitarSynth.d.ts.map +1 -1
  80. package/dist/Instruments/Decay/ElectricGuitarSynth.js +19 -12
  81. package/dist/Instruments/Decay/ElectricGuitarSynth.js.map +1 -1
  82. package/dist/Instruments/Decay/EthnicSynth.d.ts +12 -5
  83. package/dist/Instruments/Decay/EthnicSynth.d.ts.map +1 -1
  84. package/dist/Instruments/Decay/EthnicSynth.js +13 -6
  85. package/dist/Instruments/Decay/EthnicSynth.js.map +1 -1
  86. package/dist/Instruments/Decay/GuitarSynth.d.ts +12 -5
  87. package/dist/Instruments/Decay/GuitarSynth.d.ts.map +1 -1
  88. package/dist/Instruments/Decay/GuitarSynth.js +14 -7
  89. package/dist/Instruments/Decay/GuitarSynth.js.map +1 -1
  90. package/dist/Instruments/Decay/KarplusSynth.d.ts +7 -0
  91. package/dist/Instruments/Decay/KarplusSynth.d.ts.map +1 -1
  92. package/dist/Instruments/Decay/KarplusSynth.js +16 -8
  93. package/dist/Instruments/Decay/KarplusSynth.js.map +1 -1
  94. package/dist/Instruments/Decay/PianoSynth.d.ts +12 -5
  95. package/dist/Instruments/Decay/PianoSynth.d.ts.map +1 -1
  96. package/dist/Instruments/Decay/PianoSynth.js +19 -12
  97. package/dist/Instruments/Decay/PianoSynth.js.map +1 -1
  98. package/dist/Instruments/Decay/SlapBassSynth.d.ts +12 -5
  99. package/dist/Instruments/Decay/SlapBassSynth.d.ts.map +1 -1
  100. package/dist/Instruments/Decay/SlapBassSynth.js +13 -6
  101. package/dist/Instruments/Decay/SlapBassSynth.js.map +1 -1
  102. package/dist/Instruments/ISynthInstrument.d.ts +6 -0
  103. package/dist/Instruments/ISynthInstrument.d.ts.map +1 -1
  104. package/dist/Instruments/Speciality/DrumSynth.d.ts +7 -0
  105. package/dist/Instruments/Speciality/DrumSynth.d.ts.map +1 -1
  106. package/dist/Instruments/Speciality/DrumSynth.js +30 -21
  107. package/dist/Instruments/Speciality/DrumSynth.js.map +1 -1
  108. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts +7 -0
  109. package/dist/Instruments/Speciality/SoundEffectsSynth.d.ts.map +1 -1
  110. package/dist/Instruments/Speciality/SoundEffectsSynth.js +20 -12
  111. package/dist/Instruments/Speciality/SoundEffectsSynth.js.map +1 -1
  112. package/dist/Instruments/Synthesizer.d.ts +5 -0
  113. package/dist/Instruments/Synthesizer.d.ts.map +1 -1
  114. package/dist/Instruments/Synthesizer.js +7 -1
  115. package/dist/Instruments/Synthesizer.js.map +1 -1
  116. package/dist/Players/RLOGameEngine.d.ts +35 -0
  117. package/dist/Players/RLOGameEngine.d.ts.map +1 -0
  118. package/dist/Players/RLOGameEngine.js +98 -0
  119. package/dist/Players/RLOGameEngine.js.map +1 -0
  120. package/dist/Players/RLOMusicPlayer.d.ts +35 -0
  121. package/dist/Players/RLOMusicPlayer.d.ts.map +1 -0
  122. package/dist/Players/RLOMusicPlayer.js +167 -0
  123. package/dist/Players/RLOMusicPlayer.js.map +1 -0
  124. package/dist/RLO-Transpiler.d.ts +37 -15
  125. package/dist/RLO-Transpiler.d.ts.map +1 -1
  126. package/dist/RLO-Transpiler.js +139 -117
  127. package/dist/RLO-Transpiler.js.map +1 -1
  128. package/dist/compiler.d.ts +50 -31
  129. package/dist/compiler.d.ts.map +1 -1
  130. package/dist/compiler.js +165 -230
  131. package/dist/compiler.js.map +1 -1
  132. package/dist/crush.d.ts +1 -5
  133. package/dist/crush.d.ts.map +1 -1
  134. package/dist/crush.js +10 -3
  135. package/dist/crush.js.map +1 -1
  136. package/dist/index.d.ts +15 -2
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +14 -3
  139. package/dist/index.js.map +1 -1
  140. package/dist/midi-parser.d.ts +14 -0
  141. package/dist/midi-parser.d.ts.map +1 -1
  142. package/dist/midi-parser.js +21 -0
  143. package/dist/midi-parser.js.map +1 -1
  144. package/dist/rlo-engine.min.js +441 -439
  145. package/dist/rlo-engine.min.js.map +1 -1
  146. package/dist/rlo-engine.min.umd.js +1 -1
  147. package/dist/rlo-engine.min.umd.js.map +1 -1
  148. package/dist/types.d.ts +21 -3
  149. package/dist/types.d.ts.map +1 -1
  150. package/dist/types.js +4 -0
  151. package/dist/types.js.map +1 -1
  152. package/dist/vite.config.d.ts.map +1 -1
  153. package/dist/vite.config.js +16 -3
  154. package/dist/vite.config.js.map +1 -1
  155. package/dist/vite.config.js13k.d.ts.map +1 -1
  156. package/dist/vite.config.js13k.js +1 -0
  157. package/dist/vite.config.js13k.js.map +1 -1
  158. package/package.json +1 -1
  159. package/dist/Instruments/InstrumentFactory.d.ts +0 -2
  160. package/dist/Instruments/InstrumentFactory.d.ts.map +0 -1
  161. package/dist/Instruments/InstrumentFactory.js +0 -4
  162. package/dist/Instruments/InstrumentFactory.js.map +0 -1
  163. package/dist/RLO-Player.d.ts +0 -298
  164. package/dist/RLO-Player.d.ts.map +0 -1
  165. package/dist/RLO-Player.js +0 -724
  166. package/dist/RLO-Player.js.map +0 -1
@@ -1,2 +1,2 @@
1
- var t,s;t=this,s=function(t){class s{constructor(t,s,i){this.h=t,this.o=s,this.u=i}l(t,s,i,h,e){const n=.6*e*Math.min(1,1600/i),r=this.u[t]||this.u[0];globalThis.DEBUG_MIDI,r&&r.l(this.h,this.o,s,i,h,n)}}const i=class{static p(t,s="studio"){if("concert"===s&&this.M)return this.M;if("studio"===s&&this._)return this._;const i="studio"===s,h=t.sampleRate*(i?.2:1.5),e=i?8:4,n=t.createBuffer(2,h,t.sampleRate);for(let r=0;r<2;r++){const t=n.getChannelData(r);let s=0;for(let i=0;i<h;i++)s+=.3*(2*Math.random()-1-s),t[i]=s*Math.exp(i/h*-e)*(1-i/h)}return i?this._=n:this.M=n}};i.M=null,i._=null;let h=i;class e{static S(t,s=!1){const i=t.notes.length/5,h=s?new Float32Array(i):new Uint8Array(i),e=new Uint16Array(i),n=new Uint16Array(i),r=new Uint8Array(i),o=new Uint8Array(i);let a=0;for(let c=0,u=0;c<i;c++,u+=5){const i=t.notes[u+1],l=t.notes[u];h[c]=s?l:l>0?Math.max(0,Math.min(255,Math.round(12*Math.log2(l/440)+69))):0;const d=Math.max(0,Math.round(1e3*i));e[c]=Math.min(65535,d-a),n[c]=Math.min(65535,Math.max(0,Math.round(1e3*t.notes[u+2]))),r[c]=Math.max(0,Math.min(255,Math.round(255*t.notes[u+3]))),o[c]=t.notes[u+4],a+=e[c]}return{durationSecs:t.durationSecs,f:h,t:e,d:n,v:r,i:o}}static U(t,s=!1){const i=1===new Uint8Array(new Uint16Array([1]).buffer)[0],h=this.S(t,s),e=h.f.length,n=new ArrayBuffer(12+(s?10:7)*e),r=new DataView(n);if(r.setUint8(0,82),r.setUint8(1,76),r.setUint8(2,79),r.setUint8(3,s?70:50),r.setFloat32(4,h.durationSecs,!0),r.setUint32(8,e,!0),i)new Uint16Array(n,12,e).set(h.t),new Uint16Array(n,12+2*e,e).set(h.d),s&&new Float32Array(n,12+4*e,e).set(h.f);else for(let o=0;o<e;o++)r.setUint16(12+2*o,h.t[o],!0),r.setUint16(12+2*e+2*o,h.d[o],!0),s&&r.setFloat32(12+4*e+4*o,h.f[o],!0);return s?(new Uint8Array(n,12+8*e,e).set(h.v),new Uint8Array(n,12+9*e,e).set(h.i)):(new Uint8Array(n,12+4*e,e).set(h.f),new Uint8Array(n,12+5*e,e).set(h.v),new Uint8Array(n,12+6*e,e).set(h.i)),n}static R(t){const s=new DataView(t),i=String.fromCharCode(s.getUint8(0),s.getUint8(1),s.getUint8(2),s.getUint8(3));if("RLO2"!==i&&"RLOF"!==i)throw Error("Invalid RLO Binary format. Please recompile tracks.");const h="RLOF"===i,e=s.getFloat32(4,!0),n=s.getUint32(8,!0),r=h?null:new Uint8Array(t,12+4*n,n),o=new Uint8Array(t,12+(h?8:5)*n,n),a=new Uint8Array(t,12+(h?9:6)*n,n),c=Array(5*n);let u=0;for(let l=0,d=0;l<n;l++,d+=5){const t=s.getUint16(12+2*l,!0),i=s.getUint16(12+2*n+2*l,!0),e=h?s.getFloat32(12+4*n+4*l,!0):r[l];u+=t/1e3,c[d]=h?e:e>0?440*Math.pow(2,(e-69)/12):0,c[d+1]=u,c[d+2]=i/1e3,c[d+3]=o[l]/255,c[d+4]=a[l]}return{durationSecs:e,notes:c}}}function n(t){const s=Array(129).fill(null);t.forEach(t=>{for(let i=t.start;i<=t.end;i++)s[i]=t.synth});for(let i=0;i<129;i++)if(null===s[i]){let t=null,h=1/0;for(let e=0;e<129;e++)if(null!==s[e]){const n=Math.abs(i-e);n<h&&(h=n,t=s[e])}s[i]=t}return s}let r=class{constructor(t,s=[]){this.T=!1,this.N=null,this.V=null,this.j=0,this.O=0,this.L=0,this.q=[],this.k=.5,this.I=null,this.playbackRate=1,this.X=null,this.h=t,this.H=s}get J(){return this.h.currentTime}setVolume(t){this.k=t}seek(t){this.L>0&&(this.I=Math.max(0,t)%this.L)}stop(){this.T=!1,this.j++,this.N&&clearTimeout(this.N),this.V&&this.V.postMessage("stop");const t=this.q;this.q=[],t.forEach(t=>{try{t.disconnect()}catch(s){}})}dispose(){this.stop(),this.V&&(this.V.terminate(),this.V=null),this.X&&(URL.revokeObjectURL(this.X),this.X=null)}P(){return this.h.createGain()}$(t,s,i){t.setValueAtTime(i>0?0:s,this.J),i>0&&t.linearRampToValueAtTime(s,this.J+i)}K(t=this.h){const s=t.createDynamicsCompressor();return s.threshold.value=-24,s.knee.value=12,s.ratio.value=8,s.attack.value=.001,s.release.value=.25,s}W(t=0){const s=this.P();return this.$(s.gain,this.k,t),s.connect(this.h.destination),this.q.push(s),{destination:s}}playSequence(t,i=!0,h=0){let e=!0,n=h;"object"==typeof i?(e=i.loop??!0,n=i.fadeInTime??0,void 0!==i.playbackRate&&(this.playbackRate=i.playbackRate),void 0!==i.volume&&this.setVolume(i.volume)):e=i,this.stop(),"suspended"===this.h.state&&this.h.resume(),this.T=!0;const r=++this.j;this.L=t.durationSecs;const{destination:o}=this.W(n),a=new s(this.h,o,this.H);this.O=-.05*this.playbackRate;let c=this.J,u=0,l=0;const d=t.notes,p=d.length,y=()=>{if(!this.T||this.j!==r)return;const s=this.J,i=s-c;if(c=s,null!==this.I){for(this.O=this.I,u=0,l=0;l<p&&d[l+1]<this.I;)l+=5;this.I=null}else this.O+=i*this.playbackRate;const h=t.durationSecs;for(;l<p;){const t=d[l],i=d[l+1],h=d[l+2],e=d[l+3],n=d[l+4],r=u+i;if(!(r<this.O+.5*this.playbackRate))break;{const i=s+Math.max(0,(r-this.O)/this.playbackRate);a.l(n,i,t,h/this.playbackRate,e),l+=5}}l>=p?e?(l=0,u+=h,y()):this.V&&this.V.postMessage("stop"):this.V||(this.N=setTimeout(y,50))};this.V&&(this.V.onmessage=()=>y(),this.V.postMessage("start")),y()}},o=class extends r{constructor(t,s=[]){super(t,s),this.o=null,this.Y=null,this.Z=null,this.tt=new Map,this.st=20,this.it="concert",h.p(this.h,"concert"),h.p(this.h,"studio"),this.ht=()=>{document.hidden?this.h.suspend():this.T&&this.h.resume()},"undefined"!=typeof document&&document.addEventListener("visibilitychange",this.ht)}setReverbMode(t){this.it=t,this.Y&&this.Z&&(this.Y.buffer=h.p(this.h,t),this.Z.gain.setTargetAtTime("studio"===t?.05:.2,this.J,.1))}dispose(){super.dispose(),"undefined"!=typeof document&&document.removeEventListener("visibilitychange",this.ht),this.tt.clear()}setVolume(t){super.setVolume(t),this.o&&this.o.gain.setTargetAtTime(t,this.J,.1)}getCurrentTime(){return 0!==this.L&&this.T?Math.max(0,this.O)%this.L:0}getTotalDuration(){return this.L}W(t=0){this.Y=this.h.createConvolver(),this.Y.buffer=h.p(this.h,this.it),this.o=this.P(),this.q.push(this.Y,this.o),this.$(this.o.gain,this.k,t),this.Z=this.P(),this.Z.gain.value="studio"===this.it?.05:.2,this.q.push(this.Z);const s=this.h.createBiquadFilter();s.type="lowpass",s.frequency.value=Math.min(this.h.sampleRate/2-1,6500),this.q.push(s);const i=this.K();return this.q.push(i),this.o.connect(s).connect(i).connect(this.h.destination),this.o.connect(this.Y).connect(this.Z).connect(s),{destination:this.o}}async play(t,s=0,i=!0){let h,n=0,r={};if("object"==typeof s?(n=s.fadeInTime??0,r=s):(n=s,r={fadeInTime:n,loop:i}),"string"==typeof t)if(this.tt.has(t))h=this.tt.get(t);else{const s=await fetch(t);if(t.toLowerCase().endsWith(".json")){const t=await s.text();h=JSON.parse(t)}else{const t=await s.arrayBuffer(),i=new DataView(t);if(i.byteLength>=3&&82===i.getUint8(0)&&76===i.getUint8(1)&&79===i.getUint8(2))h=e.R(t);else{const s=new window.DecompressionStream("gzip"),i=s.writable.getWriter();i.write(t),i.close(),h=e.R(await new Response(s.readable).arrayBuffer())}}if(this.tt.set(t,h),this.tt.size>this.st){const t=this.tt.keys().next().value;t&&this.tt.delete(t)}}else h=t;this.playSequence(h,r)}stop(){if(this.o){const t=this.J;this.o.gain.cancelScheduledValues(t),this.o.gain.setValueAtTime(0,t),this.o=null,this.Z=null,this.Y=null}super.stop()}},a=class extends r{constructor(t,i=[]){super(t,i),this.o=this.P(),this.o.gain.value=this.k;const h=this.K();this.o.connect(h).connect(this.h.destination),this.et=this.P(),this.et.connect(this.o),this.nt=this.P(),this.nt.connect(this.o),this.rt=new s(this.h,this.nt,this.H)}setVolume(t){super.setVolume(t),this.o.gain.setTargetAtTime(t,this.J,.1)}setMusicVolume(t){this.et.gain.setTargetAtTime(t,this.J,.1)}setSFXVolume(t){this.nt.gain.setTargetAtTime(t,this.J,.1)}W(t=0){const s=this.P();return s.connect(this.et),this.q.push(s),this.$(s.gain,1,t),{destination:s}}playSFX(t,s,i,h=1,e=0){"suspended"===this.h.state&&this.h.resume();let n=1,r=e;"object"==typeof h?(n=h.velocity??1,r=h.timeOffset??0):n=h,this.rt.l(t,this.J+r,function(t){if("number"==typeof t)return t;const s=t.match(/^([a-gA-G])([#b]?)(\d)$/);if(!s)return 0;const[,i,h,e]=s;let n={C:-9,D:-7,E:-5,F:-4,G:-2,A:0,B:2}[i.toUpperCase()];return"#"===h&&n++,"b"===h&&n--,n+=12*(parseInt(e,10)-4),+(440*Math.pow(2,n/12)).toFixed(2)}(s),i,n)}playSFXSequence(t,s=0){"suspended"===this.h.state&&this.h.resume();const i=this.J+s,h=t.notes,e=h.length;for(let n=0;n<e;n+=5)this.rt.l(h[n+4],i+h[n+1],h[n],h[n+2],h[n+3])}playMusic(t,s=!0,i=0){let h=s;"object"==typeof s&&void 0!==s.volume&&(this.setMusicVolume(s.volume),h={...s},delete h.volume),this.playSequence(t,h,i)}stopMusic(){super.stop()}};var c=(t=>(t[t.Sine=0]="Sine",t[t.Square=1]="Square",t[t.Sawtooth=2]="Sawtooth",t[t.Triangle=3]="Triangle",t))(c||{}),u=(t=>(t[t.Lowpass=0]="Lowpass",t[t.Highpass=1]="Highpass",t[t.Bandpass=2]="Bandpass",t))(u||{});class l{ot(t,s,i,h){const e=t.createOscillator();return e.type=["sine","square","sawtooth","triangle"][s],i&&(e.frequency.value=Math.min(22e3,i)),h&&e.connect(h),e}P(t,s,i){const h=t.createGain();return h.gain.value=s,i&&h.connect(i),h}ct(t,s){const i=t.createBiquadFilter();return i.type=["lowpass","highpass","bandpass"][s],i}ut(t,s,i){const h=t.createStereoPanner();return h.pan.value=s,i&&h.connect(i),h}lt(t,s,...i){i.forEach(i=>{i.start(t),i.stop(s)})}dt(t,s,i){t.setValueAtTime(Math.min(22e3,s),i)}yt(t,s,i){t.linearRampToValueAtTime(Math.min(22e3,s),i)}ft(t,s,i){t.exponentialRampToValueAtTime(Math.min(22e3,s),i)}Mt(t,s,i,h,e,n,r,o=0){const a=this.P(t,0,h);this.dt(a.gain,o>0?0:n,e),o>0&&this.yt(a.gain,n,e+o),this.ft(a.gain,.001,e+r),this.lt(e,e+r,this.ot(t,s,i,a))}wt(t,s,i,h,e,n){const r=this.ct(t,s);return this.dt(r.frequency,i,e),this.ft(r.frequency,h,e+n),r}_t(t,s,i,h,e,n){return[this.ot(t,s,i,this.ut(t,-e,n)),this.ot(t,s,i*h,this.ut(t,e,n))]}St(t,s,i,h,e,n,r,o=0){const a=this.P(t,0,r);return this.dt(a.gain,0,h),o>0&&this.dt(a.gain,0,h+o),this.yt(a.gain,i,h+o+e),this.lt(h,n,this.ot(t,0,s,a)),a}vt(t,s,i,...h){{const e=t.createOscillator();e.onended=()=>{h.forEach(t=>{try{t.disconnect()}catch(s){}})},e.start(s),e.stop(i)}}}class d extends l{constructor(){super(...arguments),this.xt={v:.5,a:.02,d:.2,m:4}}l(t,s,i,h,e,n){const r=t.createGain(),o=this.gt(),a=Math.max(.001,n*o.v),c=Math.max(.02,Math.min(e,o.m));this.dt(r.gain,0,i),this.yt(r.gain,a,i+o.a),this.At(r.gain,a,i,o.a,c,o.d);const u=i+c+o.d+.1,l=this.bt(t,s,r,i,h,n,c,u)||r;l.connect(s),this.vt(t,i,u+2,l)}gt(){return this.xt}At(t,s,i,h,e,n){this.ft(t,.001,i+e+n)}}class p extends d{constructor(){super(...arguments),this.xt={v:.8,a:.015,d:.1,m:5}}bt(t,s,i,h,e,n,r,o){const a=this.wt(t,u.Lowpass,e+800+1e3*n,e+200,h,Math.min(r,1)),l=this.ot(t,c.Triangle,e,i),d=this.P(t,0),p=this.ot(t,c.Sine,2.003*e,d),y=this.ot(t,c.Sine,3.007*e,d),f=this.ut(t,Math.max(-.8,Math.min(.8,(e-261.6)/800)));return this.dt(d.gain,0,h),this.yt(d.gain,Math.max(.001,.15*n),h+.01),this.ft(d.gain,.001,h+Math.min(r,.5)),d.connect(f),this.Mt(t,c.Sine,60,f,h,Math.max(.001,.4*n),.05,.005),i.connect(f).connect(a),this.lt(h,o,l,p,y),a}}class y extends d{constructor(){super(...arguments),this.xt={v:.7,a:.005,d:.5,m:6}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sine,0,i);this.dt(a.frequency,1.1*e,h),this.ft(a.frequency,e,h+.02);const u=this.P(t,0,s);this.dt(u.gain,Math.max(.001,.25*n),h),this.ft(u.gain,.001,h+r);const l=this.ot(t,c.Sine,2.76*e,u);u.connect(s),this.lt(h,o,a,l)}}class f extends l{constructor(){super(...arguments),this.xt={v:.5,a:.05,r:.1}}l(t,s,i,h,e,n){const r=t.createGain(),o=this.gt(e),a=Math.max(.001,n*o.v);this.dt(r.gain,0,i),this.yt(r.gain,a,i+o.a);const c=Math.max(o.a,e);this.dt(r.gain,a,i+c),this.yt(r.gain,.001,i+c+o.r);const u=i+c+o.r,l=this.bt(t,r,i,h,n,c,o.r,u)||r;l.connect(s),this.vt(t,i,u+.1,l)}gt(t){return this.xt}}class M extends f{constructor(){super(...arguments),this.xt={v:.4,a:.01,r:.05}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sine,h,s),u=this.P(t,.5,s),l=this.ot(t,c.Sine,2*h,u),d=this.P(t,.25,s),p=this.ot(t,c.Sine,3*h,d),y=this.P(t,.7);return this.St(t,6.5,.3,i,0,o,y.gain),s.connect(y),this.Mt(t,c.Square,4e3,y,i,Math.max(.001,.1*e),.015),this.lt(i,o,a,l,p),y}}class w extends d{constructor(){super(...arguments),this.xt={v:.6,a:.02,d:.2,m:4}}bt(t,s,i,h,e,n,r,o){const a=this.wt(t,u.Lowpass,2e3+1e3*n,200,h,r),l=this.ot(t,c.Sawtooth,0,i);return this.dt(l.frequency,1.02*e,h),this.ft(l.frequency,e,h+.05),i.connect(a),this.Mt(t,c.Square,3500,s,h,Math.max(.001,.25*n),.015),this.lt(h,o,l),a}}class _ extends d{constructor(){super(...arguments),this.xt={v:.5,a:.02,d:.2,m:4}}At(t,s,i,h,e,n){this.ft(t,Math.max(.001,.4*s),i+Math.min(.5,e)),this.ft(t,.001,i+e+n)}bt(t,s,i,h,e,n,r,o){const a=this.wt(t,u.Lowpass,2500+1500*n,600,h,r),[l,d]=this._t(t,c.Sawtooth,0,1,0,i);return this.dt(l.frequency,1.02*e,h),this.ft(l.frequency,e,h+.05),this.dt(d.frequency,1.022*e,h),this.ft(d.frequency,1.002*e,h+.05),this.St(t,5,.015*e,h,.2,o,l.frequency,.4).connect(d.frequency),i.connect(a),this.Mt(t,c.Square,3500,s,h,Math.max(.001,.25*n),.015),this.lt(h,o,l,d),a}}class S extends d{constructor(){super(...arguments),this.xt={v:.8,a:.05,d:.1,m:4}}bt(t,s,i,h,e,n,r,o){const a=this.wt(t,u.Lowpass,300+500*n,100,h,r),l=this.ot(t,c.Sawtooth,0,i);this.dt(l.frequency,.92*e,h),this.ft(l.frequency,e,h+.04);const d=this.P(t,.6,i),p=this.ot(t,c.Sine,0,d);return this.dt(p.frequency,e/2*.92,h),this.ft(p.frequency,e/2,h+.04),i.connect(a),this.lt(h,o,l,p),a}}class v extends f{gt(t){return{v:.3,a:t<.4?.05:.2,r:t<.4?.1:.5}}bt(t,s,i,h,e,n,r,o){const[a,l]=this._t(t,c.Sawtooth,h,1.005,.6,s);this.St(t,4.5,.012*h,i,.3,o,a.frequency).connect(l.frequency);const d=this.wt(t,u.Lowpass,h+1200+1e3*e,h+800,i,n+r);return s.connect(d),this.lt(i,o,a,l),d}}class x extends f{constructor(){super(...arguments),this.xt={v:.5,a:.1,r:.1}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Square,0,s);this.dt(a.frequency,.95*h,i),this.ft(a.frequency,h,i+.05);const l=this.P(t,0,s);this.dt(l.gain,0,i),this.yt(l.gain,Math.max(.001,.25*e),i+.05),this.ft(l.gain,.001,i+.2);const d=this.ot(t,c.Sawtooth,2*h,l),p=this.ct(t,u.Lowpass);return this.dt(p.frequency,h+400,i),this.yt(p.frequency,h+1500+1e3*e,i+.1),this.ft(p.frequency,h+400,i+n+r),s.connect(p),this.lt(i,o,a),this.lt(i,i+.2,d),p}}class m extends f{constructor(){super(...arguments),this.xt={v:.7,a:.05,r:.1}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sine,h,s),l=this.P(t,0,s);this.dt(l.gain,.3,i),this.ft(l.gain,.05,i+.2);const d=this.ot(t,c.Triangle,h,l),p=this.ct(t,u.Lowpass);this.dt(p.frequency,h+800,i);const y=this.St(t,5.5,.015*h,i,.4,o,a.frequency);y.connect(d.frequency);const f=this.P(t,1),M=this.P(t,.15,f.gain);return y.connect(M),s.connect(f).connect(p),this.lt(i,o,a,d),p}}class g extends f{constructor(){super(...arguments),this.xt={v:.4,a:.05,r:.1}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sawtooth,0);this.dt(a.frequency,h,i),this.St(t,5,.02*h,i,.2,o,a.frequency);const l=this.wt(t,u.Lowpass,h,3*h,i,.05);this.ft(l.frequency,1.5*h,i+n),l.Q.value=3,a.connect(l).connect(s),this.lt(i,o,a)}}class A extends f{gt(t){return{v:.4,a:t<.4?.05:.3,r:t<.4?.1:.8}}bt(t,s,i,h,e,n,r,o){const[a,l]=this._t(t,c.Triangle,h,1.01,.7,s),d=this.ct(t,u.Lowpass);return this.dt(d.frequency,h+400,i),this.yt(d.frequency,h+1e3+500*e,i+n),this.St(t,.5,10,i,0,o,l.frequency),this.St(t,.1,400,i,0,o,d.frequency),s.connect(d),this.lt(i,o,a,l),d}}class b extends l{l(t,s,i,h,e,n){const r=this.P(t,0),o=this.ot(t,c.Sawtooth,0,r);this.dt(o.frequency,h,i),this.ft(o.frequency,Math.max(1,h/2),i+Math.max(.05,e));const a=this.P(t,.5,s);this.St(t,15,.5,i,0,i+e+.2,a.gain),r.connect(a),this.dt(r.gain,0,i),this.yt(r.gain,Math.max(.001,.5*n),i+.05),this.ft(r.gain,.001,i+e+.2),this.lt(i,i+e+.2,o),this.vt(t,i,i+e+.3,r,a)}}class U extends d{constructor(){super(...arguments),this.xt={v:.6,a:.02,d:.1,m:4}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Square,0,i);this.dt(a.frequency,1.05*e,h),this.ft(a.frequency,e,h+.08);const l=this.wt(t,u.Bandpass,2.5*e,e,h,r);l.Q.value=2,l.connect(i),this.lt(h,o,a)}}const R=class t extends l{static Ut(s){if(!t.Rt||t.Rt.sampleRate!==s.sampleRate){const i=1*s.sampleRate,h=s.createBuffer(1,i,s.sampleRate),e=h.getChannelData(0);for(let t=0;t<i;t++)e[t]=2*Math.random()-1;t.Rt=h}return t.Rt}l(s,i,h,e,n,r){if(e<70){const t=this.P(s,0,i),e=this.ot(s,c.Sine,0,t);this.dt(e.frequency,150,h),this.ft(e.frequency,30,h+.1),this.dt(t.gain,Math.max(.001,1.5*r),h),this.ft(t.gain,.001,h+.5),this.lt(h,h+.5,e),this.vt(s,h,h+.6,t)}else{const n=e<90,o=s.createBufferSource();o.buffer=t.Ut(s);const a=this.P(s,0,i),l=this.ct(s,n?u.Bandpass:u.Highpass),d=this.ut(s,n?0:.6*Math.random()-.3);if(l.frequency.value=n?1500:5e3,this.dt(a.gain,Math.max(.001,r),h),this.ft(a.gain,.001,h+(n?.2:.05)),o.connect(l).connect(a).connect(d),this.lt(h,h+(n?.2:.05),o),n){const t=this.ot(s,c.Triangle,0,a);this.dt(t.frequency,300,h),this.ft(t.frequency,100,h+.1),this.lt(h,h+.2,t)}else this.Mt(s,c.Square,7e3,d,h,Math.max(.001,.2*r),.05);this.vt(s,h,h+.4,l,a,d)}}};R.Rt=null;let T=R;class N extends f{constructor(){super(...arguments),this.xt={v:.4,a:.005,r:.05}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Square,0,s);this.dt(a.frequency,2*h,i),this.dt(a.frequency,h,i+.02),this.lt(i,o,a)}}const F=n([{synth:new p,start:0,end:7},{synth:new y,start:8,end:15},{synth:new M,start:16,end:23},{synth:new w,start:24,end:26},{synth:new _,start:27,end:31},{synth:new S,start:32,end:39},{synth:new v,start:40,end:55},{synth:new x,start:56,end:71},{synth:new m,start:72,end:79},{synth:new g,start:83,end:87},{synth:new A,start:88,end:95},{synth:new b,start:96,end:103},{synth:new b,start:120,end:127},{synth:new U,start:104,end:111},{synth:new T,start:112,end:119},{synth:new T,start:128,end:128}]),V=n([{synth:new N,start:0,end:127},{synth:new T,start:128,end:128}]);t.AdditiveSynth=class extends d{constructor(){super(...arguments),this.xt={v:.6,a:.005,d:.5,m:5}}bt(t,s,i,h,e,n,r,o){const a=[1,.6,.4,.2,.1];[1,2.76,5.4,8.9,13.3].forEach((s,o)=>{const u=e*s;if(u<22e3){const s=Math.max(.001,n*(1/(o+1.5))),e=Math.max(.1,r*a[o]);this.Mt(t,c.Sine,u,i,h,s,e,.005)}})}},t.BassSynth=S,t.BrassSynth=x,t.ChiptuneSynth=N,t.ChromaticPercussionSynth=y,t.DrumSynth=T,t.ElectricGuitarSynth=_,t.EthnicSynth=U,t.FMSynth=class extends f{constructor(){super(...arguments),this.xt={v:.6,a:.01,r:.1}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sine,h,s),u=2*h,l=4*u,d=this.P(t,0,a.frequency);this.dt(d.gain,l*e,i),this.ft(d.gain,.01,i+n);const p=this.ot(t,c.Sine,u,d);this.lt(i,o,a,p)}},t.FormantSynth=class extends f{constructor(){super(...arguments),this.xt={v:.8,a:.1,r:.4}}bt(t,s,i,h,e,n,r,o){const a=this.ot(t,c.Sawtooth,h);this.St(t,5,.015*h,i,.2,o,a.frequency),[730,1090,2440].forEach(i=>{if(i<22e3){const h=this.ct(t,u.Bandpass);h.frequency.value=i,h.Q.value=12,a.connect(h).connect(s)}}),this.lt(i,o,a)}},t.GuitarSynth=w,t.KarplusSynth=class extends l{l(t,s,i,h,e,n){const r=1/h,o=t.createBuffer(1,Math.max(1,t.sampleRate*r),t.sampleRate),a=o.getChannelData(0);for(let u=0;u<a.length;u++)a[u]=(2*Math.random()-1)*n;const c=t.createBufferSource();c.buffer=o;const l=t.createDelay(r);l.delayTime.value=r;const d=this.ct(t,u.Lowpass);d.frequency.value=Math.min(22e3,6*h);const p=this.P(t,.98);c.connect(l).connect(d).connect(p).connect(l);const y=this.P(t,0,s);this.dt(y.gain,1,i),this.ft(y.gain,.001,i+e),l.connect(y),this.lt(i,i+e,c),this.vt(t,i,i+e+3,y,l,d,p)}},t.LeadSynth=g,t.MasterInstrumentMap=F,t.OrganSynth=M,t.PadSynth=A,t.PianoSynth=p,t.RLOCore=class extends r{constructor(t,s){super(t,s||F)}},t.RLOGameEngine=class extends a{constructor(t,s){super(t,s||F)}},t.RLOMusicPlayer=class extends o{constructor(t,s){super(t,s||F)}},t.RLOTranspiler=e,t.ReeseBassSynth=class extends f{constructor(){super(...arguments),this.xt={v:.7,a:.05,r:.2}}bt(t,s,i,h,e,n,r,o){const a=this.ct(t,u.Lowpass);this.dt(a.frequency,2*h,i),this.St(t,6,3*h,i,0,o,a.frequency);const[l,d]=this._t(t,c.Sawtooth,h/2,1.015,.4,a);a.connect(s),this.lt(i,o,l,d)}},t.RetroInstrumentMap=V,t.SilentSynth={l:()=>{}},t.SlapBassSynth=class extends d{constructor(){super(...arguments),this.xt={v:.9,a:.005,d:.15,m:3}}bt(t,s,i,h,e,n,r,o){const a=this.wt(t,u.Lowpass,8*e+3e3*n,e+100,h,.1);a.Q.value=3;const l=this.ot(t,c.Sawtooth,e,i),d=this.ot(t,c.Sine,e/2,i);return this.Mt(t,c.Square,3.5*e,a,h,Math.max(.001,.4*n),.04),i.connect(a),this.lt(h,o,l,d),a}},t.SoundEffectsSynth=b,t.StandardInstrumentMap=F,t.StringSynth=v,t.WoodwindSynth=m,t.createDirectMap=function(t){const s=Array(129).fill(null);return t.forEach(t=>{t.ids.forEach(i=>s[i]=t.synth)}),s},t.createInstrumentMap=n,t.extendInstrumentMap=function(t,s){const i=[...t];return s.forEach(t=>{for(let s=t.start;s<=t.end;s++)i[s]=t.synth}),i},Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).RLOEngine={});
1
+ var t,s;t=this,s=function(t){function s(t,s=!1){const e=t.notes.length/5,i=s?new Float32Array(e):new Uint8Array(e),h=new Uint16Array(e),n=new Uint16Array(e),o=new Uint8Array(e),a=new Uint8Array(e);let c=0;for(let r=0,u=0;r<e;r++,u+=5){const e=t.notes[u+1],l=t.notes[u];i[r]=s?l:l>0?Math.max(0,Math.min(255,Math.round(12*Math.log2(l/440)+69))):0;const d=Math.max(0,Math.round(1e3*e));h[r]=Math.min(65535,d-c),n[r]=Math.min(65535,Math.max(0,Math.round(1e3*t.notes[u+2]))),o[r]=Math.max(0,Math.min(255,Math.round(255*t.notes[u+3]))),a[r]=t.notes[u+4],c+=h[r]}return{durationSecs:t.durationSecs,f:i,t:h,d:n,v:o,i:a}}function e(t){const s=new DataView(t),e=String.fromCharCode(s.getUint8(0),s.getUint8(1),s.getUint8(2),s.getUint8(3));if("RLO2"!==e&&"RLOF"!==e)throw Error("Invalid RLO Binary format. Please recompile tracks.");const i="RLOF"===e,h=s.getFloat32(4,!0),n=s.getUint32(8,!0),o=i?null:new Uint8Array(t,12+4*n,n),a=new Uint8Array(t,12+(i?8:5)*n,n),c=new Uint8Array(t,12+(i?9:6)*n,n),r=new Float32Array(5*n);let u=0;for(let l=0,d=0;l<n;l++,d+=5){const t=s.getUint16(12+2*l,!0),e=s.getUint16(12+2*n+2*l,!0),h=i?s.getFloat32(12+4*n+4*l,!0):o[l];u+=t/1e3,r[d]=i?h:h>0?440*Math.pow(2,(h-69)/12):0,r[d+1]=u,r[d+2]=e/1e3,r[d+3]=a[l]/255,r[d+4]=c[l]}return{durationSecs:h,notes:r}}class i{constructor(t,s,e){this.h=t,this.o=s,this.u=e}l(t,s,e,i,h){const n=.6*h*Math.min(1,1600/e),o=this.u[t]||this.u[0];o&&o.l(this.h,this.o,s,e,i,n)}}let h=class{constructor(t,s=[]){this.p=!1,this._=null,this.S=null,this.m=0,this.M=0,this.T=0,this.k=[],this.V=.5,this.U=null,this.playbackRate=1,this.R=null,this.h=t,this.N=s}get q(){return this.h.currentTime}setVolume(t){this.V=t}seek(t){this.T>0&&(this.U=Math.max(0,t)%this.T)}stop(){this.p=!1,this.m++,this._&&clearTimeout(this._);const t=this.k;for(this.k=[];t.length;)try{t.pop().disconnect()}catch(s){}}dispose(){this.stop()}O(){return this.h.createGain()}j(t,s,e){t.setValueAtTime(e>0?0:s,this.q),e>0&&t.linearRampToValueAtTime(s,this.q+e)}L(t=this.h){const s=t.createDynamicsCompressor();return s.threshold.value=-24,s.knee.value=12,s.ratio.value=8,s.attack.value=.001,s.release.value=.25,s}I(t=0){const s=this.O();return this.j(s.gain,this.V,t),s.connect(this.h.destination),this.k.push(s),{destination:s}}playSequence(t,s=!0,e=0){let h=!0,n=e;"object"==typeof s?(h=s.loop??!0,n=s.fadeInTime??0,this.playbackRate=s.playbackRate??this.playbackRate,void 0!==s.volume&&this.setVolume(s.volume)):h=s,this.stop(),"suspended"===this.h.state&&this.h.resume(),this.p=!0;const o=++this.m;this.T=t.durationSecs;const{destination:a}=this.I(n),c=new i(this.h,a,this.N);this.M=-.05*this.playbackRate;let r=this.q,u=0,l=0;const d=t.notes,p=d.length,y=()=>{if(!this.p||this.m!==o)return;if(0===p)return;const s=this.q,e=s-r;if(r=s,null!==this.U){for(this.M=this.U,u=0,l=0;l<p&&d[l+1]<this.U;)l+=5;this.U=null;const t=a;t.gain&&(t.gain.cancelScheduledValues(s),t.gain.setValueAtTime(.001,s),t.gain.exponentialRampToValueAtTime(this.V,s+.5))}else this.M+=e*this.playbackRate;const i=t.durationSecs;for(;l<p;){const t=u+d[l+1];if(t>=this.M+.5*this.playbackRate)break;if(this.M-t<=.15*this.playbackRate){const e=s+Math.max(0,(t-this.M)/this.playbackRate);c.l(d[l+4],e,d[l],d[l+2]/this.playbackRate,d[l+3])}l+=5}l>=p?h&&(l=0,u+=i,y()):this._=setTimeout(y,50)};y()}};const n=class{static X(t,s="studio"){if("concert"===s&&this.P)return this.P;if("studio"===s&&this.J)return this.J;const e="studio"===s,i=t.sampleRate*(e?.2:1.5),h=e?8:4,n=t.createBuffer(2,i,t.sampleRate);for(let o=0;o<2;o++){const t=n.getChannelData(o);let s=0;for(let e=0;e<i;e++)s+=.3*(2*Math.random()-1-s),t[e]=s*Math.exp(e/i*-h)*(1-e/i)}return e?this.J=n:this.P=n}};n.P=null,n.J=null;let o=n,a=class extends h{constructor(t,s=[]){super(t,s),this.$=null,this.H=null,this.K=null,this.W=new Map,this.Y=20,this.Z="concert",o.X(this.h,"concert"),o.X(this.h,"studio"),this.tt=()=>{document.hidden?this.h.suspend():this.p&&this.h.resume()},"undefined"!=typeof document&&document.addEventListener("visibilitychange",this.tt)}setReverbMode(t){this.Z=t,this.H&&this.K&&(this.H.buffer=o.X(this.h,t),this.K.gain.setTargetAtTime("studio"===t?.05:.2,this.q,.1))}dispose(){super.dispose(),"undefined"!=typeof document&&document.removeEventListener("visibilitychange",this.tt),this.W.clear()}setVolume(t){super.setVolume(t),this.$&&this.$.gain.setTargetAtTime(t,this.q,.1)}getCurrentTime(){return 0!==this.T&&this.p?Math.max(0,this.M)%this.T:0}getTotalDuration(){return this.T}I(t=0){this.H=this.h.createConvolver(),this.H.buffer=o.X(this.h,this.Z),this.$=this.O(),this.k.push(this.H,this.$),this.j(this.$.gain,this.V,t),this.K=this.O(),this.K.gain.value="studio"===this.Z?.05:.2,this.k.push(this.K);const s=this.h.createBiquadFilter();s.type="lowpass",s.frequency.value=Math.min(this.h.sampleRate/2-1,6500),this.k.push(s);const e=this.L();return this.k.push(e),this.$.connect(s).connect(e).connect(this.h.destination),this.$.connect(this.H).connect(this.K).connect(s),{destination:this.$}}async play(t,s=0,i=!0){let h,n=0,o={};if("object"==typeof s?(n=s.fadeInTime??0,o=s):(n=s,o={fadeInTime:n,loop:i}),"string"==typeof t)if(this.W.has(t))h=this.W.get(t);else{const s=await fetch(t);if(void 0!==window.__ENABLE_TRANSPILER__&&!window.__ENABLE_TRANSPILER__||t.toLowerCase().endsWith(".json")){const t=await s.text();h=JSON.parse(t)}else{const t=await s.arrayBuffer(),i=new DataView(t);if(i.byteLength>=3&&82===i.getUint8(0)&&76===i.getUint8(1)&&79===i.getUint8(2))h=e(t);else{const s=new window.DecompressionStream("gzip"),i=s.writable.getWriter();i.write(t),i.close(),h=e(await new Response(s.readable).arrayBuffer())}}if(this.W.set(t,h),this.W.size>this.Y){const t=this.W.keys().next().value;t&&this.W.delete(t)}}else h=t;this.playSequence(h,o)}stop(){if(this.$){const t=this.q;this.$.gain.cancelScheduledValues(t),this.$.gain.setValueAtTime(0,t),this.$=null,this.K=null,this.H=null}super.stop()}},c=class extends h{constructor(t,s=[]){super(t,s),this.st=this.O(),this.st.gain.value=this.V;const e=this.L();this.st.connect(e).connect(this.h.destination),this.et=this.O(),this.et.connect(this.st),this.it=this.O(),this.it.connect(this.st),this.ht=new i(this.h,this.it,this.N)}setVolume(t){super.setVolume(t),this.st.gain.setTargetAtTime(t,this.q,.1)}setMusicVolume(t){this.et.gain.setTargetAtTime(t,this.q,.1)}setSFXVolume(t){this.it.gain.setTargetAtTime(t,this.q,.1)}I(t=0){const s=this.O();return s.connect(this.et),this.k.push(s),this.j(s.gain,1,t),{destination:s}}playSFX(t,s,e,i=1,h=0){"suspended"===this.h.state&&this.h.resume();let n=1,o=h;"object"==typeof i?(n=i.velocity??1,o=i.timeOffset??0):n=i,this.ht.l(t,this.q+o,function(t){if("number"==typeof t)return t;const s=t.match(/^([a-gA-G])([#b]?)(\d)$/);if(!s)return 0;const[,e,i,h]=s;let n={C:-9,D:-7,E:-5,F:-4,G:-2,A:0,B:2}[e.toUpperCase()];return"#"===i&&n++,"b"===i&&n--,n+=12*(parseInt(h,10)-4),+(440*Math.pow(2,n/12)).toFixed(2)}(s),e,n)}playSFXSequence(t,s=0){"suspended"===this.h.state&&this.h.resume();const e=this.q+s,i=t.notes,h=i.length;for(let n=0;n<h;n+=5)this.ht.l(i[n+4],e+i[n+1],i[n],i[n+2],i[n+3])}playMusic(t,s=!0,e=0){let i=s;"object"==typeof s&&void 0!==s.volume&&(this.setMusicVolume(s.volume),i={...s},delete i.volume),this.playSequence(t,i,e)}stopMusic(){super.stop()}};function r(t){const s=Array(129).fill(null);t.forEach(t=>{for(let e=t.start;e<=t.end;e++)s[e]=t.synth});for(let e=0;e<129;e++)if(null===s[e]){let t=null,i=1/0;for(let h=0;h<129;h++)if(null!==s[h]){const n=Math.abs(e-h);n<i&&(i=n,t=s[h])}s[e]=t}return s}class u{nt(t,s,e,i){const h=t.createOscillator();return h.type=s,e&&(h.frequency.value=Math.min(22e3,e)),i&&h.connect(i),h}O(t,s,e){const i=t.createGain();return i.gain.value=s,e&&i.connect(e),i}ot(t,s){const e=t.createBiquadFilter();return e.type=s,e}ct(t,s,e){const i=t.createStereoPanner();return i.pan.value=s,e&&i.connect(e),i}rt(t,s,...e){e.forEach(e=>{e.start(t),e.stop(s)})}ut(t,s,e){t.setValueAtTime(Math.min(22e3,s),e)}lt(t,s,e){t.linearRampToValueAtTime(Math.min(22e3,s),e)}dt(t,s,e){t.exponentialRampToValueAtTime(Math.min(22e3,s),e)}yt(t,s,e,i,h,n,o,a=0){const c=this.O(t,0,i);this.ut(c.gain,a>0?0:n,h),a>0&&this.lt(c.gain,n,h+a),this.dt(c.gain,.001,h+o),this.rt(h,h+o,this.nt(t,s,e,c))}_t(t,s,e,i,h,n){const o=this.ot(t,s);return this.ut(o.frequency,e,h),this.dt(o.frequency,i,h+n),o}wt(t,s,e,i,h,n){return[this.nt(t,s,e,this.ct(t,-h,n)),this.nt(t,s,e*i,this.ct(t,h,n))]}ft(t,s,e,i,h,n,o,a=0){const c=this.O(t,0,o);return this.ut(c.gain,0,i),a>0&&this.ut(c.gain,0,i+a),this.lt(c.gain,e,i+a+h),this.rt(i,n,this.nt(t,"sine",s,c)),c}St(t,s,e,...i){{const h=this.nt(t,"sine",0);h.onended=()=>{i.forEach(t=>{try{t&&"function"==typeof t.disconnect&&t.disconnect()}catch(s){}})},h.start(s),h.stop(e)}}}class l extends u{constructor(){super(...arguments),this.Mt={Tt:.5,xt:.02,kt:.2,Vt:4}}l(t,s,e,i,h,n){const o=t.createGain(),a=this.gt(),c=Math.max(.001,n*a.Tt),r=Math.max(.02,Math.min(h,a.Vt));this.ut(o.gain,0,e),this.lt(o.gain,c,e+a.xt),this.At(o.gain,c,e,a.xt,r,a.kt);const u=e+r+a.kt+.1,l=this.bt(t,s,o,e,i,n,r,u)||o;l.connect(s),this.St(t,e,u+2,l)}gt(){return this.Mt}At(t,s,e,i,h,n){this.dt(t,.001,e+h+n)}}class d extends l{constructor(){super(...arguments),this.Mt={Tt:.8,xt:.015,kt:.1,Vt:5}}bt(t,s,e,i,h,n,o,a){const c=this._t(t,"lowpass",h+800+1e3*n,h+200,i,Math.min(o,1)),r=this.nt(t,"triangle",h,e),u=this.O(t,0),l=this.nt(t,"sine",2.003*h,u),d=this.nt(t,"sine",3.007*h,u),p=this.ct(t,Math.max(-.8,Math.min(.8,(h-261.6)/800)));return this.ut(u.gain,0,i),this.lt(u.gain,Math.max(.001,.15*n),i+.01),this.dt(u.gain,.001,i+Math.min(o,.5)),u.connect(p),this.yt(t,"sine",60,p,i,Math.max(.001,.4*n),.05,.005),e.connect(p).connect(c),this.rt(i,a,r,l,d),c}}class p extends l{constructor(){super(...arguments),this.Mt={Tt:.7,xt:.005,kt:.5,Vt:6}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sine",0,e);this.ut(c.frequency,1.1*h,i),this.dt(c.frequency,h,i+.02);const r=this.O(t,0,s);this.ut(r.gain,Math.max(.001,.25*n),i),this.dt(r.gain,.001,i+o);const u=this.nt(t,"sine",2.76*h,r);r.connect(s),this.rt(i,a,c,u)}}class y extends u{constructor(){super(...arguments),this.Mt={Tt:.5,xt:.05,Dt:.1,Vt:10}}l(t,s,e,i,h,n){const o=t.createGain(),a=this.gt(h),c=Math.max(.001,n*a.Tt),r=a.Vt?Math.min(h,a.Vt):h;this.ut(o.gain,0,e),this.lt(o.gain,c,e+a.xt);const u=Math.max(a.xt,r);this.ut(o.gain,c,e+u),this.lt(o.gain,.001,e+u+a.Dt);const l=e+u+a.Dt,d=this.bt(t,o,e,i,n,u,a.Dt,l)||o;d.connect(s),this.St(t,e,l+.1,d)}gt(t){return this.Mt}}class _ extends y{constructor(){super(...arguments),this.Mt={Tt:.4,xt:.01,Dt:.05}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sine",i,s),r=this.O(t,.5,s),u=this.nt(t,"sine",2*i,r),l=this.O(t,.25,s),d=this.nt(t,"sine",3*i,l),p=this.O(t,.7);return this.ft(t,6.5,.3,e,0,a,p.gain),s.connect(p),this.yt(t,"square",4e3,p,e,Math.max(.001,.1*h),.015),this.rt(e,a,c,u,d),p}}class w extends l{constructor(){super(...arguments),this.Mt={Tt:.6,xt:.02,kt:.2,Vt:4}}bt(t,s,e,i,h,n,o,a){const c=this._t(t,"lowpass",2e3+1e3*n,200,i,o),r=this.nt(t,"sawtooth",0,e);return this.ut(r.frequency,1.02*h,i),this.dt(r.frequency,h,i+.05),e.connect(c),this.yt(t,"square",3500,s,i,Math.max(.001,.25*n),.015),this.rt(i,a,r),c}}class f extends l{constructor(){super(...arguments),this.Mt={Tt:.5,xt:.02,kt:.2,Vt:4}}At(t,s,e,i,h,n){this.dt(t,Math.max(.001,.4*s),e+Math.min(.5,h)),this.dt(t,.001,e+h+n)}bt(t,s,e,i,h,n,o,a){const c=this._t(t,"lowpass",2500+1500*n,600,i,o),[r,u]=this.wt(t,"sawtooth",0,1,0,e);return this.ut(r.frequency,1.02*h,i),this.dt(r.frequency,h,i+.05),this.ut(u.frequency,1.022*h,i),this.dt(u.frequency,1.002*h,i+.05),this.ft(t,5,.015*h,i,.2,a,r.frequency,.4).connect(u.frequency),e.connect(c),this.yt(t,"square",3500,s,i,Math.max(.001,.25*n),.015),this.rt(i,a,r,u),c}}class S extends l{constructor(){super(...arguments),this.Mt={Tt:.8,xt:.05,kt:.1,Vt:4}}bt(t,s,e,i,h,n,o,a){const c=this._t(t,"lowpass",300+500*n,100,i,o),r=this.nt(t,"sawtooth",0,e);this.ut(r.frequency,.92*h,i),this.dt(r.frequency,h,i+.04);const u=this.O(t,.6,e),l=this.nt(t,"sine",0,u);return this.ut(l.frequency,h/2*.92,i),this.dt(l.frequency,h/2,i+.04),e.connect(c),this.rt(i,a,r,l),c}}class m extends y{Ut(t){return{v:.3,a:t<.4?.05:.2,r:t<.4?.1:.5}}bt(t,s,e,i,h,n,o,a){const[c,r]=this.wt(t,"sawtooth",i,1.005,.6,s);this.ft(t,4.5,.012*i,e,.3,a,c.frequency).connect(r.frequency);const u=this._t(t,"lowpass",i+1200+1e3*h,i+800,e,n+o);return s.connect(u),this.rt(e,a,c,r),u}}class M extends y{constructor(){super(...arguments),this.Mt={Tt:.5,xt:.1,Dt:.1}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"square",0,s);this.ut(c.frequency,.95*i,e),this.dt(c.frequency,i,e+.05);const r=this.O(t,0,s);this.ut(r.gain,0,e),this.lt(r.gain,Math.max(.001,.25*h),e+.05),this.dt(r.gain,.001,e+.2);const u=this.nt(t,"sawtooth",2*i,r),l=this.ot(t,"lowpass");return this.ut(l.frequency,i+400,e),this.lt(l.frequency,i+1500+1e3*h,e+.1),this.dt(l.frequency,i+400,e+n+o),s.connect(l),this.rt(e,a,c),this.rt(e,e+.2,u),l}}class T extends y{constructor(){super(...arguments),this.Mt={Tt:.7,xt:.05,Dt:.1}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sine",i,s),r=this.O(t,0,s);this.ut(r.gain,.3,e),this.dt(r.gain,.05,e+.2);const u=this.nt(t,"triangle",i,r),l=this.ot(t,"lowpass");this.ut(l.frequency,i+800,e);const d=this.ft(t,5.5,.015*i,e,.4,a,c.frequency);d.connect(u.frequency);const p=this.O(t,1),y=this.O(t,.15,p.gain);return d.connect(y),s.connect(p).connect(l),this.rt(e,a,c,u),l}}class x extends y{constructor(){super(...arguments),this.Mt={Tt:.4,xt:.05,Dt:.1}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sawtooth",0);this.ut(c.frequency,i,e),this.ft(t,5,.02*i,e,.2,a,c.frequency);const r=this._t(t,"lowpass",i,3*i,e,.05);this.dt(r.frequency,1.5*i,e+n),r.Q.value=3,c.connect(r).connect(s),this.rt(e,a,c)}}class k extends y{Ut(t){return{v:.4,a:t<.4?.05:.3,r:t<.4?.1:.8}}bt(t,s,e,i,h,n,o,a){const[c,r]=this.wt(t,"triangle",i,1.01,.7,s),u=this.ot(t,"lowpass");return this.ut(u.frequency,i+400,e),this.lt(u.frequency,i+1e3+500*h,e+n),this.ft(t,.5,10,e,0,a,r.frequency),this.ft(t,.1,400,e,0,a,u.frequency),s.connect(u),this.rt(e,a,c,r),u}}class V extends u{l(t,s,e,i,h,n){const o=this.O(t,0),a=this.nt(t,"sawtooth",0,o);this.ut(a.frequency,i,e),this.dt(a.frequency,Math.max(1,i/2),e+Math.max(.05,h));const c=this.O(t,.5,s);this.ft(t,15,.5,e,0,e+h+.2,c.gain),o.connect(c),this.ut(o.gain,0,e),this.lt(o.gain,Math.max(.001,.5*n),e+.05),this.dt(o.gain,.001,e+h+.2),this.rt(e,e+h+.2,a),this.St(t,e,e+h+.3,o,c)}}class g extends l{constructor(){super(...arguments),this.Mt={Tt:.6,xt:.02,kt:.1,Vt:4}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"square",0,e);this.ut(c.frequency,1.05*h,i),this.dt(c.frequency,h,i+.08);const r=this._t(t,"bandpass",2.5*h,h,i,o);r.Q.value=2,r.connect(e),this.rt(i,a,c)}}const A=class t extends u{static vt(s){if(!t.Ft||t.Ft.sampleRate!==s.sampleRate){const e=1*s.sampleRate,i=s.createBuffer(1,e,s.sampleRate),h=i.getChannelData(0);for(let t=0;t<e;t++)h[t]=2*Math.random()-1;t.Ft=i}return t.Ft}l(s,e,i,h,n,o){if(h<70){const t=this.O(s,0,e),h=this.nt(s,"sine",0,t);this.ut(h.frequency,150,i),this.dt(h.frequency,30,i+.1),this.ut(t.gain,Math.max(.001,1.5*o),i),this.dt(t.gain,.001,i+.5),this.rt(i,i+.5,h),this.St(s,i,i+.6,t)}else{const n=h<90,a=s.createBufferSource();a.buffer=t.vt(s);const c=this.O(s,0,e),r=this.ot(s,n?"bandpass":"highpass"),u=this.ct(s,n?0:.6*Math.random()-.3);if(r.frequency.value=n?1500:5e3,this.ut(c.gain,Math.max(.001,o),i),this.dt(c.gain,.001,i+(n?.2:.05)),a.connect(r).connect(c).connect(u),this.rt(i,i+(n?.2:.05),a),n){const t=this.nt(s,"triangle",0,c);this.ut(t.frequency,300,i),this.dt(t.frequency,100,i+.1),this.rt(i,i+.2,t)}else this.yt(s,"square",7e3,u,i,Math.max(.001,.2*o),.05);this.St(s,i,i+.4,r,c,u)}}};A.Ft=null;let b=A;class D extends y{constructor(){super(...arguments),this.Mt={Tt:.4,xt:.005,Dt:.05}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"square",0,s);this.ut(c.frequency,2*i,e),this.ut(c.frequency,i,e+.02),this.rt(e,a,c)}}const U=r([{synth:new d,start:0,end:7},{synth:new p,start:8,end:15},{synth:new _,start:16,end:23},{synth:new w,start:24,end:26},{synth:new f,start:27,end:31},{synth:new S,start:32,end:39},{synth:new m,start:40,end:55},{synth:new M,start:56,end:71},{synth:new T,start:72,end:79},{synth:new x,start:83,end:87},{synth:new k,start:88,end:95},{synth:new V,start:96,end:103},{synth:new V,start:120,end:127},{synth:new g,start:104,end:111},{synth:new b,start:112,end:119},{synth:new b,start:128,end:128}]),v=r([{synth:new D,start:0,end:127},{synth:new b,start:128,end:128}]);t.AdditiveSynth=class extends l{constructor(){super(...arguments),this.Mt={Tt:.6,xt:.005,kt:.5,Vt:5}}bt(t,s,e,i,h,n,o,a){const c=[1,.6,.4,.2,.1];[1,2.76,5.4,8.9,13.3].forEach((s,a)=>{const r=h*s;if(r<22e3){const s=Math.max(.001,n*(1/(a+1.5))),h=Math.max(.1,o*c[a]);this.yt(t,"sine",r,e,i,s,h,.005)}})}},t.BassSynth=S,t.BrassSynth=M,t.ChiptuneSynth=D,t.ChromaticPercussionSynth=p,t.DrumSynth=b,t.ElectricGuitarSynth=f,t.EthnicSynth=g,t.FMSynth=class extends y{constructor(){super(...arguments),this.Mt={Tt:.6,xt:.01,Dt:.1}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sine",i,s),r=2*i,u=4*r,l=this.O(t,0,c.frequency);this.ut(l.gain,u*h,e),this.dt(l.gain,.01,e+n);const d=this.nt(t,"sine",r,l);this.rt(e,a,c,d)}},t.FormantSynth=class extends y{constructor(){super(...arguments),this.Mt={Tt:.8,xt:.1,Dt:.4}}bt(t,s,e,i,h,n,o,a){const c=this.nt(t,"sawtooth",i);this.ft(t,5,.015*i,e,.2,a,c.frequency),[730,1090,2440].forEach(e=>{if(e<22e3){const i=this.ot(t,"bandpass");i.frequency.value=e,i.Q.value=12,c.connect(i).connect(s)}}),this.rt(e,a,c)}},t.GuitarSynth=w,t.KarplusSynth=class extends u{l(t,s,e,i,h,n){const o=1/i,a=t.createBuffer(1,Math.max(1,t.sampleRate*o),t.sampleRate),c=a.getChannelData(0);for(let y=0;y<c.length;y++)c[y]=(2*Math.random()-1)*n;const r=t.createBufferSource();r.buffer=a;const u=t.createDelay(o);u.delayTime.value=o;const l=this.ot(t,"lowpass");l.frequency.value=Math.min(22e3,6*i);const d=this.O(t,.98);r.connect(u).connect(l).connect(d).connect(u);const p=this.O(t,0,s);this.ut(p.gain,1,e),this.dt(p.gain,.001,e+h),u.connect(p),this.rt(e,e+h,r),this.St(t,e,e+h+3,p,u,l,d)}},t.LeadSynth=x,t.MasterInstrumentMap=U,t.OrganSynth=_,t.PadSynth=k,t.PianoSynth=d,t.RLOCore=class extends h{constructor(t,s){super(t,s||U)}},t.RLOGameEngine=class extends c{constructor(t,s){super(t,s||U)}},t.RLOMusicPlayer=class extends a{constructor(t,s){super(t,s||U)}},t.ReeseBassSynth=class extends y{constructor(){super(...arguments),this.Mt={Tt:.7,xt:.05,Dt:.2}}bt(t,s,e,i,h,n,o,a){const c=this.ot(t,"lowpass");this.ut(c.frequency,2*i,e),this.ft(t,6,3*i,e,0,a,c.frequency);const[r,u]=this.wt(t,"sawtooth",i/2,1.015,.4,c);c.connect(s),this.rt(e,a,r,u)}},t.RetroInstrumentMap=v,t.SilentSynth={l:()=>{}},t.SlapBassSynth=class extends l{constructor(){super(...arguments),this.Mt={Tt:.9,xt:.005,kt:.15,Vt:3}}bt(t,s,e,i,h,n,o,a){const c=this._t(t,"lowpass",8*h+3e3*n,h+100,i,.1);c.Q.value=3;const r=this.nt(t,"sawtooth",h,e),u=this.nt(t,"sine",h/2,e);return this.yt(t,"square",3.5*h,c,i,Math.max(.001,.4*n),.04),e.connect(c),this.rt(i,a,r,u),c}},t.SoundEffectsSynth=V,t.StandardInstrumentMap=U,t.StringSynth=m,t.WoodwindSynth=T,t.createDirectMap=function(t){const s=Array(129).fill(null);return t.forEach(t=>{t.ids.forEach(e=>s[e]=t.synth)}),s},t.createInstrumentMap=r,t.decodeBinary=e,t.encodeToBinary=function(t,e=!1){const i=1===new Uint8Array(new Uint16Array([1]).buffer)[0],h=s(t,e),n=h.f.length,o=new ArrayBuffer(12+(e?10:7)*n),a=new DataView(o);if(a.setUint8(0,82),a.setUint8(1,76),a.setUint8(2,79),a.setUint8(3,e?70:50),a.setFloat32(4,h.durationSecs,!0),a.setUint32(8,n,!0),i)new Uint16Array(o,12,n).set(h.t),new Uint16Array(o,12+2*n,n).set(h.d),e&&new Float32Array(o,12+4*n,n).set(h.f);else for(let s=0;s<n;s++)a.setUint16(12+2*s,h.t[s],!0),a.setUint16(12+2*n+2*s,h.d[s],!0),e&&a.setFloat32(12+4*n+4*s,h.f[s],!0);return e?(new Uint8Array(o,12+8*n,n).set(h.v),new Uint8Array(o,12+9*n,n).set(h.i)):(new Uint8Array(o,12+4*n,n).set(h.f),new Uint8Array(o,12+5*n,n).set(h.v),new Uint8Array(o,12+6*n,n).set(h.i)),o},t.encodeToSoA=s,t.extendInstrumentMap=function(t,s){const e=[...t];return s.forEach(t=>{for(let s=t.start;s<=t.end;s++)e[s]=t.synth}),e},Object.defineProperty(t,Symbol.toStringTag,{value:"Module"})},"object"==typeof exports&&"undefined"!=typeof module?s(exports):"function"==typeof define&&define.amd?define(["exports"],s):s((t="undefined"!=typeof globalThis?globalThis:t||self).RLOEngine={});
2
2
  //# sourceMappingURL=rlo-engine.min.umd.js.map