From c8660bf92bd51de6ca2cd34a2681e61e99478335 Mon Sep 17 00:00:00 2001 From: Timothy Farrell Date: Mon, 10 May 2021 11:22:09 -0500 Subject: [PATCH] The last of the danielx.net assets and references --- assets/raccoon.png | Bin 0 -> 1100 bytes fonts/chicago.woff | Bin 0 -> 25056 bytes index.html | 27 ++-- lame-worker.js | 335 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 345 insertions(+), 17 deletions(-) create mode 100644 assets/raccoon.png create mode 100644 fonts/chicago.woff create mode 100644 lame-worker.js diff --git a/assets/raccoon.png b/assets/raccoon.png new file mode 100644 index 0000000000000000000000000000000000000000..49ae440865679eb7764e199f7c1c09df784a86b5 GIT binary patch literal 1100 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

up0+Gm?Fjt01zvkT76WD5zJ;1cLZ= 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 z0RR913;+NC761SM0ssL30Ra{O0RRL50006200000000310002hq$daf0001@*Vljm K0001^-yT){nfC+$ literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 5f6b409..85583f2 100755 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ Mario Paint Music Composer - danielx.net - + @@ -43,7 +43,7 @@ "content": "Gist = require \"./lib/legacy/gist\"\nDrop = require \"./lib/drop\"\nReadFile = require \"./lib/read-file\"\nMidi2Composer = require \"./lib/midi2composer\"\n\nPublishTemplate = require \"./templates/publish\"\nclipboardCopy = require \"./lib/clipboard-copy\"\n\n{Modal, Progress} = system.ui\n\npublishView = Progress\n message: \"Publishing...\"\n\nmodule.exports = (I={}, self) ->\n # Autoload from location hash\n defaults I,\n unsaved: false\n\n self.attrAccessor \"unsaved\"\n\n jsonFromFile = (file) ->\n if file.type.match /^audio\\/mid/\n if self.purchased()\n file.readAsArrayBuffer()\n .then (buffer) ->\n Midi2Composer new Uint8Array(buffer)\n else\n # Display Purchase Modal\n self.purchase()\n Promise.reject(\"Only full version can import MIDI\")\n else\n file.readAsJSON()\n\n Drop document.documentElement, (files) ->\n Promise.all Array::map.call files, (file) ->\n jsonFromFile(file)\n .catch -> null\n .then (readFiles) ->\n json = readFiles.filter((f) -> !!f)[0]\n\n if json\n self.fromJSON(json)\n\n fileInput = ReadFile\n accept: \".dxc,.mid,audio/mid,.midi,audio/midi\"\n change: (file) ->\n jsonFromFile(file)\n .then self.fromJSON\n .then ->\n Modal.hide()\n .catch console.error\n\n fileInput.style.display = \"none\"\n document.body.appendChild fileInput\n\n # NOTE: Track `prompted` so in an iframe it won't trigger twice\n prompted = false\n unloadHandler = (e) ->\n return if prompted\n prompted = true\n setTimeout ->\n prompted = false\n\n if self.unsaved()\n e.returnValue = \"Your changes haven't yet been saved. If you leave now you will lose your work.\"\n\n return e.returnValue\n window.addEventListener \"beforeunload\", unloadHandler\n\n setTimeout ->\n if hash = location.hash\n self.loadFromSlug hash.substr(1)\n , 0\n\n self.extend\n saveAs: ->\n Modal.prompt \"Name\"\n .then (name) ->\n return unless name\n data = self.song().toJSON()\n localStorage[\"songs_#{name}\"] = JSON.stringify data\n self.unsaved false\n\n saveFile: ->\n Modal.prompt \"Name\", \"untitled\", \"Save Song\"\n .then (name) ->\n return unless name\n\n blob = new Blob [JSON.stringify self.song().toJSON()],\n type: \"application/json\"\n\n blob.download(\"#{name}.dxc\")\n self.unsaved false\n\n openFile: ->\n fileInput.click()\n\n loadFromSlug: (slug) ->\n Promise.resolve()\n .then ->\n if slug.match /^api-/\n self.loadAPIData(slug.substr(4))\n else if slug\n self.loadGist slug\n\n loadURL: (url) ->\n fetch(url)\n .then (result) ->\n result.json()\n .then self.fromJSON\n\n loadFromURLString: ->\n Modal.prompt \"Paste shareable URL here:\", \"https://danielx.net/composer/#api-4IuXACKoqtSke9jTAThC5I_eWc4me53ze-1cri-L8kE\", \"Load from URL\"\n .then (url) ->\n return unless url\n if url.indexOf(\"#\")\n [_, slug] = url.split(\"#\")\n self.loadFromSlug(slug)\n else\n self.loadURL(url)\n\n loadDemo: ->\n self.confirmUnsaved()\n .then ->\n Modal.hide()\n self.fromJSON(require(\"./data/demo\"))\n\n loadLocalStorage: ->\n Modal.prompt \"Name\"\n .then (name) ->\n return unless name\n\n if name\n self.fromJSON JSON.parse localStorage[\"songs_#{name}\"] \n\n getState: ->\n JSON.parse JSON.stringify self.song().toJSON()\n\n restoreState: (data) ->\n self.song().fromJSON(JSON.parse JSON.stringify data)\n self.rerenderNotes()\n\n # Returns a promise that resolves if there are no unsaved changes or the\n # the user confirms they are willing to lose unsaved changes.\n confirmUnsaved: ->\n Promise.resolve()\n .then ->\n if self.unsaved()\n Modal.confirm \"If you continue your changes will be lost!\", \"Unsaved changes!\"\n .then (confirmed) ->\n return Promise.reject() unless confirmed\n\n fromJSON: (data) ->\n self.confirmUnsaved()\n .then ->\n self._fromJSON(data)\n\n _fromJSON: (data) ->\n self.song().fromJSON(data)\n\n self.reset()\n self.rerenderNotes()\n\n removeUnloadHandler: ->\n window.removeEventListener \"beforeunload\", unloadHandler\n\n publish: ->\n Modal.show publishView.element,\n cancellable: false\n\n fetch \"https://api.danielx.net/composer\",\n method: 'POST'\n body: JSON.stringify(self.song())\n headers:\n 'Content-Type': 'text/plain'\n .then (res) -> res.json()\n .then (id) ->\n url = \"https://danielx.net/composer/#api-#{id}\"\n\n try\n history.replaceState({}, \"\", url)\n catch e\n console.warn e\n\n Modal.show PublishTemplate(\n value: url\n status: Observable \"\"\n copy: ->\n clipboardCopy(url)\n @status \"Copied!\"\n done: ->\n Modal.hide()\n ),\n cancellable: false\n .catch (e) ->\n console.warn e\n Modal.hide()\n\n loadAPIData: (id) ->\n fetch \"https://api.danielx.net/composer/data/#{id}\",\n method: 'GET'\n headers:\n 'Content-Type': 'text/plain'\n .then (res) -> res.json()\n .then (data) ->\n self.fromJSON(data)\n location.hash = \"api-\" + id\n\n # Load legacy format songs from when we could save them as anonymous Github\n # gists.\n loadGist: (id) ->\n Gist.load(id).then (data) ->\n self.fromJSON(data)\n location.hash = id\n , ->\n Modal.alert \"Couldn't load gist with id: #{id}\"\n\n loadGistPrompt: ->\n if id = prompt \"Gist id\", location.hash.substr(1) || \"0b4c4656a6eb1d246829\"\n self.loadGist(id)\n\n" }, "pixie.cson": { - "content": "title: \"Mario Paint Music Composer - danielx.net\"\ndescription: \"\"\"\nThis Mario Paint inspired composer tool is easy and fun. You can create simple\nand beautiful songs right in your browser and share them with the world!\n\"\"\"\niconURL: \"https://danielx.net/composer/images/raccoon.png\"\nversion: \"0.4.7\"\npublishPath: \"/My Briefcase/public/danielx.net/\"\nname: \"composer\"\ndependencies:\n \"!system\": \"https://danielx.net/system/0.5.0-pre.4.json\"\nremoteDependencies: [\n \"https://js.stripe.com/v3/\"\n]\nwidth: 1024\nheight: 960\nsandbox: \"allow-same-origin allow-modals allow-forms allow-pointer-lock allow-popups allow-scripts allow-popups-to-escape-sandbox midi\"\ncognito: # Whimsy.space 'My Briefcase'\n identityPoolId: 'us-east-1:4fe22da5-bb5e-4a78-a260-74ae0a140bf9'\n poolData:\n UserPoolId : 'us-east-1_cfvrlBLXG'\n ClientId : '3fd84r6idec9iork4e9l43mp61'\n bucket: \"whimsy-fs\"\nmanifest:\n name: \"DanielX.net Paint Composer\"\n short_name: \"Composer\"\n display: \"standalone\"\n start_url: \".\"\n scope: \"./\"\n icons: [ {\n \"src\": \"https://danielx.net/composer/images/raccoon.png\",\n \"sizes\": \"48x48\"\n\t}, {\n \"src\": \"https://danielx.net/composer/icon256.png\",\n \"sizes\": \"256x256\"\n\t} ]\nserviceWorker: \"service-worker\"\n" + "content": "title: \"Mario Paint Music Composer - danielx.net\"\ndescription: \"\"\"\nThis Mario Paint inspired composer tool is easy and fun. You can create simple\nand beautiful songs right in your browser and share them with the world!\n\"\"\"\niconURL: \"assets/images/raccoon.png\"\nversion: \"0.4.7\"\npublishPath: \"/My Briefcase/public/danielx.net/\"\nname: \"composer\"\ndependencies:\n \"!system\": \"https://danielx.net/system/0.5.0-pre.4.json\"\nremoteDependencies: [\n \"https://js.stripe.com/v3/\"\n]\nwidth: 1024\nheight: 960\nsandbox: \"allow-same-origin allow-modals allow-forms allow-pointer-lock allow-popups allow-scripts allow-popups-to-escape-sandbox midi\"\ncognito: # Whimsy.space 'My Briefcase'\n identityPoolId: 'us-east-1:4fe22da5-bb5e-4a78-a260-74ae0a140bf9'\n poolData:\n UserPoolId : 'us-east-1_cfvrlBLXG'\n ClientId : '3fd84r6idec9iork4e9l43mp61'\n bucket: \"whimsy-fs\"\nmanifest:\n name: \"DanielX.net Paint Composer\"\n short_name: \"Composer\"\n display: \"standalone\"\n start_url: \".\"\n scope: \"./\"\n icons: [ {\n \"src\": \"assets/images/raccoon.png\",\n \"sizes\": \"48x48\"\n\t}, {\n \"src\": \"https://danielx.net/composer/icon256.png\",\n \"sizes\": \"256x256\"\n\t} ]\n" }, "player-audio.coffee": { "content": "###\nPlayer Audio\n============\n\nMain audio loop\n\nNeeds tempo, playable, start beat, end beat, looping mode to play.\n\nProvides playTime and playing methods.\n###\n\n{Progress, Modal, Style} = system.ui\n\n# Safari uses webkit prefix.\nOfflineAudioContext = window.OfflineAudioContext or window.webkitOfflineAudioContext\n\nliveContext = require(\"./lib/audio-context\")\nEncoder = require \"./lib/encoder/index\"\n{quantize, staffNoteToPitch} = require \"./lib/util\"\n{limiter, stereoAnalyser} = FX = require(\"./lib/fx\")\n\nFXNetwork = (destination) ->\n {context} = destination\n gain = context.createGain()\n gain.connect destination\n\n fx = FX.choices.reduce (o, name) ->\n o[name] = FX[name] gain\n return o\n , {}\n\n default: gain\n fx: fx\n dispose: ->\n {currentTime} = context\n gain.gain.exponentialRampToValueAtTime 0.001, 0.1 + currentTime\n gain.gain.setValueAtTime 0, 0.1 + currentTime\n\n setTimeout ->\n gain.disconnect()\n , 0.25\n\nmodule.exports = (I, self) ->\n playTime = 0 # beats\n secondsPerMinute = 60 # unitless\n lastContextTime = 0\n lastQueuedBeat = 0\n lookahead = 0.1 # seconds\n toBeat = null\n wrapping = false\n\n self.attrObservable \"playing\"\n\n # The destination for 'live audio' goes to the analyser node then the speakers.\n # We add a hard limiter on right before the analyser and output.\n self.analysedDestination = analysedDestination = stereoAnalyser liveContext.destination\n liveDestination = limiter analysedDestination\n\n # FX Networks are disposable so we can fade out when stopping / restarting\n activeDestination = FXNetwork(liveDestination)\n\n # Need more lookahead to play when window loses focus and request animation frame\n # gets sparser\n document.addEventListener \"visibilitychange\", (e) ->\n if document.hidden\n lookahead = 1.25\n else\n lookahead = 0.1\n bufferAudio()\n\n initPlay = ->\n {context} = liveDestination\n\n context.resume()\n lastContextTime = context.currentTime\n lastQueuedBeat = playTime\n wrapping = false\n\n # playTime in beats\n # elapsedSeconds in seconds\n computeElapsedBeats = (playTime, elapsedSeconds) ->\n if playTime >= self.length()\n playTime -= self.length()\n\n [section, beatsLeft] = self.sectionAt(playTime)\n _bps = section.tempo() / 60\n\n beats = elapsedSeconds * _bps\n\n if beats > beatsLeft\n beatsLeft + computeElapsedBeats playTime + beatsLeft, elapsedSeconds - beatsLeft / _bps\n else\n beats\n\n # Schedules upcoming sounds to play\n playUpcomingSounds = (currentBeat, fromBeat, toBeat) ->\n dt = toBeat - fromBeat\n return if dt <=0\n\n self.upcomingNotes fromBeat, dt, ([beat, staffNote, accidental, instrument], section, s) ->\n pitch = staffNoteToPitch(staffNote, accidental, section.keySignature())\n\n # Play in FX destination for section\n self.playNote instrument, pitch, s, activeDestination.fx[section.presetName()]\n , currentBeat\n\n # beats per second\n bps = ->\n self.tempo() / secondsPerMinute\n\n # Buffer audio to the output device\n # The challenge is that the playhead needs to accurately track where we are in\n # beats, according to the context currentTime, but we need to buffer ahead so\n # we can properly time all the upcoming notes.\n #\n # There is one more tricky part where we wrap around. Even when not wrapping\n # the bufferd region shouldn't grow but the playhead should still advance\n # until done.\n #\n # Multi-section makes this even more tricky!\n bufferAudio = ->\n if self.playing()\n length = self.length()\n return if length < 1 or isNaN(length)\n\n {context} = liveDestination\n {currentTime} = context\n\n dt = currentTime - lastContextTime # seconds\n return if dt is 0\n lastContextTime = currentTime\n\n elapsedBeats = computeElapsedBeats playTime, dt\n self.animateNoteElements(playTime, elapsedBeats)\n playTime += elapsedBeats\n\n toBeat = playTime + computeElapsedBeats playTime, lookahead\n\n # We're continuing to wrap around until playTime loops\n if wrapping\n toBeat -= length\n playUpcomingSounds(playTime - length, lastQueuedBeat, toBeat)\n\n else\n # Enqueue sounds within the upcoming window since last queued beat\n playUpcomingSounds(playTime, lastQueuedBeat, toBeat)\n\n if toBeat >= length and self.loop()\n wrapping = true\n toBeat -= length\n lastQueuedBeat = 0\n playUpcomingSounds(playTime - length, lastQueuedBeat, toBeat)\n\n # Sometimes the toBeat could be less (we reduce the lookahead when focusing\n # the window, so only adjust it forward so we don't double buffer notes.\n lastQueuedBeat = Math.max lastQueuedBeat, toBeat\n\n if playTime >= length\n # Once playtime catches up to the end we're no longer wrapping\n wrapping = false\n if self.loop()\n playTime -= length\n self.animateNoteElements(0, playTime)\n else\n playTime = 0\n self.playing false\n\n # Set active section based on playTime\n self.activeSection self.sectionAt(playTime)[0]\n\n return\n\n setInterval ->\n bufferAudio()\n , 1000 / 120\n\n animBuffer = ->\n requestAnimationFrame animBuffer\n bufferAudio()\n animBuffer()\n\n self.extend\n exportSong: (song, opts={}) ->\n {name, type} = opts\n\n name ?= \"song\"\n type ?= \"mp3\"\n\n extension = \".#{type}\"\n\n progressView = Progress\n message: \"Rendering Audio...\"\n\n Modal.show progressView.element,\n cancellable: false\n\n cleanup = ->\n Modal.hide()\n\n err = (fn) ->\n (e) ->\n fn()\n throw e\n\n # Length total of all sections in beats\n songLength = song.length()\n\n audioChannels = 2\n samplesPerSecond = 44100\n # Export duration trims empty measures on last section\n lengthInSeconds = song.exportDuration()\n offlineContext = new OfflineAudioContext(audioChannels, samplesPerSecond * lengthInSeconds, samplesPerSecond)\n offlineFxNetwork = FXNetwork limiter offlineContext.destination\n\n new Promise (resolve, reject) ->\n t = 0 # beats\n dt = 1 # beats\n\n work = ->\n song.upcomingNotes t, dt, ([beat, staffNote, accidental, instrument], section, s) ->\n presetName = section.presetName()\n keySig = section.keySignature()\n note = staffNoteToPitch(staffNote, accidental, keySig)\n\n self.playNote instrument, note, s, offlineFxNetwork.fx[presetName]\n , 0\n\n t += dt\n\n if t <= songLength\n setTimeout work, 0\n else\n p = offlineContext.startRendering()\n\n if p\n p.then(resolve, reject)\n else\n # Safari doesn't support the Promise version yet\n offlineContext.oncomplete = ({renderedBuffer}) ->\n resolve renderedBuffer\n # There is no `onerror` event\n\n return\n\n work()\n return\n\n .then (audioBuffer) ->\n if type is \"mp3\"\n progressView.message \"Encoding mp3...\"\n Encoder.audioBufferToMP3(audioBuffer)\n else\n progressView.message \"Encoding wav...\"\n Encoder.audioBufferToWav(audioBuffer)\n .then (blob) ->\n blob.download name + extension\n .then cleanup, err cleanup\n\n # TODO: Think about how to connect these note events into audio networks fx, etc.\n # Schedule a note to be played, use the buffer at the given index, pitch shift by\n # `note` semitones, and play at `time` seconds in the future.\n playNote: (instrumentId, note=0, time=0, dest) ->\n dest ?= activeDestination.fx[self.presetName()] or liveDestination\n {context} = dest\n sample = self.samples()[instrumentId].I\n\n if sample\n {buffer, pitchShift, pan, volume} = sample\n note += pitchShift\n\n # Add panner node, this also forces mono-samples to stereo\n # FUTURE: iOS doesn't support createStereoPanner yet\n panner = context.createPanner()\n panner.panningModel = 'equalpower'\n panner.setPosition(pan, 0, 1 - Math.abs(pan))\n\n gain = context.createGain()\n gain.gain.value = volume\n\n rate = Math.pow 2, note / 12\n source = self.playBuffer(buffer, rate, time, panner)\n\n panner.connect gain\n gain.connect dest\n\n source.onended = ->\n gain.disconnect()\n\n # Plays a buffer directly into the live audio context destination or the\n # given destination. Rate and time are given to shift pitch and start time.\n # time is in seconds relative to the currentTime of the destination's\n # context.\n #\n # This is used for the 'eraser' sound effect.\n # time is in seconds, must be >= 0\n playBuffer: (buffer, rate=1, time=0, dest=liveDestination) ->\n {context} = dest\n\n # sometimes time comes in very slightly negative o_o, maybe a rounding error?\n # Audio context throws an error if start is called with a negative argument\n unless time >= 0\n time = 0\n\n source = context.createBufferSource()\n source.buffer = buffer\n source.connect(dest or context.destination)\n source.start(time + context.currentTime)\n source.playbackRate.value = rate\n\n return source\n\n # Adjust playhead by dt beats, centering the scroll on it quantized to `q`\n adjustPlayhead: (dt, q=0) ->\n self.setPlayHead quantize playTime + dt, q\n self.recenterPlayhead()\n\n # Sets playhead cursor to the `t` in beats, clamping to song length\n # t in beats\n setPlayHead: (t) ->\n return if self.playing()\n\n # Needs to be < length otherwise section is undefined\n playTime = Math.min self.length() - 0.00001, Math.max t, 0\n self.activeSection self.sectionAt(playTime)[0]\n\n return playTime\n\n bufferTo: ->\n toBeat\n \n lastQueuedBeat: ->\n lastQueuedBeat\n\n playTime: ->\n playTime\n\n playFromStart: ->\n if self.playing()\n self.stop()\n else\n playTime = 0\n self.playing true\n\n initPlay()\n\n pause: ->\n if self.playing()\n self.stop()\n else\n self.playing true\n initPlay()\n\n play: ->\n self.pause()\n\n stop: ->\n self.playing false\n # Quick fade\n activeDestination.dispose()\n activeDestination = FXNetwork(liveDestination)\n\n rewind: ->\n self.stop()\n playTime = 0\n self.scrollTo(0)\n\n reset: ->\n self.stop()\n playTime = 0\n self.activeSection self.sections()[0]\n" @@ -426,9 +426,6 @@ "data/templates/slider.coffee": { "content": "" }, - "service-worker.coffee": { - "content": "cacheName = 'files'\r\n\r\n# Try the network, fall back to cached\r\naddEventListener 'fetch', (event) ->\r\n request = event.request\r\n\r\n return unless request.method is 'GET'\r\n\r\n event.respondWith(\r\n caches.open(cacheName)\r\n .then (cache) ->\r\n fetch(request)\r\n .then (response) ->\r\n cache.put request, response.clone()\r\n \r\n return response\r\n .catch ->\r\n cache.match request\r\n )\r\n\r\n return\r\n\r\naddEventListener 'install', (event) ->\r\n event.waitUntil caches.open(cacheName).then (cache) ->\r\n cache.addAll [\r\n '.'\r\n '/composer/lame-worker2.js'\r\n ]\r\n" - }, "templates/persistence.jadelet": { "content": "section.persistence\n button(click=@showDemoSongPicker) Load a demo song\n button(click=@saveFile) Save to disk\n button(click=@openFile) Load from disk\n button(click=@publish) Publish to a shareable URL\n button(click=@loadFromURLString) Load from URL\n button(click=@exportAudio) Export to .wav or .mp3\n" }, @@ -559,7 +556,7 @@ "content": "\n/*\nHandle drop events. Will be replaced by system app drop event handling.\n\nStatus: Deprecated.\n */\nvar Drop, stopFn;\n\nstopFn = function(event, handler) {\n event.stopPropagation();\n event.preventDefault();\n return false;\n};\n\nDrop = function(el, handler) {\n el = document.documentElement;\n el.addEventListener(\"dragenter\", stopFn);\n el.addEventListener(\"dragover\", stopFn);\n el.addEventListener(\"dragleave\", stopFn);\n return el.addEventListener(\"drop\", function(event) {\n stopFn(event);\n return handler(event.dataTransfer.files);\n });\n};\n\nmodule.exports = Drop;\n" }, "lib/encoder/index": { - "content": "\n/*\nEncode web audio buffer data in a variety of formats. Handles both stereo and\nmono.\n\nMP3, WAV\n\nUse web workers where appropriate.\n\nStatus: Acceptable\n */\nvar audioBufferToChannelData, audioBufferToMP3, audioBufferToWav, audioChannelDataToInt16, fnToWorker, mp3Encode, remoteWorker;\n\nmp3Encode = function(data) {\n return remoteWorker(\"https://danielx.net/composer/lame-worker2.js\").then(function(worker) {\n return new Promise(function(resolve, reject) {\n worker.postMessage(data);\n return worker.onmessage = function(e) {\n return resolve(e.data);\n };\n });\n });\n};\n\nremoteWorker = function(url) {\n return fetch(url).then(function(response) {\n return response.arrayBuffer();\n }).then(function(buffer) {\n var blob;\n blob = new Blob([buffer], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n }).then(function(url) {\n return new Worker(url);\n });\n};\n\naudioBufferToChannelData = function(audioBuffer) {\n var channels;\n channels = audioBuffer.numberOfChannels;\n if (channels === 2) {\n return [audioBuffer.getChannelData(0), audioBuffer.getChannelData(1)];\n } else {\n return [audioBuffer.getChannelData(0)];\n }\n};\n\naudioChannelDataToInt16 = function(buffer) {\n var bufferLength, data, i, max, min, sample;\n min = Math.min, max = Math.max;\n bufferLength = buffer.length;\n data = new Int16Array(bufferLength);\n i = 0;\n while (i < bufferLength) {\n sample = max(-1, min(1, buffer[i]));\n if (sample < 0) {\n sample *= 0x8000;\n } else {\n sample *= 0x7FFF;\n }\n data[i] = sample;\n i++;\n }\n return data;\n};\n\naudioBufferToMP3 = function(audioBuffer) {\n var bufferWorker;\n if (!audioBuffer) {\n throw new Error(\"Must pass an AudioBuffer to encode .mp3\");\n }\n bufferWorker = fnToWorker(audioChannelDataToInt16);\n return Promise.all(audioBufferToChannelData(audioBuffer).map(function(channelBuffer) {\n return bufferWorker(channelBuffer);\n })).then(function(channelData) {\n return mp3Encode({\n channelData: channelData\n });\n });\n};\n\naudioBufferToWav = function(audioBuffer) {\n if (!audioBuffer) {\n throw new Error(\"Must pass an AudioBuffer to encode .wav\");\n }\n return new Promise(function(resolve, reject) {\n var url, worker, workerSource;\n workerSource = new Blob([PACKAGE.distribution[\"lib/encoder/wave-worker\"].content], {\n type: \"application/javascript\"\n });\n url = URL.createObjectURL(workerSource);\n worker = new Worker(url);\n worker.onmessage = function(e) {\n resolve(new Blob([e.data.buffer], {\n type: \"audio/wav\"\n }));\n return URL.revokeObjectURL(url);\n };\n return worker.postMessage({\n pcmArrays: audioBufferToChannelData(audioBuffer),\n config: {\n sampleRate: audioBuffer.sampleRate\n }\n });\n });\n};\n\nfnToWorker = function(fn) {\n return function(data) {\n return new Promise(function(resolve, reject) {\n var url, worker, workerSource;\n workerSource = new Blob([\"self.onmessage = function (e) {\\n self.postMessage((\" + (fn.toString()) + \")(e.data));\\n self.close();\\n};\"], {\n type: \"application/javascript\"\n });\n url = URL.createObjectURL(workerSource);\n worker = new Worker(url);\n worker.onmessage = function(e) {\n resolve(e.data);\n return URL.revokeObjectURL(url);\n };\n return worker.postMessage(data);\n });\n };\n};\n\nmodule.exports = {\n mp3Encode: mp3Encode,\n audioBufferToMP3: audioBufferToMP3,\n audioBufferToWav: audioBufferToWav,\n audioChannelDataToInt16: audioChannelDataToInt16,\n fnToWorker: fnToWorker\n};\n" + "content": "\n/*\nEncode web audio buffer data in a variety of formats. Handles both stereo and\nmono.\n\nMP3, WAV\n\nUse web workers where appropriate.\n\nStatus: Acceptable\n */\nvar audioBufferToChannelData, audioBufferToMP3, audioBufferToWav, audioChannelDataToInt16, fnToWorker, mp3Encode, remoteWorker;\n\nmp3Encode = function(data) {\n return remoteWorker(\"lame-worker2.js\").then(function(worker) {\n return new Promise(function(resolve, reject) {\n worker.postMessage(data);\n return worker.onmessage = function(e) {\n return resolve(e.data);\n };\n });\n });\n};\n\nremoteWorker = function(url) {\n return fetch(url).then(function(response) {\n return response.arrayBuffer();\n }).then(function(buffer) {\n var blob;\n blob = new Blob([buffer], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n }).then(function(url) {\n return new Worker(url);\n });\n};\n\naudioBufferToChannelData = function(audioBuffer) {\n var channels;\n channels = audioBuffer.numberOfChannels;\n if (channels === 2) {\n return [audioBuffer.getChannelData(0), audioBuffer.getChannelData(1)];\n } else {\n return [audioBuffer.getChannelData(0)];\n }\n};\n\naudioChannelDataToInt16 = function(buffer) {\n var bufferLength, data, i, max, min, sample;\n min = Math.min, max = Math.max;\n bufferLength = buffer.length;\n data = new Int16Array(bufferLength);\n i = 0;\n while (i < bufferLength) {\n sample = max(-1, min(1, buffer[i]));\n if (sample < 0) {\n sample *= 0x8000;\n } else {\n sample *= 0x7FFF;\n }\n data[i] = sample;\n i++;\n }\n return data;\n};\n\naudioBufferToMP3 = function(audioBuffer) {\n var bufferWorker;\n if (!audioBuffer) {\n throw new Error(\"Must pass an AudioBuffer to encode .mp3\");\n }\n bufferWorker = fnToWorker(audioChannelDataToInt16);\n return Promise.all(audioBufferToChannelData(audioBuffer).map(function(channelBuffer) {\n return bufferWorker(channelBuffer);\n })).then(function(channelData) {\n return mp3Encode({\n channelData: channelData\n });\n });\n};\n\naudioBufferToWav = function(audioBuffer) {\n if (!audioBuffer) {\n throw new Error(\"Must pass an AudioBuffer to encode .wav\");\n }\n return new Promise(function(resolve, reject) {\n var url, worker, workerSource;\n workerSource = new Blob([PACKAGE.distribution[\"lib/encoder/wave-worker\"].content], {\n type: \"application/javascript\"\n });\n url = URL.createObjectURL(workerSource);\n worker = new Worker(url);\n worker.onmessage = function(e) {\n resolve(new Blob([e.data.buffer], {\n type: \"audio/wav\"\n }));\n return URL.revokeObjectURL(url);\n };\n return worker.postMessage({\n pcmArrays: audioBufferToChannelData(audioBuffer),\n config: {\n sampleRate: audioBuffer.sampleRate\n }\n });\n });\n};\n\nfnToWorker = function(fn) {\n return function(data) {\n return new Promise(function(resolve, reject) {\n var url, worker, workerSource;\n workerSource = new Blob([\"self.onmessage = function (e) {\\n self.postMessage((\" + (fn.toString()) + \")(e.data));\\n self.close();\\n};\"], {\n type: \"application/javascript\"\n });\n url = URL.createObjectURL(workerSource);\n worker = new Worker(url);\n worker.onmessage = function(e) {\n resolve(e.data);\n return URL.revokeObjectURL(url);\n };\n return worker.postMessage(data);\n });\n };\n};\n\nmodule.exports = {\n mp3Encode: mp3Encode,\n audioBufferToMP3: audioBufferToMP3,\n audioBufferToWav: audioBufferToWav,\n audioChannelDataToInt16: audioChannelDataToInt16,\n fnToWorker: fnToWorker\n};\n" }, "lib/encoder/wave-worker": { "content": "// https://stackoverflow.com/a/42632646/68210\r\n\r\nself.onmessage = function( e ){\r\n var wavPCM = new WavePCM( e['data']['config'] );\r\n wavPCM.record( e['data']['pcmArrays'] );\r\n wavPCM.requestData();\r\n};\r\n\r\nvar WavePCM = function( config ){\r\n this.sampleRate = config['sampleRate'] || 48000;\r\n this.bitDepth = config['bitDepth'] || 16;\r\n this.recordedBuffers = [];\r\n this.bytesPerSample = this.bitDepth / 8;\r\n};\r\n\r\nWavePCM.prototype.record = function( buffers ){\r\n this.numberOfChannels = this.numberOfChannels || buffers.length;\r\n var bufferLength = buffers[0].length;\r\n var reducedData = new Uint8Array( bufferLength * this.numberOfChannels * this.bytesPerSample );\r\n\r\n // Interleave\r\n for ( var i = 0; i < bufferLength; i++ ) {\r\n for ( var channel = 0; channel < this.numberOfChannels; channel++ ) {\r\n\r\n var outputIndex = ( i * this.numberOfChannels + channel ) * this.bytesPerSample;\r\n var sample = buffers[ channel ][ i ];\r\n\r\n // Check for clipping\r\n if ( sample > 1 ) {\r\n sample = 1;\r\n }\r\n\r\n else if ( sample < -1 ) {\r\n sample = -1;\r\n }\r\n\r\n // bit reduce and convert to uInt\r\n switch ( this.bytesPerSample ) {\r\n case 4:\r\n sample = sample * 2147483648;\r\n reducedData[ outputIndex ] = sample;\r\n reducedData[ outputIndex + 1 ] = sample >> 8;\r\n reducedData[ outputIndex + 2 ] = sample >> 16;\r\n reducedData[ outputIndex + 3 ] = sample >> 24;\r\n break;\r\n\r\n case 3:\r\n sample = sample * 8388608;\r\n reducedData[ outputIndex ] = sample;\r\n reducedData[ outputIndex + 1 ] = sample >> 8;\r\n reducedData[ outputIndex + 2 ] = sample >> 16;\r\n break;\r\n\r\n case 2:\r\n sample = sample * 32768;\r\n reducedData[ outputIndex ] = sample;\r\n reducedData[ outputIndex + 1 ] = sample >> 8;\r\n break;\r\n\r\n case 1:\r\n reducedData[ outputIndex ] = ( sample + 1 ) * 128;\r\n break;\r\n\r\n default:\r\n throw \"Only 8, 16, 24 and 32 bits per sample are supported\";\r\n }\r\n }\r\n }\r\n\r\n this.recordedBuffers.push( reducedData );\r\n};\r\n\r\nWavePCM.prototype.requestData = function(){\r\n var bufferLength = this.recordedBuffers[0].length;\r\n var dataLength = this.recordedBuffers.length * bufferLength;\r\n var headerLength = 44;\r\n var wav = new Uint8Array( headerLength + dataLength );\r\n var view = new DataView( wav.buffer );\r\n\r\n view.setUint32( 0, 1380533830, false ); // RIFF identifier 'RIFF'\r\n view.setUint32( 4, 36 + dataLength, true ); // file length minus RIFF identifier length and file description length\r\n view.setUint32( 8, 1463899717, false ); // RIFF type 'WAVE'\r\n view.setUint32( 12, 1718449184, false ); // format chunk identifier 'fmt '\r\n view.setUint32( 16, 16, true ); // format chunk length\r\n view.setUint16( 20, 1, true ); // sample format (raw)\r\n view.setUint16( 22, this.numberOfChannels, true ); // channel count\r\n view.setUint32( 24, this.sampleRate, true ); // sample rate\r\n view.setUint32( 28, this.sampleRate * this.bytesPerSample * this.numberOfChannels, true ); // byte rate (sample rate * block align)\r\n view.setUint16( 32, this.bytesPerSample * this.numberOfChannels, true ); // block align (channel count * bytes per sample)\r\n view.setUint16( 34, this.bitDepth, true ); // bits per sample\r\n view.setUint32( 36, 1684108385, false); // data chunk identifier 'data'\r\n view.setUint32( 40, dataLength, true ); // data chunk length\r\n\r\n for (var i = 0; i < this.recordedBuffers.length; i++ ) {\r\n wav.set( this.recordedBuffers[i], i * bufferLength + headerLength );\r\n }\r\n\r\n self.postMessage( wav, [wav.buffer] );\r\n self.close();\r\n};\n" @@ -592,7 +589,7 @@ "content": "/* mousetrap v1.6.3 craig.is/killing/mice */\r\n(function(q,u,c){function v(a,b,g){a.addEventListener?a.addEventListener(b,g,!1):a.attachEvent(\"on\"+b,g)}function z(a){if(\"keypress\"==a.type){var b=String.fromCharCode(a.which);a.shiftKey||(b=b.toLowerCase());return b}return n[a.which]?n[a.which]:r[a.which]?r[a.which]:String.fromCharCode(a.which).toLowerCase()}function F(a){var b=[];a.shiftKey&&b.push(\"shift\");a.altKey&&b.push(\"alt\");a.ctrlKey&&b.push(\"ctrl\");a.metaKey&&b.push(\"meta\");return b}function w(a){return\"shift\"==a||\"ctrl\"==a||\"alt\"==a||\r\n\"meta\"==a}function A(a,b){var g,d=[];var e=a;\"+\"===e?e=[\"+\"]:(e=e.replace(/\\+{2}/g,\"+plus\"),e=e.split(\"+\"));for(g=0;gc||n.hasOwnProperty(c)&&(p[n[c]]=c)}g=p[e]?\"keydown\":\"keypress\"}\"keypress\"==g&&d.length&&(g=\"keydown\");return{key:m,modifiers:d,action:g}}function D(a,b){return null===a||a===u?!1:a===b?!0:D(a.parentNode,b)}function d(a){function b(a){a=\r\na||{};var b=!1,l;for(l in p)a[l]?b=!0:p[l]=0;b||(x=!1)}function g(a,b,t,f,g,d){var l,E=[],h=t.type;if(!k._callbacks[a])return[];\"keyup\"==h&&w(a)&&(b=[a]);for(l=0;l\":\".\",\"?\":\"/\",\"|\":\"\\\\\"},B={option:\"alt\",command:\"meta\",\"return\":\"enter\",\r\nescape:\"esc\",plus:\"+\",mod:/Mac|iPod|iPhone|iPad/.test(navigator.platform)?\"meta\":\"ctrl\"},p;for(c=1;20>c;++c)n[111+c]=\"f\"+c;for(c=0;9>=c;++c)n[c+96]=c.toString();d.prototype.bind=function(a,b,c){a=a instanceof Array?a:[a];this._bindMultiple.call(this,a,b,c);return this};d.prototype.unbind=function(a,b){return this.bind.call(this,a,function(){},b)};d.prototype.trigger=function(a,b){if(this._directMap[a+\":\"+b])this._directMap[a+\":\"+b]({},a);return this};d.prototype.reset=function(){this._callbacks={};\r\nthis._directMap={};return this};d.prototype.stopCallback=function(a,b){if(-1<(\" \"+b.className+\" \").indexOf(\" mousetrap \")||D(b,this.target))return!1;if(\"composedPath\"in a&&\"function\"===typeof a.composedPath){var c=a.composedPath()[0];c!==a.target&&(b=c)}return\"INPUT\"==b.tagName||\"SELECT\"==b.tagName||\"TEXTAREA\"==b.tagName||b.isContentEditable};d.prototype.handleKey=function(){return this._handleKey.apply(this,arguments)};d.addKeycodes=function(a){for(var b in a)a.hasOwnProperty(b)&&(n[b]=a[b]);p=null};\r\nd.init=function(){var a=d(u),b;for(b in a)\"_\"!==b.charAt(0)&&(d[b]=function(b){return function(){return a[b].apply(a,arguments)}}(b))};d.init();\"undefined\"!==typeof module&&module.exports&&(module.exports=d);\"function\"===typeof define&&define.amd&&define(function(){return d})}})(\"undefined\"!==typeof window?window:null,\"undefined\"!==typeof window?document:null);\n" }, "lib/mp3-worker": { - "content": "var remoteWorker;\n\nmodule.exports = function(samples) {\n return remoteWorker(\"https://danielx.net/composer/lame-worker.js\").then(function(worker) {\n return new Promise(function(resolve, reject) {\n worker.postMessage(samples);\n return worker.onmessage = function(e) {\n return resolve(e.data);\n };\n });\n });\n};\n\nremoteWorker = function(url) {\n return fetch(url).then(function(response) {\n return response.arrayBuffer();\n }).then(function(buffer) {\n var blob;\n blob = new Blob([buffer], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n }).then(function(url) {\n return new Worker(url);\n });\n};\n" + "content": "var remoteWorker;\n\nmodule.exports = function(samples) {\n return remoteWorker(\"lame-worker.js\").then(function(worker) {\n return new Promise(function(resolve, reject) {\n worker.postMessage(samples);\n return worker.onmessage = function(e) {\n return resolve(e.data);\n };\n });\n });\n};\n\nremoteWorker = function(url) {\n return fetch(url).then(function(response) {\n return response.arrayBuffer();\n }).then(function(buffer) {\n var blob;\n blob = new Blob([buffer], {\n type: \"application/javascript\"\n });\n return URL.createObjectURL(blob);\n }).then(function(url) {\n return new Worker(url);\n });\n};\n" }, "lib/pattern": { "content": "\n/*\nPattern\n\nHolds a pattern of notes. Used as 'stamps', a person can copy a\nselection of notes and paint them as a group onto the staff.\n\nStatus: Needs review\n */\nmodule.exports = function(I, self) {\n if (I == null) {\n I = {};\n }\n if (self == null) {\n self = Model(I);\n }\n defaults(I, {\n notes: []\n });\n self.attrAccessor(\"notes\");\n return self;\n};\n" @@ -718,7 +715,7 @@ "content": "var Drop, Gist, Midi2Composer, Modal, Progress, PublishTemplate, ReadFile, clipboardCopy, publishView, _ref;\n\nGist = require(\"./lib/legacy/gist\");\n\nDrop = require(\"./lib/drop\");\n\nReadFile = require(\"./lib/read-file\");\n\nMidi2Composer = require(\"./lib/midi2composer\");\n\nPublishTemplate = require(\"./templates/publish\");\n\nclipboardCopy = require(\"./lib/clipboard-copy\");\n\n_ref = system.ui, Modal = _ref.Modal, Progress = _ref.Progress;\n\npublishView = Progress({\n message: \"Publishing...\"\n});\n\nmodule.exports = function(I, self) {\n var fileInput, jsonFromFile, prompted, unloadHandler;\n if (I == null) {\n I = {};\n }\n defaults(I, {\n unsaved: false\n });\n self.attrAccessor(\"unsaved\");\n jsonFromFile = function(file) {\n if (file.type.match(/^audio\\/mid/)) {\n if (self.purchased()) {\n return file.readAsArrayBuffer().then(function(buffer) {\n return Midi2Composer(new Uint8Array(buffer));\n });\n } else {\n self.purchase();\n return Promise.reject(\"Only full version can import MIDI\");\n }\n } else {\n return file.readAsJSON();\n }\n };\n Drop(document.documentElement, function(files) {\n return Promise.all(Array.prototype.map.call(files, function(file) {\n return jsonFromFile(file)[\"catch\"](function() {\n return null;\n });\n })).then(function(readFiles) {\n var json;\n json = readFiles.filter(function(f) {\n return !!f;\n })[0];\n if (json) {\n return self.fromJSON(json);\n }\n });\n });\n fileInput = ReadFile({\n accept: \".dxc,.mid,audio/mid,.midi,audio/midi\",\n change: function(file) {\n return jsonFromFile(file).then(self.fromJSON).then(function() {\n return Modal.hide();\n })[\"catch\"](console.error);\n }\n });\n fileInput.style.display = \"none\";\n document.body.appendChild(fileInput);\n prompted = false;\n unloadHandler = function(e) {\n if (prompted) {\n return;\n }\n prompted = true;\n setTimeout(function() {\n return prompted = false;\n });\n if (self.unsaved()) {\n e.returnValue = \"Your changes haven't yet been saved. If you leave now you will lose your work.\";\n }\n return e.returnValue;\n };\n window.addEventListener(\"beforeunload\", unloadHandler);\n setTimeout(function() {\n var hash;\n if (hash = location.hash) {\n return self.loadFromSlug(hash.substr(1));\n }\n }, 0);\n return self.extend({\n saveAs: function() {\n return Modal.prompt(\"Name\").then(function(name) {\n var data;\n if (!name) {\n return;\n }\n data = self.song().toJSON();\n localStorage[\"songs_\" + name] = JSON.stringify(data);\n return self.unsaved(false);\n });\n },\n saveFile: function() {\n return Modal.prompt(\"Name\", \"untitled\", \"Save Song\").then(function(name) {\n var blob;\n if (!name) {\n return;\n }\n blob = new Blob([JSON.stringify(self.song().toJSON())], {\n type: \"application/json\"\n });\n blob.download(\"\" + name + \".dxc\");\n return self.unsaved(false);\n });\n },\n openFile: function() {\n return fileInput.click();\n },\n loadFromSlug: function(slug) {\n return Promise.resolve().then(function() {\n if (slug.match(/^api-/)) {\n return self.loadAPIData(slug.substr(4));\n } else if (slug) {\n return self.loadGist(slug);\n }\n });\n },\n loadURL: function(url) {\n return fetch(url).then(function(result) {\n return result.json();\n }).then(self.fromJSON);\n },\n loadFromURLString: function() {\n return Modal.prompt(\"Paste shareable URL here:\", \"https://danielx.net/composer/#api-4IuXACKoqtSke9jTAThC5I_eWc4me53ze-1cri-L8kE\", \"Load from URL\").then(function(url) {\n var slug, _, _ref1;\n if (!url) {\n return;\n }\n if (url.indexOf(\"#\")) {\n _ref1 = url.split(\"#\"), _ = _ref1[0], slug = _ref1[1];\n return self.loadFromSlug(slug);\n } else {\n return self.loadURL(url);\n }\n });\n },\n loadDemo: function() {\n return self.confirmUnsaved().then(function() {\n Modal.hide();\n return self.fromJSON(require(\"./data/demo\"));\n });\n },\n loadLocalStorage: function() {\n return Modal.prompt(\"Name\").then(function(name) {\n if (!name) {\n return;\n }\n if (name) {\n return self.fromJSON(JSON.parse(localStorage[\"songs_\" + name]));\n }\n });\n },\n getState: function() {\n return JSON.parse(JSON.stringify(self.song().toJSON()));\n },\n restoreState: function(data) {\n self.song().fromJSON(JSON.parse(JSON.stringify(data)));\n return self.rerenderNotes();\n },\n confirmUnsaved: function() {\n return Promise.resolve().then(function() {\n if (self.unsaved()) {\n return Modal.confirm(\"If you continue your changes will be lost!\", \"Unsaved changes!\").then(function(confirmed) {\n if (!confirmed) {\n return Promise.reject();\n }\n });\n }\n });\n },\n fromJSON: function(data) {\n return self.confirmUnsaved().then(function() {\n return self._fromJSON(data);\n });\n },\n _fromJSON: function(data) {\n self.song().fromJSON(data);\n self.reset();\n return self.rerenderNotes();\n },\n removeUnloadHandler: function() {\n return window.removeEventListener(\"beforeunload\", unloadHandler);\n },\n publish: function() {\n Modal.show(publishView.element, {\n cancellable: false\n });\n return fetch(\"https://api.danielx.net/composer\", {\n method: 'POST',\n body: JSON.stringify(self.song()),\n headers: {\n 'Content-Type': 'text/plain'\n }\n }).then(function(res) {\n return res.json();\n }).then(function(id) {\n var e, url;\n url = \"https://danielx.net/composer/#api-\" + id;\n try {\n history.replaceState({}, \"\", url);\n } catch (_error) {\n e = _error;\n console.warn(e);\n }\n return Modal.show(PublishTemplate({\n value: url,\n status: Observable(\"\"),\n copy: function() {\n clipboardCopy(url);\n return this.status(\"Copied!\");\n },\n done: function() {\n return Modal.hide();\n }\n }), {\n cancellable: false\n });\n })[\"catch\"](function(e) {\n console.warn(e);\n return Modal.hide();\n });\n },\n loadAPIData: function(id) {\n return fetch(\"https://api.danielx.net/composer/data/\" + id, {\n method: 'GET',\n headers: {\n 'Content-Type': 'text/plain'\n }\n }).then(function(res) {\n return res.json();\n }).then(function(data) {\n self.fromJSON(data);\n return location.hash = \"api-\" + id;\n });\n },\n loadGist: function(id) {\n return Gist.load(id).then(function(data) {\n self.fromJSON(data);\n return location.hash = id;\n }, function() {\n return Modal.alert(\"Couldn't load gist with id: \" + id);\n });\n },\n loadGistPrompt: function() {\n var id;\n if (id = prompt(\"Gist id\", location.hash.substr(1) || \"0b4c4656a6eb1d246829\")) {\n return self.loadGist(id);\n }\n }\n });\n};\n" }, "pixie": { - "content": "module.exports = {\n \"title\": \"Mario Paint Music Composer - danielx.net\",\n \"description\": \"This Mario Paint inspired composer tool is easy and fun. You can create simple\\nand beautiful songs right in your browser and share them with the world!\",\n \"iconURL\": \"https://danielx.net/composer/images/raccoon.png\",\n \"version\": \"0.4.7\",\n \"publishPath\": \"/My Briefcase/public/danielx.net/\",\n \"name\": \"composer\",\n \"dependencies\": {\n \"!system\": \"https://danielx.net/system/0.5.0-pre.4.json\"\n },\n \"remoteDependencies\": [\n \"https://js.stripe.com/v3/\"\n ],\n \"width\": 1024,\n \"height\": 960,\n \"sandbox\": \"allow-same-origin allow-modals allow-forms allow-pointer-lock allow-popups allow-scripts allow-popups-to-escape-sandbox midi\",\n \"cognito\": {\n \"identityPoolId\": \"us-east-1:4fe22da5-bb5e-4a78-a260-74ae0a140bf9\",\n \"poolData\": {\n \"UserPoolId\": \"us-east-1_cfvrlBLXG\",\n \"ClientId\": \"3fd84r6idec9iork4e9l43mp61\"\n },\n \"bucket\": \"whimsy-fs\"\n },\n \"manifest\": {\n \"name\": \"DanielX.net Paint Composer\",\n \"short_name\": \"Composer\",\n \"display\": \"standalone\",\n \"start_url\": \".\",\n \"scope\": \"./\",\n \"icons\": [\n {\n \"src\": \"https://danielx.net/composer/images/raccoon.png\",\n \"sizes\": \"48x48\"\n },\n {\n \"src\": \"https://danielx.net/composer/icon256.png\",\n \"sizes\": \"256x256\"\n }\n ]\n },\n \"serviceWorker\": \"service-worker\"\n};" + "content": "module.exports = {\n \"title\": \"Mario Paint Music Composer - danielx.net\",\n \"description\": \"This Mario Paint inspired composer tool is easy and fun. You can create simple\\nand beautiful songs right in your browser and share them with the world!\",\n \"iconURL\": \"https://danielx.net/composer/images/raccoon.png\",\n \"version\": \"0.4.7\",\n \"publishPath\": \"/My Briefcase/public/danielx.net/\",\n \"name\": \"composer\",\n \"dependencies\": {\n \"!system\": \"https://danielx.net/system/0.5.0-pre.4.json\"\n },\n \"remoteDependencies\": [\n \"https://js.stripe.com/v3/\"\n ],\n \"width\": 1024,\n \"height\": 960,\n \"sandbox\": \"allow-same-origin allow-modals allow-forms allow-pointer-lock allow-popups allow-scripts allow-popups-to-escape-sandbox midi\",\n \"cognito\": {\n \"identityPoolId\": \"us-east-1:4fe22da5-bb5e-4a78-a260-74ae0a140bf9\",\n \"poolData\": {\n \"UserPoolId\": \"us-east-1_cfvrlBLXG\",\n \"ClientId\": \"3fd84r6idec9iork4e9l43mp61\"\n },\n \"bucket\": \"whimsy-fs\"\n },\n \"manifest\": {\n \"name\": \"DanielX.net Paint Composer\",\n \"short_name\": \"Composer\",\n \"display\": \"standalone\",\n \"start_url\": \".\",\n \"scope\": \"./\",\n \"icons\": [\n {\n \"src\": \"https://danielx.net/composer/images/raccoon.png\",\n \"sizes\": \"48x48\"\n },\n {\n \"src\": \"https://danielx.net/composer/icon256.png\",\n \"sizes\": \"256x256\"\n }\n ]\n }};" }, "player-audio": { "content": "\n/*\nPlayer Audio\n============\n\nMain audio loop\n\nNeeds tempo, playable, start beat, end beat, looping mode to play.\n\nProvides playTime and playing methods.\n */\nvar Encoder, FX, FXNetwork, Modal, OfflineAudioContext, Progress, Style, limiter, liveContext, quantize, staffNoteToPitch, stereoAnalyser, _ref, _ref1, _ref2;\n\n_ref = system.ui, Progress = _ref.Progress, Modal = _ref.Modal, Style = _ref.Style;\n\nOfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;\n\nliveContext = require(\"./lib/audio-context\");\n\nEncoder = require(\"./lib/encoder/index\");\n\n_ref1 = require(\"./lib/util\"), quantize = _ref1.quantize, staffNoteToPitch = _ref1.staffNoteToPitch;\n\n_ref2 = FX = require(\"./lib/fx\"), limiter = _ref2.limiter, stereoAnalyser = _ref2.stereoAnalyser;\n\nFXNetwork = function(destination) {\n var context, fx, gain;\n context = destination.context;\n gain = context.createGain();\n gain.connect(destination);\n fx = FX.choices.reduce(function(o, name) {\n o[name] = FX[name](gain);\n return o;\n }, {});\n return {\n \"default\": gain,\n fx: fx,\n dispose: function() {\n var currentTime;\n currentTime = context.currentTime;\n gain.gain.exponentialRampToValueAtTime(0.001, 0.1 + currentTime);\n gain.gain.setValueAtTime(0, 0.1 + currentTime);\n return setTimeout(function() {\n return gain.disconnect();\n }, 0.25);\n }\n };\n};\n\nmodule.exports = function(I, self) {\n var activeDestination, analysedDestination, animBuffer, bps, bufferAudio, computeElapsedBeats, initPlay, lastContextTime, lastQueuedBeat, liveDestination, lookahead, playTime, playUpcomingSounds, secondsPerMinute, toBeat, wrapping;\n playTime = 0;\n secondsPerMinute = 60;\n lastContextTime = 0;\n lastQueuedBeat = 0;\n lookahead = 0.1;\n toBeat = null;\n wrapping = false;\n self.attrObservable(\"playing\");\n self.analysedDestination = analysedDestination = stereoAnalyser(liveContext.destination);\n liveDestination = limiter(analysedDestination);\n activeDestination = FXNetwork(liveDestination);\n document.addEventListener(\"visibilitychange\", function(e) {\n if (document.hidden) {\n lookahead = 1.25;\n } else {\n lookahead = 0.1;\n }\n return bufferAudio();\n });\n initPlay = function() {\n var context;\n context = liveDestination.context;\n context.resume();\n lastContextTime = context.currentTime;\n lastQueuedBeat = playTime;\n return wrapping = false;\n };\n computeElapsedBeats = function(playTime, elapsedSeconds) {\n var beats, beatsLeft, section, _bps, _ref3;\n if (playTime >= self.length()) {\n playTime -= self.length();\n }\n _ref3 = self.sectionAt(playTime), section = _ref3[0], beatsLeft = _ref3[1];\n _bps = section.tempo() / 60;\n beats = elapsedSeconds * _bps;\n if (beats > beatsLeft) {\n return beatsLeft + computeElapsedBeats(playTime + beatsLeft, elapsedSeconds - beatsLeft / _bps);\n } else {\n return beats;\n }\n };\n playUpcomingSounds = function(currentBeat, fromBeat, toBeat) {\n var dt;\n dt = toBeat - fromBeat;\n if (dt <= 0) {\n return;\n }\n return self.upcomingNotes(fromBeat, dt, function(_arg, section, s) {\n var accidental, beat, instrument, pitch, staffNote;\n beat = _arg[0], staffNote = _arg[1], accidental = _arg[2], instrument = _arg[3];\n pitch = staffNoteToPitch(staffNote, accidental, section.keySignature());\n return self.playNote(instrument, pitch, s, activeDestination.fx[section.presetName()]);\n }, currentBeat);\n };\n bps = function() {\n return self.tempo() / secondsPerMinute;\n };\n bufferAudio = function() {\n var context, currentTime, dt, elapsedBeats, length;\n if (self.playing()) {\n length = self.length();\n if (length < 1 || isNaN(length)) {\n return;\n }\n context = liveDestination.context;\n currentTime = context.currentTime;\n dt = currentTime - lastContextTime;\n if (dt === 0) {\n return;\n }\n lastContextTime = currentTime;\n elapsedBeats = computeElapsedBeats(playTime, dt);\n self.animateNoteElements(playTime, elapsedBeats);\n playTime += elapsedBeats;\n toBeat = playTime + computeElapsedBeats(playTime, lookahead);\n if (wrapping) {\n toBeat -= length;\n playUpcomingSounds(playTime - length, lastQueuedBeat, toBeat);\n } else {\n playUpcomingSounds(playTime, lastQueuedBeat, toBeat);\n if (toBeat >= length && self.loop()) {\n wrapping = true;\n toBeat -= length;\n lastQueuedBeat = 0;\n playUpcomingSounds(playTime - length, lastQueuedBeat, toBeat);\n }\n }\n lastQueuedBeat = Math.max(lastQueuedBeat, toBeat);\n if (playTime >= length) {\n wrapping = false;\n if (self.loop()) {\n playTime -= length;\n self.animateNoteElements(0, playTime);\n } else {\n playTime = 0;\n self.playing(false);\n }\n }\n self.activeSection(self.sectionAt(playTime)[0]);\n }\n };\n setInterval(function() {\n return bufferAudio();\n }, 1000 / 120);\n animBuffer = function() {\n requestAnimationFrame(animBuffer);\n return bufferAudio();\n };\n animBuffer();\n return self.extend({\n exportSong: function(song, opts) {\n var audioChannels, cleanup, err, extension, lengthInSeconds, name, offlineContext, offlineFxNetwork, progressView, samplesPerSecond, songLength, type;\n if (opts == null) {\n opts = {};\n }\n name = opts.name, type = opts.type;\n if (name == null) {\n name = \"song\";\n }\n if (type == null) {\n type = \"mp3\";\n }\n extension = \".\" + type;\n progressView = Progress({\n message: \"Rendering Audio...\"\n });\n Modal.show(progressView.element, {\n cancellable: false\n });\n cleanup = function() {\n return Modal.hide();\n };\n err = function(fn) {\n return function(e) {\n fn();\n throw e;\n };\n };\n songLength = song.length();\n audioChannels = 2;\n samplesPerSecond = 44100;\n lengthInSeconds = song.exportDuration();\n offlineContext = new OfflineAudioContext(audioChannels, samplesPerSecond * lengthInSeconds, samplesPerSecond);\n offlineFxNetwork = FXNetwork(limiter(offlineContext.destination));\n return new Promise(function(resolve, reject) {\n var dt, t, work;\n t = 0;\n dt = 1;\n work = function() {\n var p;\n song.upcomingNotes(t, dt, function(_arg, section, s) {\n var accidental, beat, instrument, keySig, note, presetName, staffNote;\n beat = _arg[0], staffNote = _arg[1], accidental = _arg[2], instrument = _arg[3];\n presetName = section.presetName();\n keySig = section.keySignature();\n note = staffNoteToPitch(staffNote, accidental, keySig);\n return self.playNote(instrument, note, s, offlineFxNetwork.fx[presetName]);\n }, 0);\n t += dt;\n if (t <= songLength) {\n setTimeout(work, 0);\n } else {\n p = offlineContext.startRendering();\n if (p) {\n p.then(resolve, reject);\n } else {\n offlineContext.oncomplete = function(_arg) {\n var renderedBuffer;\n renderedBuffer = _arg.renderedBuffer;\n return resolve(renderedBuffer);\n };\n }\n }\n };\n work();\n }).then(function(audioBuffer) {\n if (type === \"mp3\") {\n progressView.message(\"Encoding mp3...\");\n return Encoder.audioBufferToMP3(audioBuffer);\n } else {\n progressView.message(\"Encoding wav...\");\n return Encoder.audioBufferToWav(audioBuffer);\n }\n }).then(function(blob) {\n return blob.download(name + extension);\n }).then(cleanup, err(cleanup));\n },\n playNote: function(instrumentId, note, time, dest) {\n var buffer, context, gain, pan, panner, pitchShift, rate, sample, source, volume;\n if (note == null) {\n note = 0;\n }\n if (time == null) {\n time = 0;\n }\n if (dest == null) {\n dest = activeDestination.fx[self.presetName()] || liveDestination;\n }\n context = dest.context;\n sample = self.samples()[instrumentId].I;\n if (sample) {\n buffer = sample.buffer, pitchShift = sample.pitchShift, pan = sample.pan, volume = sample.volume;\n note += pitchShift;\n panner = context.createPanner();\n panner.panningModel = 'equalpower';\n panner.setPosition(pan, 0, 1 - Math.abs(pan));\n gain = context.createGain();\n gain.gain.value = volume;\n rate = Math.pow(2, note / 12);\n source = self.playBuffer(buffer, rate, time, panner);\n panner.connect(gain);\n gain.connect(dest);\n return source.onended = function() {\n return gain.disconnect();\n };\n }\n },\n playBuffer: function(buffer, rate, time, dest) {\n var context, source;\n if (rate == null) {\n rate = 1;\n }\n if (time == null) {\n time = 0;\n }\n if (dest == null) {\n dest = liveDestination;\n }\n context = dest.context;\n if (!(time >= 0)) {\n time = 0;\n }\n source = context.createBufferSource();\n source.buffer = buffer;\n source.connect(dest || context.destination);\n source.start(time + context.currentTime);\n source.playbackRate.value = rate;\n return source;\n },\n adjustPlayhead: function(dt, q) {\n if (q == null) {\n q = 0;\n }\n self.setPlayHead(quantize(playTime + dt, q));\n return self.recenterPlayhead();\n },\n setPlayHead: function(t) {\n if (self.playing()) {\n return;\n }\n playTime = Math.min(self.length() - 0.00001, Math.max(t, 0));\n self.activeSection(self.sectionAt(playTime)[0]);\n return playTime;\n },\n bufferTo: function() {\n return toBeat;\n },\n lastQueuedBeat: function() {\n return lastQueuedBeat;\n },\n playTime: function() {\n return playTime;\n },\n playFromStart: function() {\n if (self.playing()) {\n self.stop();\n } else {\n playTime = 0;\n self.playing(true);\n }\n return initPlay();\n },\n pause: function() {\n if (self.playing()) {\n return self.stop();\n } else {\n self.playing(true);\n return initPlay();\n }\n },\n play: function() {\n return self.pause();\n },\n stop: function() {\n self.playing(false);\n activeDestination.dispose();\n return activeDestination = FXNetwork(liveDestination);\n },\n rewind: function() {\n self.stop();\n playTime = 0;\n return self.scrollTo(0);\n },\n reset: function() {\n self.stop();\n playTime = 0;\n return self.activeSection(self.sections()[0]);\n }\n });\n};\n" @@ -736,7 +733,7 @@ "content": "var CLEF_OFFSET, NoteTemplate, PIXELS_PER_BEAT, SectionTemplate, accidentalToSymbol, animateNoteElement, clamp, composedPath, noteAnimationHandler, noteName, quantize, staffNoteToPitch, updateMeasureNumbers, _ref, _ref1;\n\nNoteTemplate = require(\"./templates/note\");\n\nSectionTemplate = require(\"./templates/section\");\n\n_ref = require(\"./lib/util\"), accidentalToSymbol = _ref.accidentalToSymbol, clamp = _ref.clamp, composedPath = _ref.composedPath, noteName = _ref.noteName, quantize = _ref.quantize, staffNoteToPitch = _ref.staffNoteToPitch;\n\n_ref1 = require(\"./const\"), CLEF_OFFSET = _ref1.CLEF_OFFSET, PIXELS_PER_BEAT = _ref1.PIXELS_PER_BEAT;\n\nnoteAnimationHandler = function() {\n this.classList.remove(\"active\");\n return this.removeEventListener(\"animationend\", noteAnimationHandler);\n};\n\nanimateNoteElement = function(element) {\n if (element.classList.contains(\"active\")) {\n return;\n }\n element.classList.add(\"active\");\n return element.addEventListener(\"animationend\", noteAnimationHandler);\n};\n\nupdateMeasureNumbers = function(sectionElement, t, section) {\n var beatGroup, beatsPerMeasure, measuresPerNumber, numberElements, sectionLength, t1, t2;\n sectionLength = section.length();\n numberElements = sectionElement.querySelectorAll('span.measure-number');\n beatsPerMeasure = section.numerator();\n measuresPerNumber = 4;\n beatGroup = measuresPerNumber * beatsPerMeasure;\n t1 = quantize(t, beatGroup);\n if (t1 < t) {\n t1 += beatGroup;\n }\n if (t1 < 0) {\n t1 = 0;\n }\n t2 = t1 + beatGroup;\n if (t1 < sectionLength) {\n numberElements[0].innerText = t1 / beatsPerMeasure + 1;\n numberElements[0].style.left = t1 * PIXELS_PER_BEAT + \"px\";\n }\n if (t2 < sectionLength) {\n numberElements[1].style.display = \"initial\";\n numberElements[1].innerText = t2 / beatsPerMeasure + 1;\n return numberElements[1].style.left = t2 * PIXELS_PER_BEAT + \"px\";\n } else {\n return numberElements[1].style.display = \"none\";\n }\n};\n\nmodule.exports = function(I, self) {\n var adjustScroll, autoscroll, beatNoteInRange, beatToStaffPosition, bufferEndElement, bufferStartElement, clearNoteCache, clientWidth, element, eventToBeatNote, eventToStaffPosition, noteElementCache, notesElement, playheadElement, positionToStaffNote, recenterPlayhead, renderNote, renderSection, rerenderTriggered, scrollLeft, sectionElementCache, staffElement, staffNoteToPosition, staffPositionToBeat, staffPositionToBeatNote;\n if (I == null) {\n I = {};\n }\n if (self == null) {\n self = Model(I);\n }\n defaults(I, {\n gamut: [-14, 14],\n quantize: 1 / 4,\n accidentalModifier: 0\n });\n self.attrObservable(\"gamut\", \"quantize\", \"accidentalModifier\", \"fxStyle\");\n rerenderTriggered = false;\n clearNoteCache = false;\n scrollLeft = null;\n clientWidth = null;\n beatNoteInRange = function(_arg) {\n var beat, noteMax, noteMin, staffNote, _ref2;\n beat = _arg[0], staffNote = _arg[1];\n _ref2 = self.gamut(), noteMin = _ref2[0], noteMax = _ref2[1];\n return staffNote >= noteMin && staffNote <= noteMax && beat >= 0;\n };\n staffPositionToBeatNote = function(_arg) {\n var a, beat, staffNote, t, y;\n t = _arg.t, y = _arg.y, a = _arg.a;\n staffNote = positionToStaffNote(y);\n beat = quantize(t, self.quantize());\n return [beat, staffNote, a];\n };\n element = require(\"./templates/staff\")({\n fxStyle: self.fxStyle,\n contextmenu: function(e) {\n return e.preventDefault();\n },\n dragstart: function(e) {\n return e.preventDefault();\n },\n scroll: function(e) {\n scrollLeft = element.scrollLeft, clientWidth = element.clientWidth;\n return rerenderTriggered = true;\n },\n mousedown: function(e) {\n var beatNote, buttonPressed, sp;\n buttonPressed = composedPath(e.target).some(function(el) {\n return el.tagName === \"BUTTON\";\n });\n if (buttonPressed) {\n return;\n }\n sp = eventToStaffPosition(e);\n beatNote = eventToBeatNote(e);\n self.activeTool().down(self, beatNote, e, sp);\n return rerenderTriggered = true;\n },\n mousemove: function(e) {\n var accidental, beat, beatNote, staffNote;\n beatNote = eventToBeatNote(e);\n if (beatNoteInRange(beatNote)) {\n beat = beatNote[0], staffNote = beatNote[1], accidental = beatNote[2];\n self.notePosition(\"Beat: \" + ((beat + 1).toFixed(2)) + \"\\nNote: \" + (noteName(staffNoteToPitch(staffNote, accidental))));\n } else {\n self.notePosition(\"\");\n }\n return self.activeTool().move(self, beatNote, e);\n },\n mouseup: function(e) {\n var beatNote;\n beatNote = eventToBeatNote(e);\n return self.activeTool().up(self, beatNote, e);\n },\n repeatClass: function() {\n if (!self.loop()) {\n return \"hidden\";\n }\n },\n selectionClass: self.selectionClass,\n selectionCopy: self.selectionCopy,\n selectionCut: self.selectionCut,\n selectionDelete: self.selectionDelete,\n selectionReset: self.selectionReset,\n selectionMoveUp: self.selectionMoveUp,\n selectionMoveDown: self.selectionMoveDown,\n selectionMoveLeft: self.navigateLeft,\n selectionMoveRight: self.navigateRight\n });\n playheadElement = element.querySelector(\"playhead\");\n staffElement = element.querySelector(\"staff\");\n notesElement = staffElement.querySelector(\"notes\");\n self.selectionElement = staffElement.querySelector(\"selection\");\n self.patternPreviewElement = staffElement.querySelector(\"pattern-preview\");\n bufferStartElement = element.querySelector(\"playhead.buffer-start\");\n bufferEndElement = element.querySelector(\"playhead.buffer-end\");\n setTimeout(function() {\n return scrollLeft = element.scrollLeft, clientWidth = element.clientWidth, element;\n });\n window.addEventListener(\"resize\", function(e) {\n scrollLeft = element.scrollLeft, clientWidth = element.clientWidth;\n return rerenderTriggered = true;\n });\n beatToStaffPosition = function(t) {\n return PIXELS_PER_BEAT * t + CLEF_OFFSET;\n };\n staffPositionToBeat = function(x) {\n return (x - CLEF_OFFSET) / PIXELS_PER_BEAT;\n };\n eventToStaffPosition = function(e) {\n var a, ctrlKey, left, metaKey, pageX, pageY, shiftKey, t, top, x, y, _ref2;\n pageX = e.pageX, pageY = e.pageY, shiftKey = e.shiftKey, ctrlKey = e.ctrlKey, metaKey = e.metaKey;\n _ref2 = staffElement.getBoundingClientRect(), top = _ref2.top, left = _ref2.left;\n x = pageX - left;\n y = pageY - top;\n t = staffPositionToBeat(x);\n a = self.accidentalModifier();\n if (a === 0) {\n if (shiftKey) {\n a = 1;\n } else if (ctrlKey || metaKey) {\n a = -1;\n }\n } else if (a === 1 && (ctrlKey || metaKey)) {\n a = 0;\n } else if (a === -1 && shiftKey) {\n a = 0;\n }\n return {\n t: t,\n y: y,\n a: a\n };\n };\n eventToBeatNote = function(e) {\n return staffPositionToBeatNote(eventToStaffPosition(e));\n };\n positionToStaffNote = function(y) {\n return Math.round((337 - y) / 24);\n };\n staffNoteToPosition = function(n) {\n return 337 - 24 * n;\n };\n renderNote = function(datum) {\n var a, accidental, beat, instrument, staffNote;\n beat = datum[0], staffNote = datum[1], accidental = datum[2], instrument = datum[3];\n a = accidentalToSymbol(accidental);\n return NoteTemplate({\n note: noteName(staffNoteToPitch(staffNote)),\n accidental: a,\n instrument: \"i\" + instrument,\n style: {\n top: \"\" + (staffNote * -24 - 24 + 240) + \"px\",\n left: \"\" + (beat * PIXELS_PER_BEAT - 24) + \"px\"\n }\n });\n };\n renderSection = function(section, startBeat) {\n var el, length;\n el = sectionElementCache.get(section);\n if (!el) {\n el = SectionTemplate({\n c1: function() {\n var sig;\n sig = section.keySignature();\n if (sig > 0) {\n return \"s\";\n } else if (sig < 0) {\n return \"f\";\n }\n },\n c2: function() {\n return this.c1() + Math.abs(section.keySignature());\n },\n meterClass: function() {\n var n;\n n = section.numerator();\n return \"n\" + n;\n }\n });\n sectionElementCache.set(section, el);\n }\n length = section.length();\n Object.assign(el.style, {\n left: \"\" + (startBeat * PIXELS_PER_BEAT) + \"px\",\n width: \"\" + (length * PIXELS_PER_BEAT) + \"px\"\n });\n if (!el.parentElement) {\n notesElement.appendChild(el);\n }\n return el;\n };\n autoscroll = 0;\n adjustScroll = 0;\n recenterPlayhead = false;\n self.samples.observe(function() {\n return self.setCursor();\n });\n self.activeInstrument.observe(function(instrument) {\n return self.setCursor();\n });\n self.activeToolIndex.observe(function() {\n return self.setCursor();\n });\n noteElementCache = new Map;\n sectionElementCache = new Map;\n return self.extend({\n autoscrolling: function(v) {\n return autoscroll = v;\n },\n scrollTo: function(x) {\n return element.scrollLeft = x;\n },\n adjustScroll: function(dt) {\n return adjustScroll = dt;\n },\n recenterPlayhead: function() {\n return recenterPlayhead = true;\n },\n beatNoteInRange: beatNoteInRange,\n beatNoteToStaffPosition: function(_arg) {\n var beat, staffNote;\n beat = _arg[0], staffNote = _arg[1];\n return {\n x: beatToStaffPosition(beat),\n y: staffNoteToPosition(staffNote)\n };\n },\n staffElement: element,\n performDraw: function() {\n var p;\n if (autoscroll) {\n element.scrollLeft += autoscroll * PIXELS_PER_BEAT / 60;\n }\n p = Math.floor(beatToStaffPosition(self.playTime()));\n playheadElement.style.left = p + \"px\";\n staffElement.style.width = CLEF_OFFSET + PIXELS_PER_BEAT * self.song().length() + \"px\";\n if (self.playing() || recenterPlayhead) {\n element.scrollLeft = p - clientWidth / 2 + 56;\n } else if (adjustScroll) {\n element.scrollLeft += adjustScroll * PIXELS_PER_BEAT;\n }\n if (rerenderTriggered) {\n rerenderTriggered = false;\n self.rerenderNotes();\n }\n adjustScroll = 0;\n recenterPlayhead = false;\n },\n triggerRerender: function(force) {\n rerenderTriggered = true;\n if (force) {\n return clearNoteCache = true;\n }\n },\n renderNote: renderNote,\n rerenderNotes: function() {\n var notesToRemove, notesToRender, sectionStart, sectionsToRender, t0, t1, x0, x1;\n x0 = scrollLeft - 48 - 48;\n x1 = x0 + clientWidth + 96;\n t0 = staffPositionToBeat(x0);\n t1 = staffPositionToBeat(x1);\n if (clearNoteCache) {\n Array.from(noteElementCache.keys()).filter(function(note) {\n var noteElement;\n noteElement = noteElementCache.get(note);\n noteElement.remove();\n return noteElementCache[\"delete\"](note);\n });\n clearNoteCache = false;\n }\n sectionStart = 0;\n sectionsToRender = new Set;\n self.sections().forEach(function(section) {\n var sectionLength;\n sectionsToRender.add(section);\n renderSection(section, sectionStart);\n sectionLength = section.length();\n updateMeasureNumbers(sectionElementCache.get(section), t0 - sectionStart, section);\n return sectionStart += sectionLength;\n });\n Array.from(sectionElementCache.keys()).forEach(function(section) {\n var el;\n if (!sectionsToRender.has(section)) {\n el = sectionElementCache.get(section);\n el.remove();\n return sectionElementCache[\"delete\"](section);\n }\n });\n notesToRender = new Set;\n self.upcomingNotes(t0, t1 - t0, function(note, section) {\n var noteElement, sectionElement;\n notesToRender.add(note);\n if (!noteElementCache.has(note)) {\n noteElement = renderNote(note);\n sectionElement = sectionElementCache.get(section);\n sectionElement.appendChild(noteElement);\n return noteElementCache.set(note, noteElement);\n }\n });\n return notesToRemove = Array.from(noteElementCache.keys()).filter(function(note) {\n var noteElement;\n if (!notesToRender.has(note)) {\n noteElement = noteElementCache.get(note);\n noteElement.remove();\n return noteElementCache[\"delete\"](note);\n }\n });\n },\n animateNoteElements: function(t, dt) {\n var notes;\n return notes = self.upcomingNotes(t, dt, function(note) {\n var el;\n el = noteElementCache.get(note);\n if (el) {\n return animateNoteElement(el);\n }\n });\n },\n activeSample: function() {\n return self.samples()[self.activeInstrument()];\n },\n setCursor: function() {\n var sample;\n if (self.activeToolIndex() === 0) {\n if (sample = self.activeSample().I) {\n return document.body.style.cursor = sample.cursor;\n }\n } else {\n return document.body.style.cursor = self.activeTool().cursor;\n }\n }\n });\n};\n" }, "style": { - "content": "module.exports = \"@font-face {\\n font-display: auto;\\n font-family: 'Chicago';\\n src: url(\\\"https://danielx.net/fonts/chicago.woff2\\\") format('woff2'), url(\\\"https://danielx.net/fonts/chicago.woff\\\") format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n* {\\n box-sizing: border-box;\\n}\\nimg {\\n max-width: 100%;\\n}\\n.hidden {\\n display: none !important;\\n}\\n#modal > * {\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: inherit;\\n padding: 1rem;\\n}\\n#modal > * > h1,\\n#modal > * > h2 {\\n margin-top: 0;\\n}\\n#modal > section.purchase {\\n background-color: transparent;\\n border: none;\\n border-radius: 0;\\n box-shadow: none;\\n padding: 0;\\n}\\n#modal > .publish > p.status:empty {\\n margin: 0;\\n}\\n#modal > .publish > pre {\\n user-select: all;\\n}\\n#modal > .publish > actions {\\n display: flex;\\n}\\n#modal > .publish > actions > button:last-child {\\n margin-left: auto;\\n}\\n:focus {\\n color: #fff;\\n background-color: #673ab7;\\n outline: none;\\n}\\nhtml,\\nbody {\\n height: 100%;\\n}\\nbody {\\n color: #241440;\\n display: flex;\\n font-family: Chicago, sans-serif;\\n font-size: 16px;\\n line-height: 1rem;\\n margin: 0;\\n overflow: hidden;\\n user-select: none;\\n}\\np {\\n font-family: sans-serif;\\n}\\ninput,\\ntextarea,\\nselect,\\nbutton {\\n font-family: inherit;\\n}\\ninput {\\n background-color: #ede7f6;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7 inset;\\n color: #673ab7;\\n font-size: inherit;\\n padding: 2px 0.25em;\\n}\\ninput[type=\\\"number\\\"] {\\n -moz-appearance: textfield;\\n}\\ninput:focus {\\n background-color: #ffc107;\\n color: rgba(0,0,0,0.69);\\n}\\nnote {\\n font-size: 48px;\\n height: 48px;\\n -ms-interpolation-mode: nearest-neighbor;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n position: absolute;\\n width: 48px;\\n}\\nnote.active {\\n animation-name: note-active;\\n animation-duration: 0.25s;\\n}\\nnote::after {\\n align-items: center;\\n background-repeat: no-repeat;\\n background-position: 100% 50%;\\n content: \\\"\\\";\\n display: flex;\\n position: absolute;\\n left: 0;\\n top: 0;\\n width: 100%;\\n height: 100%;\\n text-indent: -12px;\\n}\\nnote.♭::after {\\n content: \\\"♭\\\";\\n}\\nnote.♯::after {\\n content: \\\"♯\\\";\\n}\\nnote.C4::before,\\nnote.A5::before,\\nnote.C6::before,\\nnote.C2::before,\\nnote.E2::before,\\nnote.B5::before,\\nnote.D2::before {\\n content: \\\"\\\";\\n width: 48px;\\n left: 0px;\\n top: 23px;\\n position: absolute;\\n height: 0;\\n border-bottom: 2px solid #000;\\n}\\nnote.B5::before {\\n top: 40px;\\n}\\nnote.D2::before {\\n top: -8px;\\n}\\nsong-section {\\n height: 483px;\\n position: absolute;\\n top: -241px;\\n}\\nsong-section::after {\\n content: \\\"\\\";\\n border-right: 2px solid #000;\\n height: 100%;\\n position: absolute;\\n right: 10px;\\n}\\nsong-section > span.measure-number {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid #000;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n font-style: italic;\\n left: 0px;\\n padding: 2px 6px 2px 4px;\\n position: absolute;\\n top: -132px;\\n}\\nsong-section > div.key-signature.s > ::after {\\n content: \\\"♯\\\";\\n}\\nsong-section > div.key-signature.f > ::after {\\n content: \\\"♭\\\";\\n}\\nsong-section > div.key-signature > * {\\n display: none;\\n font-size: 96px;\\n height: 48px;\\n position: absolute;\\n width: 48px;\\n}\\nsong-section > div.key-signature > *::after {\\n align-items: center;\\n display: flex;\\n height: 100%;\\n width: 100%;\\n}\\nsong-section > div.key-signature.s1 > :nth-child(1),\\nsong-section > div.key-signature.s2 > :nth-child(1),\\nsong-section > div.key-signature.s3 > :nth-child(1),\\nsong-section > div.key-signature.s4 > :nth-child(1),\\nsong-section > div.key-signature.s5 > :nth-child(1),\\nsong-section > div.key-signature.s6 > :nth-child(1),\\nsong-section > div.key-signature.s7 > :nth-child(1) {\\n display: initial;\\n top: -24px;\\n left: -96px;\\n}\\nsong-section > div.key-signature.s2 > :nth-child(2),\\nsong-section > div.key-signature.s3 > :nth-child(2),\\nsong-section > div.key-signature.s4 > :nth-child(2),\\nsong-section > div.key-signature.s5 > :nth-child(2),\\nsong-section > div.key-signature.s6 > :nth-child(2),\\nsong-section > div.key-signature.s7 > :nth-child(2) {\\n display: initial;\\n top: 48px;\\n left: -72px;\\n}\\nsong-section > div.key-signature.s3 > :nth-child(3),\\nsong-section > div.key-signature.s4 > :nth-child(3),\\nsong-section > div.key-signature.s5 > :nth-child(3),\\nsong-section > div.key-signature.s6 > :nth-child(3),\\nsong-section > div.key-signature.s7 > :nth-child(3) {\\n display: initial;\\n top: -48px;\\n left: -48px;\\n}\\nsong-section > div.key-signature.s4 > :nth-child(4),\\nsong-section > div.key-signature.s5 > :nth-child(4),\\nsong-section > div.key-signature.s6 > :nth-child(4),\\nsong-section > div.key-signature.s7 > :nth-child(4) {\\n display: initial;\\n top: 24px;\\n left: -24px;\\n}\\nsong-section > div.key-signature.s5 > :nth-child(5),\\nsong-section > div.key-signature.s6 > :nth-child(5),\\nsong-section > div.key-signature.s7 > :nth-child(5) {\\n display: initial;\\n top: 96px;\\n left: 0;\\n}\\nsong-section > div.key-signature.s6 > :nth-child(6),\\nsong-section > div.key-signature.s7 > :nth-child(6) {\\n display: initial;\\n top: 0px;\\n left: 24px;\\n}\\nsong-section > div.key-signature.s7 > :nth-child(7) {\\n display: initial;\\n top: 72px;\\n left: 48px;\\n}\\nsong-section > div.key-signature.f1 > :nth-child(1),\\nsong-section > div.key-signature.f2 > :nth-child(1),\\nsong-section > div.key-signature.f3 > :nth-child(1),\\nsong-section > div.key-signature.f4 > :nth-child(1),\\nsong-section > div.key-signature.f5 > :nth-child(1),\\nsong-section > div.key-signature.f6 > :nth-child(1),\\nsong-section > div.key-signature.f7 > :nth-child(1) {\\n display: initial;\\n top: 72px;\\n left: -96px;\\n}\\nsong-section > div.key-signature.f2 > :nth-child(2),\\nsong-section > div.key-signature.f3 > :nth-child(2),\\nsong-section > div.key-signature.f4 > :nth-child(2),\\nsong-section > div.key-signature.f5 > :nth-child(2),\\nsong-section > div.key-signature.f6 > :nth-child(2),\\nsong-section > div.key-signature.f7 > :nth-child(2) {\\n display: initial;\\n top: 0px;\\n left: -72px;\\n}\\nsong-section > div.key-signature.f3 > :nth-child(3),\\nsong-section > div.key-signature.f4 > :nth-child(3),\\nsong-section > div.key-signature.f5 > :nth-child(3),\\nsong-section > div.key-signature.f6 > :nth-child(3),\\nsong-section > div.key-signature.f7 > :nth-child(3) {\\n display: initial;\\n top: 96px;\\n left: -48px;\\n}\\nsong-section > div.key-signature.f4 > :nth-child(4),\\nsong-section > div.key-signature.f5 > :nth-child(4),\\nsong-section > div.key-signature.f6 > :nth-child(4),\\nsong-section > div.key-signature.f7 > :nth-child(4) {\\n display: initial;\\n top: 24px;\\n left: -24px;\\n}\\nsong-section > div.key-signature.f5 > :nth-child(5),\\nsong-section > div.key-signature.f6 > :nth-child(5),\\nsong-section > div.key-signature.f7 > :nth-child(5) {\\n display: initial;\\n top: -48px;\\n left: 0;\\n}\\nsong-section > div.key-signature.f6 > :nth-child(6),\\nsong-section > div.key-signature.f7 > :nth-child(6) {\\n display: initial;\\n top: 48px;\\n left: 24px;\\n}\\nsong-section > div.key-signature.f7 > :nth-child(7) {\\n display: initial;\\n top: -24px;\\n left: 48px;\\n}\\ntd > select {\\n width: 100%;\\n}\\ntd > input {\\n border-radius: 0;\\n box-shadow: none;\\n}\\ntd > aside.fx-picker > label {\\n display: none;\\n}\\ntd.sprite {\\n text-align: center;\\n vertical-align: middle;\\n}\\ntd.sprite > img {\\n margin-right: 1rem;\\n vertical-align: middle;\\n}\\ntd.input > input[type=number] {\\n display: block;\\n margin: auto;\\n width: 60px;\\n}\\nsection.settings {\\n overflow: auto;\\n padding: 1rem;\\n position: relative;\\n}\\nsection.settings > h2 {\\n margin: 0 0 1rem;\\n}\\nsection.settings > button.close {\\n position: absolute;\\n top: 1rem;\\n right: 1rem;\\n}\\nsection.settings > table {\\n margin: 0 -8px;\\n width: calc(100% + 16px);\\n}\\nsection.demo-picker {\\n overflow: auto;\\n padding: 1rem;\\n position: relative;\\n}\\nsection.demo-picker > h2 {\\n margin: 0 0 1rem;\\n}\\nsection.demo-picker > button.close {\\n position: absolute;\\n top: 1rem;\\n right: 1rem;\\n}\\nsection.demo-picker > table {\\n font-size: 18px;\\n}\\nsection.demo-picker > table > tbody > tr {\\n cursor: pointer;\\n line-height: 2rem;\\n}\\nsection.demo-picker > table > tbody > tr:hover {\\n background-color: rgba(103,58,183,0.19);\\n}\\nviewport {\\n background-attachment: local;\\n background-color: #ede7f6;\\n display: flex;\\n height: 100%;\\n align-items: center;\\n overflow-x: scroll;\\n overflow-y: hidden;\\n}\\nviewport > staff {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid rgba(0,0,0,0.5);\\n box-sizing: content-box;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n display: block;\\n flex: 0 0 auto;\\n padding: 96px 0;\\n position: relative;\\n margin: 0 48px;\\n z-index: 0;\\n}\\nviewport > staff::after {\\n border-left: 8px solid #000;\\n content: \\\"\\\";\\n position: absolute;\\n right: -48px;\\n top: 96px;\\n width: 48px;\\n height: calc(100% - 192px);\\n z-index: -1;\\n}\\nviewport > staff > z-meter {\\n display: block;\\n position: absolute;\\n left: 256px;\\n top: 96px;\\n height: calc(100% - 192px);\\n width: calc(100% - 256px);\\n}\\nviewport > staff > z-meter::before {\\n content: \\\"\\\";\\n border-left: 2px solid #000;\\n position: absolute;\\n height: 100%;\\n left: -257px;\\n}\\nviewport > staff > z-meter > div.repeat {\\n position: absolute;\\n right: 0;\\n height: 100%;\\n}\\nviewport > staff > z-meter > div.repeat::before,\\nviewport > staff > z-meter > div.repeat::after {\\n content: \\\"\\\";\\n display: block;\\n background-color: #000;\\n border-radius: 100%;\\n position: absolute;\\n width: 16px;\\n height: 16px;\\n right: 16px;\\n top: 66px;\\n}\\nviewport > staff > z-meter > div.repeat::after {\\n top: 114px;\\n}\\nviewport > staff > z-meter > div.repeat.bass {\\n position: relative;\\n top: 288px;\\n}\\nviewport > staff > notes {\\n display: block;\\n position: absolute;\\n left: 256px;\\n top: 337px;\\n}\\nviewport > staff > pattern-preview {\\n opacity: 0.5;\\n position: absolute;\\n}\\nviewport > staff > selection {\\n background-color: rgba(103,58,183,0.25);\\n border: 2px dashed #673ab7;\\n position: absolute;\\n left: -150px;\\n z-index: 20;\\n}\\nviewport > staff > selection > button {\\n display: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n margin: auto;\\n width: 48px;\\n height: 48px;\\n}\\nviewport > staff > selection > button.up {\\n bottom: calc(100% + 4px);\\n top: auto;\\n}\\nviewport > staff > selection > button.down {\\n top: calc(100% + 4px);\\n bottom: auto;\\n}\\nviewport > staff > selection > button.left {\\n right: calc(100% + 4px);\\n left: auto;\\n}\\nviewport > staff > selection > button.right {\\n left: calc(100% + 4px);\\n right: auto;\\n}\\nviewport > staff > selection > actions {\\n display: none;\\n position: absolute;\\n}\\nviewport > staff > selection > actions > button {\\n margin-left: 4px;\\n}\\nviewport > staff > selection.t > actions {\\n top: 0;\\n}\\nviewport > staff > selection.b > actions {\\n bottom: 0;\\n}\\nviewport > staff > selection.l > actions {\\n left: 0;\\n}\\nviewport > staff > selection.r > actions {\\n right: 0;\\n}\\nviewport > staff > selection.set > actions {\\n display: flex;\\n}\\nviewport > staff > selection.set > button {\\n display: block;\\n}\\nviewport > staff > lines {\\n display: block;\\n margin-bottom: 48px;\\n}\\nviewport > staff > lines:nth-child(2) {\\n margin-bottom: 0;\\n}\\nviewport > staff > lines:nth-child(2) > line:last-child {\\n height: 0;\\n}\\nviewport > staff > lines > line {\\n border-top: 3px solid #000;\\n display: block;\\n height: 48px;\\n}\\nviewport > staff > playhead {\\n border-left: 1px solid rgba(103,58,183,0.5);\\n border-right: 1px solid rgba(103,58,183,0.5);\\n position: absolute;\\n top: 0;\\n height: 674px;\\n width: 2px;\\n z-index: 10;\\n}\\nviewport > staff > playhead.buffer-start {\\n display: none;\\n border-color: rgba(255,0,0,0.5);\\n}\\nviewport > staff > playhead.buffer-end {\\n display: none;\\n border-color: rgba(0,0,255,0.5);\\n}\\nviewport > staff > img {\\n position: absolute;\\n height: 600px;\\n top: -94px;\\n left: -120px;\\n}\\nviewport > staff > img:last-child {\\n left: -100px;\\n top: 181px;\\n}\\nform > label {\\n display: block;\\n}\\nform > label > h3 {\\n font-size: 1rem;\\n}\\nform > label > h3.inline {\\n display: inline-block;\\n margin-right: 0.5em;\\n}\\nform > label > input {\\n padding-left: 2px;\\n width: 100%;\\n}\\nform > actions {\\n display: flex;\\n justify-content: space-between;\\n margin-top: 1em;\\n}\\nform.purchase {\\n width: 672px;\\n}\\napp {\\n display: flex;\\n flex: 1 0;\\n height: 100%;\\n flex-direction: column;\\n}\\nbutton.loop {\\n font-size: 32px;\\n line-height: 1rem;\\n}\\naside.meter-picker {\\n margin-left: 8px;\\n}\\naside.meter-picker > button {\\n border-radius: 0;\\n}\\naside.meter-picker > button:first-child {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n}\\naside.meter-picker > button:last-child {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\naside.note-control > section {\\n display: flex;\\n margin-left: 1rem;\\n}\\naside.note-control > section > label {\\n display: flex;\\n align-items: center;\\n margin-right: 4px;\\n}\\naside.note-control > section > button {\\n flex: 0 0 auto;\\n font-size: 20px;\\n line-height: 1rem;\\n width: 36px;\\n border-radius: 0;\\n}\\naside.note-control > section > button.triplet {\\n font-size: 16px;\\n}\\naside.note-control > section > button:nth-child(n + 3) {\\n border-left: 0;\\n}\\naside.note-control > section > button:nth-child(2) {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n}\\naside.note-control > section.snap > button:nth-child(5) {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\naside.note-control > section.snap > input {\\n margin-left: 5px;\\n width: 60px;\\n}\\naside.note-control > section.accidental > button:nth-child(4) {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\nsection.persistence {\\n display: flex;\\n flex-direction: column;\\n padding: 1rem;\\n width: 480px;\\n}\\nsection.persistence > button {\\n margin-top: 8px;\\n width: 100%;\\n}\\nsection.persistence > button:first-child {\\n margin-top: 0;\\n}\\nabout > actions > button,\\nabout > actions a.button {\\n width: 100%;\\n margin-top: 8px;\\n}\\naside {\\n display: flex;\\n}\\naside > label {\\n display: flex;\\n align-items: center;\\n margin-right: 4px;\\n margin-left: 1rem;\\n}\\naside.stereo-analyser > canvas {\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n}\\naside.fx-picker {\\n display: flex;\\n}\\naside.fx-picker > button {\\n background-size: 100%;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n height: 36px;\\n padding: 0;\\n margin-left: 2px;\\n width: 36px;\\n}\\naside.actions {\\n background-color: #fff;\\n border-top: 2px solid #673ab7;\\n display: flex;\\n flex: 0 0 auto;\\n flex-direction: column;\\n padding: 4px 4px 0px 4px;\\n width: 100%;\\n}\\naside.actions > section:nth-child(2) > button,\\naside.actions > section:nth-child(2) > a.button {\\n padding: 15px 8px;\\n}\\naside.actions > section {\\n display: flex;\\n}\\naside.actions > section:last-child {\\n margin-top: 8px;\\n}\\naside.actions > section.buttons > * {\\n margin-bottom: 6px;\\n}\\naside.actions > section.buttons > *:nth-child(n + 2) {\\n margin-left: 4px;\\n}\\naside.actions > section.buttons > form {\\n display: flex;\\n}\\naside.actions > section.buttons > button,\\naside.actions > section.buttons > a.button {\\n flex: 0 0 auto;\\n}\\naside.actions > section.buttons > label {\\n align-items: center;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n display: flex;\\n flex-direction: column;\\n padding: 5px 8px 4px;\\n white-space: nowrap;\\n}\\naside.actions > section.buttons > label > input {\\n padding: 2px 0 0;\\n text-align: center;\\n width: 60px;\\n}\\naside.actions > section.buttons > label > h2 {\\n display: block;\\n font-size: 1em;\\n font-weight: normal;\\n margin: 0 0 4px;\\n}\\naside.actions > section.buttons > .right {\\n margin-left: auto;\\n}\\nactions > label {\\n background-color: #fff;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n cursor: pointer;\\n font: inherit;\\n line-height: 1em;\\n padding: 9px 16px;\\n}\\nactions > label:nth-child(n + 2) {\\n margin-left: 4px;\\n}\\na.button {\\n align-items: center;\\n display: inline-flex;\\n justify-content: center;\\n text-align: center;\\n text-decoration: none;\\n}\\na.button > :nth-child(2) {\\n margin-left: 5px;\\n}\\nbutton,\\na.button {\\n background-color: #fff;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n cursor: pointer;\\n font-size: inherit;\\n line-height: 1em;\\n padding: 9px 8px;\\n white-space: nowrap;\\n}\\nbutton.full,\\na.button.full {\\n width: 100%;\\n}\\nbutton:focus,\\na.button:focus {\\n background-color: #ffc107;\\n color: rgba(0,0,0,0.69);\\n outline-offset: 4px;\\n}\\nbutton:active,\\na.button:active,\\nbutton.active,\\na.button.active {\\n background-color: #673ab7;\\n border: 1px solid #673ab7;\\n color: #fff;\\n box-shadow: 1px 2px 0px #241440 inset;\\n}\\nbutton:disabled,\\na.button:disabled {\\n background-color: #eee;\\n border-color: #4e4e4e;\\n box-shadow: 1px 2px 0px #4e4e4e;\\n color: #4e4e4e;\\n cursor: default;\\n}\\ntools,\\npatterns {\\n background-color: #fff;\\n border-bottom: 2px solid #673ab7;\\n display: flex;\\n width: 100%;\\n}\\ntools > *,\\npatterns > * {\\n background-repeat: no-repeat;\\n background-position: 50% 50%;\\n border-right: 1px solid #673ab7;\\n cursor: pointer;\\n display: block;\\n width: 49px;\\n height: 48px;\\n}\\ntools > *:hover,\\npatterns > *:hover {\\n background-color: #ffe0b2;\\n}\\ntools > *.active,\\npatterns > *.active {\\n background-color: #ffc107;\\n}\\ntools > tool.eraser,\\npatterns > tool.eraser {\\n order: 2;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAIdJREFUeJzNUsERwCAIw15n031wDt0Hl0s/9VoF9NnmZzRBCERfI2zusdOtDABmopRGVoRCrdviADNMiADM6L873Mql2NYiw3E2WItzVi2dSuw8JBHNvQyegcU4vmjNFesWZrHFTSlYQ/RhRDgatKZFnXPy7zMIoVaYa3fH5i3PTHira4r/gQv1W1E4p9FksQAAAABJRU5ErkJggg==\\\");\\n}\\ntools > .selection,\\npatterns > .selection {\\n order: 2;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVRYR+1XQQrAIAyr/3/0RLAyqoUdzNJDvFnEpkkM2MzssX21Qw1SGo0igHfNgfiZ6/sI4HqDSVs6wGlaCNXZpQ7gN80jkIxyNAtLkjIA0BOn99O0d0RlJIjvFC3JZkJ0Q3kgMqAcWIwoB8oEkXKAHsV0APIAXQI6AHkA9vf78jUbZ+gAaB7opmM7IWnG3nUAAAAASUVORK5CYII=\\\");\\n}\\ntools > * {\\n -ms-interpolation-mode: nearest-neighbor;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n}\\npatterns {\\n margin-top: -1px;\\n}\\npatterns:empty {\\n display: none;\\n}\\npatterns > pattern {\\n display: flex;\\n padding: 0 8px;\\n align-items: center;\\n width: 64px;\\n overflow: hidden;\\n}\\npatterns > pattern > preview {\\n position: relative;\\n transform: scale(0.0625, 0.0625);\\n top: -14px;\\n}\\npatterns > pattern > preview > * {\\n transform: scale(4);\\n}\\npre.position {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid #000;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n padding: 2px 6px 2px 4px;\\n font-family: inherit;\\n pointer-events: none;\\n padding: 4px;\\n position: absolute;\\n left: 1rem;\\n top: calc(45px + 1rem);\\n}\\npre.position:empty {\\n display: none;\\n}\\npre.debug:empty {\\n display: none;\\n}\\n@media only screen and (max-width: 768px) {\\n aside.actions {\\n border-top: none;\\n padding-top: 0;\\n }\\n aside.actions > section:first-child {\\n display: none;\\n }\\n aside.actions > section:nth-child(2) {\\n margin-top: 0;\\n }\\n button > span.description {\\n display: none;\\n }\\n tools,\\n patterns {\\n order: 2;\\n border: none;\\n width: 49px;\\n height: 48px;\\n }\\n tools > *,\\n patterns > * {\\n border-top: 1px solid #673ab7;\\n display: none;\\n }\\n tools tool.active,\\n patterns tool.active {\\n display: block;\\n }\\n tools pattern.active,\\n patterns pattern.active {\\n display: flex;\\n }\\n tools.open,\\n patterns.open {\\n background-color: #673ab7;\\n display: grid;\\n grid-gap: 1px;\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\\n z-index: 1;\\n }\\n tools.open > *,\\n patterns.open > * {\\n background-color: #fff;\\n background-size: 100%;\\n border: none;\\n display: block;\\n image-rendering: pixelated;\\n height: 100%;\\n width: 100%;\\n }\\n tools.open > *:hover,\\n patterns.open > *:hover {\\n background-color: #ffe0b2;\\n }\\n}\\n@-moz-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@-webkit-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@-o-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n\";" + "content": "module.exports = \"@font-face {\\n font-display: auto;\\n font-family: 'Chicago';\\n src: url(\\\"fonts/chicago.woff2\\\") format('woff2'), url(\\\"fonts/chicago.woff\\\") format('woff');\\n font-weight: normal;\\n font-style: normal;\\n}\\n* {\\n box-sizing: border-box;\\n}\\nimg {\\n max-width: 100%;\\n}\\n.hidden {\\n display: none !important;\\n}\\n#modal > * {\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: inherit;\\n padding: 1rem;\\n}\\n#modal > * > h1,\\n#modal > * > h2 {\\n margin-top: 0;\\n}\\n#modal > section.purchase {\\n background-color: transparent;\\n border: none;\\n border-radius: 0;\\n box-shadow: none;\\n padding: 0;\\n}\\n#modal > .publish > p.status:empty {\\n margin: 0;\\n}\\n#modal > .publish > pre {\\n user-select: all;\\n}\\n#modal > .publish > actions {\\n display: flex;\\n}\\n#modal > .publish > actions > button:last-child {\\n margin-left: auto;\\n}\\n:focus {\\n color: #fff;\\n background-color: #673ab7;\\n outline: none;\\n}\\nhtml,\\nbody {\\n height: 100%;\\n}\\nbody {\\n color: #241440;\\n display: flex;\\n font-family: Chicago, sans-serif;\\n font-size: 16px;\\n line-height: 1rem;\\n margin: 0;\\n overflow: hidden;\\n user-select: none;\\n}\\np {\\n font-family: sans-serif;\\n}\\ninput,\\ntextarea,\\nselect,\\nbutton {\\n font-family: inherit;\\n}\\ninput {\\n background-color: #ede7f6;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7 inset;\\n color: #673ab7;\\n font-size: inherit;\\n padding: 2px 0.25em;\\n}\\ninput[type=\\\"number\\\"] {\\n -moz-appearance: textfield;\\n}\\ninput:focus {\\n background-color: #ffc107;\\n color: rgba(0,0,0,0.69);\\n}\\nnote {\\n font-size: 48px;\\n height: 48px;\\n -ms-interpolation-mode: nearest-neighbor;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n position: absolute;\\n width: 48px;\\n}\\nnote.active {\\n animation-name: note-active;\\n animation-duration: 0.25s;\\n}\\nnote::after {\\n align-items: center;\\n background-repeat: no-repeat;\\n background-position: 100% 50%;\\n content: \\\"\\\";\\n display: flex;\\n position: absolute;\\n left: 0;\\n top: 0;\\n width: 100%;\\n height: 100%;\\n text-indent: -12px;\\n}\\nnote.♭::after {\\n content: \\\"♭\\\";\\n}\\nnote.♯::after {\\n content: \\\"♯\\\";\\n}\\nnote.C4::before,\\nnote.A5::before,\\nnote.C6::before,\\nnote.C2::before,\\nnote.E2::before,\\nnote.B5::before,\\nnote.D2::before {\\n content: \\\"\\\";\\n width: 48px;\\n left: 0px;\\n top: 23px;\\n position: absolute;\\n height: 0;\\n border-bottom: 2px solid #000;\\n}\\nnote.B5::before {\\n top: 40px;\\n}\\nnote.D2::before {\\n top: -8px;\\n}\\nsong-section {\\n height: 483px;\\n position: absolute;\\n top: -241px;\\n}\\nsong-section::after {\\n content: \\\"\\\";\\n border-right: 2px solid #000;\\n height: 100%;\\n position: absolute;\\n right: 10px;\\n}\\nsong-section > span.measure-number {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid #000;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n font-style: italic;\\n left: 0px;\\n padding: 2px 6px 2px 4px;\\n position: absolute;\\n top: -132px;\\n}\\nsong-section > div.key-signature.s > ::after {\\n content: \\\"♯\\\";\\n}\\nsong-section > div.key-signature.f > ::after {\\n content: \\\"♭\\\";\\n}\\nsong-section > div.key-signature > * {\\n display: none;\\n font-size: 96px;\\n height: 48px;\\n position: absolute;\\n width: 48px;\\n}\\nsong-section > div.key-signature > *::after {\\n align-items: center;\\n display: flex;\\n height: 100%;\\n width: 100%;\\n}\\nsong-section > div.key-signature.s1 > :nth-child(1),\\nsong-section > div.key-signature.s2 > :nth-child(1),\\nsong-section > div.key-signature.s3 > :nth-child(1),\\nsong-section > div.key-signature.s4 > :nth-child(1),\\nsong-section > div.key-signature.s5 > :nth-child(1),\\nsong-section > div.key-signature.s6 > :nth-child(1),\\nsong-section > div.key-signature.s7 > :nth-child(1) {\\n display: initial;\\n top: -24px;\\n left: -96px;\\n}\\nsong-section > div.key-signature.s2 > :nth-child(2),\\nsong-section > div.key-signature.s3 > :nth-child(2),\\nsong-section > div.key-signature.s4 > :nth-child(2),\\nsong-section > div.key-signature.s5 > :nth-child(2),\\nsong-section > div.key-signature.s6 > :nth-child(2),\\nsong-section > div.key-signature.s7 > :nth-child(2) {\\n display: initial;\\n top: 48px;\\n left: -72px;\\n}\\nsong-section > div.key-signature.s3 > :nth-child(3),\\nsong-section > div.key-signature.s4 > :nth-child(3),\\nsong-section > div.key-signature.s5 > :nth-child(3),\\nsong-section > div.key-signature.s6 > :nth-child(3),\\nsong-section > div.key-signature.s7 > :nth-child(3) {\\n display: initial;\\n top: -48px;\\n left: -48px;\\n}\\nsong-section > div.key-signature.s4 > :nth-child(4),\\nsong-section > div.key-signature.s5 > :nth-child(4),\\nsong-section > div.key-signature.s6 > :nth-child(4),\\nsong-section > div.key-signature.s7 > :nth-child(4) {\\n display: initial;\\n top: 24px;\\n left: -24px;\\n}\\nsong-section > div.key-signature.s5 > :nth-child(5),\\nsong-section > div.key-signature.s6 > :nth-child(5),\\nsong-section > div.key-signature.s7 > :nth-child(5) {\\n display: initial;\\n top: 96px;\\n left: 0;\\n}\\nsong-section > div.key-signature.s6 > :nth-child(6),\\nsong-section > div.key-signature.s7 > :nth-child(6) {\\n display: initial;\\n top: 0px;\\n left: 24px;\\n}\\nsong-section > div.key-signature.s7 > :nth-child(7) {\\n display: initial;\\n top: 72px;\\n left: 48px;\\n}\\nsong-section > div.key-signature.f1 > :nth-child(1),\\nsong-section > div.key-signature.f2 > :nth-child(1),\\nsong-section > div.key-signature.f3 > :nth-child(1),\\nsong-section > div.key-signature.f4 > :nth-child(1),\\nsong-section > div.key-signature.f5 > :nth-child(1),\\nsong-section > div.key-signature.f6 > :nth-child(1),\\nsong-section > div.key-signature.f7 > :nth-child(1) {\\n display: initial;\\n top: 72px;\\n left: -96px;\\n}\\nsong-section > div.key-signature.f2 > :nth-child(2),\\nsong-section > div.key-signature.f3 > :nth-child(2),\\nsong-section > div.key-signature.f4 > :nth-child(2),\\nsong-section > div.key-signature.f5 > :nth-child(2),\\nsong-section > div.key-signature.f6 > :nth-child(2),\\nsong-section > div.key-signature.f7 > :nth-child(2) {\\n display: initial;\\n top: 0px;\\n left: -72px;\\n}\\nsong-section > div.key-signature.f3 > :nth-child(3),\\nsong-section > div.key-signature.f4 > :nth-child(3),\\nsong-section > div.key-signature.f5 > :nth-child(3),\\nsong-section > div.key-signature.f6 > :nth-child(3),\\nsong-section > div.key-signature.f7 > :nth-child(3) {\\n display: initial;\\n top: 96px;\\n left: -48px;\\n}\\nsong-section > div.key-signature.f4 > :nth-child(4),\\nsong-section > div.key-signature.f5 > :nth-child(4),\\nsong-section > div.key-signature.f6 > :nth-child(4),\\nsong-section > div.key-signature.f7 > :nth-child(4) {\\n display: initial;\\n top: 24px;\\n left: -24px;\\n}\\nsong-section > div.key-signature.f5 > :nth-child(5),\\nsong-section > div.key-signature.f6 > :nth-child(5),\\nsong-section > div.key-signature.f7 > :nth-child(5) {\\n display: initial;\\n top: -48px;\\n left: 0;\\n}\\nsong-section > div.key-signature.f6 > :nth-child(6),\\nsong-section > div.key-signature.f7 > :nth-child(6) {\\n display: initial;\\n top: 48px;\\n left: 24px;\\n}\\nsong-section > div.key-signature.f7 > :nth-child(7) {\\n display: initial;\\n top: -24px;\\n left: 48px;\\n}\\ntd > select {\\n width: 100%;\\n}\\ntd > input {\\n border-radius: 0;\\n box-shadow: none;\\n}\\ntd > aside.fx-picker > label {\\n display: none;\\n}\\ntd.sprite {\\n text-align: center;\\n vertical-align: middle;\\n}\\ntd.sprite > img {\\n margin-right: 1rem;\\n vertical-align: middle;\\n}\\ntd.input > input[type=number] {\\n display: block;\\n margin: auto;\\n width: 60px;\\n}\\nsection.settings {\\n overflow: auto;\\n padding: 1rem;\\n position: relative;\\n}\\nsection.settings > h2 {\\n margin: 0 0 1rem;\\n}\\nsection.settings > button.close {\\n position: absolute;\\n top: 1rem;\\n right: 1rem;\\n}\\nsection.settings > table {\\n margin: 0 -8px;\\n width: calc(100% + 16px);\\n}\\nsection.demo-picker {\\n overflow: auto;\\n padding: 1rem;\\n position: relative;\\n}\\nsection.demo-picker > h2 {\\n margin: 0 0 1rem;\\n}\\nsection.demo-picker > button.close {\\n position: absolute;\\n top: 1rem;\\n right: 1rem;\\n}\\nsection.demo-picker > table {\\n font-size: 18px;\\n}\\nsection.demo-picker > table > tbody > tr {\\n cursor: pointer;\\n line-height: 2rem;\\n}\\nsection.demo-picker > table > tbody > tr:hover {\\n background-color: rgba(103,58,183,0.19);\\n}\\nviewport {\\n background-attachment: local;\\n background-color: #ede7f6;\\n display: flex;\\n height: 100%;\\n align-items: center;\\n overflow-x: scroll;\\n overflow-y: hidden;\\n}\\nviewport > staff {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid rgba(0,0,0,0.5);\\n box-sizing: content-box;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n display: block;\\n flex: 0 0 auto;\\n padding: 96px 0;\\n position: relative;\\n margin: 0 48px;\\n z-index: 0;\\n}\\nviewport > staff::after {\\n border-left: 8px solid #000;\\n content: \\\"\\\";\\n position: absolute;\\n right: -48px;\\n top: 96px;\\n width: 48px;\\n height: calc(100% - 192px);\\n z-index: -1;\\n}\\nviewport > staff > z-meter {\\n display: block;\\n position: absolute;\\n left: 256px;\\n top: 96px;\\n height: calc(100% - 192px);\\n width: calc(100% - 256px);\\n}\\nviewport > staff > z-meter::before {\\n content: \\\"\\\";\\n border-left: 2px solid #000;\\n position: absolute;\\n height: 100%;\\n left: -257px;\\n}\\nviewport > staff > z-meter > div.repeat {\\n position: absolute;\\n right: 0;\\n height: 100%;\\n}\\nviewport > staff > z-meter > div.repeat::before,\\nviewport > staff > z-meter > div.repeat::after {\\n content: \\\"\\\";\\n display: block;\\n background-color: #000;\\n border-radius: 100%;\\n position: absolute;\\n width: 16px;\\n height: 16px;\\n right: 16px;\\n top: 66px;\\n}\\nviewport > staff > z-meter > div.repeat::after {\\n top: 114px;\\n}\\nviewport > staff > z-meter > div.repeat.bass {\\n position: relative;\\n top: 288px;\\n}\\nviewport > staff > notes {\\n display: block;\\n position: absolute;\\n left: 256px;\\n top: 337px;\\n}\\nviewport > staff > pattern-preview {\\n opacity: 0.5;\\n position: absolute;\\n}\\nviewport > staff > selection {\\n background-color: rgba(103,58,183,0.25);\\n border: 2px dashed #673ab7;\\n position: absolute;\\n left: -150px;\\n z-index: 20;\\n}\\nviewport > staff > selection > button {\\n display: none;\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n margin: auto;\\n width: 48px;\\n height: 48px;\\n}\\nviewport > staff > selection > button.up {\\n bottom: calc(100% + 4px);\\n top: auto;\\n}\\nviewport > staff > selection > button.down {\\n top: calc(100% + 4px);\\n bottom: auto;\\n}\\nviewport > staff > selection > button.left {\\n right: calc(100% + 4px);\\n left: auto;\\n}\\nviewport > staff > selection > button.right {\\n left: calc(100% + 4px);\\n right: auto;\\n}\\nviewport > staff > selection > actions {\\n display: none;\\n position: absolute;\\n}\\nviewport > staff > selection > actions > button {\\n margin-left: 4px;\\n}\\nviewport > staff > selection.t > actions {\\n top: 0;\\n}\\nviewport > staff > selection.b > actions {\\n bottom: 0;\\n}\\nviewport > staff > selection.l > actions {\\n left: 0;\\n}\\nviewport > staff > selection.r > actions {\\n right: 0;\\n}\\nviewport > staff > selection.set > actions {\\n display: flex;\\n}\\nviewport > staff > selection.set > button {\\n display: block;\\n}\\nviewport > staff > lines {\\n display: block;\\n margin-bottom: 48px;\\n}\\nviewport > staff > lines:nth-child(2) {\\n margin-bottom: 0;\\n}\\nviewport > staff > lines:nth-child(2) > line:last-child {\\n height: 0;\\n}\\nviewport > staff > lines > line {\\n border-top: 3px solid #000;\\n display: block;\\n height: 48px;\\n}\\nviewport > staff > playhead {\\n border-left: 1px solid rgba(103,58,183,0.5);\\n border-right: 1px solid rgba(103,58,183,0.5);\\n position: absolute;\\n top: 0;\\n height: 674px;\\n width: 2px;\\n z-index: 10;\\n}\\nviewport > staff > playhead.buffer-start {\\n display: none;\\n border-color: rgba(255,0,0,0.5);\\n}\\nviewport > staff > playhead.buffer-end {\\n display: none;\\n border-color: rgba(0,0,255,0.5);\\n}\\nviewport > staff > img {\\n position: absolute;\\n height: 600px;\\n top: -94px;\\n left: -120px;\\n}\\nviewport > staff > img:last-child {\\n left: -100px;\\n top: 181px;\\n}\\nform > label {\\n display: block;\\n}\\nform > label > h3 {\\n font-size: 1rem;\\n}\\nform > label > h3.inline {\\n display: inline-block;\\n margin-right: 0.5em;\\n}\\nform > label > input {\\n padding-left: 2px;\\n width: 100%;\\n}\\nform > actions {\\n display: flex;\\n justify-content: space-between;\\n margin-top: 1em;\\n}\\nform.purchase {\\n width: 672px;\\n}\\napp {\\n display: flex;\\n flex: 1 0;\\n height: 100%;\\n flex-direction: column;\\n}\\nbutton.loop {\\n font-size: 32px;\\n line-height: 1rem;\\n}\\naside.meter-picker {\\n margin-left: 8px;\\n}\\naside.meter-picker > button {\\n border-radius: 0;\\n}\\naside.meter-picker > button:first-child {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n}\\naside.meter-picker > button:last-child {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\naside.note-control > section {\\n display: flex;\\n margin-left: 1rem;\\n}\\naside.note-control > section > label {\\n display: flex;\\n align-items: center;\\n margin-right: 4px;\\n}\\naside.note-control > section > button {\\n flex: 0 0 auto;\\n font-size: 20px;\\n line-height: 1rem;\\n width: 36px;\\n border-radius: 0;\\n}\\naside.note-control > section > button.triplet {\\n font-size: 16px;\\n}\\naside.note-control > section > button:nth-child(n + 3) {\\n border-left: 0;\\n}\\naside.note-control > section > button:nth-child(2) {\\n border-top-left-radius: 4px;\\n border-bottom-left-radius: 4px;\\n}\\naside.note-control > section.snap > button:nth-child(5) {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\naside.note-control > section.snap > input {\\n margin-left: 5px;\\n width: 60px;\\n}\\naside.note-control > section.accidental > button:nth-child(4) {\\n border-top-right-radius: 4px;\\n border-bottom-right-radius: 4px;\\n}\\nsection.persistence {\\n display: flex;\\n flex-direction: column;\\n padding: 1rem;\\n width: 480px;\\n}\\nsection.persistence > button {\\n margin-top: 8px;\\n width: 100%;\\n}\\nsection.persistence > button:first-child {\\n margin-top: 0;\\n}\\nabout > actions > button,\\nabout > actions a.button {\\n width: 100%;\\n margin-top: 8px;\\n}\\naside {\\n display: flex;\\n}\\naside > label {\\n display: flex;\\n align-items: center;\\n margin-right: 4px;\\n margin-left: 1rem;\\n}\\naside.stereo-analyser > canvas {\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n}\\naside.fx-picker {\\n display: flex;\\n}\\naside.fx-picker > button {\\n background-size: 100%;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n height: 36px;\\n padding: 0;\\n margin-left: 2px;\\n width: 36px;\\n}\\naside.actions {\\n background-color: #fff;\\n border-top: 2px solid #673ab7;\\n display: flex;\\n flex: 0 0 auto;\\n flex-direction: column;\\n padding: 4px 4px 0px 4px;\\n width: 100%;\\n}\\naside.actions > section:nth-child(2) > button,\\naside.actions > section:nth-child(2) > a.button {\\n padding: 15px 8px;\\n}\\naside.actions > section {\\n display: flex;\\n}\\naside.actions > section:last-child {\\n margin-top: 8px;\\n}\\naside.actions > section.buttons > * {\\n margin-bottom: 6px;\\n}\\naside.actions > section.buttons > *:nth-child(n + 2) {\\n margin-left: 4px;\\n}\\naside.actions > section.buttons > form {\\n display: flex;\\n}\\naside.actions > section.buttons > button,\\naside.actions > section.buttons > a.button {\\n flex: 0 0 auto;\\n}\\naside.actions > section.buttons > label {\\n align-items: center;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n display: flex;\\n flex-direction: column;\\n padding: 5px 8px 4px;\\n white-space: nowrap;\\n}\\naside.actions > section.buttons > label > input {\\n padding: 2px 0 0;\\n text-align: center;\\n width: 60px;\\n}\\naside.actions > section.buttons > label > h2 {\\n display: block;\\n font-size: 1em;\\n font-weight: normal;\\n margin: 0 0 4px;\\n}\\naside.actions > section.buttons > .right {\\n margin-left: auto;\\n}\\nactions > label {\\n background-color: #fff;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n cursor: pointer;\\n font: inherit;\\n line-height: 1em;\\n padding: 9px 16px;\\n}\\nactions > label:nth-child(n + 2) {\\n margin-left: 4px;\\n}\\na.button {\\n align-items: center;\\n display: inline-flex;\\n justify-content: center;\\n text-align: center;\\n text-decoration: none;\\n}\\na.button > :nth-child(2) {\\n margin-left: 5px;\\n}\\nbutton,\\na.button {\\n background-color: #fff;\\n border: 1px solid #673ab7;\\n border-radius: 4px;\\n box-shadow: 1px 2px 0px #673ab7;\\n color: #673ab7;\\n cursor: pointer;\\n font-size: inherit;\\n line-height: 1em;\\n padding: 9px 8px;\\n white-space: nowrap;\\n}\\nbutton.full,\\na.button.full {\\n width: 100%;\\n}\\nbutton:focus,\\na.button:focus {\\n background-color: #ffc107;\\n color: rgba(0,0,0,0.69);\\n outline-offset: 4px;\\n}\\nbutton:active,\\na.button:active,\\nbutton.active,\\na.button.active {\\n background-color: #673ab7;\\n border: 1px solid #673ab7;\\n color: #fff;\\n box-shadow: 1px 2px 0px #241440 inset;\\n}\\nbutton:disabled,\\na.button:disabled {\\n background-color: #eee;\\n border-color: #4e4e4e;\\n box-shadow: 1px 2px 0px #4e4e4e;\\n color: #4e4e4e;\\n cursor: default;\\n}\\ntools,\\npatterns {\\n background-color: #fff;\\n border-bottom: 2px solid #673ab7;\\n display: flex;\\n width: 100%;\\n}\\ntools > *,\\npatterns > * {\\n background-repeat: no-repeat;\\n background-position: 50% 50%;\\n border-right: 1px solid #673ab7;\\n cursor: pointer;\\n display: block;\\n width: 49px;\\n height: 48px;\\n}\\ntools > *:hover,\\npatterns > *:hover {\\n background-color: #ffe0b2;\\n}\\ntools > *.active,\\npatterns > *.active {\\n background-color: #ffc107;\\n}\\ntools > tool.eraser,\\npatterns > tool.eraser {\\n order: 2;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAAIdJREFUeJzNUsERwCAIw15n031wDt0Hl0s/9VoF9NnmZzRBCERfI2zusdOtDABmopRGVoRCrdviADNMiADM6L873Mql2NYiw3E2WItzVi2dSuw8JBHNvQyegcU4vmjNFesWZrHFTSlYQ/RhRDgatKZFnXPy7zMIoVaYa3fH5i3PTHira4r/gQv1W1E4p9FksQAAAABJRU5ErkJggg==\\\");\\n}\\ntools > .selection,\\npatterns > .selection {\\n order: 2;\\n background-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAiUlEQVRYR+1XQQrAIAyr/3/0RLAyqoUdzNJDvFnEpkkM2MzssX21Qw1SGo0igHfNgfiZ6/sI4HqDSVs6wGlaCNXZpQ7gN80jkIxyNAtLkjIA0BOn99O0d0RlJIjvFC3JZkJ0Q3kgMqAcWIwoB8oEkXKAHsV0APIAXQI6AHkA9vf78jUbZ+gAaB7opmM7IWnG3nUAAAAASUVORK5CYII=\\\");\\n}\\ntools > * {\\n -ms-interpolation-mode: nearest-neighbor;\\n image-rendering: crisp-edges;\\n image-rendering: pixelated;\\n}\\npatterns {\\n margin-top: -1px;\\n}\\npatterns:empty {\\n display: none;\\n}\\npatterns > pattern {\\n display: flex;\\n padding: 0 8px;\\n align-items: center;\\n width: 64px;\\n overflow: hidden;\\n}\\npatterns > pattern > preview {\\n position: relative;\\n transform: scale(0.0625, 0.0625);\\n top: -14px;\\n}\\npatterns > pattern > preview > * {\\n transform: scale(4);\\n}\\npre.position {\\n background-color: rgba(255,255,255,0.938);\\n border: 1px solid #000;\\n box-shadow: 1px 1px 0 0 rgba(0,0,0,0.5);\\n padding: 2px 6px 2px 4px;\\n font-family: inherit;\\n pointer-events: none;\\n padding: 4px;\\n position: absolute;\\n left: 1rem;\\n top: calc(45px + 1rem);\\n}\\npre.position:empty {\\n display: none;\\n}\\npre.debug:empty {\\n display: none;\\n}\\n@media only screen and (max-width: 768px) {\\n aside.actions {\\n border-top: none;\\n padding-top: 0;\\n }\\n aside.actions > section:first-child {\\n display: none;\\n }\\n aside.actions > section:nth-child(2) {\\n margin-top: 0;\\n }\\n button > span.description {\\n display: none;\\n }\\n tools,\\n patterns {\\n order: 2;\\n border: none;\\n width: 49px;\\n height: 48px;\\n }\\n tools > *,\\n patterns > * {\\n border-top: 1px solid #673ab7;\\n display: none;\\n }\\n tools tool.active,\\n patterns tool.active {\\n display: block;\\n }\\n tools pattern.active,\\n patterns pattern.active {\\n display: flex;\\n }\\n tools.open,\\n patterns.open {\\n background-color: #673ab7;\\n display: grid;\\n grid-gap: 1px;\\n position: absolute;\\n width: 100%;\\n height: 100%;\\n grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\\n z-index: 1;\\n }\\n tools.open > *,\\n patterns.open > * {\\n background-color: #fff;\\n background-size: 100%;\\n border: none;\\n display: block;\\n image-rendering: pixelated;\\n height: 100%;\\n width: 100%;\\n }\\n tools.open > *:hover,\\n patterns.open > *:hover {\\n background-color: #ffe0b2;\\n }\\n}\\n@-moz-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@-webkit-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@-o-keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n@keyframes note-active {\\n from {\\n background-color: rgba(0,0,0,0);\\n }\\n to {\\n background-color: rgba(255,0,255,0);\\n }\\n}\\n\";" }, "templates/about": { "content": "module.exports = system.ui.Jadelet.exec([\"about\",{},[[\"h1\",{},[\"About\"]],[\"p\",{},[\"ProTip™ hold Shift to sharp, Ctrl to flat\"]],[\"p\",{},[\"By\\n\",[\"a\",{\"href\":\"https://danielx.net\"},[\"Daniel X. Moore\"]],\" creator of\\n\",[\"a\",{\"href\":\"https://whimsy.space\"},[\"Whimsy.Space\"]]]]]]);" @@ -867,9 +864,6 @@ "data/views/slider": { "content": "var Observable;\n\nObservable = system.ui.Observable;\n\nmodule.exports = {\n name: \"Delay\",\n value: Observable(100),\n min: 0,\n max: 250,\n unit: \"ms\"\n};\n" }, - "service-worker": { - "content": "var cacheName;\n\ncacheName = 'files';\n\naddEventListener('fetch', function(event) {\n var request;\n request = event.request;\n if (request.method !== 'GET') {\n return;\n }\n event.respondWith(caches.open(cacheName).then(function(cache) {\n return fetch(request).then(function(response) {\n cache.put(request, response.clone());\n return response;\n })[\"catch\"](function() {\n return cache.match(request);\n });\n }));\n});\n\naddEventListener('install', function(event) {\n return event.waitUntil(caches.open(cacheName).then(function(cache) {\n return cache.addAll(['.', '/composer/lame-worker2.js']);\n }));\n});\n" - }, "templates/persistence": { "content": "module.exports = system.ui.Jadelet.exec([\"section\",{\"class\":[\"persistence\"]},[[\"button\",{\"click\":{\"bind\":\"showDemoSongPicker\"}},[\"Load a demo song\"]],[\"button\",{\"click\":{\"bind\":\"saveFile\"}},[\"Save to disk\"]],[\"button\",{\"click\":{\"bind\":\"openFile\"}},[\"Load from disk\"]],[\"button\",{\"click\":{\"bind\":\"publish\"}},[\"Publish to a shareable URL\"]],[\"button\",{\"click\":{\"bind\":\"loadFromURLString\"}},[\"Load from URL\"]],[\"button\",{\"click\":{\"bind\":\"exportAudio\"}},[\"Export to .wav or .mp3\"]]]]);" }, @@ -925,7 +919,7 @@ "config": { "title": "Mario Paint Music Composer - danielx.net", "description": "This Mario Paint inspired composer tool is easy and fun. You can create simple\nand beautiful songs right in your browser and share them with the world!", - "iconURL": "https://danielx.net/composer/images/raccoon.png", + "iconURL": "assets/images/raccoon.png", "version": "0.4.7", "publishPath": "/My Briefcase/public/danielx.net/", "name": "composer", @@ -954,16 +948,15 @@ "scope": "./", "icons": [ { - "src": "https://danielx.net/composer/images/raccoon.png", + "src": "assets/images/raccoon.png", "sizes": "48x48" }, { - "src": "https://danielx.net/composer/icon256.png", + "src": "assets/icon256.png", "sizes": "256x256" } ] - }, - "serviceWorker": "service-worker" + } }, "version": "0.1.0", "repository": { diff --git a/lame-worker.js b/lame-worker.js new file mode 100644 index 0000000..c545002 --- /dev/null +++ b/lame-worker.js @@ -0,0 +1,335 @@ +function lamejs(){function U(f){return new Int32Array(f)}function G(f){return new Float32Array(f)}function ha(f){if(1==f.length)return G(f[0]);var k=f[0];f=f.slice(1);for(var r=[],x=0;x>=1;0!=a--;)g[l++]=e>c[b++]?0:1,g[l++]=e>c[b++]?0:1}function r(a,e,c,b,g,l){a>>=1;var h=a%2;for(a>>=1;0!=a--;){var p=c[b++]*e;var m=c[b++]*e;var n=0|p;var d=c[b++]*e;var z=0|m;var E=c[b++]*e;var f=0|d;p+=u.adj43[n];n=0|E;m+=u.adj43[z];g[l++]=0|p;d+=u.adj43[f];g[l++]=0|m;E+=u.adj43[n];g[l++]=0|d;g[l++]=0|E}0!=h&&(p=c[b++]*e,m=c[b++]*e,p+=u.adj43[0|p],m+=u.adj43[0|m],g[l++]=0|p,g[l++]=0|m)}function K(a,e,c,b){var m,g= +e,h=m=0;do{var p=a[g++],n=a[g++];m>=16;m>a&&(m=a,e++);b.bits+=m;return e;case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:g=e;e=d[m-1];var p=h=m=0,n=v.ht[e].xlen,l=v.ht[e].hlen, +f=v.ht[e+1].hlen,q=v.ht[e+2].hlen;do{var D=a[g+0]*n+a[g+1],g=g+2;m+=l[D];h+=f[D];p+=q[D]}while(gh&&(m=h,a++);m>p&&(m=p,a=e+2);b.bits+=m;return a;default:if(m>Y.IXMAX_VAL)return b.bits=Y.LARGE_BITS,-1;m-=15;for(g=24;32>g&&!(v.ht[g].linmax>=m);g++);for(h=g-8;24>h&&!(v.ht[h].linmax>=m);h++);m=h;p=65536*v.ht[m].xlen+v.ht[g].xlen;h=0;do n=a[e++],l=a[e++],0!=n&&(14>=16;h>a&&(h=a,m=g);b.bits+=h;return m}} +function C(a,e,b,c,g,l,h,p){for(var m=e.big_values,n=2;n=m)break;var E=g[n-2]+e.count1bits;if(b.part2_3_length<=E)break;E=new x(E);d=K(c,d,m,E);E=E.bits;b.part2_3_length<=E||(b.assign(e),b.part2_3_length=E,b.region0_count=l[n-2],b.region1_count=n-2-l[n-2],b.table_select[0]=h[n-2],b.table_select[1]=p[n-2],b.table_select[2]=d)}}var u=null;this.qupvt=null;this.setModules=function(a){u=this.qupvt=a};var fa=[[0,0],[0,0],[0,0],[0,0],[0,0],[0,1],[1,1],[1, +1],[1,2],[2,2],[2,3],[2,3],[3,4],[3,4],[3,4],[4,5],[4,5],[4,6],[5,6],[5,6],[5,7],[6,7],[6,7]],d=[1,2,5,7,7,10,10,13,13,13,13,13,13,13,13];this.noquant_count_bits=function(a,e,b){var c=e.l3_enc,m=Math.min(576,e.max_nonzero_coeff+2>>1<<1);null!=b&&(b.sfb_count1=0);for(;1h&&(p=h,e.count1table_select= +1);e.count1bits=p;e.big_values=m;if(0==m)return p;e.block_type==f.SHORT_TYPE?(g=3*a.scalefac_band.s[3],g>e.big_values&&(g=e.big_values),h=e.big_values):e.block_type==f.NORM_TYPE?(g=e.region0_count=a.bv_scf[m-2],h=e.region1_count=a.bv_scf[m-1],h=a.scalefac_band.l[g+h+2],g=a.scalefac_band.l[g+1],hh&&(g=h));g=Math.min(g,m);h=Math.min(h,m);0g)return Y.LARGE_BITS;var g=u.IPOW20(c.global_gain),h,p=0,n=0,l=0,d=0,q=0,w=m,t=0,D=e,H=0;var B=null!=b&&c.global_gain==b.global_gain; +var Q=c.block_type==f.SHORT_TYPE?38:21;for(h=0;h<=Q;h++){var V=-1;if(B||c.block_type==f.NORM_TYPE)V=c.global_gain-(c.scalefac[h]+(0!=c.preflag?u.pretab[h]:0)<c.max_nonzero_coeff&&(h=c.max_nonzero_coeff-p+1,qa.fill(m,c.max_nonzero_coeff,576,0),N=h,0>N&&(N=0),h=Q+1);0==n&&0==l&&(w=m,t=q,D=e,H=d);null!=b&&0=b.sfb_count1&&0=b.step[h]?(0!=n&&(r(n,g,D,H,w,t),n=0,w=m,t=q,D=e,H=d),l+=N):(0!=l&&(k(l,g,D,H,w,t),l=0,w=m,t=q,D=e,H=d),n+=N);if(0>=N){0!=l&&(k(l,g,D,H,w,t),l=0);0!=n&&(r(n,g,D,H,w,t),n=0);break}}h<=Q&&(q+=c.width[h],d+=c.width[h],p+=c.width[h])}0!=n&&r(n,g,D,H,w,t);0!=l&&k(l,g,D,H,w,t);if(0!=(a.substep_shaping&2))for(g=0,Q=.634521682242439/u.IPOW20(c.global_gain+c.scalefac_scale),p=0;p=Q?m[n]:0;return this.noquant_count_bits(a, +c,b)};this.best_huffman_divide=function(a,e){var c=new rb,b=e.l3_enc,g=U(23),l=U(23),h=U(23),p=U(23);if(e.block_type!=f.SHORT_TYPE||1!=a.mode_gr){c.assign(e);if(e.block_type==f.NORM_TYPE){for(var d=e.big_values,q=0;22>=q;q++)g[q]=Y.LARGE_BITS;for(q=0;16>q;q++){var w=a.scalefac_band.l[q+1];if(w>=d)break;for(var t=0,D=new x(t),k=K(b,0,w,D),t=D.bits,I=0;8>I;I++){var H=a.scalefac_band.l[q+I+2];if(H>=d)break;D=t;D=new x(D);H=K(b,w,H,D);D=D.bits;g[q+I]>D&&(g[q+I]=D,l[q+I]=q,h[q+I]=k,p[q+I]=H)}}C(a,c,e, +b,g,l,h,p)}d=c.big_values;if(!(0==d||1<(b[d-2]|b[d-1])||(d=e.count1+2,576c.big_values;d-=4)t=2*(2*(2*b[d-4]+b[d-3])+b[d-2])+b[d-1],q+=v.t32l[t],w+=v.t33l[t];c.big_values=d;c.count1table_select=0;q>w&&(q=w,c.count1table_select=1);c.count1bits=q;c.block_type==f.NORM_TYPE?C(a,c,e,b,g,l,h,p):(c.part2_3_length=q,q=a.scalefac_band.l[8],q>d&&(q=d),0q&&(a=new x(c.part2_3_length), +c.table_select[1]=K(b,q,d,a),c.part2_3_length=a.bits),e.part2_3_length>c.part2_3_length&&e.assign(c))}}};var c=[1,1,1,1,8,2,2,2,4,4,4,8,8,8,16,16],w=[1,2,4,8,1,2,4,8,2,4,8,2,4,8,4,8],a=[0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4],b=[0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3];fb.slen1_tab=a;fb.slen2_tab=b;this.best_scalefac_store=function(e,g,m,n){var l=n.tt[g][m],d,h,p=0;for(d=h=0;dq&&0==l.l3_enc[q+h];q++);0==q&&(l.scalefac[d]=p=-2)}if(0==l.scalefac_scale&&0==l.preflag){for(d= +h=0;d>=1);l.scalefac_scale=p=1}}if(0==l.preflag&&l.block_type!=f.SHORT_TYPE&&2==e.mode_gr){for(d=11;dd;d++)n.scfsi[m][d]=0;if(2==e.mode_gr&&1==g&&n.tt[0][m].block_type!=f.SHORT_TYPE&&n.tt[1][m].block_type!= +f.SHORT_TYPE){g=n.tt[1][m];h=n.tt[0][m];for(p=0;pd;d++)-1!=g.scalefac[d]&&(n++,mp;p++)m +d&&(g.part2_length=d,g.scalefac_compress=p));p=0}for(d=0;db;b++)gt[b]&&(a.part2_length=t[b],a.scalefac_compress=b);return a.part2_length==Y.LARGE_BITS};var q=[[15,15,7,7],[15,15,7,0],[7,3,0,0],[15,31,31,0],[7,7,7,0],[3,3,0,0]];this.scale_bitcount_lsf=function(a,e){var b,c,d,l,h=U(4),p=e.scalefac;a= +0!=e.preflag?2:0;for(d=0;4>d;d++)h[d]=0;if(e.block_type==f.SHORT_TYPE){var A=1;var w=u.nr_of_sfb_block[a][A];for(b=l=0;4>b;b++){var t=w[b]/3;for(d=0;dc;c++)p[3*l+c]>h[b]&&(h[b]=p[3*l+c])}}else for(A=0,w=u.nr_of_sfb_block[a][A],b=l=0;4>b;b++)for(t=w[b],d=0;dh[b]&&(h[b]=p[l]);w=!1;for(b=0;4>b;b++)h[b]>q[a][b]&&(w=!0);if(!w){e.sfb_partition_table=u.nr_of_sfb_block[a][A];for(b=0;4>b;b++)e.slen[b]=g[h[b]];A=e.slen[0];b=e.slen[1];h=e.slen[2];t=e.slen[3];switch(a){case 0:e.scalefac_compress= +(5*A+b<<4)+(h<<2)+t;break;case 1:e.scalefac_compress=400+(5*A+b<<2)+h;break;case 2:e.scalefac_compress=500+3*A+b;break;default:S.err.printf("intensity stereo not implemented yet\n")}}if(!w)for(b=e.part2_length=0;4>b;b++)e.part2_length+=e.slen[b]*e.sfb_partition_table[b];return w};var g=[0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4];this.huffman_init=function(a){for(var e=2;576>=e;e+=2){for(var b=0,c;a.scalefac_band.l[++b]e;)c--;0>c&&(c=fa[b][0]);a.bv_scf[e-2]=c;for(c= +fa[b][1];a.scalefac_band.l[c+a.bv_scf[e-2]+2]>e;)c--;0>c&&(c=fa[b][1]);a.bv_scf[e-1]=c}}}function ca(){function f(d,c,f,a,b,k){for(;0!=b--;)f[a]=1E-10+d[c+0]*k[0]-f[a-1]*k[1]+d[c-1]*k[2]-f[a-2]*k[3]+d[c-2]*k[4]-f[a-3]*k[5]+d[c-3]*k[6]-f[a-4]*k[7]+d[c-4]*k[8]-f[a-5]*k[9]+d[c-5]*k[10]-f[a-6]*k[11]+d[c-6]*k[12]-f[a-7]*k[13]+d[c-7]*k[14]-f[a-8]*k[15]+d[c-8]*k[16]-f[a-9]*k[17]+d[c-9]*k[18]-f[a-10]*k[19]+d[c-10]*k[20],++a,++c}function k(d,c,f,a,b,k){for(;0!=b--;)f[a]=d[c+0]*k[0]-f[a-1]*k[1]+d[c-1]*k[2]- +f[a-2]*k[3]+d[c-2]*k[4],++a,++c}function r(d){return d*d}var K=ca.RMS_WINDOW_TIME_NUMERATOR,C=ca.RMS_WINDOW_TIME_DENOMINATOR,u=[[.038575994352,-3.84664617118067,-.02160367184185,7.81501653005538,-.00123395316851,-11.34170355132042,-9.291677959E-5,13.05504219327545,-.01655260341619,-12.28759895145294,.02161526843274,9.4829380631979,-.02074045215285,-5.87257861775999,.00594298065125,2.75465861874613,.00306428023191,-.86984376593551,1.2025322027E-4,.13919314567432,.00288463683916],[.0541865640643,-3.47845948550071, +-.02911007808948,6.36317777566148,-.00848709379851,-8.54751527471874,-.00851165645469,9.4769360780128,-.00834990904936,-8.81498681370155,.02245293253339,6.85401540936998,-.02596338512915,-4.39470996079559,.01624864962975,2.19611684890774,-.00240879051584,-.75104302451432,.00674613682247,.13149317958808,-.00187763777362],[.15457299681924,-2.37898834973084,-.09331049056315,2.84868151156327,-.06247880153653,-2.64577170229825,.02163541888798,2.23697657451713,-.05588393329856,-1.67148153367602,.04781476674921, +1.00595954808547,.00222312597743,-.45953458054983,.03174092540049,.16378164858596,-.01390589421898,-.05032077717131,.00651420667831,.0234789740702,-.00881362733839],[.30296907319327,-1.61273165137247,-.22613988682123,1.0797749225997,-.08587323730772,-.2565625775407,.03282930172664,-.1627671912044,-.00915702933434,-.22638893773906,-.02364141202522,.39120800788284,-.00584456039913,-.22138138954925,.06276101321749,.04500235387352,-8.28086748E-6,.02005851806501,.00205861885564,.00302439095741,-.02950134983287], +[.33642304856132,-1.49858979367799,-.2557224142557,.87350271418188,-.11828570177555,.12205022308084,.11921148675203,-.80774944671438,-.07834489609479,.47854794562326,-.0046997791438,-.12453458140019,-.0058950022444,-.04067510197014,.05724228140351,.08333755284107,.00832043980773,-.04237348025746,-.0163538138454,.02977207319925,-.0176017656815],[.4491525660845,-.62820619233671,-.14351757464547,.29661783706366,-.22784394429749,-.372563729424,-.01419140100551,.00213767857124,.04078262797139,-.42029820170918, +-.12398163381748,.22199650564824,.04097565135648,.00613424350682,.10478503600251,.06747620744683,-.01863887810927,.05784820375801,-.03193428438915,.03222754072173,.00541907748707],[.56619470757641,-1.04800335126349,-.75464456939302,.29156311971249,.1624213774223,-.26806001042947,.16744243493672,.00819999645858,-.18901604199609,.45054734505008,.3093178284183,-.33032403314006,-.27562961986224,.0673936833311,.00647310677246,-.04784254229033,.08647503780351,.01639907836189,-.0378898455484,.01807364323573, +-.00588215443421],[.58100494960553,-.51035327095184,-.53174909058578,-.31863563325245,-.14289799034253,-.20256413484477,.17520704835522,.1472815413433,.02377945217615,.38952639978999,.15558449135573,-.23313271880868,-.25344790059353,-.05246019024463,.01628462406333,-.02505961724053,.06920467763959,.02442357316099,-.03721611395801,.01818801111503,-.00749618797172],[.53648789255105,-.2504987195602,-.42163034350696,-.43193942311114,-.00275953611929,-.03424681017675,.04267842219415,-.04678328784242,-.10214864179676, +.26408300200955,.14590772289388,.15113130533216,-.02459864859345,-.17556493366449,-.11202315195388,-.18823009262115,-.04060034127,.05477720428674,.0478866554818,.0470440968812,-.02217936801134]],v=[[.98621192462708,-1.97223372919527,-1.97242384925416,.97261396931306,.98621192462708],[.98500175787242,-1.96977855582618,-1.97000351574484,.9702284756635,.98500175787242],[.97938932735214,-1.95835380975398,-1.95877865470428,.95920349965459,.97938932735214],[.97531843204928,-1.95002759149878,-1.95063686409857, +.95124613669835,.97531843204928],[.97316523498161,-1.94561023566527,-1.94633046996323,.94705070426118,.97316523498161],[.96454515552826,-1.92783286977036,-1.92909031105652,.93034775234268,.96454515552826],[.96009142950541,-1.91858953033784,-1.92018285901082,.92177618768381,.96009142950541],[.95856916599601,-1.9154210807478,-1.91713833199203,.91885558323625,.95856916599601],[.94597685600279,-1.88903307939452,-1.89195371200558,.89487434461664,.94597685600279]];this.InitGainAnalysis=function(d,c){a:{for(var f= +0;fd.sampleWindow-d.totsamp?d.sampleWindow-d.totsamp:q;if(lMAX_ORDER-l&&(g=MAX_ORDER-l)}else e=w+l,t=c,D=b+l,m=a;f(t,e,d.lstepbuf,d.lstep+d.totsamp,g,u[d.reqindex]);f(m,D,d.rstepbuf,d.rstep+d.totsamp,g,u[d.reqindex]);k(d.lstepbuf,d.lstep+d.totsamp,d.loutbuf,d.lout+d.totsamp,g,v[d.reqindex]);k(d.rstepbuf,d.rstep+d.totsamp,d.routbuf,d.rout+ +d.totsamp,g,v[d.reqindex]);e=d.lout+d.totsamp;t=d.loutbuf;D=d.rout+d.totsamp;m=d.routbuf;for(var n=g%8;0!=n--;)d.lsum+=r(t[e++]),d.rsum+=r(m[D++]);for(n=g/8;0!=n--;)d.lsum+=r(t[e+0])+r(t[e+1])+r(t[e+2])+r(t[e+3])+r(t[e+4])+r(t[e+5])+r(t[e+6])+r(t[e+7]),e+=8,d.rsum+=r(m[D+0])+r(m[D+1])+r(m[D+2])+r(m[D+3])+r(m[D+4])+r(m[D+5])+r(m[D+6])+r(m[D+7]),D+=8;q-=g;l+=g;d.totsamp+=g;d.totsamp==d.sampleWindow&&(e=10*ca.STEPS_per_dB*Math.log10((d.lsum+d.rsum)/d.totsamp*.5+1E-37),e=0>=e?0:0|e,e>=d.A.length&&(e= +d.A.length-1),d.A[e]++,d.lsum=d.rsum=0,S.arraycopy(d.loutbuf,d.totsamp,d.loutbuf,0,MAX_ORDER),S.arraycopy(d.routbuf,d.totsamp,d.routbuf,0,MAX_ORDER),S.arraycopy(d.lstepbuf,d.totsamp,d.lstepbuf,0,MAX_ORDER),S.arraycopy(d.rstepbuf,d.totsamp,d.rstepbuf,0,MAX_ORDER),d.totsamp=0);if(d.totsamp>d.sampleWindow)return GAIN_ANALYSIS_ERROR}B=(b-=c[a])););c=64.82-a/ca.STEPS_per_dB}for(f=0;fb&&(b=0);9w&&(w+=64);c.exp_nspsytune|=w<<2}0!=a?c.quant_comp=d[b].quant_comp:0=d)return K(c,d,a);c.preset=0;return d}}function xc(){var f;this.setModules= +function(k){f=k};this.ResvFrameBegin=function(k,r){var x=k.internal_flags,C=x.l3_side,u=f.getframebits(k);r.bits=(u-8*x.sideinfo_len)/x.mode_gr;var v=2048*x.mode_gr-8;if(320v&&(x.ResvMax=v);if(0>x.ResvMax||k.disable_reservoir)x.ResvMax=0;k=r.bits*x.mode_gr+Math.min(x.ResvSize,x.ResvMax);k>d&&(k=d);C.resvDrain_pre=0;null!=x.pinfo&&(x.pinfo.mean_bits= +r.bits/2,x.pinfo.resvsize=x.ResvSize);return k};this.ResvMaxBits=function(f,r,x,C){var k=f.internal_flags,v=k.ResvSize,d=k.ResvMax;0!=C&&(v+=r);0!=(k.substep_shaping&1)&&(d*=.9);x.bits=r;10*v>9*d?(C=v-9*d/10,x.bits+=C,k.substep_shaping|=128):(C=0,k.substep_shaping&=127,f.disable_reservoir||0!=(k.substep_shaping&1)||(x.bits-=.1*r));f=v<6*k.ResvMax/10?v:6*k.ResvMax/10;f-=C;0>f&&(f=0);return f};this.ResvAdjust=function(f,r){f.ResvSize-=r.part2_3_length+r.part2_length};this.ResvFrameEnd=function(f,r){var k, +x=f.l3_side;f.ResvSize+=r*f.mode_gr;r=0;x.resvDrain_post=0;x.resvDrain_pre=0;0!=(k=f.ResvSize%8)&&(r+=k);k=f.ResvSize-r-f.ResvMax;0>24&255;a[b+1]=c>>16&255;a[b+2]=c>>8&255;a[b+3]=c&255}function r(a,b,c){a[b+0]=c>>8&255; +a[b+1]=c&255}function K(a,b,c){return 255&(a<a.out_samplerate?0:1);b[1]=K(b[1],1,a.version);b[1]=K(b[1],2,1);b[1]=K(b[1],1,a.error_protection?0:1);b[2]=K(b[2],4,e.bitrate_index);b[2]=K(b[2],2,e.samplerate_index);b[2]=K(b[2],1,0);b[2]=K(b[2],1,a.extension);b[3]=K(b[3],2,a.mode.ordinal());b[3]=K(b[3],2,e.mode_ext);b[3]=K(b[3],1,a.copyright);b[3]=K(b[3],1,a.original);b[3]=K(b[3],2,a.emphasis); +b[0]=255;var e=b[1]&241;var c=1==a.version?128:16E3>a.out_samplerate?32:64;a.VBR==J.vbr_off&&(c=a.brate);c=a.free_format?0:255&16*G.BitrateIndex(c,a.version,a.out_samplerate);b[1]=1==a.version?255&(e|10):255&(e|2);e=b[2]&13;b[2]=255&(c|e)}function u(a,b){return b=b>>8^B[(b^a)&255]}var G,d,c;this.setModules=function(a,b,f){G=a;d=b;c=f};var w=gb.NUMTOCENTRIES,a=gb.MAXFRAMESIZE,b=w+4+4+4+4+4+9+1+1+8+1+1+3+1+1+2+4+2+2,B=[0,49345,49537,320,49921,960,640,49729,50689,1728,1920,51009,1280,50625,50305,1088, +52225,3264,3456,52545,3840,53185,52865,3648,2560,51905,52097,2880,51457,2496,2176,51265,55297,6336,6528,55617,6912,56257,55937,6720,7680,57025,57217,8E3,56577,7616,7296,56385,5120,54465,54657,5440,55041,6080,5760,54849,53761,4800,4992,54081,4352,53697,53377,4160,61441,12480,12672,61761,13056,62401,62081,12864,13824,63169,63361,14144,62721,13760,13440,62529,15360,64705,64897,15680,65281,16320,16E3,65089,64001,15040,15232,64321,14592,63937,63617,14400,10240,59585,59777,10560,60161,11200,10880,59969, +60929,11968,12160,61249,11520,60865,60545,11328,58369,9408,9600,58689,9984,59329,59009,9792,8704,58049,58241,9024,57601,8640,8320,57409,40961,24768,24960,41281,25344,41921,41601,25152,26112,42689,42881,26432,42241,26048,25728,42049,27648,44225,44417,27968,44801,28608,28288,44609,43521,27328,27520,43841,26880,43457,43137,26688,30720,47297,47489,31040,47873,31680,31360,47681,48641,32448,32640,48961,32E3,48577,48257,31808,46081,29888,30080,46401,30464,47041,46721,30272,29184,45761,45953,29504,45313, +29120,28800,45121,20480,37057,37249,20800,37633,21440,21120,37441,38401,22208,22400,38721,21760,38337,38017,21568,39937,23744,23936,40257,24320,40897,40577,24128,23040,39617,39809,23360,39169,22976,22656,38977,34817,18624,18816,35137,19200,35777,35457,19008,19968,36545,36737,20288,36097,19904,19584,35905,17408,33985,34177,17728,34561,18368,18048,34369,33281,17088,17280,33601,16640,33217,32897,16448];this.addVbrFrame=function(a){var b=a.internal_flags;var e=b.VBR_seek_table;a=v.bitrate_table[a.version][b.bitrate_index]; +e.nVbrNumFrames++;e.sum+=a;e.seen++;if(!(e.seen>3&1,d=a[e+2]>>2&3,k=a[e+3]>>6&3,m=a[e+2]>>4&15,m=v.bitrate_table[c][m];b.samprate=14==a[e+1]>>4?v.samplerate_table[2][d]:v.samplerate_table[c][d];d=e=0!=c?3!=k?e+36:e+21:3!=k?e+21:e+13;if(!(new String(a,d,4(),null)).equals("Xing")&&!(new String(a, +d,4(),null)).equals("Info"))return null;e+=4;b.hId=c;d=b.flags=f(a,e);e+=4;0!=(d&1)&&(b.frames=f(a,e),e+=4);0!=(d&2)&&(b.bytes=f(a,e),e+=4);if(0!=(d&4)){if(null!=b.toc)for(k=0;k>4;m=(a[e+1]&15)<<8;m+=a[e+2]&255;if(0>c||3E3m||3E3e.out_samplerate?32:64;e.VBR==J.vbr_off&&(f=e.brate);f=72E3*(e.version+1)*f/e.out_samplerate;var g=c.sideinfo_len+b;c.VBR_seek_table.TotalFrameSize=f;if(fa)e.bWriteVbrTag=!1;else for(c.VBR_seek_table.nVbrNumFrames=0,c.VBR_seek_table.nBytesWritten=0,c.VBR_seek_table.sum=0,c.VBR_seek_table.seen=0,c.VBR_seek_table.want=1,c.VBR_seek_table.pos=0,null==c.VBR_seek_table.bag&&(c.VBR_seek_table.bag=new int[400],c.VBR_seek_table.size=400),f=new Int8Array(a),C(e,f),c=c.VBR_seek_table.TotalFrameSize, +g=0;g=e.VBR_seek_table.pos)return 0;if(b.length=l.pos))for(f=1;fl.pos-1&&(m=l.pos-1);m=0|256*l.bag[m]/l.sum;255z.RadioGain&&(z.RadioGain=-510),x=11264,x=0<=z.RadioGain?x|z.RadioGain:x|512|-z.RadioGain);z.findPeakSample&&(B=Math.abs(0|z.PeakSample/32767*Math.pow(2,23)+.5));-1!=V&&(0h&&(h=0);switch(a.mode){case MONO:M=0;break;case STEREO:M=1;break;case DUAL_CHANNEL:M=2;break;case JOINT_STEREO:M=a.force_ms?4:3;break;default:M= +7}I=32E3>=a.in_samplerate?0:48E3==a.in_samplerate?2:48E3a.scale_right||a.disable_reservoir&&320>a.brate||a.noATH||a.ATHonly||0==v||32E3>=a.in_samplerate)X=1;R=R+(M<<2)+(X<<5)+(I<<6);z=z.nMusicCRC;k(b,g+m,h);m+=4;for(h=0;9>h;h++)b[g+m+h]=255&p.charAt(h);m+=9;b[g+m]=255&A;m++;b[g+m]=255&y;m++;k(b,g+m,B);m+=4;r(b,g+m, +x);m+=2;r(b,g+m,0);m+=2;b[g+m]=255&H;m++;b[g+m]=255<=Qa?255:255&Qa;m++;b[g+m]=255&n>>4;b[g+m+1]=255&(n<<4)+(E>>8);b[g+m+2]=255&E;m+=3;b[g+m]=255&R;m++;b[g+m++]=0;r(b,g+m,a.preset);m+=2;k(b,g+m,l);m+=4;r(b,g+m,z);m+=2;for(a=0;a=b.internal_flags.VBR_seek_table.pos)return-1;c.seek(c.length());if(0==c.length())return-1;c.seek(0);var e=new Int8Array(10);c.readFully(e);e=(new String(e,"ISO-8859-1")).startsWith("ID3")? +0:((e[6]&127)<<21|(e[7]&127)<<14|(e[8]&127)<<7|e[9]&127)+e.length;c.seek(e);e=new Int8Array(a);b=getLameTagFrame(b,e);if(b>e.length)return-1;if(1>b)return 0;c.write(e,0,b);return 0}}function da(){function x(a,b,c){for(;0>c<>3]|=b>>c<<8-(e&7)-h;e+=h}a.header[a.h_ptr].ptr=e}function K(a,b){a<<=8;for(var c=0;8>c;c++)a<<=1,b<<=1,0!=((b^a)& +65536)&&(b^=32773);return b}function C(a,b){var c=v.ht[b.count1table_select+32],e,h=0,d=b.big_values,g=b.big_values;for(e=(b.count1-b.big_values)/4;0b.xr[g+0]&&f++);n=b.l3_enc[d+1];0!=n&&(m+=4,f*=2,0>b.xr[g+1]&&f++);n=b.l3_enc[d+2];0!=n&&(m+=2,f*=2,0>b.xr[g+2]&&f++);n=b.l3_enc[d+3];0!=n&&(m++,f*=2,0>b.xr[g+3]&&f++);d+=4;g+=4;x(a,f+c.table[m],c.hlen[m]);h+=c.hlen[m]}return h}function u(a,b,c,e,h){var d=v.ht[b],g=0;if(0==b)return g;for(;ch.xr[c]&&q++,f--);15h.xr[c+1]&&q++,f--);I=I*l+k;m-=f;f+=d.hlen[I];x(a,d.table[I],f);x(a,q,m);g+=f+m}return g}function G(a,b){var c=3*a.scalefac_band.s[3];c>b.big_values&&(c=b.big_values);var e=u(a,b.table_select[0],0,c,b);return e+=u(a,b.table_select[1],c,b.big_values,b)}function d(a,b){var c=b.big_values;var e=b.region0_count+1;var h=a.scalefac_band.l[e]; +e+=b.region1_count+1;var d=a.scalefac_band.l[e];h>c&&(h=c);d>c&&(d=c);e=u(a,b.table_select[0],0,h,b);e+=u(a,b.table_select[1],h,d,b);return e+=u(a,b.table_select[2],d,c,b)}function c(){this.total=0}function w(b,c){var e=b.internal_flags;var d=e.w_ptr;var h=e.h_ptr-1;-1==h&&(h=ia.MAX_HEADER_BUF-1);var f=e.header[h].write_timing-g;c.total=f;if(0<=f){var m=1+h-d;hf&&S.err.println("strange error flushing buffer ... \n");return f}var a=this,b=null,B=null,e=null,l=null;this.setModules=function(a,c,d,f){b=a;B=c;e=d;l=f};var q=null,g=0,t=0,D=0;this.getframebits=function(a){var b=a.internal_flags;return 8*(0|72E3*(a.version+1)*(0!=b.bitrate_index?v.bitrate_table[a.version][b.bitrate_index]:a.brate)/a.out_samplerate+b.padding)};this.CRC_writeheader=function(a,b){var c=K(b[2]&255,65535);c=K(b[3]&255,c);for(var e=6;e> +8);b[5]=byte(c&255)};this.flush_bitstream=function(a){var e=a.internal_flags,d;var f=e.l3_side;0>(d=w(a,new c))||(k(a,d),e.ResvSize=0,f.main_data_begin=0,e.findReplayGain&&(f=b.GetTitleGain(e.rgdata),e.RadioGain=Math.floor(10*f+.5)|0),e.findPeakSample&&(e.noclipGainChange=Math.ceil(200*Math.log10(e.PeakSample/32767))|0,0>h<a.out_samplerate?r(p,4094,12):r(p,4095,12);r(p,a.version,1);r(p,1,2);r(p,a.error_protection? +0:1,1);r(p,p.bitrate_index,4);r(p,p.samplerate_index,2);r(p,p.padding,1);r(p,a.extension,1);r(p,a.mode.ordinal(),2);r(p,p.mode_ext,2);r(p,a.copyright,1);r(p,a.original,1);r(p,a.emphasis,2);a.error_protection&&r(p,0,16);if(1==a.version){r(p,t.main_data_begin,9);2==p.channels_out?r(p,t.private_bits,3):r(p,t.private_bits,5);for(q=0;qh;h++)r(p,t.scfsi[q][h],1);for(l=0;2>l;l++)for(q=0;qq;q++)for(h=0;hN;N++)for(M=t.sfb_partition_table[N]/3,H=t.slen[N],Q=0;QN;N++)for(M=t.sfb_partition_table[N], +H=t.slen[N],Q=0;Q ResvSize");8*e.main_data_begin!=b.ResvSize&&(S.err.printf("bit reservoir error: \nl3_side.main_data_begin: %d \nResvoir size: %d \nresv drain (post) %d \nresv drain (pre) %d \nheader and sideinfo: %d \ndata bits: %d \ntotal bits: %d (remainder: %d) \nbitsperframe: %d \n", +8*e.main_data_begin,b.ResvSize,e.resvDrain_post,e.resvDrain_pre,8*b.sideinfo_len,p-e.resvDrain_post-8*b.sideinfo_len,p,p%8,m),S.err.println("This is a fatal error. It has several possible causes:"),S.err.println("90%% LAME compiled with buggy version of gcc using advanced optimizations"),S.err.println(" 9%% Your system is overclocked"),S.err.println(" 1%% bug in LAME encoding library"),b.ResvSize=8*e.main_data_begin);if(1E9=f)return 0;if(0!=d&&f>d)return-1;S.arraycopy(q,0,c,e,f);t=-1;D=0;if(0!=h&&(d=U(1),d[0]=a.nMusicCRC,l.updateMusicCRC(d,c,e,f),a.nMusicCRC=d[0],0a.PeakSample?a.PeakSample=d[0][m]:-d[0][m]>a.PeakSample&&(a.PeakSample=-d[0][m]);if(1< +a.channels_out)for(m=0;ma.PeakSample?a.PeakSample=d[1][m]:-d[1][m]>a.PeakSample&&(a.PeakSample=-d[1][m])}if(a.findReplayGain&&b.AnalyzeSamples(a.rgdata,d[0],0,d[1],0,g,a.channels_out)==ca.GAIN_ANALYSIS_ERROR)return-6}}return f};this.init_bit_stream_w=function(a){q=new Int8Array(W.LAME_MAXMP3BUFFER);a.h_ptr=a.w_ptr=0;a.header[a.h_ptr].write_timing=0;t=-1;g=D=0}}function ba(f,k,r,v){this.xlen=f;this.linmax=k;this.table=r;this.hlen=v}function Fa(f){this.bits=f}function Fb(){this.bits= +this.over_SSD=this.over_count=this.max_noise=this.tot_noise=this.over_noise=0}function yc(){this.setModules=function(f,k){}}function zc(){this.floor=this.decay=this.adjustLimit=this.adjust=this.aaSensitivityP=this.useAdjust=0;this.l=G(f.SBMAX_l);this.s=G(f.SBMAX_s);this.psfb21=G(f.PSFB21);this.psfb12=G(f.PSFB12);this.cb_l=G(f.CBANDS);this.cb_s=G(f.CBANDS);this.eql_w=G(f.BLKSIZE/2)}function Ac(){this.scale_right=this.scale_left=this.scale=this.out_samplerate=this.in_samplerate=this.num_channels=this.num_samples= +this.class_id=0;this.decode_only=this.bWriteVbrTag=this.analysis=!1;this.quality=0;this.mode=ka.STEREO;this.write_id3tag_automatic=this.decode_on_the_fly=this.findReplayGain=this.free_format=this.force_ms=!1;this.error_protection=this.emphasis=this.extension=this.original=this.copyright=this.compression_ratio=this.brate=0;this.disable_reservoir=this.strict_ISO=!1;this.quant_comp_short=this.quant_comp=0;this.experimentalY=!1;this.preset=this.exp_nspsytune=this.experimentalZ=0;this.VBR=null;this.maskingadjust_short= +this.maskingadjust=this.highpasswidth=this.lowpasswidth=this.highpassfreq=this.lowpassfreq=this.VBR_hard_min=this.VBR_max_bitrate_kbps=this.VBR_min_bitrate_kbps=this.VBR_mean_bitrate_kbps=this.VBR_q=this.VBR_q_frac=0;this.noATH=this.ATHshort=this.ATHonly=!1;this.athaa_sensitivity=this.athaa_loudapprox=this.athaa_type=this.ATHlower=this.ATHcurve=this.ATHtype=0;this.short_blocks=null;this.useTemporal=!1;this.msfix=this.interChRatio=0;this.tune=!1;this.lame_allocated_gfp=this.frameNum=this.framesize= +this.encoder_padding=this.encoder_delay=this.version=this.tune_value_a=0;this.internal_flags=null}function Bc(x){this.quantize=x;this.iteration_loop=function(k,r,x,v){var u=k.internal_flags,C=G(ra.SFBMAX),d=G(576),c=U(2),w=u.l3_side;var a=new Fa(0);this.quantize.rv.ResvFrameBegin(k,a);a=a.bits;for(var b=0;b>2&63;32<=q&&(q-=64); +k=Math.pow(10,q/4/10);q=c.exp_nspsytune>>8&63;32<=q&&(q-=64);m=Math.pow(10,q/4/10);q=c.exp_nspsytune>>14&63;32<=q&&(q-=64);n=Math.pow(10,q/4/10);q=c.exp_nspsytune>>20&63;32<=q&&(q-=64);z=n*Math.pow(10,q/4/10);for(q=0;q=q?k:13>=q?m:20>=q?n:z,e.nsPsy.longfact[q]=c;for(q=0;q=q?k:10>=q?m:11>=q?n:z,e.nsPsy.shortfact[q]=c}};this.on_pe=function(a,b,c,d,f,k){var e=a.internal_flags,g=0,l=U(2),q,g=new Fa(g);a=v.ResvMaxBits(a,d,g,k);var g=g.bits,h=g+a;h>ia.MAX_BITS_PER_GRANULE&& +(h=ia.MAX_BITS_PER_GRANULE);for(q=k=0;q3*d/4&&(l[q]=3*d/4),0>l[q]&&(l[q]=0),l[q]+c[q]>ia.MAX_BITS_PER_CHANNEL&&(l[q]=Math.max(0,ia.MAX_BITS_PER_CHANNEL-c[q])),k+=l[q];if(k>a)for(q=0;qia.MAX_BITS_PER_GRANULE)for(q=0;qb&&(b=0);.5ia.MAX_BITS_PER_CHANNEL-a[0]&&(b=ia.MAX_BITS_PER_CHANNEL-a[0]);0>b&&(b=0);125<=a[1]&&(125d&&(a[0]=d*a[0]/b,a[1]=d*a[1]/b)};this.athAdjust=function(a,b,c){b=Z.FAST_LOG10_X(b,10);a*=a;var e=0;b-=c;1E-20e&&(e=0);return Math.pow(10,.1*(b*e+(c+90.30873362-94.82444863)))}; +this.calc_xmin=function(a,b,c,d){var e=0,g=a.internal_flags,m,l=0,q=0,k=g.ATH,h=c.xr,p=a.VBR==J.vbr_mtrh?1:0,A=g.masking_lower;if(a.VBR==J.vbr_mtrh||a.VBR==J.vbr_mt)A=1;for(m=0;m>1;var I=0;do{var H=h[l]*h[l];I+=H;x+=Hw&&q++;m==f.SBPSY_l&&(u=w*g.nsPsy.longfact[m],xQ;Q++){I=0;u=r>>1;B=V/r;x=2.220446049250313E-16;do H=h[l]*h[l],I+=H,x+=HV&&q++;M==f.SBPSY_s&&(u=V*g.nsPsy.shortfact[M],xd[e-3+1]&&(d[e-3+1]+=(d[e-3]-d[e-3+1])*g.decay),d[e-3+1]>d[e-3+2]&&(d[e-3+2]+=(d[e-3+1]-d[e-3+2])*g.decay))}return q};this.calc_noise_core=function(a,c,d,f){var e=0,g=c.s,m=a.l3_enc;if(g>a.count1)for(;0!=d--;){var l=a.xr[g]; +g++;e+=l*l;l=a.xr[g];g++;e+=l*l}else if(g>a.big_values){var q=G(2);q[0]=0;for(q[1]=f;0!=d--;)l=Math.abs(a.xr[g])-q[m[g]],g++,e+=l*l,l=Math.abs(a.xr[g])-q[m[g]],g++,e+=l*l}else for(;0!=d--;)l=Math.abs(a.xr[g])-b[m[g]]*f,g++,e+=l*l,l=Math.abs(a.xr[g])-b[m[g]]*f,g++,e+=l*l;c.s=g;return e};this.calc_noise=function(a,b,d,f,t){var e=0,g=0,l,q=0,r=0,h=0,p=-20,A=0,y=a.scalefac,x=0;for(l=f.over_SSD=0;l>1;A+a.width[l]>a.max_nonzero_coeff&&(v=a.max_nonzero_coeff-A+1,v=0>1:0);A=new k(A);u=this.calc_noise_core(a,A,v,u);A=A.s;null!=t&&(t.step[l]=B,t.noise[l]=u);u=d[e++]=u/b[g++];u=Z.FAST_LOG10(Math.max(u,1E-20));null!=t&&(t.noise_log[l]=u)}null!=t&&(t.global_gain=a.global_gain);h+=u;0H;H++){l=0;for(I=B;If;++f){var a=d.tt[c][0].xr[f],b=d.tt[c][1].xr[f];d.tt[c][0].xr[f]=.5*(a+b)*Z.SQRT2;d.tt[c][1].xr[f]=.5*(a-b)*Z.SQRT2}};this.init_xrpow=function(d,c,f){var a=0|c.max_nonzero_coeff;c.xrpow_max=0;qa.fill(f,a,576,0);for(var b,k=b=0;k<=a;++k){var e=Math.abs(c.xr[k]);b+=e;f[k]=Math.sqrt(e*Math.sqrt(e));f[k]>c.xrpow_max&&(c.xrpow_max=f[k])}if(1E-20l;l++)for(var q=r;q=c;e--)if(Math.abs(a[e])l;l++)for(b=!1,r=f.PSFB12-1;0<=r&&!b;r--)for(c=3*d.scalefac_band.s[12]+(d.scalefac_band.s[13]-d.scalefac_band.s[12])*l+(d.scalefac_band.psfb12[r]-d.scalefac_band.psfb12[0]),e=c+(d.scalefac_band.psfb12[r+1]-d.scalefac_band.psfb12[r]), +q=C.athAdjust(k.adjust,k.psfb12[r],k.floor),1E-12=c;e--)if(Math.abs(a[e])r;r++){var e=0;0!=c.l3_enc[r]&&(e=Math.abs(c.xr[r]));a[r]=e}r=0;e= +8;c.block_type==f.SHORT_TYPE&&(e=6);do{var l,q,g=c.width[e],r=r+g;if(!(1<=b[e]||(qa.sort(a,r-g,g),da.EQ(a[r-1],0)))){var t=(1-b[e])*k[e];var w=l=0;do{for(q=1;w+qh?(O==x.BINSEARCH_DOWN&&(A=!0),A&&(p/=2),O=x.BINSEARCH_UP,F=p):(O==x.BINSEARCH_UP&&(A=!0),A&&(p/=2),O=x.BINSEARCH_DOWN,F=-p);c.global_gain+=F;0>c.global_gain&&(c.global_gain=0,A=!0);255h&&255>c.global_gain;)c.global_gain++,F=fa.count_bits(e, +a,c,null);e.CurrentStep[b]=4<=y-c.global_gain?4:2;e.OldValue[b]=c.global_gain;c.part2_3_length=F;if(0==e.noise_shaping)return 100;C.calc_noise(c,r,g,t,w);t.bits=c.part2_3_length;l.assign(c);b=0;for(S.arraycopy(a,0,q,0,576);!n;){do{h=new Fb;A=255;p=0!=(e.substep_shaping&2)?20:3;if(e.sfb21_extra){if(1la;la++)I[N+la]*=M,I[N+la]>R.xrpow_max&&(R.xrpow_max=I[N+la]);if(2==H.noise_shaping_amp)break}}if(M=k(y))y=!1;else if(M= +2==O.mode_gr?fa.scale_bitcount(y):fa.scale_bitcount_lsf(O,y)){if(1H;H++)F[R+H]*=1.2968395546510096,F[R+H]>M.xrpow_max&&(M.xrpow_max=F[R+H]);M.scalefac[X]=I>>1}M.preflag=0;M.scalefac_scale=1;M=!1}else if(y.block_type==f.SHORT_TYPE&&0H;H++){V=Q=0;for(F=R.sfb_lmax+H;FQ&&8>V)){if(7<=R.subblock_gain[H]){F=!0;break b}R.subblock_gain[H]++;Q=M.scalefac_band.l[R.sfb_lmax];for(F=R.sfb_lmax+H;F>R.scalefac_scale,0<=N)I[F]=N,Q+=3*V;else{I[F]=0;N=C.IPOW20(210+(N<la;la++)X[Q+la]*=N,X[Q+la]>R.xrpow_max&&(R.xrpow_max=X[Q+la]);Q+=V*(3-H-1)}N=C.IPOW20(202); +Q+=R.width[F]*(H+1);for(la=-R.width[F];0>la;la++)X[Q+la]*=N,X[Q+la]>R.xrpow_max&&(R.xrpow_max=X[Q+la])}}F=!1}M=F||k(y)}M||(M=2==O.mode_gr?fa.scale_bitcount(y):fa.scale_bitcount_lsf(O,y));y=!M}else y=!0;if(!y)break;0!=l.scalefac_scale&&(A=254);y=u-l.part2_length;if(0>=y)break;for(;(l.part2_3_length=fa.count_bits(e,a,l,w))>y&&l.global_gain<=A;)l.global_gain++;if(l.global_gain>A)break;if(0==t.over_count){for(;(l.part2_3_length=fa.count_bits(e,a,l,w))>m&&l.global_gain<=A;)l.global_gain++;if(l.global_gain> +A)break}C.calc_noise(l,r,g,h,w);h.bits=l.part2_3_length;O=c.block_type!=f.SHORT_TYPE?d.quant_comp:d.quant_comp_short;A=t;y=h;M=l;F=g;switch(O){default:case 9:0y.max_noise&&10*y.max_noise+y.bits<=10*A.max_noise+A.bits;break;case 0:O=y.over_count=y.max_noise&&.2=y.max_noise&&0>A.max_noise&&A.max_noise>y.max_noise-.2&&y.tot_noise=y.max_noise&&0y.max_noise-.2&&y.tot_noisey.max_noise-.1&&y.tot_noise+y.over_noisey.max_noise-.15&&y.tot_noise+y.over_noise+y.over_noisep&&0==t.over_count)break;if(3==e.noise_shaping_amp&&B&&30l.global_gain+l.scalefac_scale);3==e.noise_shaping_amp?B?n=!0:(l.assign(c),S.arraycopy(q,0,a,0,576),b=0,v=l.global_gain,B=!0):n=!0}d.VBR==J.vbr_rh||d.VBR==J.vbr_mtrh?S.arraycopy(q, +0,a,0,576):0!=(e.substep_shaping&1)&&trancate_smallspectrums(e,c,r,a);return t.over_count};this.iteration_finish_one=function(d,c,f){var a=d.l3_side,b=a.tt[c][f];fa.best_scalefac_store(d,c,f,a);1==d.use_best_huffman&&fa.best_huffman_divide(d,b);v.ResvAdjust(d,b)};this.VBR_encode_granule=function(d,c,f,a,b,k,e){var l=d.internal_flags,q=new rb,g=G(576),r=e,w=(e+k)/2,m=0,n=l.sfb21_extra;qa.fill(q.l3_enc,0);do{l.sfb21_extra=w>r-42?!1:n;var u=outer_loop(d,c,f,a,b,w);0>=u?(m=1,e=c.part2_3_length,q.assign(c), +S.arraycopy(a,0,g,0,576),e-=32,u=e-k,w=(e+k)/2):(k=w+32,u=e-k,w=(e+k)/2,0!=m&&(m=2,c.assign(q),S.arraycopy(g,0,a,0,576)))}while(12r[g.VBR_max_bitrate]&&(l[n][u]*=r[g.VBR_max_bitrate],l[n][u]/=w),e[n][u]>l[n][u]&&(e[n][u]=l[n][u]);return t};this.bitpressure_strategy=function(d,c,k,a){for(var b=0;bt&&(r[b][u]*=t,r[b][u]/=g);return q};this.calc_target_bits=function(d,c,k,a,b,u){var e=d.internal_flags,l=e.l3_side;e.bitrate_index=e.VBR_max_bitrate;var q=new Fa(0); +u[0]=v.ResvFrameBegin(d,q);e.bitrate_index=1;q=r.getframebits(d)-8*e.sideinfo_len;b[0]=q/(e.mode_gr*e.channels_out);q=d.VBR_mean_bitrate_kbps*d.framesize*1E3;0!=(e.substep_shaping&1)&&(q*=1.09);q/=d.out_samplerate;q-=8*e.sideinfo_len;q/=e.mode_gr*e.channels_out;var g=.93+.07*(11-d.compression_ratio)/5.5;.9>g&&(g=.9);13*q/2?w=3*q/2:0>w&&(w=0);a[d][b]+=w}a[d][b]>ia.MAX_BITS_PER_CHANNEL&&(a[d][b]=ia.MAX_BITS_PER_CHANNEL);t+=a[d][b]}if(t>ia.MAX_BITS_PER_GRANULE)for(b=0;bia.MAX_BITS_PER_CHANNEL&&(a[d][b]=ia.MAX_BITS_PER_CHANNEL),c+=a[d][b];if(c>u[0])for(d= +0;dq;q++){var g=k[e+-10];f=c[l+-224]*g;b=c[d+224]*g;g=k[e+-9];f+=c[l+-160]*g;b+=c[d+160]*g;g=k[e+-8];f+=c[l+-96]*g;b+=c[d+96]*g;g=k[e+-7];f+=c[l+-32]*g;b+=c[d+32]*g;g=k[e+-6];f+=c[l+32]*g;b+=c[d+-32]*g;g=k[e+-5];f+=c[l+96]*g;b+=c[d+-96]*g;g=k[e+-4];f+=c[l+160]*g;b+=c[d+-160]*g;g=k[e+-3];f+=c[l+224]*g;b+=c[d+-224]*g;g=k[e+-2];f+=c[d+-256]*g;b-=c[l+256]*g;g=k[e+ +-1];f+=c[d+-192]*g;b-=c[l+192]*g;g=k[e+0];f+=c[d+-128]*g;b-=c[l+128]*g;g=k[e+1];f+=c[d+-64]*g;b-=c[l+64]*g;g=k[e+2];f+=c[d+0]*g;b-=c[l+0]*g;g=k[e+3];f+=c[d+64]*g;b-=c[l+-64]*g;g=k[e+4];f+=c[d+128]*g;b-=c[l+-128]*g;g=k[e+5];f+=c[d+192]*g;b-=c[l+-192]*g;f*=k[e+6];g=b-f;a[30+2*q]=b+f;a[31+2*q]=k[e+7]*g;e+=18;d--;l++}b=c[d+-16]*k[e+-10];f=c[d+-32]*k[e+-2];b+=(c[d+-48]-c[d+16])*k[e+-9];f+=c[d+-96]*k[e+-1];b+=(c[d+-80]+c[d+48])*k[e+-8];f+=c[d+-160]*k[e+0];b+=(c[d+-112]-c[d+80])*k[e+-7];f+=c[d+-224]*k[e+ +1];b+=(c[d+-144]+c[d+112])*k[e+-6];f-=c[d+32]*k[e+2];b+=(c[d+-176]-c[d+144])*k[e+-5];f-=c[d+96]*k[e+3];b+=(c[d+-208]+c[d+176])*k[e+-4];f-=c[d+160]*k[e+4];b+=(c[d+-240]-c[d+208])*k[e+-3];f-=c[d+224];c=f-b;d=f+b;b=a[14];f=a[15]-b;a[31]=d+b;a[30]=c+f;a[15]=c-f;a[14]=d-b;b=a[28]-a[0];a[0]+=a[28];a[28]=b*k[e+-36+7];b=a[29]-a[1];a[1]+=a[29];a[29]=b*k[e+-36+7];b=a[26]-a[2];a[2]+=a[26];a[26]=b*k[e+-72+7];b=a[27]-a[3];a[3]+=a[27];a[27]=b*k[e+-72+7];b=a[24]-a[4];a[4]+=a[24];a[24]=b*k[e+-108+7];b=a[25]-a[5]; +a[5]+=a[25];a[25]=b*k[e+-108+7];b=a[22]-a[6];a[6]+=a[22];a[22]=b*Z.SQRT2;b=a[23]-a[7];a[7]+=a[23];a[23]=b*Z.SQRT2-a[7];a[7]-=a[6];a[22]-=a[7];a[23]-=a[22];b=a[6];a[6]=a[31]-b;a[31]+=b;b=a[7];a[7]=a[30]-b;a[30]+=b;b=a[22];a[22]=a[15]-b;a[15]+=b;b=a[23];a[23]=a[14]-b;a[14]+=b;b=a[20]-a[8];a[8]+=a[20];a[20]=b*k[e+-180+7];b=a[21]-a[9];a[9]+=a[21];a[21]=b*k[e+-180+7];b=a[18]-a[10];a[10]+=a[18];a[18]=b*k[e+-216+7];b=a[19]-a[11];a[11]+=a[19];a[19]=b*k[e+-216+7];b=a[16]-a[12];a[12]+=a[16];a[16]=b*k[e+-252+ +7];b=a[17]-a[13];a[13]+=a[17];a[17]=b*k[e+-252+7];b=-a[20]+a[24];a[20]+=a[24];a[24]=b*k[e+-216+7];b=-a[21]+a[25];a[21]+=a[25];a[25]=b*k[e+-216+7];b=a[4]-a[8];a[4]+=a[8];a[8]=b*k[e+-216+7];b=a[5]-a[9];a[5]+=a[9];a[9]=b*k[e+-216+7];b=a[0]-a[12];a[0]+=a[12];a[12]=b*k[e+-72+7];b=a[1]-a[13];a[1]+=a[13];a[13]=b*k[e+-72+7];b=a[16]-a[28];a[16]+=a[28];a[28]=b*k[e+-72+7];b=-a[17]+a[29];a[17]+=a[29];a[29]=b*k[e+-72+7];b=Z.SQRT2*(a[2]-a[10]);a[2]+=a[10];a[10]=b;b=Z.SQRT2*(a[3]-a[11]);a[3]+=a[11];a[11]=b;b=Z.SQRT2* +(-a[18]+a[26]);a[18]+=a[26];a[26]=b-a[18];b=Z.SQRT2*(-a[19]+a[27]);a[19]+=a[27];a[27]=b-a[19];b=a[2];a[19]-=a[3];a[3]-=b;a[2]=a[31]-b;a[31]+=b;b=a[3];a[11]-=a[19];a[18]-=b;a[3]=a[30]-b;a[30]+=b;b=a[18];a[27]-=a[11];a[19]-=b;a[18]=a[15]-b;a[15]+=b;b=a[19];a[10]-=b;a[19]=a[14]-b;a[14]+=b;b=a[10];a[11]-=b;a[10]=a[23]-b;a[23]+=b;b=a[11];a[26]-=b;a[11]=a[22]-b;a[22]+=b;b=a[26];a[27]-=b;a[26]=a[7]-b;a[7]+=b;b=a[27];a[27]=a[6]-b;a[6]+=b;b=Z.SQRT2*(a[0]-a[4]);a[0]+=a[4];a[4]=b;b=Z.SQRT2*(a[1]-a[5]);a[1]+= +a[5];a[5]=b;b=Z.SQRT2*(a[16]-a[20]);a[16]+=a[20];a[20]=b;b=Z.SQRT2*(a[17]-a[21]);a[17]+=a[21];a[21]=b;b=-Z.SQRT2*(a[8]-a[12]);a[8]+=a[12];a[12]=b-a[8];b=-Z.SQRT2*(a[9]-a[13]);a[9]+=a[13];a[13]=b-a[9];b=-Z.SQRT2*(a[25]-a[29]);a[25]+=a[29];a[29]=b-a[25];b=-Z.SQRT2*(a[24]+a[28]);a[24]-=a[28];a[28]=b-a[24];b=a[24]-a[16];a[24]=b;b=a[20]-b;a[20]=b;b=a[28]-b;a[28]=b;b=a[25]-a[17];a[25]=b;b=a[21]-b;a[21]=b;b=a[29]-b;a[29]=b;b=a[17]-a[1];a[17]=b;b=a[9]-b;a[9]=b;b=a[25]-b;a[25]=b;b=a[5]-b;a[5]=b;b=a[21]-b; +a[21]=b;b=a[13]-b;a[13]=b;b=a[29]-b;a[29]=b;b=a[1]-a[0];a[1]=b;b=a[16]-b;a[16]=b;b=a[17]-b;a[17]=b;b=a[8]-b;a[8]=b;b=a[9]-b;a[9]=b;b=a[24]-b;a[24]=b;b=a[25]-b;a[25]=b;b=a[4]-b;a[4]=b;b=a[5]-b;a[5]=b;b=a[20]-b;a[20]=b;b=a[21]-b;a[21]=b;b=a[12]-b;a[12]=b;b=a[13]-b;a[13]=b;b=a[28]-b;a[28]=b;b=a[29]-b;a[29]=b;b=a[0];a[0]+=a[31];a[31]-=b;b=a[1];a[1]+=a[30];a[30]-=b;b=a[16];a[16]+=a[15];a[15]-=b;b=a[17];a[17]+=a[14];a[14]-=b;b=a[8];a[8]+=a[23];a[23]-=b;b=a[9];a[9]+=a[22];a[22]-=b;b=a[24];a[24]+=a[7];a[7]-= +b;b=a[25];a[25]+=a[6];a[6]-=b;b=a[4];a[4]+=a[27];a[27]-=b;b=a[5];a[5]+=a[26];a[26]-=b;b=a[20];a[20]+=a[11];a[11]-=b;b=a[21];a[21]+=a[10];a[10]-=b;b=a[12];a[12]+=a[19];a[19]-=b;b=a[13];a[13]+=a[18];a[18]-=b;b=a[28];a[28]+=a[3];a[3]-=b;b=a[29];a[29]+=a[2];a[2]-=b}var k=[-.1482523854003001,32.308141959636465,296.40344946382766,883.1344870032432,11113.947376231741,1057.2713659324597,305.7402417275812,30.825928907280012,3.8533188138216365,59.42900443849514,709.5899960123345,5281.91112291017,-5829.66483675846, +-817.6293103748613,-76.91656988279972,-4.594269939176596,.9063471690191471,.1960342806591213,-.15466694054279598,34.324387823855965,301.8067566458425,817.599602898885,11573.795901679885,1181.2520595540152,321.59731579894424,31.232021761053772,3.7107095756221318,53.650946155329365,684.167428119626,5224.56624370173,-6366.391851890084,-908.9766368219582,-89.83068876699639,-5.411397422890401,.8206787908286602,.3901806440322567,-.16070888947830023,36.147034243915876,304.11815768187864,732.7429163887613, +11989.60988270091,1300.012278487897,335.28490093152146,31.48816102859945,3.373875931311736,47.232241542899175,652.7371796173471,5132.414255594984,-6909.087078780055,-1001.9990371107289,-103.62185754286375,-6.104916304710272,.7416505462720353,.5805693545089249,-.16636367662261495,37.751650073343995,303.01103387567713,627.9747488785183,12358.763425278165,1412.2779918482834,346.7496836825721,31.598286663170416,3.1598635433980946,40.57878626349686,616.1671130880391,5007.833007176154,-7454.040671756168, +-1095.7960341867115,-118.24411666465777,-6.818469345853504,.6681786379192989,.7653668647301797,-.1716176790982088,39.11551877123304,298.3413246578966,503.5259106886539,12679.589408408976,1516.5821921214542,355.9850766329023,31.395241710249053,2.9164211881972335,33.79716964664243,574.8943997801362,4853.234992253242,-7997.57021486075,-1189.7624067269965,-133.6444792601766,-7.7202770609839915,.5993769336819237,.9427934736519954,-.17645823955292173,40.21879108166477,289.9982036694474,359.3226160751053, +12950.259102786438,1612.1013903507662,362.85067106591504,31.045922092242872,2.822222032597987,26.988862316190684,529.8996541764288,4671.371946949588,-8535.899136645805,-1282.5898586244496,-149.58553632943463,-8.643494270763135,.5345111359507916,1.111140466039205,-.36174739330527045,41.04429910497807,277.5463268268618,195.6386023135583,13169.43812144731,1697.6433561479398,367.40983966190305,30.557037410382826,2.531473372857427,20.070154905927314,481.50208566532336,4464.970341588308,-9065.36882077239, +-1373.62841526722,-166.1660487028118,-9.58289321133207,.4729647758913199,1.268786568327291,-.36970682634889585,41.393213350082036,261.2935935556502,12.935476055240873,13336.131683328815,1772.508612059496,369.76534388639965,29.751323653701338,2.4023193045459172,13.304795348228817,430.5615775526625,4237.0568611071185,-9581.931701634761,-1461.6913552409758,-183.12733958476446,-10.718010163869403,.41421356237309503,1.414213562373095,-.37677560326535325,41.619486213528496,241.05423794991074,-187.94665032361226, +13450.063605744153,1836.153896465782,369.4908799925761,29.001847876923147,2.0714759319987186,6.779591200894186,377.7767837205709,3990.386575512536,-10081.709459700915,-1545.947424837898,-200.3762958015653,-11.864482073055006,.3578057213145241,1.546020906725474,-.3829366947518991,41.1516456456653,216.47684307105183,-406.1569483347166,13511.136535077321,1887.8076599260432,367.3025214564151,28.136213436723654,1.913880671464418,.3829366947518991,323.85365704338597,3728.1472257487526,-10561.233882199509, +-1625.2025997821418,-217.62525175416,-13.015432208941645,.3033466836073424,1.66293922460509,-.5822628872992417,40.35639251440489,188.20071124269245,-640.2706748618148,13519.21490106562,1927.6022433578062,362.8197642637487,26.968821921868447,1.7463817695935329,-5.62650678237171,269.3016715297017,3453.386536448852,-11016.145278780888,-1698.6569643425091,-234.7658734267683,-14.16351421663124,.2504869601913055,1.76384252869671,-.5887180101749253,39.23429103868072,155.76096234403798,-889.2492977967378, +13475.470561874661,1955.0535223723712,356.4450994756727,25.894952980042156,1.5695032905781554,-11.181939564328772,214.80884394039484,3169.1640829158237,-11443.321309975563,-1765.1588461316153,-251.68908574481912,-15.49755935939164,.198912367379658,1.847759065022573,-.7912582233652842,37.39369355329111,119.699486012458,-1151.0956593239027,13380.446257078214,1970.3952110853447,348.01959814116185,24.731487364283044,1.3850130831637748,-16.421408865300393,161.05030052864092,2878.3322807850063,-11838.991423510031, +-1823.985884688674,-268.2854986386903,-16.81724543849939,.1483359875383474,1.913880671464418,-.7960642926861912,35.2322109610459,80.01928065061526,-1424.0212633405113,13235.794061869668,1973.804052543835,337.9908651258184,23.289159354463873,1.3934255946442087,-21.099669467133474,108.48348407242611,2583.700758091299,-12199.726194855148,-1874.2780658979746,-284.2467154529415,-18.11369784385905,.09849140335716425,1.961570560806461,-.998795456205172,32.56307803611191,36.958364584370486,-1706.075448829146, +13043.287458812016,1965.3831106103316,326.43182772364605,22.175018750622293,1.198638339011324,-25.371248002043963,57.53505923036915,2288.41886619975,-12522.674544337233,-1914.8400385312243,-299.26241273417224,-19.37805630698734,.04912684976946725,1.990369453344394,.0178904535*Z.SQRT2/2.384E-6,.008938074*Z.SQRT2/2.384E-6,.0015673635*Z.SQRT2/2.384E-6,.001228571*Z.SQRT2/2.384E-6,4.856585E-4*Z.SQRT2/2.384E-6,1.09434E-4*Z.SQRT2/2.384E-6,5.0783E-5*Z.SQRT2/2.384E-6,6.914E-6*Z.SQRT2/2.384E-6,12804.797818791945, +1945.5515939597317,313.4244966442953,20.801593959731544,1995.1556208053692,9.000838926174497,-29.20218120805369],r=[[2.382191739347913E-13,6.423305872147834E-13,9.400849094049688E-13,1.122435026096556E-12,1.183840321267481E-12,1.122435026096556E-12,9.40084909404969E-13,6.423305872147839E-13,2.382191739347918E-13,5.456116108943412E-12,4.878985199565852E-12,4.240448995017367E-12,3.559909094758252E-12,2.858043359288075E-12,2.156177623817898E-12,1.475637723558783E-12,8.371015190102974E-13,2.599706096327376E-13, +-5.456116108943412E-12,-4.878985199565852E-12,-4.240448995017367E-12,-3.559909094758252E-12,-2.858043359288076E-12,-2.156177623817898E-12,-1.475637723558783E-12,-8.371015190102975E-13,-2.599706096327376E-13,-2.382191739347923E-13,-6.423305872147843E-13,-9.400849094049696E-13,-1.122435026096556E-12,-1.183840321267481E-12,-1.122435026096556E-12,-9.400849094049694E-13,-6.42330587214784E-13,-2.382191739347918E-13],[2.382191739347913E-13,6.423305872147834E-13,9.400849094049688E-13,1.122435026096556E-12, +1.183840321267481E-12,1.122435026096556E-12,9.400849094049688E-13,6.423305872147841E-13,2.382191739347918E-13,5.456116108943413E-12,4.878985199565852E-12,4.240448995017367E-12,3.559909094758253E-12,2.858043359288075E-12,2.156177623817898E-12,1.475637723558782E-12,8.371015190102975E-13,2.599706096327376E-13,-5.461314069809755E-12,-4.921085770524055E-12,-4.343405037091838E-12,-3.732668368707687E-12,-3.093523840190885E-12,-2.430835727329465E-12,-1.734679010007751E-12,-9.74825365660928E-13,-2.797435120168326E-13, +0,0,0,0,0,0,-2.283748241799531E-13,-4.037858874020686E-13,-2.146547464825323E-13],[.1316524975873958,.414213562373095,.7673269879789602,1.091308501069271,1.303225372841206,1.56968557711749,1.920982126971166,2.414213562373094,3.171594802363212,4.510708503662055,7.595754112725146,22.90376554843115,.984807753012208,.6427876096865394,.3420201433256688,.9396926207859084,-.1736481776669303,-.7660444431189779,.8660254037844387,.5,-.5144957554275265,-.4717319685649723,-.3133774542039019,-.1819131996109812, +-.09457419252642064,-.04096558288530405,-.01419856857247115,-.003699974673760037,.8574929257125442,.8817419973177052,.9496286491027329,.9833145924917901,.9955178160675857,.9991605581781475,.999899195244447,.9999931550702802],[0,0,0,0,0,0,2.283748241799531E-13,4.037858874020686E-13,2.146547464825323E-13,5.461314069809755E-12,4.921085770524055E-12,4.343405037091838E-12,3.732668368707687E-12,3.093523840190885E-12,2.430835727329466E-12,1.734679010007751E-12,9.74825365660928E-13,2.797435120168326E-13, +-5.456116108943413E-12,-4.878985199565852E-12,-4.240448995017367E-12,-3.559909094758253E-12,-2.858043359288075E-12,-2.156177623817898E-12,-1.475637723558782E-12,-8.371015190102975E-13,-2.599706096327376E-13,-2.382191739347913E-13,-6.423305872147834E-13,-9.400849094049688E-13,-1.122435026096556E-12,-1.183840321267481E-12,-1.122435026096556E-12,-9.400849094049688E-13,-6.423305872147841E-13,-2.382191739347918E-13]],v=r[f.SHORT_TYPE],C=r[f.SHORT_TYPE],u=r[f.SHORT_TYPE],J=r[f.SHORT_TYPE],d=[0,1,16,17, +8,9,24,25,4,5,20,21,12,13,28,29,2,3,18,19,10,11,26,27,6,7,22,23,14,15,30,31];this.mdct_sub48=function(c,k,a){for(var b=286,w=0;wn;n++)for(x(k,b,D[m]),x(k,b+32,D[m+1]),m+=2,b+=64,l=1;32>l;l+=2)D[m-1][l]*=-1;for(l=0;32>l;l++,t+=18){var D=q.block_type,m=c.sb_sample[w][e],z=c.sb_sample[w][1-e];0!=q.mixed_block_flag&&2>l&&(D=0);if(1E-12>c.amp_filter[l])qa.fill(g,t+0,t+18,0);else{if(1> +c.amp_filter[l])for(n=0;18>n;n++)z[n][d[l]]*=c.amp_filter[l];if(D==f.SHORT_TYPE){for(n=-3;0>n;n++){var E=r[f.SHORT_TYPE][n+3];g[t+3*n+9]=m[9+n][d[l]]*E-m[8-n][d[l]];g[t+3*n+18]=m[14-n][d[l]]*E+m[15+n][d[l]];g[t+3*n+10]=m[15+n][d[l]]*E-m[14-n][d[l]];g[t+3*n+19]=z[2-n][d[l]]*E+z[3+n][d[l]];g[t+3*n+11]=z[3+n][d[l]]*E-z[2-n][d[l]];g[t+3*n+20]=z[8-n][d[l]]*E+z[9+n][d[l]]}n=g;m=t;for(E=0;3>E;E++){var h=n[m+6]*r[f.SHORT_TYPE][0]-n[m+15];z=n[m+0]*r[f.SHORT_TYPE][2]-n[m+9];var p=h+z;var A=h-z;h=n[m+15]*r[f.SHORT_TYPE][0]+ +n[m+6];z=n[m+9]*r[f.SHORT_TYPE][2]+n[m+0];var y=h+z;var O=-h+z;z=2.069978111953089E-11*(n[m+3]*r[f.SHORT_TYPE][1]-n[m+12]);h=2.069978111953089E-11*(n[m+12]*r[f.SHORT_TYPE][1]+n[m+3]);n[m+0]=1.90752519173728E-11*p+z;n[m+15]=1.90752519173728E-11*-y+h;A*=1.6519652744032674E-11;y=9.537625958686404E-12*y+h;n[m+3]=A-y;n[m+6]=A+y;p=9.537625958686404E-12*p-z;O*=1.6519652744032674E-11;n[m+9]=p+O;n[m+12]=p-O;m++}}else{E=G(18);for(n=-9;0>n;n++)p=r[D][n+27]*z[n+9][d[l]]+r[D][n+36]*z[8-n][d[l]],A=r[D][n+9]*m[n+ +9][d[l]]-r[D][n+18]*m[8-n][d[l]],E[n+9]=p-A*v[3+n+9],E[n+18]=p*v[3+n+9]+A;var n=g,m=t;p=E;var F=p[17]-p[9];var R=p[15]-p[11];var X=p[14]-p[12];O=p[0]+p[8];y=p[1]+p[7];h=p[2]+p[6];A=p[3]+p[5];n[m+17]=O+h-A-(y-p[4]);E=(O+h-A)*C[19]+(y-p[4]);z=(F-R-X)*C[18];n[m+5]=z+E;n[m+6]=z-E;var I=(p[16]-p[10])*C[18];y=y*C[19]+p[4];z=F*C[12]+I+R*C[13]+X*C[14];E=-O*C[16]+y-h*C[17]+A*C[15];n[m+1]=z+E;n[m+2]=z-E;z=F*C[13]-I-R*C[14]+X*C[12];E=-O*C[17]+y-h*C[15]+A*C[16];n[m+9]=z+E;n[m+10]=z-E;z=F*C[14]-I+R*C[12]-X*C[13]; +E=O*C[15]-y+h*C[16]-A*C[17];n[m+13]=z+E;n[m+14]=z-E;F=p[8]-p[0];R=p[6]-p[2];X=p[5]-p[3];O=p[17]+p[9];y=p[16]+p[10];h=p[15]+p[11];A=p[14]+p[12];n[m+0]=O+h+A+(y+p[13]);z=(O+h+A)*C[19]-(y+p[13]);E=(F-R+X)*C[18];n[m+11]=z+E;n[m+12]=z-E;I=(p[7]-p[1])*C[18];y=p[13]-y*C[19];z=O*C[15]-y+h*C[16]+A*C[17];E=F*C[14]+I+R*C[12]+X*C[13];n[m+3]=z+E;n[m+4]=z-E;z=-O*C[17]+y-h*C[15]-A*C[16];E=F*C[13]+I-R*C[14]-X*C[12];n[m+7]=z+E;n[m+8]=z-E;z=-O*C[16]+y-h*C[17]-A*C[15];E=F*C[12]-I+R*C[13]-X*C[14];n[m+15]=z+E;n[m+16]= +z-E}}if(D!=f.SHORT_TYPE&&0!=l)for(n=7;0<=n;--n)D=g[t+n]*u[20+n]+g[t+-1-n]*J[28+n],m=g[t+n]*J[28+n]-g[t+-1-n]*u[20+n],g[t+-1-n]=D,g[t+n]=m}}k=a;b=286;if(1==c.mode_gr)for(e=0;18>e;e++)S.arraycopy(c.sb_sample[w][1][e],0,c.sb_sample[w][0][e],0,32)}}}function za(){this.thm=new tb;this.en=new tb}function f(){var x=f.FFTOFFSET,k=f.MPG_MD_MS_LR,r=null,v=this.psy=null,C=null,u=null;this.setModules=function(d,c,f,a){r=d;v=this.psy=c;C=a;u=f};var fa=new Fc;this.lame_encode_mp3_frame=function(d,c,w,a,b,B){var e= +Tb([2,2]);e[0][0]=new za;e[0][1]=new za;e[1][0]=new za;e[1][1]=new za;var l=Tb([2,2]);l[0][0]=new za;l[0][1]=new za;l[1][0]=new za;l[1][1]=new za;var q=[null,null],g=d.internal_flags,t=ha([2,4]),D=[.5,.5],m=[[0,0],[0,0]],n=[[0,0],[0,0]];q[0]=c;q[1]=w;if(0==g.lame_encode_frame_init){c=d.internal_flags;var z,E;if(0==c.lame_encode_frame_init){w=G(2014);var h=G(2014);c.lame_encode_frame_init=1;for(E=z=0;z<286+576*(1+c.mode_gr);++z)z<576*c.mode_gr?(w[z]=0,2==c.channels_out&&(h[z]=0)):(w[z]=q[0][E],2== +c.channels_out&&(h[z]=q[1][E]),++E);for(E=0;E(g.slot_lag-=g.frac_SpF)&&(g.slot_lag+=d.out_samplerate,g.padding=1);if(0!=g.psymodel)for(h=[null,null],z=0,E=U(2),w=0;w=t?(g.ATH.adjust*=.075*t+.925,g.ATH.adjust=t?g.ATH.adjust=t:g.ATH.adjustl;l++)g.nsPsy.pefirbuf[l]=g.nsPsy.pefirbuf[l+1];for(w=n=0;wl;l++)n+=(g.nsPsy.pefirbuf[l]+g.nsPsy.pefirbuf[18-l])*f.fircoef[l];n=3350*g.mode_gr*g.channels_out/n;for(w=0;wb;b++)g.pinfo.pcmdata[c][b]=q[c][b-x]}u.set_frame_pinfo(d,e)}g.bitrate_stereoMode_Hist[g.bitrate_index][4]++;g.bitrate_stereoMode_Hist[15][4]++;2==g.channels_out&&(g.bitrate_stereoMode_Hist[g.bitrate_index][g.mode_ext]++, +g.bitrate_stereoMode_Hist[15][g.mode_ext]++);for(d=0;df;f++)for(var k=0;2>k;k++)this.tt[f][k]=new rb}function tb(){this.l=G(f.SBMAX_l);this.s=ha([f.SBMAX_s,3]);var x=this;this.assign=function(k){S.arraycopy(k.l,0,x.l,0,f.SBMAX_l);for(var r=0;rv;v++)x.s[r][v]=k.s[r][v]}}function Ic(){this.last_en_subshort=ha([4,9]);this.lastAttacks=U(4);this.pefirbuf=G(19);this.longfact=G(f.SBMAX_l); +this.shortfact=G(f.SBMAX_s);this.attackthre_s=this.attackthre=0}function ia(){function x(){this.ptr=this.write_timing=0;this.buf=new Int8Array(40)}this.fill_buffer_resample_init=this.iteration_init_init=this.lame_encode_frame_init=this.Class_ID=0;this.mfbuf=ha([2,ia.MFSIZE]);this.full_outer_loop=this.use_best_huffman=this.subblock_gain=this.noise_shaping_stop=this.psymodel=this.substep_shaping=this.noise_shaping_amp=this.noise_shaping=this.highpass2=this.highpass1=this.lowpass2=this.lowpass1=this.mode_ext= +this.samplerate_index=this.bitrate_index=this.VBR_max_bitrate=this.VBR_min_bitrate=this.mf_size=this.mf_samples_to_encode=this.resample_ratio=this.channels_out=this.channels_in=this.mode_gr=0;this.l3_side=new Hc;this.ms_ratio=G(2);this.slot_lag=this.frac_SpF=this.padding=0;this.tag_spec=null;this.nMusicCRC=0;this.OldValue=U(2);this.CurrentStep=U(2);this.masking_lower=0;this.bv_scf=U(576);this.pseudohalf=U(ra.SFBMAX);this.sfb21_extra=!1;this.inbuf_old=Array(2);this.blackfilt=Array(2*ia.BPC+1);this.itime= +new Float64Array(2);this.sideinfo_len=0;this.sb_sample=ha([2,2,18,f.SBLIMIT]);this.amp_filter=G(32);this.header=Array(ia.MAX_HEADER_BUF);this.ResvMax=this.ResvSize=this.ancillary_flag=this.w_ptr=this.h_ptr=0;this.scalefac_band=new ma;this.minval_l=G(f.CBANDS);this.minval_s=G(f.CBANDS);this.nb_1=ha([4,f.CBANDS]);this.nb_2=ha([4,f.CBANDS]);this.nb_s1=ha([4,f.CBANDS]);this.nb_s2=ha([4,f.CBANDS]);this.s3_ll=this.s3_ss=null;this.decay=0;this.thm=Array(4);this.en=Array(4);this.tot_ener=G(4);this.loudness_sq= +ha([2,2]);this.loudness_sq_save=G(2);this.mld_l=G(f.SBMAX_l);this.mld_s=G(f.SBMAX_s);this.bm_l=U(f.SBMAX_l);this.bo_l=U(f.SBMAX_l);this.bm_s=U(f.SBMAX_s);this.bo_s=U(f.SBMAX_s);this.npart_s=this.npart_l=0;this.s3ind=Ua([f.CBANDS,2]);this.s3ind_s=Ua([f.CBANDS,2]);this.numlines_s=U(f.CBANDS);this.numlines_l=U(f.CBANDS);this.rnumlines_l=G(f.CBANDS);this.mld_cb_l=G(f.CBANDS);this.mld_cb_s=G(f.CBANDS);this.numlines_l_num1=this.numlines_s_num1=0;this.pe=G(4);this.ms_ener_ratio_old=this.ms_ratio_l_old=this.ms_ratio_s_old= +0;this.blocktype_old=U(2);this.nsPsy=new Ic;this.VBR_seek_table=new Gc;this.PSY=this.ATH=null;this.nogap_current=this.nogap_total=0;this.findPeakSample=this.findReplayGain=this.decode_on_the_fly=!0;this.AudiophileGain=this.RadioGain=this.PeakSample=0;this.rgdata=null;this.noclipScale=this.noclipGainChange=0;this.bitrate_stereoMode_Hist=Ua([16,5]);this.bitrate_blockType_Hist=Ua([16,6]);this.hip=this.pinfo=null;this.in_buffer_nsamples=0;this.iteration_loop=this.in_buffer_1=this.in_buffer_0=null;for(var k= +0;k>1;var e=a;var l=a<<1;var q=l+e;a=l<<1;var g=k;var t=g+u;do{var x=f[g+0]-f[g+e];var m=f[g+0]+f[g+e];var n=f[g+l]-f[g+q];var C=f[g+l]+f[g+q];f[g+l]=m-C;f[g+0]=m+C;f[g+q]=x-n;f[g+e]=x+n;x=f[t+0]-f[t+e];m=f[t+0]+f[t+e];n=Z.SQRT2*f[t+q];C=Z.SQRT2*f[t+l];f[t+l]=m-C;f[t+0]=m+C;f[t+ +q]=x-n;f[t+e]=x+n;t+=a;g+=a}while(gk;k++){var a=f.BLKSIZE_s/2,b=65535&192*(k+1),u=f.BLKSIZE_s/8-1;do{var e=C[u<<2]&255;var l=r[e]*c[d][w+e+b];var q=r[127-e]*c[d][w+e+b+128];var g=l-q;l+=q;var t=r[e+64]*c[d][w+e+b+64];q=r[63-e]*c[d][w+e+b+192];var D=t-q;t+=q;a-=4;v[k][a+0]=l+t;v[k][a+2]=l-t;v[k][a+1]=g+D;v[k][a+3]=g-D;l=r[e+ +1]*c[d][w+e+b+1];q=r[126-e]*c[d][w+e+b+129];g=l-q;l+=q;t=r[e+65]*c[d][w+e+b+65];q=r[62-e]*c[d][w+e+b+193];D=t-q;t+=q;v[k][a+f.BLKSIZE_s/2+0]=l+t;v[k][a+f.BLKSIZE_s/2+2]=l-t;v[k][a+f.BLKSIZE_s/2+1]=g+D;v[k][a+f.BLKSIZE_s/2+3]=g-D}while(0<=--u);x(v[k],a,f.BLKSIZE_s/2)}};this.fft_long=function(r,v,d,c,w){r=f.BLKSIZE/8-1;var a=f.BLKSIZE/2;do{var b=C[r]&255;var u=k[b]*c[d][w+b];var e=k[b+512]*c[d][w+b+512];var l=u-e;u+=e;var q=k[b+256]*c[d][w+b+256];e=k[b+768]*c[d][w+b+768];var g=q-e;q+=e;a-=4;v[a+0]= +u+q;v[a+2]=u-q;v[a+1]=l+g;v[a+3]=l-g;u=k[b+1]*c[d][w+b+1];e=k[b+513]*c[d][w+b+513];l=u-e;u+=e;q=k[b+257]*c[d][w+b+257];e=k[b+769]*c[d][w+b+769];g=q-e;q+=e;v[a+f.BLKSIZE/2+0]=u+q;v[a+f.BLKSIZE/2+2]=u-q;v[a+f.BLKSIZE/2+1]=l+g;v[a+f.BLKSIZE/2+3]=l-g}while(0<=--r);x(v,a,f.BLKSIZE/2)};this.init_fft=function(u){for(u=0;ua)if(b=b*n)return a+b;g=a/b}a+=b;if(6>=f+3){if(g>=m)return a;f=0|Z.FAST_LOG10_X(g,16);return a*p[f]}f=0|Z.FAST_LOG10_X(g,16);b=0!=e?d.ATH.cb_s[c]*d.ATH.adjust:d.ATH.cb_l[c]*d.ATH.adjust;return ab?(c=1,13>=f&&(c=A[f]),b=Z.FAST_LOG10_X(a/b,10/15),a*((h[f]-c)*b+c)):13a&&(a=0);0>b&&(b=0);if(0>= +a)return b;if(0>=b)return a;var f=b>a?b/a:a/b;if(-2<=c&&2>=c){if(f>=m)return a+b;c=0|Z.FAST_LOG10_X(f,16);return(a+b)*y[c]}if(f=m){++h;break}k=a.PSY.bo_s_weight[h];m=1-k;p=k*b[g];k*=c[g];a.en[d].s[h][e]+=p;a.thm[d].s[h][e]+=k;p=m*b[g];k=m*c[g]}for(;h=l){++e;break}p=a.PSY.bo_l_weight[e];l=1-p;g=p*b[h];p*=c[h];a.en[d].l[e]+=g;a.thm[d].l[e]+=p;g=l*b[h];p=l*c[h]}for(;e=c?b:0e;e++){var h=a.thm.s[d][e];if(0h&&(c=g>1E10*h?c+23.02585092994046*O[d]:c+O[d]*Z.FAST_LOG10(g/h))}}return c}function d(a,b){for(var c=281.0575,d=0;de&&(c=h>1E10*e?c+23.02585092994046*F[d]:c+F[d]*Z.FAST_LOG10(h/e))}}return c}function c(a,b,c,d,f){var e,h;for(e=h=0;ef&&(g=f);d[e]=g}else d[e]=0;for(e=1;ef&&(g=f),d[e]=g):d[e]=0;h=c[e-1]+c[e];0f&&(g=f),d[e]=g):d[e]=0}function a(a,b,c,e,d,f,h){var g= +2*f;d=0m&&(k=m);p>q&&(p=q);b[2][l]=k;b[3][l]=p}}function b(a,b){a=0<=a?27*-a:a*b;return-72>=a?0:Math.exp(.2302585093*a)}function B(a){0> +a&&(a=0);a*=.001;return 13*Math.atan(.76*a)+3.5*Math.atan(a*a/56.25)}function e(a,b,c,e,d,h,g,p,k,l,m,q){var A=G(f.CBANDS+1),r=p/(15B(p*w)-y&&w<=k/2;w++);a[n]=w-u;for(Q=n+1;uk/2){u=k/2;++n;break}}A[n]=p*u;for(y=0;yn&&(n=0),w=0|Math.floor(.5+m*(u-.5)),w>k/2&&(w=k/2),c[y]=(t[n]+t[w])/2,b[y]=t[w],g[y]=(r*u-A[b[y]])/(A[b[y]+ +1]-A[b[y]]),0>g[y]?g[y]=0:1=m){var q=m-.5;q=8*(q*q-2*q)}else q=0;m+=.474;m=15.811389+7.5*m-17.5*Math.sqrt(1+m*m);-60>=m?q=0:(m=Math.exp(.2302585093* +(q+m)),q=m/.6609193);m=q*d[g];p[l][g]=m*h[l]}else for(g=0;g=n;++n)A=m+n*(r-m)/1E3,A=b(A,l),t+=A;A=1001/(t*(r-m));for(l=0;la&&(a=3410);a=Math.max(.1,a/1E3);return 3.64*Math.pow(a,-.8)-6.8*Math.exp(-.6*Math.pow(a-3.4,2))+6*Math.exp(-.15*Math.pow(a-8.7,2))+.001*(.6+.04*b)*Math.pow(a,4)}var t=new Jc,D=1/217621504/(f.BLKSIZE/2),m,n,z,E=[1,.79433,.63096,.63096,.63096,.63096,.63096,.25119,.11749],h=[3.3246* +3.3246,3.23837*3.23837,9.9500500969,9.0247369744,8.1854926609,7.0440875649,2.46209*2.46209,2.284*2.284,4.4892710641,1.96552*1.96552,1.82335*1.82335,1.69146*1.69146,2.4621061921,2.1508568964,1.37074*1.37074,1.31036*1.31036,1.5691069696,1.4555939904,1.16203*1.16203,1.2715945225,1.09428*1.09428,1.0659*1.0659,1.0779838276,1.0382591025,1],p=[1.7782755904,1.35879*1.35879,1.38454*1.38454,1.39497*1.39497,1.40548*1.40548,1.3537*1.3537,1.6999465924,1.22321*1.22321,1.3169398564,1],A=[5.5396212496,2.29259*2.29259, +4.9868695969,2.12675*2.12675,2.02545*2.02545,1.87894*1.87894,1.74303*1.74303,1.61695*1.61695,2.2499700001,1.39148*1.39148,1.29083*1.29083,1.19746*1.19746,1.2339655056,1.0779838276],y=[1.7782755904,1.35879*1.35879,1.38454*1.38454,1.39497*1.39497,1.40548*1.40548,1.3537*1.3537,1.6999465924,1.22321*1.22321,1.3169398564,1],O=[11.8,13.6,17.2,32,46.5,51.3,57.5,67.1,71.5,84.6,97.6,130],F=[6.8,5.8,5.8,6.4,6.5,9.9,12.1,14.4,15,18.9,21.6,26.9,34.2,40.2,46.8,56.5,60.7,73.9,85.7,93.4,126.1],R=[-1.730326E-17,-.01703172, +-1.349528E-17,.0418072,-6.73278E-17,-.0876324,-3.0835E-17,.1863476,-1.104424E-16,-.627638];this.L3psycho_anal_ns=function(a,b,e,h,g,p,l,m,q,A){var r,n=a.internal_flags,y=ha([2,f.BLKSIZE]),Q=ha([2,3,f.BLKSIZE_s]),I=G(f.CBANDS+1),H=G(f.CBANDS+1),V=G(f.CBANDS+2),O=U(2),D=U(2),z,M,B,X,F,N,K,la=ha([2,576]),S=U(f.CBANDS+2),ca=U(f.CBANDS+2);qa.fill(ca,0);var fa=n.channels_out;a.mode==ka.JOINT_STEREO&&(fa=4);var T=a.VBR==J.vbr_off?0==n.ResvMax?0:n.ResvSize/n.ResvMax*.5:a.VBR==J.vbr_rh||a.VBR==J.vbr_mtrh|| +a.VBR==J.vbr_mt?.6:1;for(z=0;zB;B++){var ba;var ia=Qa[L+B+10];for(X=ba=0;9>X;X+=2)ia+=R[X]*(Qa[L+B+X]+Qa[L+B+21-X]),ba+=R[X+1]*(Qa[L+B+X+1]+Qa[L+B+21-X-1]);la[z][B]=ia+ba}g[h][z].en.assign(n.en[z]);g[h][z].thm.assign(n.thm[z]);2B;B++)Ka[B]=n.nsPsy.last_en_subshort[z][B+6],Da[B]=Ka[B]/n.nsPsy.last_en_subshort[z][B+4],da[0]+=Ka[B];if(2==z)for(B=0;576>B;B++){var za=la[0][B];var Ub=la[1][B];la[0][B]=za+Ub;la[1][B]=za-Ub}var Za=la[z&1],bc=0;for(B=0;9>B;B++){var Ua=bc+64;for(r=1;bcKa[B+3-2]?r/Ka[B+3-2]:Ka[B+3-2]>10*r?Ka[B+3-2]/(10*r):0;Da[B+3]=r}if(a.analysis){var Fa=Da[0];for(B=1;12>B;B++)FaB;B++)0==ya[B/3]&&Da[B]>sb&&(ya[B/3]=B%3+1);for(B=1;4>B;B++)1.7>(da[B-1]>da[B]?da[B-1]/da[B]:da[B]/da[B-1])&&(ya[B]=0,1==B&&(ya[0]=0));0!=ya[0]&&0!=n.nsPsy.lastAttacks[z]&&(ya[0]=0);if(3==n.nsPsy.lastAttacks[z]||0!=ya[0]+ya[1]+ya[2]+ya[3])Y=0,0!=ya[1]&&0!=ya[0]&&(ya[1]=0),0!=ya[2]&&0!=ya[1]&&(ya[2]=0),0!=ya[3]&&0!=ya[2]&&(ya[3]=0);2>z?D[z]=Y:0==Y&&(D[0]=D[1]=0);q[z]=n.tot_ener[z];var ub=void 0, +Vb=void 0,ob=void 0,P=void 0,jc=a,Ia=xa,Gb=ma,Ra=y,La=z&1,Ma=Q,Sa=z&1,va=h,Na=z,fb=b,gb=e,Va=jc.internal_flags;if(2>Na)t.fft_long(Va,Ra[La],Na,fb,gb),t.fft_short(Va,Ma[Sa],Na,fb,gb);else if(2==Na){for(var ja=f.BLKSIZE-1;0<=ja;--ja)ub=Ra[La+0][ja],Vb=Ra[La+1][ja],Ra[La+0][ja]=(ub+Vb)*Z.SQRT2*.5,Ra[La+1][ja]=(ub-Vb)*Z.SQRT2*.5;for(var Ca=2;0<=Ca;--Ca)for(ja=f.BLKSIZE_s-1;0<=ja;--ja)ub=Ma[Sa+0][Ca][ja],Vb=Ma[Sa+1][Ca][ja],Ma[Sa+0][Ca][ja]=(ub+Vb)*Z.SQRT2*.5,Ma[Sa+1][Ca][ja]=(ub-Vb)*Z.SQRT2*.5}Ia[0]= +Ra[La+0][0];Ia[0]*=Ia[0];for(ja=f.BLKSIZE/2-1;0<=ja;--ja)ob=Ra[La+0][f.BLKSIZE/2-ja],P=Ra[La+0][f.BLKSIZE/2+ja],Ia[f.BLKSIZE/2-ja]=.5*(ob*ob+P*P);for(Ca=2;0<=Ca;--Ca)for(Gb[Ca][0]=Ma[Sa+0][Ca][0],Gb[Ca][0]*=Gb[Ca][0],ja=f.BLKSIZE_s/2-1;0<=ja;--ja)ob=Ma[Sa+0][Ca][f.BLKSIZE_s/2-ja],P=Ma[Sa+0][Ca][f.BLKSIZE_s/2+ja],Gb[Ca][f.BLKSIZE_s/2-ja]=.5*(ob*ob+P*P);for(var rb=0,ja=11;jaNa&&(Va.loudness_sq[va][Na]=Va.loudness_sq_save[Na],Va.loudness_sq_save[Na]=x(Ia,Va));c(n,xa,I,ac,ra);w(n,ac,ra,S);for(K=0;3>K;K++){for(var Hb,aa,sa=void 0,ta=void 0,Wb=void 0,Ab=ma,Ta=H,$a=V,vb=z,Fb=K,Ga=a.internal_flags,sa=ta=0;sakb;kb++)oa=Oa.thm[0].s[Aa][kb],Jb= +Oa.thm[1].s[Aa][kb],Oa.thm[0].s[Aa][kb]+=Jb*Cb,Oa.thm[1].s[Aa][kb]+=oa*Cb}}if(a.mode==ka.JOINT_STEREO){for(var Db,Kb,Ja,Xa,ea=0;ea1.58*n.thm[1].l[ea]||n.thm[1].l[ea]>1.58*n.thm[0].l[ea]||(Xa=n.mld_l[ea]*n.en[3].l[ea],Ja=Math.max(n.thm[2].l[ea],Math.min(n.thm[3].l[ea],Xa)),Xa=n.mld_l[ea]*n.en[2].l[ea],Kb=Math.max(n.thm[3].l[ea],Math.min(n.thm[2].l[ea],Xa)),n.thm[2].l[ea]=Ja,n.thm[3].l[ea]=Kb);for(ea=0;eaBa;Ba++)n.thm[0].s[ea][Ba]>1.58*n.thm[1].s[ea][Ba]|| +n.thm[1].s[ea][Ba]>1.58*n.thm[0].s[ea][Ba]||(Xa=n.mld_s[ea]*n.en[3].s[ea][Ba],Ja=Math.max(n.thm[2].s[ea][Ba],Math.min(n.thm[3].s[ea][Ba],Xa)),Xa=n.mld_s[ea]*n.en[2].s[ea][Ba],Kb=Math.max(n.thm[3].s[ea][Ba],Math.min(n.thm[2].s[ea][Ba],Xa)),n.thm[2].s[ea][Ba]=Ja,n.thm[3].s[ea][Ba]=Kb);Db=a.msfix;if(0mb;mb++)bb=n.ATH.cb_s[n.bm_s[wa]]*lb,Eb=Math.min(Math.max(n.thm[0].s[wa][mb],bb),Math.max(n.thm[1].s[wa][mb],bb)),db=Math.max(n.thm[2].s[wa][mb],bb),cb=Math.max(n.thm[3].s[wa][mb],bb),Eb*LbL;L++){var ba; +var ia=firbuf[Qa+L+10];for(var da=ba=0;9>da;da+=2)ia+=X[da]*(firbuf[Qa+L+da]+firbuf[Qa+L+21-da]),ba+=X[da+1]*(firbuf[Qa+L+da+1]+firbuf[Qa+L+21-da-1]);la[T][L]=ia+ba}p[g][T].en.assign(S.en[T]);p[g][T].thm.assign(S.thm[T]);2L;L++)Da[L]=S.nsPsy.last_en_subshort[T][L+6],Y[L]=Da[L]/S.nsPsy.last_en_subshort[T][L+4],ra[0]+=Da[L];for(L=0;9>L;L++){for(var za=qa+64,Za=1;qaDa[L+3-2]?Za/Da[L+3-2]:Da[L+3-2]>10*Za?Da[L+3-2]/(10*Za):0;Y[L+3]=Za}for(L=0;3>L;++L){var Ua=Da[3*L+3]+Da[3*L+4]+Da[3*L+5],Ub=1;6*Da[3*L+5]L;L++)fb< +Y[L]&&(fb=Y[L]);S.pinfo.ers[g][T]=S.pinfo.ers_save[T];S.pinfo.ers_save[T]=fb}for(L=0;12>L;L++)0==N[T][L/3]&&Y[L]>ya&&(N[T][L/3]=L%3+1);for(L=1;4>L;L++){var gb=ra[L-1],ub=ra[L];4E4>Math.max(gb,ub)&&gb<1.7*ub&&ub<1.7*gb&&(1==L&&N[T][0]<=N[T][L]&&(N[T][0]=0),N[T][L]=0)}N[T][0]<=S.nsPsy.lastAttacks[T]&&(N[T][0]=0);if(3==S.nsPsy.lastAttacks[T]||0!=N[T][0]+N[T][1]+N[T][2]+N[T][3])ma=0,0!=N[T][1]&&0!=N[T][0]&&(N[T][1]=0),0!=N[T][2]&&0!=N[T][1]&&(N[T][2]=0),0!=N[T][3]&&0!=N[T][2]&&(N[T][3]=0);2>T?K[T]=ma: +0==ma&&(K[0]=K[1]=0);n[T]=S.tot_ener[T]}var sb=b.internal_flags;b.short_blocks!=pa.short_block_coupled||0!=K[0]&&0!=K[1]||(K[0]=K[1]=0);for(var ob=0;obIa)t.fft_long(Sa,La[Ma],Ia,e,h);else if(2==Ia)for(var va=f.BLKSIZE-1;0<=va;--va){var Na=La[Ma+0][va],tb=La[Ma+1][va];La[Ma+0][va]=(Na+tb)* +Z.SQRT2*.5;La[Ma+1][va]=(Na-tb)*Z.SQRT2*.5}Ra[0]=La[Ma+0][0];Ra[0]*=Ra[0];for(va=f.BLKSIZE/2-1;0<=va;--va){var zb=La[Ma+0][f.BLKSIZE/2-va],Va=La[Ma+0][f.BLKSIZE/2+va];Ra[f.BLKSIZE/2-va]=.5*(zb*zb+Va*Va)}for(var ja=0,va=11;vaCa&& +(Hb.loudness_sq[g][Ca]=Hb.loudness_sq_save[Ca],Hb.loudness_sq_save[Ca]=x(Fb,Hb));if(0!=K[Q]){var aa=void 0,sa=void 0,ta=z,Wb=V,Ab=M[P],Ta=R[P],$a=P,vb=G(f.CBANDS),Tb=G(f.CBANDS),Ga=U(f.CBANDS+2);c(ta,Wb,Ab,vb,Tb);w(ta,vb,Tb,Ga);for(var Ib=0,aa=0;aa=Qb&&(Qb=ab);0>=jb&&(jb=ab);sa=ta.blocktype_old[$a&1]==f.NORM_TYPE?Math.min(jb,Qb):jb;Ta[aa]=Math.min(ab,sa)}ta.nb_2[$a][aa]=ta.nb_1[$a][aa];ta.nb_1[$a][aa]=ab;ib=vb[aa];ib*=ta.minval_l[aa];ib*=xb;Ta[aa]>ib&&(Ta[aa]=ib);1Ab[aa]&&(Ta[aa]=Ab[aa]);1>ta.masking_lower&& +(Ta[aa]*=ta.masking_lower)}for(;aaoa;oa++){for(P=0;PKb&&t.fft_short(Lb,ea[Ba],Kb,e,h);if(2==Kb)for(var Ha=f.BLKSIZE_s-1;0<=Ha;--Ha){var bb=ea[Ba+0][Ja][Ha],cb=ea[Ba+1][Ja][Ha];ea[Ba+0][Ja][Ha]=(bb+cb)*Z.SQRT2*.5;ea[Ba+1][Ja][Ha]=(bb-cb)*Z.SQRT2*.5}Xa[Ja][0]=ea[Ba+0][Ja][0];Xa[Ja][0]*=Xa[Ja][0];for(Ha=f.BLKSIZE_s/2-1;0<=Ha;--Ha){var db=ea[Ba+0][Ja][f.BLKSIZE_s/2-Ha],Eb=ea[Ba+0][Ja][f.BLKSIZE_s/2+Ha];Xa[Ja][f.BLKSIZE_s/2-Ha]=.5*(db*db+Eb*Eb)}for(var ga=void 0,lb=void 0,wa=void 0,mb=I,Wa=M[P],ua=R[P], +Mb=P,cc=oa,Ea=b.internal_flags,Nb=new float[f.CBANDS],kc=G(f.CBANDS),dc=new int[f.CBANDS],ga=lb=0;gaYb&& +(nb=Yb),Xb[na]=nb):Xb[na]=0;for(na=1;naYb&&(nb=Yb),Xb[na]=nb):Xb[na]=0;Pa=Rb[na-1]+Rb[na];0Yb&&(nb=Yb),Xb[na]=nb):Xb[na]=0;for(lb=ga=0;gaZb&&(ua[ga]=Zb);1Wa[ga]&&(ua[ga]=Wa[ga]);1>Ea.masking_lower&&(ua[ga]*=Ea.masking_lower)}for(;gaoa;oa++){var eb=z.thm[P].s[Sb][oa],eb=.8*eb;if(2<=N[P][oa]||1==N[P][oa+1])y=0!=oa?oa-1:2,A=u(z.thm[P].s[Sb][y],eb,.36),eb=Math.min(eb,A);else if(1==N[P][oa])y=0!=oa?oa-1:2,A=u(z.thm[P].s[Sb][y],eb,.18),eb=Math.min(eb,A);else if(0!=oa&&3==N[P][oa- +1]||0==oa&&3==z.nsPsy.lastAttacks[P])y=2!=oa?oa+1:0,A=u(z.thm[P].s[Sb][y],eb,.18),eb=Math.min(eb,A);eb*=F[P][oa];vc[oa]=eb}for(oa=0;3>oa;oa++)z.thm[P].s[Sb][oa]=vc[oa]}for(P=0;Ph;++h){for(var v=0;vv;++v){for(c=0;cv;v++)d.nsPsy.last_en_subshort[h][v]=10}d.loudness_sq_save[0]=d.loudness_sq_save[1]=0;d.npart_l=e(d.numlines_l,d.bo_l,d.bm_l,u,y,d.mld_l,d.PSY.bo_l_weight,x,f.BLKSIZE,d.scalefac_band.l,f.BLKSIZE/1152,f.SBMAX_l);for(h=0;h=p&&(c=k*(u[h]-p)/(24-p)+b*(24-u[h])/(24-p)),w[h]=Math.pow(10,c/10),d.rnumlines_l[h]=0b&&(k=b);d.ATH.cb_l[h]=k;k=-20+20*u[h]/10;6k&&(k=-15);k-=8;d.minval_l[h]=Math.pow(10,k/10)*d.numlines_l[h]}d.npart_s=e(d.numlines_s,d.bo_s,d.bm_s,u,y,d.mld_s,d.PSY.bo_s_weight,x,f.BLKSIZE_s,d.scalefac_band.s,f.BLKSIZE_s/384,f.SBMAX_s);for(h=v=0;h=p&&(c=r*(u[h]-p)/(24-p)+A*(24-u[h])/(24-p));w[h]=Math.pow(10,c/10);k=sb.MAX_VALUE;for(c=0;cb&&(k=b);d.ATH.cb_s[h]=k;k=-7+7*u[h]/12;12u[h]&&(k*=1+2.3*Math.log(1-k));-15>k&&(k=-15);k-=8;d.minval_s[h]=Math.pow(10,k/10)*d.numlines_s[h]}d.s3_ss=l(d.s3ind_s,d.npart_s,u,y,w,g);m=Math.pow(10,.5625);n=Math.pow(10,1.5);z=Math.pow(10,1.5);t.init_fft(d);d.decay=Math.exp(-2.302585092994046/(.01*x/192));h=3.5;0!=(a.exp_nspsytune&2)&&(h=1);0 +d.npart_l-1&&(d.s3ind[g][1]=d.npart_l-1);d.ATH.decay=Math.pow(10,576*d.mode_gr/x*-1.2);d.ATH.adjust=.01;d.ATH.adjustLimit=1;if(-1!=a.ATHtype){v=a.out_samplerate/f.BLKSIZE;for(h=b=g=0;h=a?1:Math.cos(Math.PI/2*a)}function C(a,b){switch(a){case 44100:return b.version=1,0;case 48E3:return b.version=1;case 32E3:return b.version=1,2;case 22050:return b.version=0;case 24E3:return b.version=0,1;case 16E3:return b.version=0,2;case 11025:return b.version=0;case 12E3:return b.version=0,1;case 8E3:return b.version=0,2;default:return b.version= +0,-1}}function u(a,b,c){16E3>c&&(b=2);c=v.bitrate_table[b][1];for(var d=2;14>=d;d++)0c&&(b=2);for(c=0;14>=c;c++)if(0y)return y;r+=y;p+=y;u[0]=g;u[1]=k;if(da.NEQ(d.scale,0)&&da.NEQ(d.scale,1))for(y= +0;yD.resample_ratio|| +1.0001ia.BPC&&(ra=ia.BPC);var pa=1E-4>Math.abs(Y.resample_ratio-Math.floor(.5+Y.resample_ratio))?1:0;var qa=1/Y.resample_ratio;1za&&(za=0);1Math.abs(Ka)?Ua/Math.PI:za*Math.sin(ma*Ua*Ka)/(Math.PI*ma*Ka))}for(F=0;F<=ma;F++)Y.blackfilt[ha][F]/=xa}Y.fill_buffer_resample_init=1}xa=Y.inbuf_old[ka];for(qa=0;qa=ba)break;T=F-Y.itime[ka]-(ha+ma%2*.5);T=0|Math.floor(2*T*ra+ra+.5);for(F=Fa=0;F<=ma;++F)L=F+ha-ma/2,Fa+=(0>L?xa[pa+L]:U[Z+L])*Y.blackfilt[T][F];J[S+qa]=Fa}fa.num_used=Math.min(ba,ma+ha-ma/2);Y.itime[ka]+=fa.num_used-qa*Y.resample_ratio;if(fa.num_used>=pa)for(F=0;Fh.mf_samples_to_encode&&(h.mf_samples_to_encode=f.ENCDELAY+f.POSTDELAY);h.mf_samples_to_encode+=y;if(h.mf_size>=g){x=t-p;0==t&&(x=0);y=d;x=e.enc.lame_encode_mp3_frame(y,A[0],A[1],n,r,x);y.frameNum++;y=x;if(0>y)return y; +r+=y;p+=y;h.mf_size-=d.framesize;h.mf_samples_to_encode-=d.framesize;for(x=0;xf;f++)if(Math.max(a,b[f+ +1])!=a){c=b[f+1];d=f+1;e=b[f];h=f;break}return c-a>a-e?h:d};this.lame_init_params=function(a){var b=a.internal_flags;b.Class_ID=0;null==b.ATH&&(b.ATH=new zc);null==b.PSY&&(b.PSY=new x);null==b.rgdata&&(b.rgdata=new Cc);b.channels_in=a.num_channels;1==b.channels_in&&(a.mode=ka.MONO);b.channels_out=a.mode==ka.MONO?1:2;b.mode_ext=f.MPG_MD_MS_LR;a.mode==ka.MONO&&(a.force_ms=!1);a.VBR==J.vbr_off&&128!=a.VBR_mean_bitrate_kbps&&0==a.brate&&(a.brate=a.VBR_mean_bitrate_kbps);a.VBR!=J.vbr_off&&a.VBR!=J.vbr_mtrh&& +a.VBR!=J.vbr_mt&&(a.free_format=!1);a.VBR==J.vbr_off&&0==a.brate&&da.EQ(a.compression_ratio,0)&&(a.compression_ratio=11.025);a.VBR==J.vbr_off&&0a.out_samplerate?(a.VBR_mean_bitrate_kbps=Math.max(a.VBR_mean_bitrate_kbps, +8),a.VBR_mean_bitrate_kbps=Math.min(a.VBR_mean_bitrate_kbps,64)):32E3>a.out_samplerate?(a.VBR_mean_bitrate_kbps=Math.max(a.VBR_mean_bitrate_kbps,8),a.VBR_mean_bitrate_kbps=Math.min(a.VBR_mean_bitrate_kbps,160)):(a.VBR_mean_bitrate_kbps=Math.max(a.VBR_mean_bitrate_kbps,32),a.VBR_mean_bitrate_kbps=Math.min(a.VBR_mean_bitrate_kbps,320)));if(0==a.lowpassfreq){switch(a.VBR){case J.vbr_off:var c=new k;d(c,a.brate);c=c.lowerlimit;break;case J.vbr_abr:c=new k;d(c,a.VBR_mean_bitrate_kbps);c=c.lowerlimit;break; +case J.vbr_rh:var e=[19500,19E3,18600,18E3,17500,16E3,15600,14900,12500,1E4,3950];if(0<=a.VBR_q&&9>=a.VBR_q){c=e[a.VBR_q];var h=e[a.VBR_q+1];e=a.VBR_q_frac;c=linear_int(c,h,e)}else c=19500;break;default:e=[19500,19E3,18500,18E3,17500,16500,15500,14500,12500,9500,3950],0<=a.VBR_q&&9>=a.VBR_q?(c=e[a.VBR_q],h=e[a.VBR_q+1],e=a.VBR_q_frac,c=linear_int(c,h,e)):c=19500}a.mode!=ka.MONO||a.VBR!=J.vbr_off&&a.VBR!=J.vbr_abr||(c*=1.5);a.lowpassfreq=c|0}0==a.out_samplerate&&(2*a.lowpassfreq>a.in_samplerate&&(a.lowpassfreq= +a.in_samplerate/2),c=a.lowpassfreq|0,e=a.in_samplerate,h=44100,48E3<=e?h=48E3:44100<=e?h=44100:32E3<=e?h=32E3:24E3<=e?h=24E3:22050<=e?h=22050:16E3<=e?h=16E3:12E3<=e?h=12E3:11025<=e?h=11025:8E3<=e&&(h=8E3),-1==c?c=h:(15960>=c&&(h=44100),15250>=c&&(h=32E3),11220>=c&&(h=24E3),9970>=c&&(h=22050),7230>=c&&(h=16E3),5420>=c&&(h=12E3),4510>=c&&(h=11025),3970>=c&&(h=8E3),c=e=a.out_samplerate?1:2;a.framesize=576*b.mode_gr;a.encoder_delay=f.ENCDELAY;b.resample_ratio=a.in_samplerate/a.out_samplerate;switch(a.VBR){case J.vbr_mt:case J.vbr_rh:case J.vbr_mtrh:a.compression_ratio=[5.7,6.5,7.3,8.2,10,11.9,13,14,15,16.5][a.VBR_q];break;case J.vbr_abr:a.compression_ratio=16*a.out_samplerate* +b.channels_out/(1E3*a.VBR_mean_bitrate_kbps);break;default:a.compression_ratio=16*a.out_samplerate*b.channels_out/(1E3*a.brate)}a.mode==ka.NOT_SET&&(a.mode=ka.JOINT_STEREO);0b.lowpass1&&(b.lowpass1=0)):b.lowpass1=2*a.lowpassfreq,b.lowpass1/=a.out_samplerate,b.lowpass2/=a.out_samplerate):(b.lowpass1=0,b.lowpass2=0);c=a.internal_flags;var r=32,w=-1;if(0=e;e++)h=e/31,h>=c.lowpass2&&(r=Math.min(r,e)),c.lowpass1=e;e++)h=e/31,h<=c.highpass1&&(w=Math.max(w,e)),c.highpass1e;e++)h=e/31,w=c.highpass2>c.highpass1?K((c.highpass2-h)/(c.highpass2-c.highpass1+1E-20)):1,h=c.lowpass2>c.lowpass1?K((h-c.lowpass1)/(c.lowpass2-c.lowpass1+1E-20)):1,c.amp_filter[e]=w*h;b.samplerate_index=C(a.out_samplerate,a);if(0>b.samplerate_index)return a.internal_flags=null,-1;if(a.VBR==J.vbr_off)if(a.free_format)b.bitrate_index= +0;else{if(a.brate=u(a.brate,a.version,a.out_samplerate),b.bitrate_index=U(a.brate,a.version,a.out_samplerate),0>=b.bitrate_index)return a.internal_flags=null,-1}else b.bitrate_index=1;a.analysis&&(a.bWriteVbrTag=!1);null!=b.pinfo&&(a.bWriteVbrTag=!1);q.init_bit_stream_w(b);c=b.samplerate_index+3*a.version+6*(16E3>a.out_samplerate?1:0);for(e=0;ec;c++)b.nsPsy.pefirbuf[c]=700*b.mode_gr*b.channels_out;-1==a.ATHtype&&(a.ATHtype=4);switch(a.VBR){case J.vbr_mt:a.VBR=J.vbr_mtrh;case J.vbr_mtrh:null==a.useTemporal&&(a.useTemporal=!1);g.apply_preset(a,500-10*a.VBR_q,0);0>a.quality&&(a.quality=LAME_DEFAULT_QUALITY);5>a.quality&&(a.quality=0);5a.quality&&(a.quality=LAME_DEFAULT_QUALITY);b.iteration_loop=new VBROldIterationLoop(D);break;default:b.sfb21_extra=!1,0>a.quality&&(a.quality= +LAME_DEFAULT_QUALITY),c=a.VBR,c==J.vbr_off&&(a.VBR_mean_bitrate_kbps=a.brate),g.apply_preset(a,a.VBR_mean_bitrate_kbps,0),a.VBR=c,b.PSY.mask_adjust=a.maskingadjust,b.PSY.mask_adjust_short=a.maskingadjust_short,b.iteration_loop=c==J.vbr_off?new Bc(D):new ABRIterationLoop(D)}if(a.VBR!=J.vbr_off){b.VBR_min_bitrate=1;b.VBR_max_bitrate=14;16E3>a.out_samplerate&&(b.VBR_max_bitrate=8);if(0!=a.VBR_min_bitrate_kbps&&(a.VBR_min_bitrate_kbps=u(a.VBR_min_bitrate_kbps,a.version,a.out_samplerate),b.VBR_min_bitrate= +U(a.VBR_min_bitrate_kbps,a.version,a.out_samplerate),0>b.VBR_min_bitrate)||0!=a.VBR_max_bitrate_kbps&&(a.VBR_max_bitrate_kbps=u(a.VBR_max_bitrate_kbps,a.version,a.out_samplerate),b.VBR_max_bitrate=U(a.VBR_max_bitrate_kbps,a.version,a.out_samplerate),0>b.VBR_max_bitrate))return-1;a.VBR_min_bitrate_kbps=v.bitrate_table[a.version][b.VBR_min_bitrate];a.VBR_max_bitrate_kbps=v.bitrate_table[a.version][b.VBR_max_bitrate];a.VBR_mean_bitrate_kbps=Math.min(v.bitrate_table[a.version][b.VBR_max_bitrate],a.VBR_mean_bitrate_kbps); +a.VBR_mean_bitrate_kbps=Math.max(v.bitrate_table[a.version][b.VBR_min_bitrate],a.VBR_mean_bitrate_kbps)}a.tune&&(b.PSY.mask_adjust+=a.tune_value_a,b.PSY.mask_adjust_short+=a.tune_value_a);c=a.internal_flags;switch(a.quality){default:case 9:c.psymodel=0;c.noise_shaping=0;c.noise_shaping_amp=0;c.noise_shaping_stop=0;c.use_best_huffman=0;c.full_outer_loop=0;break;case 8:a.quality=7;case 7:c.psymodel=1;c.noise_shaping=0;c.noise_shaping_amp=0;c.noise_shaping_stop=0;c.use_best_huffman=0;c.full_outer_loop= +0;break;case 6:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);c.noise_shaping_amp=0;c.noise_shaping_stop=0;-1==c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=0;c.full_outer_loop=0;break;case 5:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);c.noise_shaping_amp=0;c.noise_shaping_stop=0;-1==c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=0;c.full_outer_loop=0;break;case 4:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);c.noise_shaping_amp=0;c.noise_shaping_stop=0;-1== +c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=1;c.full_outer_loop=0;break;case 3:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);c.noise_shaping_amp=1;c.noise_shaping_stop=1;-1==c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=1;c.full_outer_loop=0;break;case 2:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);0==c.substep_shaping&&(c.substep_shaping=2);c.noise_shaping_amp=1;c.noise_shaping_stop=1;-1==c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=1;c.full_outer_loop= +0;break;case 1:c.psymodel=1;0==c.noise_shaping&&(c.noise_shaping=1);0==c.substep_shaping&&(c.substep_shaping=2);c.noise_shaping_amp=2;c.noise_shaping_stop=1;-1==c.subblock_gain&&(c.subblock_gain=1);c.use_best_huffman=1;c.full_outer_loop=0;break;case 0:c.psymodel=1,0==c.noise_shaping&&(c.noise_shaping=1),0==c.substep_shaping&&(c.substep_shaping=2),c.noise_shaping_amp=2,c.noise_shaping_stop=1,-1==c.subblock_gain&&(c.subblock_gain=1),c.use_best_huffman=1,c.full_outer_loop=0}b.ATH.useAdjust=0>a.athaa_type? +3:a.athaa_type;b.ATH.aaSensitivityP=Math.pow(10,a.athaa_sensitivity/-10);null==a.short_blocks&&(a.short_blocks=pa.short_block_allowed);a.short_blocks!=pa.short_block_allowed||a.mode!=ka.JOINT_STEREO&&a.mode!=ka.STEREO||(a.short_blocks=pa.short_block_coupled);0>a.quant_comp&&(a.quant_comp=1);0>a.quant_comp_short&&(a.quant_comp_short=0);0>a.msfix&&(a.msfix=0);a.exp_nspsytune|=1;0>a.internal_flags.nsPsy.attackthre&&(a.internal_flags.nsPsy.attackthre=$b.NSATTACKTHRE);0>a.internal_flags.nsPsy.attackthre_s&& +(a.internal_flags.nsPsy.attackthre_s=$b.NSATTACKTHRE_S);0>a.scale&&(a.scale=1);0>a.ATHtype&&(a.ATHtype=4);0>a.ATHcurve&&(a.ATHcurve=4);0>a.athaa_loudapprox&&(a.athaa_loudapprox=2);0>a.interChRatio&&(a.interChRatio=0);null==a.useTemporal&&(a.useTemporal=!0);b.slot_lag=b.frac_SpF=0;a.VBR==J.vbr_off&&(b.slot_lag=b.frac_SpF=72E3*(a.version+1)*a.brate%a.out_samplerate|0);t.iteration_init(a);m.psymodel_init(a);return 0};this.lame_encode_flush=function(a,b,d,e){var g=a.internal_flags,h=fc([2,1152]),k=0, +l=g.mf_samples_to_encode-f.POSTDELAY,m=c(a);if(1>g.mf_samples_to_encode)return 0;var n=0;a.in_samplerate!=a.out_samplerate&&(l+=16*a.out_samplerate/a.in_samplerate);var p=a.framesize-l%a.framesize;576>p&&(p+=a.framesize);a.encoder_padding=p;for(p=(l+p)/a.framesize;0r&&(r=1);k=e-n;0==e&&(k=0);k=this.lame_encode_buffer(a,h[0],h[1],r,b,d,k);d+=k;n+=k;p-=l!=a.frameNum?1:0}g.mf_samples_to_encode=0;if(0> +k)return k;k=e-n;0==e&&(k=0);q.flush_bitstream(a);k=q.copy_buffer(g,b,d,k,1);if(0>k)return k;d+=k;n+=k;k=e-n;0==e&&(k=0);if(a.write_id3tag_automatic){z.id3tag_write_v1(a);k=q.copy_buffer(g,b,d,k,0);if(0>k)return k;n+=k}return n};this.lame_encode_buffer=function(a,b,c,d,e,f,g){var h=a.internal_flags,k=[null,null];if(4294479419!=h.Class_ID)return-3;if(0==d)return 0;if(null==h.in_buffer_0||h.in_buffer_nsamplesMath.abs(k)?Math.abs(f-k)<=1E-6*Math.abs(f):Math.abs(f-k)<=1E-6*Math.abs(k)};da.NEQ=function(f,k){return!da.EQ(f,k)};var v={t1HB:[1,1,1,0],t2HB:[1,2,1,3,1,1,3,2,0],t3HB:[3,2,1,1,1,1,3,2,0],t5HB:[1,2,6,5,3,1,4,4,7,5,7,1,6,1,1,0],t6HB:[7,3,5,1,6,2,3,2,5,4,4,1,3,3,2,0],t7HB:[1,2,10,19,16,10,3,3,7,10,5,3,11,4,13,17,8,4,12,11,18,15,11,2,7,6,9,14,3,1,6,4,5,3,2,0],t8HB:[3,4,6,18,12,5,5,1,2,16,9,3,7,3,5,14,7,3,19,17,15,13, +10,4,13,5,8,11,5,1,12,4,4,1,1,0],t9HB:[7,5,9,14,15,7,6,4,5,5,6,7,7,6,8,8,8,5,15,6,9,10,5,1,11,7,9,6,4,1,14,4,6,2,6,0],t10HB:[1,2,10,23,35,30,12,17,3,3,8,12,18,21,12,7,11,9,15,21,32,40,19,6,14,13,22,34,46,23,18,7,20,19,33,47,27,22,9,3,31,22,41,26,21,20,5,3,14,13,10,11,16,6,5,1,9,8,7,8,4,4,2,0],t11HB:[3,4,10,24,34,33,21,15,5,3,4,10,32,17,11,10,11,7,13,18,30,31,20,5,25,11,19,59,27,18,12,5,35,33,31,58,30,16,7,5,28,26,32,19,17,15,8,14,14,12,9,13,14,9,4,1,11,4,6,6,6,3,2,0],t12HB:[9,6,16,33,41,39,38,26, +7,5,6,9,23,16,26,11,17,7,11,14,21,30,10,7,17,10,15,12,18,28,14,5,32,13,22,19,18,16,9,5,40,17,31,29,17,13,4,2,27,12,11,15,10,7,4,1,27,12,8,12,6,3,1,0],t13HB:[1,5,14,21,34,51,46,71,42,52,68,52,67,44,43,19,3,4,12,19,31,26,44,33,31,24,32,24,31,35,22,14,15,13,23,36,59,49,77,65,29,40,30,40,27,33,42,16,22,20,37,61,56,79,73,64,43,76,56,37,26,31,25,14,35,16,60,57,97,75,114,91,54,73,55,41,48,53,23,24,58,27,50,96,76,70,93,84,77,58,79,29,74,49,41,17,47,45,78,74,115,94,90,79,69,83,71,50,59,38,36,15,72,34,56,95, +92,85,91,90,86,73,77,65,51,44,43,42,43,20,30,44,55,78,72,87,78,61,46,54,37,30,20,16,53,25,41,37,44,59,54,81,66,76,57,54,37,18,39,11,35,33,31,57,42,82,72,80,47,58,55,21,22,26,38,22,53,25,23,38,70,60,51,36,55,26,34,23,27,14,9,7,34,32,28,39,49,75,30,52,48,40,52,28,18,17,9,5,45,21,34,64,56,50,49,45,31,19,12,15,10,7,6,3,48,23,20,39,36,35,53,21,16,23,13,10,6,1,4,2,16,15,17,27,25,20,29,11,17,12,16,8,1,1,0,1],t15HB:[7,12,18,53,47,76,124,108,89,123,108,119,107,81,122,63,13,5,16,27,46,36,61,51,42,70,52,83, +65,41,59,36,19,17,15,24,41,34,59,48,40,64,50,78,62,80,56,33,29,28,25,43,39,63,55,93,76,59,93,72,54,75,50,29,52,22,42,40,67,57,95,79,72,57,89,69,49,66,46,27,77,37,35,66,58,52,91,74,62,48,79,63,90,62,40,38,125,32,60,56,50,92,78,65,55,87,71,51,73,51,70,30,109,53,49,94,88,75,66,122,91,73,56,42,64,44,21,25,90,43,41,77,73,63,56,92,77,66,47,67,48,53,36,20,71,34,67,60,58,49,88,76,67,106,71,54,38,39,23,15,109,53,51,47,90,82,58,57,48,72,57,41,23,27,62,9,86,42,40,37,70,64,52,43,70,55,42,25,29,18,11,11,118,68, +30,55,50,46,74,65,49,39,24,16,22,13,14,7,91,44,39,38,34,63,52,45,31,52,28,19,14,8,9,3,123,60,58,53,47,43,32,22,37,24,17,12,15,10,2,1,71,37,34,30,28,20,17,26,21,16,10,6,8,6,2,0],t16HB:[1,5,14,44,74,63,110,93,172,149,138,242,225,195,376,17,3,4,12,20,35,62,53,47,83,75,68,119,201,107,207,9,15,13,23,38,67,58,103,90,161,72,127,117,110,209,206,16,45,21,39,69,64,114,99,87,158,140,252,212,199,387,365,26,75,36,68,65,115,101,179,164,155,264,246,226,395,382,362,9,66,30,59,56,102,185,173,265,142,253,232,400,388, +378,445,16,111,54,52,100,184,178,160,133,257,244,228,217,385,366,715,10,98,48,91,88,165,157,148,261,248,407,397,372,380,889,884,8,85,84,81,159,156,143,260,249,427,401,392,383,727,713,708,7,154,76,73,141,131,256,245,426,406,394,384,735,359,710,352,11,139,129,67,125,247,233,229,219,393,743,737,720,885,882,439,4,243,120,118,115,227,223,396,746,742,736,721,712,706,223,436,6,202,224,222,218,216,389,386,381,364,888,443,707,440,437,1728,4,747,211,210,208,370,379,734,723,714,1735,883,877,876,3459,865,2,377, +369,102,187,726,722,358,711,709,866,1734,871,3458,870,434,0,12,10,7,11,10,17,11,9,13,12,10,7,5,3,1,3],t24HB:[15,13,46,80,146,262,248,434,426,669,653,649,621,517,1032,88,14,12,21,38,71,130,122,216,209,198,327,345,319,297,279,42,47,22,41,74,68,128,120,221,207,194,182,340,315,295,541,18,81,39,75,70,134,125,116,220,204,190,178,325,311,293,271,16,147,72,69,135,127,118,112,210,200,188,352,323,306,285,540,14,263,66,129,126,119,114,214,202,192,180,341,317,301,281,262,12,249,123,121,117,113,215,206,195,185, +347,330,308,291,272,520,10,435,115,111,109,211,203,196,187,353,332,313,298,283,531,381,17,427,212,208,205,201,193,186,177,169,320,303,286,268,514,377,16,335,199,197,191,189,181,174,333,321,305,289,275,521,379,371,11,668,184,183,179,175,344,331,314,304,290,277,530,383,373,366,10,652,346,171,168,164,318,309,299,287,276,263,513,375,368,362,6,648,322,316,312,307,302,292,284,269,261,512,376,370,364,359,4,620,300,296,294,288,282,273,266,515,380,374,369,365,361,357,2,1033,280,278,274,267,264,259,382,378, +372,367,363,360,358,356,0,43,20,19,17,15,13,11,9,7,6,4,7,5,3,1,3],t32HB:[1,10,8,20,12,20,16,32,14,12,24,0,28,16,24,16],t33HB:[15,28,26,48,22,40,36,64,14,24,20,32,12,16,8,0],t1l:[1,4,3,5],t2l:[1,4,7,4,5,7,6,7,8],t3l:[2,3,7,4,4,7,6,7,8],t5l:[1,4,7,8,4,5,8,9,7,8,9,10,8,8,9,10],t6l:[3,4,6,8,4,4,6,7,5,6,7,8,7,7,8,9],t7l:[1,4,7,9,9,10,4,6,8,9,9,10,7,7,9,10,10,11,8,9,10,11,11,11,8,9,10,11,11,12,9,10,11,12,12,12],t8l:[2,4,7,9,9,10,4,4,6,10,10,10,7,6,8,10,10,11,9,10,10,11,11,12,9,9,10,11,12,12,10,10,11,11, +13,13],t9l:[3,4,6,7,9,10,4,5,6,7,8,10,5,6,7,8,9,10,7,7,8,9,9,10,8,8,9,9,10,11,9,9,10,10,11,11],t10l:[1,4,7,9,10,10,10,11,4,6,8,9,10,11,10,10,7,8,9,10,11,12,11,11,8,9,10,11,12,12,11,12,9,10,11,12,12,12,12,12,10,11,12,12,13,13,12,13,9,10,11,12,12,12,13,13,10,10,11,12,12,13,13,13],t11l:[2,4,6,8,9,10,9,10,4,5,6,8,10,10,9,10,6,7,8,9,10,11,10,10,8,8,9,11,10,12,10,11,9,10,10,11,11,12,11,12,9,10,11,12,12,13,12,13,9,9,9,10,11,12,12,12,9,9,10,11,12,12,12,12],t12l:[4,4,6,8,9,10,10,10,4,5,6,7,9,9,10,10,6,6,7, +8,9,10,9,10,7,7,8,8,9,10,10,10,8,8,9,9,10,10,10,11,9,9,10,10,10,11,10,11,9,9,9,10,10,11,11,12,10,10,10,11,11,11,11,12],t13l:[1,5,7,8,9,10,10,11,10,11,12,12,13,13,14,14,4,6,8,9,10,10,11,11,11,11,12,12,13,14,14,14,7,8,9,10,11,11,12,12,11,12,12,13,13,14,15,15,8,9,10,11,11,12,12,12,12,13,13,13,13,14,15,15,9,9,11,11,12,12,13,13,12,13,13,14,14,15,15,16,10,10,11,12,12,12,13,13,13,13,14,13,15,15,16,16,10,11,12,12,13,13,13,13,13,14,14,14,15,15,16,16,11,11,12,13,13,13,14,14,14,14,15,15,15,16,18,18,10,10,11, +12,12,13,13,14,14,14,14,15,15,16,17,17,11,11,12,12,13,13,13,15,14,15,15,16,16,16,18,17,11,12,12,13,13,14,14,15,14,15,16,15,16,17,18,19,12,12,12,13,14,14,14,14,15,15,15,16,17,17,17,18,12,13,13,14,14,15,14,15,16,16,17,17,17,18,18,18,13,13,14,15,15,15,16,16,16,16,16,17,18,17,18,18,14,14,14,15,15,15,17,16,16,19,17,17,17,19,18,18,13,14,15,16,16,16,17,16,17,17,18,18,21,20,21,18],t15l:[3,5,6,8,8,9,10,10,10,11,11,12,12,12,13,14,5,5,7,8,9,9,10,10,10,11,11,12,12,12,13,13,6,7,7,8,9,9,10,10,10,11,11,12,12,13, +13,13,7,8,8,9,9,10,10,11,11,11,12,12,12,13,13,13,8,8,9,9,10,10,11,11,11,11,12,12,12,13,13,13,9,9,9,10,10,10,11,11,11,11,12,12,13,13,13,14,10,9,10,10,10,11,11,11,11,12,12,12,13,13,14,14,10,10,10,11,11,11,11,12,12,12,12,12,13,13,13,14,10,10,10,11,11,11,11,12,12,12,12,13,13,14,14,14,10,10,11,11,11,11,12,12,12,13,13,13,13,14,14,14,11,11,11,11,12,12,12,12,12,13,13,13,13,14,15,14,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,15,12,12,11,12,12,12,13,13,13,13,13,13,14,14,15,15,12,12,12,12,12,13,13,13,13,14, +14,14,14,14,15,15,13,13,13,13,13,13,13,13,14,14,14,14,15,15,14,15,13,13,13,13,13,13,13,14,14,14,14,14,15,15,15,15],t16_5l:[1,5,7,9,10,10,11,11,12,12,12,13,13,13,14,11,4,6,8,9,10,11,11,11,12,12,12,13,14,13,14,11,7,8,9,10,11,11,12,12,13,12,13,13,13,14,14,12,9,9,10,11,11,12,12,12,13,13,14,14,14,15,15,13,10,10,11,11,12,12,13,13,13,14,14,14,15,15,15,12,10,10,11,11,12,13,13,14,13,14,14,15,15,15,16,13,11,11,11,12,13,13,13,13,14,14,14,14,15,15,16,13,11,11,12,12,13,13,13,14,14,15,15,15,15,17,17,13,11,12,12, +13,13,13,14,14,15,15,15,15,16,16,16,13,12,12,12,13,13,14,14,15,15,15,15,16,15,16,15,14,12,13,12,13,14,14,14,14,15,16,16,16,17,17,16,13,13,13,13,13,14,14,15,16,16,16,16,16,16,15,16,14,13,14,14,14,14,15,15,15,15,17,16,16,16,16,18,14,15,14,14,14,15,15,16,16,16,18,17,17,17,19,17,14,14,15,13,14,16,16,15,16,16,17,18,17,19,17,16,14,11,11,11,12,12,13,13,13,14,14,14,14,14,14,14,12],t16l:[1,5,7,9,10,10,11,11,12,12,12,13,13,13,14,10,4,6,8,9,10,11,11,11,12,12,12,13,14,13,14,10,7,8,9,10,11,11,12,12,13,12,13,13, +13,14,14,11,9,9,10,11,11,12,12,12,13,13,14,14,14,15,15,12,10,10,11,11,12,12,13,13,13,14,14,14,15,15,15,11,10,10,11,11,12,13,13,14,13,14,14,15,15,15,16,12,11,11,11,12,13,13,13,13,14,14,14,14,15,15,16,12,11,11,12,12,13,13,13,14,14,15,15,15,15,17,17,12,11,12,12,13,13,13,14,14,15,15,15,15,16,16,16,12,12,12,12,13,13,14,14,15,15,15,15,16,15,16,15,13,12,13,12,13,14,14,14,14,15,16,16,16,17,17,16,12,13,13,13,13,14,14,15,16,16,16,16,16,16,15,16,13,13,14,14,14,14,15,15,15,15,17,16,16,16,16,18,13,15,14,14,14, +15,15,16,16,16,18,17,17,17,19,17,13,14,15,13,14,16,16,15,16,16,17,18,17,19,17,16,13,10,10,10,11,11,12,12,12,13,13,13,13,13,13,13,10],t24l:[4,5,7,8,9,10,10,11,11,12,12,12,12,12,13,10,5,6,7,8,9,10,10,11,11,11,12,12,12,12,12,10,7,7,8,9,9,10,10,11,11,11,11,12,12,12,13,9,8,8,9,9,10,10,10,11,11,11,11,12,12,12,12,9,9,9,9,10,10,10,10,11,11,11,12,12,12,12,13,9,10,9,10,10,10,10,11,11,11,11,12,12,12,12,12,9,10,10,10,10,10,11,11,11,11,12,12,12,12,12,13,9,11,10,10,10,11,11,11,11,12,12,12,12,12,13,13,10,11,11, +11,11,11,11,11,11,11,12,12,12,12,13,13,10,11,11,11,11,11,11,11,12,12,12,12,12,13,13,13,10,12,11,11,11,11,12,12,12,12,12,12,13,13,13,13,10,12,12,11,11,11,12,12,12,12,12,12,13,13,13,13,10,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,10,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,10,13,12,12,12,12,12,12,13,13,13,13,13,13,13,13,10,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,6],t32l:[1,5,5,7,5,8,7,9,5,7,7,9,7,9,9,10],t33l:[4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8]};v.ht=[new ba(0,0,null,null),new ba(2,0,v.t1HB,v.t1l),new ba(3, +0,v.t2HB,v.t2l),new ba(3,0,v.t3HB,v.t3l),new ba(0,0,null,null),new ba(4,0,v.t5HB,v.t5l),new ba(4,0,v.t6HB,v.t6l),new ba(6,0,v.t7HB,v.t7l),new ba(6,0,v.t8HB,v.t8l),new ba(6,0,v.t9HB,v.t9l),new ba(8,0,v.t10HB,v.t10l),new ba(8,0,v.t11HB,v.t11l),new ba(8,0,v.t12HB,v.t12l),new ba(16,0,v.t13HB,v.t13l),new ba(0,0,null,v.t16_5l),new ba(16,0,v.t15HB,v.t15l),new ba(1,1,v.t16HB,v.t16l),new ba(2,3,v.t16HB,v.t16l),new ba(3,7,v.t16HB,v.t16l),new ba(4,15,v.t16HB,v.t16l),new ba(6,63,v.t16HB,v.t16l),new ba(8,255, +v.t16HB,v.t16l),new ba(10,1023,v.t16HB,v.t16l),new ba(13,8191,v.t16HB,v.t16l),new ba(4,15,v.t24HB,v.t24l),new ba(5,31,v.t24HB,v.t24l),new ba(6,63,v.t24HB,v.t24l),new ba(7,127,v.t24HB,v.t24l),new ba(8,255,v.t24HB,v.t24l),new ba(9,511,v.t24HB,v.t24l),new ba(11,2047,v.t24HB,v.t24l),new ba(13,8191,v.t24HB,v.t24l),new ba(0,0,v.t32HB,v.t32l),new ba(0,0,v.t33HB,v.t33l)];v.largetbl=[65540,327685,458759,589832,655369,655370,720906,720907,786443,786444,786444,851980,851980,851980,917517,655370,262149,393222, +524295,589832,655369,720906,720906,720907,786443,786443,786444,851980,917516,851980,917516,655370,458759,524295,589832,655369,720905,720906,786442,786443,851979,786443,851979,851980,851980,917516,917517,720905,589832,589832,655369,720905,720906,786442,786442,786443,851979,851979,917515,917516,917516,983052,983052,786441,655369,655369,720905,720906,786442,786442,851978,851979,851979,917515,917516,917516,983052,983052,983053,720905,655370,655369,720906,720906,786442,851978,851979,917515,851979,917515, +917516,983052,983052,983052,1048588,786441,720906,720906,720906,786442,851978,851979,851979,851979,917515,917516,917516,917516,983052,983052,1048589,786441,720907,720906,786442,786442,851979,851979,851979,917515,917516,983052,983052,983052,983052,1114125,1114125,786442,720907,786443,786443,851979,851979,851979,917515,917515,983051,983052,983052,983052,1048588,1048589,1048589,786442,786443,786443,786443,851979,851979,917515,917515,983052,983052,983052,983052,1048588,983053,1048589,983053,851978,786444, +851979,786443,851979,917515,917516,917516,917516,983052,1048588,1048588,1048589,1114125,1114125,1048589,786442,851980,851980,851979,851979,917515,917516,983052,1048588,1048588,1048588,1048588,1048589,1048589,983053,1048589,851978,851980,917516,917516,917516,917516,983052,983052,983052,983052,1114124,1048589,1048589,1048589,1048589,1179661,851978,983052,917516,917516,917516,983052,983052,1048588,1048588,1048589,1179661,1114125,1114125,1114125,1245197,1114125,851978,917517,983052,851980,917516,1048588, +1048588,983052,1048589,1048589,1114125,1179661,1114125,1245197,1114125,1048589,851978,655369,655369,655369,720905,720905,786441,786441,786441,851977,851977,851977,851978,851978,851978,851978,655366];v.table23=[65538,262147,458759,262148,327684,458759,393222,458759,524296];v.table56=[65539,262148,458758,524296,262148,327684,524294,589831,458757,524294,589831,655368,524295,524295,589832,655369];v.bitrate_table=[[0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,-1],[0,32,40,48,56,64,80,96,112,128,160, +192,224,256,320,-1],[0,8,16,24,32,40,48,56,64,-1,-1,-1,-1,-1,-1,-1]];v.samplerate_table=[[22050,24E3,16E3,-1],[44100,48E3,32E3,-1],[11025,12E3,8E3,-1]];v.scfsi_band=[0,6,11,16,21];Y.Q_MAX=257;Y.Q_MAX2=116;Y.LARGE_BITS=1E5;Y.IXMAX_VAL=8206;var ra={};ra.SFBMAX=3*f.SBMAX_s;f.ENCDELAY=576;f.POSTDELAY=1152;f.MDCTDELAY=48;f.FFTOFFSET=224+f.MDCTDELAY;f.DECDELAY=528;f.SBLIMIT=32;f.CBANDS=64;f.SBPSY_l=21;f.SBPSY_s=12;f.SBMAX_l=22;f.SBMAX_s=13;f.PSFB21=6;f.PSFB12=6;f.BLKSIZE=1024;f.HBLKSIZE=f.BLKSIZE/2+1;f.BLKSIZE_s= +256;f.HBLKSIZE_s=f.BLKSIZE_s/2+1;f.NORM_TYPE=0;f.START_TYPE=1;f.SHORT_TYPE=2;f.STOP_TYPE=3;f.MPG_MD_LR_LR=0;f.MPG_MD_LR_I=1;f.MPG_MD_MS_LR=2;f.MPG_MD_MS_I=3;f.fircoef=[-.1039435,-.1892065,-.0432472*5,-.155915,3.898045E-17,.0467745*5,.50455,.756825,.187098*5];ia.MFSIZE=3456+f.ENCDELAY-f.MDCTDELAY;ia.MAX_HEADER_BUF=256;ia.MAX_BITS_PER_CHANNEL=4095;ia.MAX_BITS_PER_GRANULE=7680;ia.BPC=320;xa.RIFF=zb("RIFF");xa.WAVE=zb("WAVE");xa.fmt_=zb("fmt ");xa.data=zb("data");xa.readHeader=function(f){var k=new xa, +r=f.getUint32(0,!1);if(xa.RIFF==r&&(f.getUint32(4,!0),xa.WAVE==f.getUint32(8,!1)&&xa.fmt_==f.getUint32(12,!1))){var v=f.getUint32(16,!0),x=20;switch(v){case 16:case 18:k.channels=f.getUint16(x+2,!0);k.sampleRate=f.getUint32(x+4,!0);break;default:throw"extended fmt chunk not implemented";}for(var x=x+v,v=xa.data,u=0;v!=r;){r=f.getUint32(x,!1);u=f.getUint32(x+4,!0);if(v==r)break;x+=u+8}k.dataLen=u;k.dataOffset=x+8;return k}};ra.SFBMAX=3*f.SBMAX_s;lamejs.Mp3Encoder=function(f,k,r){3!=arguments.length&& +(console.error("WARN: Mp3Encoder(channels, samplerate, kbps) not specified"),f=1,k=44100,r=128);var v=new W,x=new Kc,u=new ca,G=new da,d=new wc,c=new Y,w=new Ec,a=new gb,b=new ic,B=new Nc,e=new xc,l=new fb,q=new Lc,g=new Mc;v.setModules(u,G,d,c,w,a,b,B,g);G.setModules(u,g,b,a);B.setModules(G,b);d.setModules(v);w.setModules(G,e,c,l);c.setModules(l,e,v.enc.psy);e.setModules(G);l.setModules(c);a.setModules(v,G,b);x.setModules(q,g);q.setModules(b,B,d);var t=v.lame_init();t.num_channels=f;t.in_samplerate= +k;t.brate=r;t.mode=ka.STEREO;t.quality=3;t.bWriteVbrTag=!1;t.disable_reservoir=!0;t.write_id3tag_automatic=!1;v.lame_init_params(t);var D=1152,m=0|1.25*D+7200,n=new Int8Array(m);this.encodeBuffer=function(a,b){1==f&&(b=a);a.length>D&&(D=a.length,m=0|1.25*D+7200,n=new Int8Array(m));a=v.lame_encode_buffer(t,a,b,a.length,n,0,m);return new Int8Array(n.subarray(0,a))};this.flush=function(){var a=v.lame_encode_flush(t,n,0,m);return new Int8Array(n.subarray(0,a))}};lamejs.WavHeader=xa}lamejs(); + +self.onmessage = function(e) { + channels = 1; //1 for mono or 2 for stereo + sampleRate = 44100; //44.1khz (normal mp3 samplerate) + kbps = 128; //encode 128kbps mp3 + mp3encoder = new lamejs.Mp3Encoder(channels, sampleRate, kbps); + var mp3Data = []; + var mp3buf; + + samples = e.data; // Int16Array + sampleBlockSize = 1152; //can be anything but make it a multiple of 576 to make encoders life easier + + for (var i = 0; i < samples.length; i += sampleBlockSize) { + sampleChunk = samples.subarray(i, i + sampleBlockSize); + mp3buf = mp3encoder.encodeBuffer(sampleChunk); + if (mp3buf.length > 0) { + mp3Data.push(mp3buf); + } + } + mp3buf = mp3encoder.flush(); //finish writing mp3 + + if (mp3buf.length > 0) { + mp3Data.push(new Int8Array(mp3buf)); + } + + var blob = new Blob(mp3Data, {type: 'audio/mp3'}); + self.postMessage(blob); +};