forked from junghans-schneider/ModPlayer.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodplayer.min.js
1 lines (1 loc) · 16 KB
/
modplayer.min.js
1
!function(a){"use strict";Array.from||(Array.from=function(a){return[].slice.call(a)});var b,c=a.mp;b=a.mp={},b.noConflict=function(){return a.mp=c,b},b.loadModule=function(a,c,d){c=Array.from(arguments).slice(1),d=c.pop(),b.util.get(a,"arraybuffer",function(a,e){d(a,a?null:b.module.apply(null,[e].concat(c)))})}}(window),function(mp){"use strict";var util=mp.util={};util.constant=function(a){return function(){return a}},util.extend=function(a,b){for(var c in b)a[c]=b[c];return a},util.flatten=function(a){return[].concat.apply([],a)},util.range=function(a){return Array.apply(null,new Array(a)).map(function(a,b){return b})},util.get=function(url,type,done){done||(done=type,type="json");var isText="text"===type||!type,isJSON="json"===type,xhr=util.extend(new XMLHttpRequest,{onload:function(){done(null,isText?xhr.responseText:isJSON?eval("("+xhr.responseText+")"):xhr.response)},onerror:function(){done(xhr)}});xhr.open("GET",url),xhr.responseType=isJSON?"":type,xhr.send()}}(window.mp),function(a){"use strict";var b=a.format={},c=a.util,d=[];b.register=function(a,c){d.push(a),c&&(b["parse"+c]=a)},b.parseModule=function(a){for(var b=null,c=0;!b&&c<d.length;)b=d[c++](a);return b},b.bytesIter=function(a,b){function d(){return b}function e(a){return b+=Math.abs(a),i}function f(c){return String.fromCharCode.apply(null,a.subarray(b,b+=c))}function g(a,b){var d=Array.from(arguments).slice(2);return d.unshift(i),a=i[a]||a,c.range(b).map(function(){return a.apply(this,d)})}function h(d,e){e=e===!0;var f=c.range(d).reduce(function(c,f){var g=a[b+f];return e&&f+1!==d||(g&=255),c+(g<<8*f)},0);return b+=d,f}b=b||0;var i={pos:d,step:e,str:f,list:g},j={"byte":1,word:2,dword:4};return Object.keys(j).forEach(function(a){i[a]=h.bind(null,j[a])}),i}}(window.mp),function(a){"use strict";function b(b){if(!c(b))return null;var f=a.format.bytesIter(b),h=d(f);return j.extend(h,{patterns:f.list(e,h.patterns,h.numChannels),instruments:f.list(g,h.instruments)})}function c(b){return"Extended Module: "===a.format.bytesIter(b).str(17)}function d(a){var b={id:a.str(17),title:a.str(20).trim(),tracker:a.step(1).str(20).trim(),ver:a.word(),patternOrder:a.step(4).word(),restart:a.word(),numChannels:a.word(),patterns:a.word(),instruments:a.word(),freqTable:1&a.word()?"linear":"amiga",tempo:a.word(),speed:a.word()};return b.patternOrder=a.list("byte",256).slice(0,b.patternOrder),b}function e(a,b){var c;return a.step(5),c=a.word(),a.step(2),j.flatten(a.list(f,c*b))}function f(a){var b,c,d,e,f,g=a.byte();return 128&g?(b=c=d=e=f=0,1&g&&(b=a.byte()),2&g&&(c=a.byte()),4&g&&(d=a.byte()),8&g&&(e=a.byte()),16&g&&(f=a.byte())):(b=g,c=a.byte(),d=a.byte(),e=a.byte(),f=a.byte()),[b,c,d,e,f]}function g(a){function b(b){return b.data=i(a,b.data,b.is16),b}var c={},d=a.pos(),e=a.dword(),f=a.str(22).trim(),g=a.step(1).word();return g>0&&(a.step(4),c={sampleMapping:a.list("byte",96),volumeEnvelope:a.list("word",24),panningEnvelope:a.list("word",24),volumeEnvelopePoints:a.byte(),panningEnvelopePoints:a.byte(),volumeEnvelopeSustainPoint:a.byte(),volumeEnvelopeLoopStartPoint:a.byte(),volumeEnvelopeLoopEndPoint:a.byte(),panningEnvelopeSustainPoint:a.byte(),panningEnvelopeLoopStartPoint:a.byte(),panningEnvelopeLoopEndPoint:a.byte(),volumeType:a.byte(),panningType:a.byte(),vibratoType:a.byte(),vibratoSweep:a.byte(),vibratoDepth:a.byte(),vibratoRate:a.byte(),volumeFadeOut:a.word()},a.step(e-(a.pos()-d)),c.samples=a.list(h,g).map(b)),c.name=f,c}function h(a){var b={data:a.dword(),loopStart:a.dword(),loopLength:a.dword(),volume:a.byte(),finetune:a.byte(!0),loopType:a.byte(),panning:a.byte(),relnote:a.byte(!0),name:a.step(1).str(22).trim()},c=3&b.loopType;return b.is16=!!(16&b.loopType),b.loopType=c?1===c?"forward":"ping-pong":null,b}function i(a,b,c){c&&(b/=2);var d=c?"word":"byte",e=0;return a.list(d,b).map(function(a){return e+=a,e&=c?65535:255,c?e>=32768&&(e-=65536):e>=128&&(e-=256),e})}var j=a.util;a.format.register(b,"XModule")}(window.mp),function(a){"use strict";function b(b){function d(a){var b=a.samples&&a.samples[0];b&&(b.data=e(h,b.length))}var h=a.format.bytesIter(b),i={title:h.str(20).trim(),instruments:h.list(c,31),speed:125,tempo:6},j=h.byte(),k=h.step(1).list("byte",128),l=Math.max.apply(null,k)+1;return i.patternOrder=k.slice(0,j),i.id=h.str(4),i.numChannels=f(i.id),i.patterns=h.list(g,l,i.numChannels),i.instruments.forEach(d),i}function c(b){var c={},e=b.str(22).trim(),f=d(b);if(f.length>2){var g=a.util.constant(0);c={sampleMapping:k.range(96).map(g),volumeEnvelope:k.range(24).map(g),panningEnvelope:k.range(24).map(g),volumeEnvelopePoints:0,panningEnvelopePoints:0,volumeEnvelopeSustainPoint:0,volumeEnvelopeLoopStartPoint:0,volumeEnvelopeLoopEndPoint:0,panningEnvelopeSustainPoint:0,panningEnvelopeLoopStartPoint:0,panningEnvelopeLoopEndPoint:0,volumeType:0,panningType:0,vibratoType:0,vibratoSweep:0,vibratoDepth:0,vibratoRate:0,volumeFadeOut:0},c.samples=[f]}return c.name=e,c}function d(a){var b={length:2*j(a),finetune:l[15&a.byte()],volume:a.byte(),loopStart:2*j(a),loopLength:2*j(a),panning:128,relnote:0};return b.loopType=b.loopEnd>2?"forward":null,b}function e(a,b){return a.list("byte",b).map(function(a){return 128>a?a:a-256})}function f(a){return{"M.K.":4,"M!K!":4,FLT4:4,FLT8:8,OKTA:8,OCTA:8,FA08:8,CD81:8}[a]||parseInt(/(\d+)CH/.exec(a)[1],10)}function g(b,c){return a.util.flatten(b.list(h,64*c))}function h(a){var b=a.byte(),c=a.byte(),d=a.byte(),e=a.byte(),f=((15&b)<<8)+c,g=(240&b)+(d>>4),h=15&d;return f=i(f),e||(1==h&&(h=0),2==h&&(h=0),10==h&&(h=0),5==h&&(h=3),6==h&&(h=4)),[f,g,0,h,e]}function i(a){for(var b=0;120>b;b++){var c=16*m[b%12]>>b/12>>2;if(a>=c)return b+1}return 0}function j(a){return(a.byte()<<8)+a.byte()}var k=a.util;a.format.register(b,"PTModule");var l=[0,16,32,48,64,80,96,112,-128,-112,-96,-80,-64,-48,-32,-16],m=[1712,1616,1524,1440,1356,1280,1208,1140,1076,1016,960,907]}(window.mp),function(a){"use strict";function b(a,b,c){function d(c){return a[b+c]}var e={points:[],sustainPos:-1,loopStartPos:-1,loopEndPos:-1},f=d("Type"),g=d("Envelope"),h=d("EnvelopePoints")||0,i=d("EnvelopeSustainPoint"),j=d("EnvelopeLoopStartPoint"),k=d("EnvelopeLoopEndPoint");if(1&f)for(var l=-1,m=c,n=0;h>n;++n){for(var o=g[2*n],p=g[2*n+1],q=l+1;o>q;++q)e.points[q]=m+(p-m)*(q-l)/(o-l);e.points[o]=p,i==n&&2&f&&(e.sustainPos=o),j==n&&4&f&&(e.loopStartPos=o),k==n&&4&f&&(e.loopEndPos=o),l=o,m=p}return e}a.instrument=function(c,d,e){function f(a){return n[e.sampleMapping[a-1]]}function g(a,b,c){return a/m*(b/64)*(c/64)}function h(a,b){var c=a+(b-32)*(128-Math.abs(a-128))/32;return 0>c?c=0:c>255&&(c=255),c/255}function i(a,b,d,e,f,g,h){function i(a,b,d){return b!=d&&(null==d&&(a.value=d=0),c.smoothlySetValueAtTime(a,d,b,g,h)),b}var j=e*Math.cos(Math.PI/2*f),k=e*Math.sin(Math.PI/2*f);d.volumeLeft=i(a.gain,j,d.volumeLeft),d.volumeRight=i(b.gain,k,d.volumeRight)}function j(a,b,c,g,h,i,j,k){var l=f(b);if(null==a&&(a={},e.vibratoRate&&e.vibratoDepth&&(a.autoVibratoPos=0,e.vibratoSweep&&(a.autoVibratoSweepPos=0))),null!=c&&(a.arpeggio=c,a.arpeggioPos=0),null!=g)if(a.portamento=g,a.portamentoPos=0,null!=h){var m=f(h);a.portamentoTarget=m.getBasePlaybackRate()*Math.pow(2,(h-49)/12),a.portamentoTarget<a.basePlaybackRate?a.portamento>0&&(a.portamento*=-1):a.portamento<0&&(a.portamento*=-1)}else a.portamentoTarget=null;var n=a.basePlaybackRate;if(null==n&&(n=l.getBasePlaybackRate(),n*=Math.pow(2,(b-49)/12),a.basePlaybackRate=n),null!=a.arpeggio&&(n=a.arpeggioPos%3==1?a.basePlaybackRate*Math.pow(2,(15&a.arpeggio)/12):a.arpeggioPos%3==2?a.basePlaybackRate*Math.pow(2,(240&a.arpeggio)/16/12):a.basePlaybackRate,++a.arpeggioPos,a.arpeggioPos>=d&&(a.arpeggio=null)),null!=a.portamento&&(++a.portamentoPos,a.portamentoPos>=d?a.portamento=null:(a.basePlaybackRate*=Math.pow(2,a.portamento/16/12),null!=a.portamentoTarget&&(a.basePlaybackRate<=a.portamentoTarget&&a.portamento<0||a.basePlaybackRate>=a.portamentoTarget&&a.portamento>0)&&(a.basePlaybackRate=a.portamentoTarget,a.portamento=null))),e.vibratoRate&&e.vibratoDepth){var o=Math.sin(2*Math.PI*a.autoVibratoPos/256),p=o*e.vibratoDepth/64;e.vibratoSweep&&(p*=a.autoVibratoSweepPos/e.vibratoSweep),n*=Math.pow(2,p/12),a.autoVibratoPos+=e.vibratoRate,e.vibratoSweep&&a.autoVibratoSweepPos<e.vibratoSweep&&++a.autoVibratoSweepPos}if(n!=a.playbackRate){null==a.playbackRate?i.playbackRate.value=n:i.playbackRate.setValueAtTime(n,j),a.playbackRate=n}return a}function k(a,b,c,j,k,l,n,q,r){var s=f(b),t=97==b;null==a&&(a={fadeVolume:m,volumeSlide:0,envelopePos:0,panningEnvelopePos:0,keyOff:!1}),t?a.keyOff=!0:b>=1&&96>=b&&(a.keyOff=!1,a.fadeVolume=m),null!=c&&(a.envelopePos=0),null!=j&&(a.volumeSlide=j,a.volumeSlidePos=0),null!=k&&(a.envelopePos=k),null!=l&&(a.panningEnvelopePos=0);var u=l;null==u&&(u=null!=a.notePanning?a.notePanning:s.getBasePanning()),a.notePanning=u;var v;if(0==(1&e.panningType))v=h(u,32);else{var w=p.points[a.panningEnvelopePos];null==w&&(w=a.envelopePanning),null==w&&(w=32),a.envelopePanning=w,v=h(u,w),a.panningEnvelopePos!=p.sustainPos&&(++a.panningEnvelopePos,a.panningEnvelopePos==p.loopEndPos&&(a.panningEnvelopePos=p.loopEndPos))}var x=c;if(null==x&&(x=null!=a.noteVolume?a.noteVolume:s.getBaseVolume()),a.noteVolume=x,0==(1&e.volumeType)){var y=t?0:g(m,x,64);i(n,q,a,y,v,r)}else{var z=o.points[a.envelopePos];null==z&&(z=a.envelopeVolume),null==z&&(z=64),a.envelopeVolume=z;var y=g(a.fadeVolume,x,z);i(n,q,a,y,v,r),(a.keyOff||a.envelopePos!=o.sustainPos)&&(++a.envelopePos,a.envelopePos==o.loopEndPos&&(a.envelopePos=o.loopStartPos)),a.keyOff&&(a.fadeVolume-=e.volumeFadeOut,a.fadeVolume<0&&(a.fadeVolume=0))}if(null!=a.volumeSlide){++a.volumeSlidePos;var A=a.volumeSlide,B=d;Math.abs(A)<1&&(A*=256,B=2),a.volumeSlidePos>=B?a.volumeSlide=null:(a.noteVolume+=A,a.noteVolume<0?a.noteVolume=0:a.noteVolume>64&&(a.noteVolume=64))}return a}function l(a,b,d,e,f){c.smoothlySetValueAtTime(b.gain,a.volumeLeft,0,f),c.smoothlySetValueAtTime(d.gain,a.volumeRight,0,f),e.stop(f+c.smoothingTime)}var m=32767,n=[];e.samples&&(n=e.samples.map(a.sample.bind(null,c.audioContext)));var o=b(e,"volume",64),p=b(e,"panning",32);return{getSample:f,doFrequencyTick:j,doVolumeTick:k,stopNoteAtTime:l}}}(window.mp),function(a,b){"use strict";function c(a){function b(a,b,d,e,f){null==f&&(f=1),null==b?a.setValueAtTime(d,e):(a.setValueAtTime(b,e),a.linearRampToValueAtTime(d,e+c*f))}var c=.004;return{smoothlySetValueAtTime:b,audioContext:a,smoothingTime:c}}b.module=function(d,e){function f(a,c){if(null==n){"function"==typeof a&&(c=a,a=null),a=a||e.destination;var f=h.audioContext.createGain();f.gain.value=.75,f.connect(a);var g=null;n=h.audioContext.currentTime+.03,m=n;var l,p=n,q=0,r=null,s=2,t=0,u=function(){var a=h.audioContext.currentTime;null==r&&(r=b.pattern(h,f,o,j,k,i,d.patterns[d.patternOrder[q]]));var c=r;if(g=c.playPattern(g,p,a,s),t+=c.getProcessedRows(g),p=c.getPatternEndTime(g),c.isFinished(g)&&(r=null,++q,q>=d.patternOrder.length&&(q=d.restart?d.restart:0),s>t))return void u();var e=p-n,m=.5*e+(n-a);setTimeout(l,1e3*m),n=p},l=u;null!=c&&(l=function(){c(u)}),u()}}function g(a){if(null==n)return null;var b=h.audioContext.currentTime,c=1,d=l*c;if(null==a||b>a){var e=Math.round((n-m)/l);m=n-(e%c+c-.25)*l;var f=Math.round((b-m)/d);a=m+(f+1)*d}return a}e||(e=new(a.AudioContext||a.webkitAudioContext)),d=b.format.parseModule(new Int8Array(d));var h=c(e),i=d.numChannels,j=2.5/d.speed,k=d.tempo,l=j*k,m=null,n=null,o=d.instruments.map(b.instrument.bind(null,h,k));return{play:f,syncWithAudio:g}}}(window,window.mp),function(a){"use strict";a.pattern=function(a,b,c,d,e,f,g){function h(){var c=a.audioContext.createGain();c.connect(b);for(var d={masterGainNode:c,channels:[],rowIndex:0,loopStartRow:0,loopCounter:0},e=0;f>e;++e){var g=a.audioContext.createChannelMerger(2),h=a.audioContext.createGain();g.connect(h),h.connect(c),d.channels.push({channelMasterGainNode:h,channelMergerNode:g,playingNotes:[]})}return d}function i(a,b,c){return null==a&&(a=h()),a.channels[b].channelMasterGainNode.setValueAtTime(0,c),a}function j(a,b,c){return null==a&&(a=h()),a.channels[b].channelMasterGainNode.setValueAtTime(1,c),a}function k(a){if(null!=a)for(var b=0;f>b;++b)for(var c=a.channels[b],d=c.playingNotes.length,e=0;d>e;++e){var g=c.playingNotes[e];g.stopped||(g.sourceNode.stop(time),g.stopped=!0)}}function l(a,b){for(var c=0;f>c;++c){for(var d=a.channels[c],e=d.playingNotes.length,g=0,h=1;e>h;++h){var i=d.playingNotes[h];i.startTime<b&&(g=h)}g>0&&d.playingNotes.splice(0,g)}}function m(b,i,j,k){null==b?b=h():l(b,j),b.processedRows=0,k||(k=1e3);for(var m=5,n=m*f,o=g.length/n,p=0;b.rowIndex<o&&b.processedRows<k;){var q=i+p*d,r=e,s=b.globalVolume;null==s&&(s=64);for(var t=null,u=0;f>u;++u){var v=b.channels[u],w=b.rowIndex*n+u*m,x=g[w+3],y=g[w+4];if(16==x)s=y,s>64&&(s=64);else if(17==x)0==y&&v.globalVolumeSlideMemory&&(y=v.globalVolumeSlideMemory),y&&(t=(240&y)/16,0==t&&(t=-(15&y)),v.globalVolumeSlideMemory=y);else if(14==x&&224==(240&y)){var z=((15&y)+1)*e;z>r&&(r=z)}var A=v.playingNotes.length,B=g[w],C=g[w+1];if(0==B?0!=C&&v.noteMemory&&(B=v.noteMemory):B>=1&&96>=B&&(v.noteMemory=B),B>=1&&96>=B&&3!=x){var D=c[C-1],E=D.getSample(B);if(A>0){var F=v.playingNotes[A-1];F.stopped||(F.instrument.stopNoteAtTime(F.volumeState,F.leftGainNode,F.rightGainNode,F.sourceNode,q),F.stopped=!0)}var F={instrument:D,sourceNode:E.createSampleSourceNode(),leftGainNode:a.audioContext.createGain(),rightGainNode:a.audioContext.createGain()};F.leftGainNode.connect(v.channelMergerNode,0,0),F.rightGainNode.connect(v.channelMergerNode,0,1),F.sourceNode.connect(F.leftGainNode),F.sourceNode.connect(F.rightGainNode);var G=0;9==x&&(0==y&&v.sampleOffsetMemory&&(y=v.sampleOffsetMemory),y&&(G=E.getSampleOffsetInSeconds(256*y),v.sampleOffsetMemory=y)),F.sourceNode.start(q,G),v.playingNotes.push(F)}}for(var H=0;r>H;++H){var I=i+p*d,J=i+(p+1)*d;null!=s&&s!=b.globalVolume&&(null==b.globalVolume?b.masterGainNode.gain.value=s/64:b.masterGainNode.gain.setValueAtTime(s/64,I),b.globalVolume=s),null!=t&&(s+=t,0>s?s=0:s>64&&(s=64));for(var u=0;f>u;++u){var v=b.channels[u],w=b.rowIndex*n+u*m,A=v.playingNotes.length;if(A>0){var F=v.playingNotes[A-1],B=null,K=null,L=null,M=null,N=null,O=null,P=null,Q=null;if(0==H){B=g[w];var C=g[w+1];0==B&&0!=C&&v.noteMemory&&(B=v.noteMemory),K=g[w+2],K>=16&&96>K?(K-=16,K>64&&(K=64)):(128==(240&K)?P=-(15&K)/256:192==(240&K)&&(L=15&K,L+=16*L),K=null);var R=g[w+3],S=g[w+4];0==R?S&&(M=S):1==R?(0==S&&v.portamentoUpMemory&&(S=v.portamentoUpMemory),S&&(N=S,v.portamentoUpMemory=S)):2==R?(0==S&&v.portamentoDownMemory&&(S=v.portamentoDownMemory),S&&(N=-S,v.portamentoDownMemory=S)):3==R?(null==B?O=v.portamentoTargetMemory:(O=B,v.portamentoTargetMemory=B),0==S&&v.portamentoMemory&&(S=v.portamentoMemory),S&&(N=S,v.portamentoMemory=S)):10==R?(0==S&&v.volumeSlideMemory&&(S=v.volumeSlideMemory),S&&(P=(240&S)/16,0==P&&(P=-(15&S)),v.volumeSlideMemory=S)):12==R?(K=S,K>64&&(K=64)):21==R&&(Q=S)}F.frequencyState=F.instrument.doFrequencyTick(F.frequencyState,B,M,N,O,F.sourceNode,I,J),F.volumeState=F.instrument.doVolumeTick(F.volumeState,B,K,P,Q,L,F.leftGainNode,F.rightGainNode,I,J)}}++p}for(var u=0;f>u;++u){var v=b.channels[u],w=b.rowIndex*n+u*m,x=g[w+3];if(14==x){var y=g[w+4];if(96==(240&y)){var T=15&y;0==T?b.loopStartRow=b.rowIndex:b.loopCounter<T?(++b.loopCounter,b.rowIndex=b.loopStartRow-1):b.loopCounter=0}}}++b.rowIndex,++b.processedRows}return b.rowIndex==o&&(b.rowIndex=0),b.endTime=i+p*d,b}function n(a){return a.endTime}function o(a){return a.processedRows}function p(a){return 0==a.rowIndex}return{playPattern:m,getPatternEndTime:n,getProcessedRows:o,isFinished:p,muteChannel:i,unmuteChannel:j,stopPlayingImmediately:k}}}(window.mp),function(a){"use strict";a.sample=function(a,b){function c(){if(null==o)return null;var b=a.createBufferSource();if(b.buffer=o,0!=n){var c=o.duration;b.loop=!0,b.loopStart=m/h*c,b.loopEnd=(m+n)/h*c}return b}function d(){return l}function e(){return b.volume}function f(){return b.panning}function g(a){return a/h*o.duration}var h,i=8363,j=22050,k=j>i?j:i,l=i/k,m=b.loopStart,n=b.loopLength,o=null,p=b.relnote;p>=128&&(p-=256);var q=b.finetune;q>=128&&(q-=256),l*=Math.pow(2,p/12),l*=Math.pow(2,q/128/12);var r=b.data;h=r.length,o=a.createBuffer(1,h,k);for(var s=o.getChannelData(0),t=b.is16?32768:128,u=0;h>u;++u)s[u]=r[u]/t;return{createSampleSourceNode:c,getBasePlaybackRate:d,getBaseVolume:e,getBasePanning:f,getSampleOffsetInSeconds:g}}}(window.mp);