wavesurfer.js 5.1.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGES.md +11 -0
- package/dist/plugin/wavesurfer.cursor.js +2 -2
- package/dist/plugin/wavesurfer.cursor.js.map +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +2 -2
- package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.js +2 -2
- package/dist/plugin/wavesurfer.elan.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +2 -2
- package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.js +2 -2
- package/dist/plugin/wavesurfer.markers.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.min.js +2 -2
- package/dist/plugin/wavesurfer.markers.min.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.js +2 -2
- package/dist/plugin/wavesurfer.mediasession.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js +2 -2
- package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.js +2 -2
- package/dist/plugin/wavesurfer.microphone.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js +2 -2
- package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.js +2 -2
- package/dist/plugin/wavesurfer.minimap.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +2 -2
- package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.js +2 -2
- package/dist/plugin/wavesurfer.playhead.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js +2 -2
- package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.js +37 -7
- package/dist/plugin/wavesurfer.regions.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.min.js +2 -2
- package/dist/plugin/wavesurfer.regions.min.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.js +2 -2
- package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
- package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.js +14 -11
- package/dist/plugin/wavesurfer.timeline.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +2 -2
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +2 -2
- package/dist/wavesurfer-html-init.js.map +1 -1
- package/dist/wavesurfer-html-init.min.js +2 -2
- package/dist/wavesurfer-html-init.min.js.map +1 -1
- package/dist/wavesurfer.js +99 -21
- package/dist/wavesurfer.js.map +1 -1
- package/dist/wavesurfer.min.js +2 -2
- package/dist/wavesurfer.min.js.map +1 -1
- package/package.json +11 -11
- package/src/plugin/regions/region.js +33 -5
- package/src/plugin/timeline/index.js +11 -9
- package/src/util/index.js +1 -0
- package/src/util/silence-mode.js +35 -0
- package/src/wavesurfer.js +23 -13
- package/src/webaudio.js +10 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/startup"],"names":["FFT","bufferSize","sampleRate","windowFunc","alpha","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","real","imag","bSi","sqrt","rval","ival","mag","spectrum","k","floor","log","LN2","length","halfSize","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","cmEntry","val","push","width","pixelRatio","fftSamples","height","noverlap","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","pixels","resample","heightFactor","numberOfChannels","imageData","createImageData","j","y","redIndex","data","putImageData","callback","backend","channelOne","getChannelData","bufferLength","frequencies","uniqueSamplesPerPx","max","fft","maxSlicesCount","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","frequenciesHeight","bgWidth","getMaxY","labelIndex","freqStart","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","index","label","freqType","units","unitType","yLabelOffset","x","font","fillText","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","name","deferInit","staticProps","instance"],"mappings":"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","file":"wavesurfer.spectrogram.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(this, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n const pixels = my.resample(frequenciesData);\n const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;\n if (spectrCc) {\n const imageData = spectrCc.createImageData(width, height);\n let i;\n let j;\n let k;\n\n for (i = 0; i < pixels.length; i++) {\n for (j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n /* eslint-disable max-depth */\n for (k = 0; k < heightFactor; k++) {\n let y = height - j * heightFactor;\n if (heightFactor === 2 && k === 1) {\n y--;\n }\n const redIndex = y * (width * 4) + i * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n /* eslint-enable max-depth */\n }\n }\n spectrCc.putImageData(imageData, 0, 0);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channelOne = buffer.getChannelData(0);\n const bufferLength = buffer.length;\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n const maxSlicesCount = Math.floor(\n bufferLength / (fftSamples - noverlap)\n );\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelOne.length) {\n const segment = channelOne.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n frequencies.push(array);\n currentOffset += fftSamples - noverlap;\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height;\n this.labelsEl.width = bgWidth;\n\n if (ctx) {\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, 0, bgWidth, getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/spectrogram/index.js\");\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.spectrogram.js","mappings":"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","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/before-startup","webpack://WaveSurfer.[name]/webpack/startup","webpack://WaveSurfer.[name]/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(self, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n const pixels = my.resample(frequenciesData);\n const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;\n if (spectrCc) {\n const imageData = spectrCc.createImageData(width, height);\n let i;\n let j;\n let k;\n\n for (i = 0; i < pixels.length; i++) {\n for (j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n /* eslint-disable max-depth */\n for (k = 0; k < heightFactor; k++) {\n let y = height - j * heightFactor;\n if (heightFactor === 2 && k === 1) {\n y--;\n }\n const redIndex = y * (width * 4) + i * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n /* eslint-enable max-depth */\n }\n }\n spectrCc.putImageData(imageData, 0, 0);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channelOne = buffer.getChannelData(0);\n const bufferLength = buffer.length;\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n const maxSlicesCount = Math.floor(\n bufferLength / (fftSamples - noverlap)\n );\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelOne.length) {\n const segment = channelOne.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n frequencies.push(array);\n currentOffset += fftSamples - noverlap;\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height;\n this.labelsEl.width = bgWidth;\n\n if (ctx) {\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, 0, bgWidth, getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/spectrogram/index.js\");\n",""],"names":["FFT","bufferSize","sampleRate","windowFunc","alpha","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","real","imag","bSi","sqrt","rval","ival","mag","spectrum","k","floor","log","LN2","length","halfSize","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","cmEntry","val","push","width","pixelRatio","fftSamples","height","noverlap","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","pixels","resample","heightFactor","numberOfChannels","imageData","createImageData","j","y","redIndex","data","putImageData","callback","backend","channelOne","getChannelData","bufferLength","frequencies","uniqueSamplesPerPx","max","fft","maxSlicesCount","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","frequenciesHeight","bgWidth","getMaxY","labelIndex","freqStart","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","index","label","freqType","units","unitType","yLabelOffset","x","font","fillText","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","name","deferInit","staticProps","instance"],"sourceRoot":""}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js spectrogram plugin 5.
|
|
2
|
+
* wavesurfer.js spectrogram plugin 5.2.0 (2021-08-16)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
6
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("WaveSurfer",[],t):"object"==typeof exports?exports.WaveSurfer=t():(e.WaveSurfer=e.WaveSurfer||{},e.WaveSurfer.spectrogram=t())}(
|
|
6
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("WaveSurfer",[],t):"object"==typeof exports?exports.WaveSurfer=t():(e.WaveSurfer=e.WaveSurfer||{},e.WaveSurfer.spectrogram=t())}(self,(function(){return(()=>{"use strict";var e={325:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,r){switch(this.bufferSize=e,this.sampleRate=t,this.bandwidth=2/e*(t/2),this.sinTable=new Float32Array(e),this.cosTable=new Float32Array(e),this.windowValues=new Float32Array(e),this.reverseTable=new Uint32Array(e),this.peakBand=0,this.peak=0,a){case"bartlett":for(i=0;i<e;i++)this.windowValues[i]=2/(e-1)*((e-1)/2-Math.abs(i-(e-1)/2));break;case"bartlettHann":for(i=0;i<e;i++)this.windowValues[i]=.62-.48*Math.abs(i/(e-1)-.5)-.38*Math.cos(2*Math.PI*i/(e-1));break;case"blackman":for(r=r||.16,i=0;i<e;i++)this.windowValues[i]=(1-r)/2-.5*Math.cos(2*Math.PI*i/(e-1))+r/2*Math.cos(4*Math.PI*i/(e-1));break;case"cosine":for(i=0;i<e;i++)this.windowValues[i]=Math.cos(Math.PI*i/(e-1)-Math.PI/2);break;case"gauss":for(r=r||.25,i=0;i<e;i++)this.windowValues[i]=Math.pow(Math.E,-.5*Math.pow((i-(e-1)/2)/(r*(e-1)/2),2));break;case"hamming":for(i=0;i<e;i++)this.windowValues[i]=.54-.46*Math.cos(2*Math.PI*i/(e-1));break;case"hann":case void 0:for(i=0;i<e;i++)this.windowValues[i]=.5*(1-Math.cos(2*Math.PI*i/(e-1)));break;case"lanczoz":for(i=0;i<e;i++)this.windowValues[i]=Math.sin(Math.PI*(2*i/(e-1)-1))/(Math.PI*(2*i/(e-1)-1));break;case"rectangular":for(i=0;i<e;i++)this.windowValues[i]=1;break;case"triangular":for(i=0;i<e;i++)this.windowValues[i]=2/e*(e/2-Math.abs(i-(e-1)/2));break;default:throw Error("No such window function '"+a+"'")}var i,s=1,n=e>>1;for(;s<e;){for(i=0;i<s;i++)this.reverseTable[i+s]=this.reverseTable[i]+n;s<<=1,n>>=1}for(i=0;i<e;i++)this.sinTable[i]=Math.sin(-Math.PI/i),this.cosTable[i]=Math.cos(-Math.PI/i);this.calculateSpectrum=function(e){var t,a,r,i=this.bufferSize,s=this.cosTable,n=this.sinTable,o=this.reverseTable,l=new Float32Array(i),h=new Float32Array(i),f=2/this.bufferSize,c=Math.sqrt,u=new Float32Array(i/2),p=Math.floor(Math.log(i)/Math.LN2);if(Math.pow(2,p)!==i)throw"Invalid buffer size, must be a power of 2.";if(i!==e.length)throw"Supplied buffer is not the same size as defined FFT. FFT Size: "+i+" Buffer Size: "+e.length;for(var d,v,w,b,m,y,M,g,k=1,x=0;x<i;x++)l[x]=e[o[x]]*this.windowValues[o[x]],h[x]=0;for(;k<i;){d=s[k],v=n[k],w=1,b=0;for(var S=0;S<k;S++){for(x=S;x<i;)y=w*l[m=x+k]-b*h[m],M=w*h[m]+b*l[m],l[m]=l[x]-y,h[m]=h[x]-M,l[x]+=y,h[x]+=M,x+=k<<1;w=(g=w)*d-b*v,b=g*v+b*d}k<<=1}x=0;for(var C=i/2;x<C;x++)(r=f*c((t=l[x])*t+(a=h[x])*a))>this.peak&&(this.peakBand=x,this.peak=r),u[x]=r;return u}},e.exports=t.default},943:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r,i=(r=a(325))&&r.__esModule?r:{default:r};function s(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var n=function(){function e(t,a){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.params=t,this.wavesurfer=a,this.util=a.util,this.frequenciesDataUrl=t.frequenciesDataUrl,this._onScroll=function(e){r.updateScroll(e)},this._onRender=function(){r.render()},this._onWrapperClick=function(e){r._wrapperClickHandler(e)},this._onReady=function(){var e=r.drawer=a.drawer;if(r.container="string"==typeof t.container?document.querySelector(t.container):t.container,!r.container)throw Error("No container for WaveSurfer spectrogram");if(t.colorMap){if(t.colorMap.length<256)throw new Error("Colormap must contain 256 elements");for(var i=0;i<t.colorMap.length;i++){if(4!==t.colorMap[i].length)throw new Error("ColorMap entries must contain 4 values")}r.colorMap=t.colorMap}else{r.colorMap=[];for(var s=0;s<256;s++){var n=(255-s)/256;r.colorMap.push([n,n,n,1])}}r.width=e.width,r.pixelRatio=r.params.pixelRatio||a.params.pixelRatio,r.fftSamples=r.params.fftSamples||a.params.fftSamples||512,r.height=r.fftSamples/2,r.noverlap=t.noverlap,r.windowFunc=t.windowFunc,r.alpha=t.alpha,r.createWrapper(),r.createCanvas(),r.render(),e.wrapper.addEventListener("scroll",r._onScroll),a.on("redraw",r._onRender)}}var t,a,r;return t=e,r=[{key:"create",value:function(t){return{name:"spectrogram",deferInit:!(!t||!t.deferInit)&&t.deferInit,params:t,staticProps:{FFT:i.default},instance:e}}}],(a=[{key:"init",value:function(){this.wavesurfer.isReady?this._onReady():this.wavesurfer.once("ready",this._onReady)}},{key:"destroy",value:function(){this.unAll(),this.wavesurfer.un("ready",this._onReady),this.wavesurfer.un("redraw",this._onRender),this.drawer&&this.drawer.wrapper.removeEventListener("scroll",this._onScroll),this.wavesurfer=null,this.util=null,this.params=null,this.wrapper&&(this.wrapper.removeEventListener("click",this._onWrapperClick),this.wrapper.parentNode.removeChild(this.wrapper),this.wrapper=null)}},{key:"createWrapper",value:function(){var e=this.container.querySelector("spectrogram");e&&this.container.removeChild(e);var t=this.wavesurfer.params;if(this.wrapper=document.createElement("spectrogram"),this.params.labels){var a=this.labelsEl=document.createElement("canvas");a.classList.add("spec-labels"),this.drawer.style(a,{left:0,position:"absolute",zIndex:9,height:"".concat(this.height/this.pixelRatio,"px"),width:"".concat(55/this.pixelRatio,"px")}),this.wrapper.appendChild(a),this.loadLabels("rgba(68,68,68,0.5)","12px","10px","","#fff","#f7f7f7","center","#specLabels")}this.drawer.style(this.wrapper,{display:"block",position:"relative",userSelect:"none",webkitUserSelect:"none",height:"".concat(this.height/this.pixelRatio,"px")}),(t.fillParent||t.scrollParent)&&this.drawer.style(this.wrapper,{width:"100%",overflowX:"hidden",overflowY:"hidden"}),this.container.appendChild(this.wrapper),this.wrapper.addEventListener("click",this._onWrapperClick)}},{key:"_wrapperClickHandler",value:function(e){e.preventDefault();var t="offsetX"in e?e.offsetX:e.layerX;this.fireEvent("click",t/this.width||0)}},{key:"createCanvas",value:function(){var e=this.canvas=this.wrapper.appendChild(document.createElement("canvas"));this.spectrCc=e.getContext("2d"),this.util.style(e,{position:"absolute",zIndex:4})}},{key:"render",value:function(){this.updateCanvasStyle(),this.frequenciesDataUrl?this.loadFrequenciesData(this.frequenciesDataUrl):this.getFrequencies(this.drawSpectrogram)}},{key:"updateCanvasStyle",value:function(){var e=Math.round(this.width/this.pixelRatio)+"px";this.canvas.width=this.width,this.canvas.height=this.height,this.canvas.style.width=e}},{key:"drawSpectrogram",value:function(e,t){var a=t.spectrCc,r=t.height,i=t.width,s=t.resample(e),n=t.buffer?2/t.buffer.numberOfChannels:1;if(a){var o,l,h,f=a.createImageData(i,r);for(o=0;o<s.length;o++)for(l=0;l<s[o].length;l++){var c=t.colorMap[s[o][l]];for(h=0;h<n;h++){var u=r-l*n;2===n&&1===h&&u--;var p=u*(4*i)+4*o;f.data[p]=255*c[0],f.data[p+1]=255*c[1],f.data[p+2]=255*c[2],f.data[p+3]=255*c[3]}}a.putImageData(f,0,0)}}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=a.getChannelData(0),s=a.length,n=a.sampleRate,o=[];if(a){var l=this.noverlap;if(!l){var h=a.length/this.canvas.width;l=Math.max(0,Math.round(t-h))}for(var f=new i.default(t,n,this.windowFunc,this.alpha),c=(Math.floor(s/(t-l)),0);c+t<r.length;){var u=r.slice(c,c+t),p=f.calculateSpectrum(u),d=new Uint8Array(t/2),v=void 0;for(v=0;v<t/2;v++)d[v]=Math.max(-255,45*Math.log10(p[v]));o.push(d),c+=t-l}e(o,this)}else this.fireEvent("error","Web Audio buffer is not available")}},{key:"loadFrequenciesData",value:function(e){var t=this,a=this.util.fetchFile({url:e});return a.on("success",(function(e){return t.drawSpectrogram(JSON.parse(e),t)})),a.on("error",(function(e){return t.fireEvent("error",e)})),a}},{key:"freqType",value:function(e){return e>=1e3?(e/1e3).toFixed(1):Math.round(e)}},{key:"unitType",value:function(e){return e>=1e3?"KHz":"Hz"}},{key:"loadLabels",value:function(e,t,a,r,i,s,n,o){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",s=s||"#fff",n=n||"center",o=o||"#specLabels";var l,h=this.height||512,f=h/256*5,c=(this.wavesurfer.backend.ac.sampleRate/2-0)/f,u=this.labelsEl.getContext("2d");if(this.labelsEl.height=this.height,this.labelsEl.width=55,u)for(u.fillStyle=e,u.fillRect(0,0,55,h),u.fill(),l=0;l<=f;l++){u.textAlign=n,u.textBaseline="middle";var p=0+c*l,d=(Math.round(p/(this.sampleRate/2)*this.fftSamples),this.freqType(p)),v=this.unitType(p),w=void 0;0==l?(w=h+l-10,u.fillStyle=s,u.font=a+" "+r,u.fillText(v,40,w),u.fillStyle=i,u.font=t+" "+r,u.fillText(d,16,w)):(w=h-50*l+2,u.fillStyle=s,u.font=a+" "+r,u.fillText(v,40,w),u.fillStyle=i,u.font=t+" "+r,u.fillText(d,16,w))}}},{key:"updateScroll",value:function(e){this.wrapper&&(this.wrapper.scrollLeft=e.target.scrollLeft)}},{key:"resample",value:function(e){var t,a=this.width,r=[],i=1/e.length,s=1/a;for(t=0;t<a;t++){var n=new Array(e[0].length),o=void 0;for(o=0;o<e.length;o++){var l=o*i,h=l+i,f=t*s,c=f+s,u=h<=f||c<=l?0:Math.min(Math.max(h,f),Math.max(c,l))-Math.max(Math.min(h,f),Math.min(c,l)),p=void 0;if(u>0)for(p=0;p<e[0].length;p++)null==n[p]&&(n[p]=0),n[p]+=u/s*e[o][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=n[v];r.push(d)}return r}}])&&s(t.prototype,a),r&&s(t,r),e}();t.default=n,e.exports=t.default}},t={};return function a(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,a),s.exports}(943)})()}));
|
|
7
7
|
//# sourceMappingURL=wavesurfer.spectrogram.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/startup"],"names":["root","factory","exports","module","define","amd","this","bufferSize","sampleRate","windowFunc","alpha","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","rval","ival","mag","real","imag","bSi","sqrt","spectrum","k","floor","log","LN2","length","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","halfSize","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","val","push","width","pixelRatio","fftSamples","height","noverlap","createWrapper","createCanvas","wrapper","addEventListener","on","name","deferInit","staticProps","FFT","instance","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","pixels","resample","heightFactor","numberOfChannels","j","imageData","createImageData","y","redIndex","data","putImageData","callback","backend","channelOne","getChannelData","bufferLength","frequencies","uniqueSamplesPerPx","max","fft","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","font","fillText","x","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"mappings":"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","file":"wavesurfer.spectrogram.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(this, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n const pixels = my.resample(frequenciesData);\n const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;\n if (spectrCc) {\n const imageData = spectrCc.createImageData(width, height);\n let i;\n let j;\n let k;\n\n for (i = 0; i < pixels.length; i++) {\n for (j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n /* eslint-disable max-depth */\n for (k = 0; k < heightFactor; k++) {\n let y = height - j * heightFactor;\n if (heightFactor === 2 && k === 1) {\n y--;\n }\n const redIndex = y * (width * 4) + i * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n /* eslint-enable max-depth */\n }\n }\n spectrCc.putImageData(imageData, 0, 0);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channelOne = buffer.getChannelData(0);\n const bufferLength = buffer.length;\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n const maxSlicesCount = Math.floor(\n bufferLength / (fftSamples - noverlap)\n );\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelOne.length) {\n const segment = channelOne.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n frequencies.push(array);\n currentOffset += fftSamples - noverlap;\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height;\n this.labelsEl.width = bgWidth;\n\n if (ctx) {\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, 0, bgWidth, getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(943);\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.spectrogram.min.js","mappings":"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","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(self, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n const pixels = my.resample(frequenciesData);\n const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;\n if (spectrCc) {\n const imageData = spectrCc.createImageData(width, height);\n let i;\n let j;\n let k;\n\n for (i = 0; i < pixels.length; i++) {\n for (j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n /* eslint-disable max-depth */\n for (k = 0; k < heightFactor; k++) {\n let y = height - j * heightFactor;\n if (heightFactor === 2 && k === 1) {\n y--;\n }\n const redIndex = y * (width * 4) + i * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n /* eslint-enable max-depth */\n }\n }\n spectrCc.putImageData(imageData, 0, 0);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channelOne = buffer.getChannelData(0);\n const bufferLength = buffer.length;\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n const maxSlicesCount = Math.floor(\n bufferLength / (fftSamples - noverlap)\n );\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelOne.length) {\n const segment = channelOne.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n frequencies.push(array);\n currentOffset += fftSamples - noverlap;\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height;\n this.labelsEl.width = bgWidth;\n\n if (ctx) {\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, 0, bgWidth, getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(943);\n"],"names":["root","factory","exports","module","define","amd","self","bufferSize","sampleRate","windowFunc","alpha","this","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","rval","ival","mag","real","imag","bSi","sqrt","spectrum","k","floor","log","LN2","length","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","halfSize","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","val","push","width","pixelRatio","fftSamples","height","noverlap","createWrapper","createCanvas","wrapper","addEventListener","on","name","deferInit","staticProps","FFT","instance","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","pixels","resample","heightFactor","numberOfChannels","j","imageData","createImageData","y","redIndex","data","putImageData","callback","backend","channelOne","getChannelData","bufferLength","frequencies","uniqueSamplesPerPx","max","fft","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","font","fillText","x","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js timeline plugin 5.
|
|
2
|
+
* wavesurfer.js timeline plugin 5.2.0 (2021-08-16)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
exports["WaveSurfer"] = factory();
|
|
13
13
|
else
|
|
14
14
|
root["WaveSurfer"] = root["WaveSurfer"] || {}, root["WaveSurfer"]["timeline"] = factory();
|
|
15
|
-
})(
|
|
15
|
+
})(self, function() {
|
|
16
16
|
return /******/ (() => { // webpackBootstrap
|
|
17
17
|
/******/ "use strict";
|
|
18
18
|
/******/ var __webpack_modules__ = ({
|
|
@@ -481,18 +481,21 @@ var TimelinePlugin = /*#__PURE__*/function () {
|
|
|
481
481
|
var xOffset = 0;
|
|
482
482
|
this.canvases.forEach(function (canvas) {
|
|
483
483
|
var context = canvas.getContext('2d');
|
|
484
|
-
var canvasWidth = context.canvas.width;
|
|
485
484
|
|
|
486
|
-
if (
|
|
487
|
-
|
|
488
|
-
}
|
|
485
|
+
if (context) {
|
|
486
|
+
var canvasWidth = context.canvas.width;
|
|
489
487
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
488
|
+
if (xOffset > x + textWidth) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
494
491
|
|
|
495
|
-
|
|
492
|
+
if (xOffset + canvasWidth > x && context) {
|
|
493
|
+
textWidth = context.measureText(text).width;
|
|
494
|
+
context.fillText(text, x - xOffset, y);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
xOffset += canvasWidth;
|
|
498
|
+
}
|
|
496
499
|
});
|
|
497
500
|
}
|
|
498
501
|
/**
|