wavesurfer.js 6.2.0 → 6.3.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 +8 -0
- package/LICENSE +1 -1
- package/README.md +0 -10
- package/dist/plugin/wavesurfer.cursor.js +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.js +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +1 -1
- package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.js +41 -6
- 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 +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.js +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.js +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.js +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.js +2 -2
- 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 +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +1 -1
- package/dist/wavesurfer-html-init.js.map +1 -1
- package/dist/wavesurfer-html-init.min.js +1 -1
- package/dist/wavesurfer-html-init.min.js.map +1 -1
- package/dist/wavesurfer.js +32 -29
- 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 +18 -19
- package/src/drawer.multicanvas.js +4 -4
- package/src/plugin/markers/index.js +31 -5
- package/src/plugin/regions/index.js +1 -1
- package/src/plugin/spectrogram/index.js +1 -1
- package/src/wavesurfer.js +12 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.spectrogram.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/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, () => {\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} splitChannels=false Render with separate spectrograms for\n * the channels of the audio\n * @property {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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 {number} frequencyMin=0 Min frequency to scale spectrogram.\n * @property {number} frequencyMax=12000 Max frequency to scale spectrogram.\n * Set this to samplerate/2 to draw whole range of spectrogram.\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.params.height || this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n this.splitChannels = params.splitChannels;\n this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;\n\n // Getting file's original samplerate is difficult(#1248).\n // So set 12kHz default to render like wavesurfer.js 5.x.\n this.frequencyMin = params.frequencyMin || 0;\n this.frequencyMax = params.frequencyMax || 12000;\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 position: 'fixed',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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.channels}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.fftSamples / 2 * this.channels;\n this.canvas.style.width = width;\n this.canvas.style.height = this.height + 'px';\n }\n\n drawSpectrogram(frequenciesData, my) {\n if (!isNaN(frequenciesData[0][0])) { // data is 1ch [sample, freq] format\n // to [channel, sample, freq] format\n frequenciesData = [frequenciesData];\n }\n\n const spectrCc = my.spectrCc;\n const height = my.fftSamples / 2;\n const width = my.width;\n const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\n\n if (!spectrCc) {\n return;\n }\n\n for (let c = 0; c < frequenciesData.length; c++) { // for each channel\n const pixels = my.resample(frequenciesData[c]);\n const imageData = new ImageData(width, height);\n\n for (let i = 0; i < pixels.length; i++) {\n for (let j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n const redIndex = ((height - j) * width + 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 }\n\n // scale and stack spectrograms\n createImageBitmap(imageData).then(renderer =>\n spectrCc.drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * c, // destination x, y\n width, height // destination width, height\n )\n );\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channels = this.channels;\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n // This may differ from file samplerate. Browser resamples audio.\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\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\n for (let c = 0; c < channels; c++) { // for each channel\n const channelData = buffer.getChannelData(c);\n const channelFreq = [];\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelData.length) {\n const segment = channelData.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 channelFreq.push(array);\n // channelFreq: [sample, freq]\n\n currentOffset += fftSamples - noverlap;\n }\n frequencies.push(channelFreq);\n // frequencies: [channel, sample, freq]\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 = this.frequencyMin;\n const step = (this.frequencyMax - freqStart) / labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\n\n if (!ctx) {\n return;\n }\n\n for (let c = 0; c < this.channels; c++) { // for each channel\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * 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 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 = (1 + c) * 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 = (1 + c) * 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","splitChannels","channels","backend","numberOfChannels","frequencyMin","frequencyMax","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","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","isNaN","freqFrom","freqMin","freqMax","c","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","drawImage","callback","frequencies","uniqueSamplesPerPx","max","fft","channelData","getChannelData","channelFreq","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","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","yLabelOffset","x","y","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
|
+
{"version":3,"file":"wavesurfer.spectrogram.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/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, () => {\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} splitChannels=false Render with separate spectrograms for\n * the channels of the audio\n * @property {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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 {number} frequencyMin=0 Min frequency to scale spectrogram.\n * @property {number} frequencyMax=12000 Max frequency to scale spectrogram.\n * Set this to samplerate/2 to draw whole range of spectrogram.\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.params.height || this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n this.splitChannels = params.splitChannels;\n this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;\n\n // Getting file's original samplerate is difficult(#1248).\n // So set 12kHz default to render like wavesurfer.js 5.x.\n this.frequencyMin = params.frequencyMin || 0;\n this.frequencyMax = params.frequencyMax || 12000;\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 position: 'absolute',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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.channels}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.fftSamples / 2 * this.channels;\n this.canvas.style.width = width;\n this.canvas.style.height = this.height + 'px';\n }\n\n drawSpectrogram(frequenciesData, my) {\n if (!isNaN(frequenciesData[0][0])) { // data is 1ch [sample, freq] format\n // to [channel, sample, freq] format\n frequenciesData = [frequenciesData];\n }\n\n const spectrCc = my.spectrCc;\n const height = my.fftSamples / 2;\n const width = my.width;\n const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\n\n if (!spectrCc) {\n return;\n }\n\n for (let c = 0; c < frequenciesData.length; c++) { // for each channel\n const pixels = my.resample(frequenciesData[c]);\n const imageData = new ImageData(width, height);\n\n for (let i = 0; i < pixels.length; i++) {\n for (let j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n const redIndex = ((height - j) * width + 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 }\n\n // scale and stack spectrograms\n createImageBitmap(imageData).then(renderer =>\n spectrCc.drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * c, // destination x, y\n width, height // destination width, height\n )\n );\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channels = this.channels;\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n // This may differ from file samplerate. Browser resamples audio.\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\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\n for (let c = 0; c < channels; c++) { // for each channel\n const channelData = buffer.getChannelData(c);\n const channelFreq = [];\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelData.length) {\n const segment = channelData.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 channelFreq.push(array);\n // channelFreq: [sample, freq]\n\n currentOffset += fftSamples - noverlap;\n }\n frequencies.push(channelFreq);\n // frequencies: [channel, sample, freq]\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 = this.frequencyMin;\n const step = (this.frequencyMax - freqStart) / labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\n\n if (!ctx) {\n return;\n }\n\n for (let c = 0; c < this.channels; c++) { // for each channel\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * 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 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 = (1 + c) * 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 = (1 + c) * 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","splitChannels","channels","backend","numberOfChannels","frequencyMin","frequencyMax","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","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","isNaN","freqFrom","freqMin","freqMax","c","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","drawImage","callback","frequencies","uniqueSamplesPerPx","max","fft","channelData","getChannelData","channelFreq","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","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","yLabelOffset","x","y","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 6.
|
|
2
|
+
* wavesurfer.js spectrogram plugin 6.3.0 (2022-10-03)
|
|
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())}(self,(()=>(()=>{"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,n=1,s=e>>1;for(;n<e;){for(i=0;i<n;i++)this.reverseTable[i+n]=this.reverseTable[i]+s;n<<=1,s>>=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,n=this.cosTable,s=this.sinTable,l=this.reverseTable,o=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,y,m,b,M,g,k=1,x=0;x<i;x++)o[x]=e[l[x]]*this.windowValues[l[x]],h[x]=0;for(;k<i;){d=n[k],v=s[k],w=1,y=0;for(var S=0;S<k;S++){for(x=S;x<i;)b=w*o[m=x+k]-y*h[m],M=w*h[m]+y*o[m],o[m]=o[x]-b,h[m]=h[x]-M,o[x]+=b,h[x]+=M,x+=k<<1;w=(g=w)*d-y*v,y=g*v+y*d}k<<=1}x=0;for(var C=i/2;x<C;x++)(r=f*c((t=o[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 n(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 s=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 n=0;n<256;n++){var s=(255-n)/256;r.colorMap.push([s,s,s,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.params.height||r.fftSamples/2,r.noverlap=t.noverlap,r.windowFunc=t.windowFunc,r.alpha=t.alpha,r.splitChannels=t.splitChannels,r.channels=r.splitChannels?a.backend.buffer.numberOfChannels:1,r.frequencyMin=t.frequencyMin||0,r.frequencyMax=t.frequencyMax||12e3,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,{position:"fixed",zIndex:9,height:"".concat(this.height*this.channels,"px"),width:"55px"}),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.channels,"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.fftSamples/2*this.channels,this.canvas.style.width=e,this.canvas.style.height=this.height+"px"}},{key:"drawSpectrogram",value:function(e,t){isNaN(e[0][0])||(e=[e]);var a=t.spectrCc,r=t.fftSamples/2,i=t.width,n=t.buffer.sampleRate/2,s=t.frequencyMin,l=t.frequencyMax;if(a)for(var o=function(o){for(var h=t.resample(e[o]),f=new ImageData(i,r),c=0;c<h.length;c++)for(var u=0;u<h[c].length;u++){var p=t.colorMap[h[c][u]],d=4*((r-u)*i+c);f.data[d]=255*p[0],f.data[d+1]=255*p[1],f.data[d+2]=255*p[2],f.data[d+3]=255*p[3]}createImageBitmap(f).then((function(e){return a.drawImage(e,0,r*(1-l/n),i,r*(l-s)/n,0,r*o,i,r)}))},h=0;h<e.length;h++)o(h)}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=this.channels;if(a){var n=a.sampleRate,s=[],l=this.noverlap;if(!l){var o=a.length/this.canvas.width;l=Math.max(0,Math.round(t-o))}for(var h=new i.default(t,n,this.windowFunc,this.alpha),f=0;f<r;f++){for(var c=a.getChannelData(f),u=[],p=0;p+t<c.length;){var d=c.slice(p,p+t),v=h.calculateSpectrum(d),w=new Uint8Array(t/2),y=void 0;for(y=0;y<t/2;y++)w[y]=Math.max(-255,45*Math.log10(v[y]));u.push(w),p+=t-l}s.push(u)}e(s,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,n,s,l){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",n=n||"#fff",s=s||"center",l=l||"#specLabels";var o=this.height||512,h=o/256*5,f=this.frequencyMin,c=(this.frequencyMax-f)/h,u=this.labelsEl.getContext("2d"),p=window.devicePixelRatio;if(this.labelsEl.height=this.height*this.channels*p,this.labelsEl.width=55*p,u.scale(p,p),u)for(var d=0;d<this.channels;d++){u.fillStyle=e,u.fillRect(0,d*o,55,(1+d)*o),u.fill();var v=void 0;for(v=0;v<=h;v++){u.textAlign=s,u.textBaseline="middle";var w=f+c*v,y=this.freqType(w),m=this.unitType(w),b=void 0;0==v?(b=(1+d)*o+v-10,u.fillStyle=n,u.font=a+" "+r,u.fillText(m,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(y,16,b)):(b=(1+d)*o-50*v+2,u.fillStyle=n,u.font=a+" "+r,u.fillText(m,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(y,16,b))}}}},{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,n=1/a;for(t=0;t<a;t++){var s=new Array(e[0].length),l=void 0;for(l=0;l<e.length;l++){var o=l*i,h=o+i,f=t*n,c=f+n,u=h<=f||c<=o?0:Math.min(Math.max(h,f),Math.max(c,o))-Math.max(Math.min(h,f),Math.min(c,o)),p=void 0;if(u>0)for(p=0;p<e[0].length;p++)null==s[p]&&(s[p]=0),s[p]+=u/n*e[l][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=s[v];r.push(d)}return r}}])&&n(t.prototype,a),r&&n(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.default=s,e.exports=t.default}},t={};var a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}(943);return a})()));
|
|
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,(()=>(()=>{"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,n=1,s=e>>1;for(;n<e;){for(i=0;i<n;i++)this.reverseTable[i+n]=this.reverseTable[i]+s;n<<=1,s>>=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,n=this.cosTable,s=this.sinTable,l=this.reverseTable,o=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,y,m,b,M,g,k=1,x=0;x<i;x++)o[x]=e[l[x]]*this.windowValues[l[x]],h[x]=0;for(;k<i;){d=n[k],v=s[k],w=1,y=0;for(var S=0;S<k;S++){for(x=S;x<i;)b=w*o[m=x+k]-y*h[m],M=w*h[m]+y*o[m],o[m]=o[x]-b,h[m]=h[x]-M,o[x]+=b,h[x]+=M,x+=k<<1;w=(g=w)*d-y*v,y=g*v+y*d}k<<=1}x=0;for(var C=i/2;x<C;x++)(r=f*c((t=o[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 n(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 s=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 n=0;n<256;n++){var s=(255-n)/256;r.colorMap.push([s,s,s,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.params.height||r.fftSamples/2,r.noverlap=t.noverlap,r.windowFunc=t.windowFunc,r.alpha=t.alpha,r.splitChannels=t.splitChannels,r.channels=r.splitChannels?a.backend.buffer.numberOfChannels:1,r.frequencyMin=t.frequencyMin||0,r.frequencyMax=t.frequencyMax||12e3,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,{position:"absolute",zIndex:9,height:"".concat(this.height*this.channels,"px"),width:"55px"}),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.channels,"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.fftSamples/2*this.channels,this.canvas.style.width=e,this.canvas.style.height=this.height+"px"}},{key:"drawSpectrogram",value:function(e,t){isNaN(e[0][0])||(e=[e]);var a=t.spectrCc,r=t.fftSamples/2,i=t.width,n=t.buffer.sampleRate/2,s=t.frequencyMin,l=t.frequencyMax;if(a)for(var o=function(o){for(var h=t.resample(e[o]),f=new ImageData(i,r),c=0;c<h.length;c++)for(var u=0;u<h[c].length;u++){var p=t.colorMap[h[c][u]],d=4*((r-u)*i+c);f.data[d]=255*p[0],f.data[d+1]=255*p[1],f.data[d+2]=255*p[2],f.data[d+3]=255*p[3]}createImageBitmap(f).then((function(e){return a.drawImage(e,0,r*(1-l/n),i,r*(l-s)/n,0,r*o,i,r)}))},h=0;h<e.length;h++)o(h)}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=this.channels;if(a){var n=a.sampleRate,s=[],l=this.noverlap;if(!l){var o=a.length/this.canvas.width;l=Math.max(0,Math.round(t-o))}for(var h=new i.default(t,n,this.windowFunc,this.alpha),f=0;f<r;f++){for(var c=a.getChannelData(f),u=[],p=0;p+t<c.length;){var d=c.slice(p,p+t),v=h.calculateSpectrum(d),w=new Uint8Array(t/2),y=void 0;for(y=0;y<t/2;y++)w[y]=Math.max(-255,45*Math.log10(v[y]));u.push(w),p+=t-l}s.push(u)}e(s,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,n,s,l){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",n=n||"#fff",s=s||"center",l=l||"#specLabels";var o=this.height||512,h=o/256*5,f=this.frequencyMin,c=(this.frequencyMax-f)/h,u=this.labelsEl.getContext("2d"),p=window.devicePixelRatio;if(this.labelsEl.height=this.height*this.channels*p,this.labelsEl.width=55*p,u.scale(p,p),u)for(var d=0;d<this.channels;d++){u.fillStyle=e,u.fillRect(0,d*o,55,(1+d)*o),u.fill();var v=void 0;for(v=0;v<=h;v++){u.textAlign=s,u.textBaseline="middle";var w=f+c*v,y=this.freqType(w),m=this.unitType(w),b=void 0;0==v?(b=(1+d)*o+v-10,u.fillStyle=n,u.font=a+" "+r,u.fillText(m,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(y,16,b)):(b=(1+d)*o-50*v+2,u.fillStyle=n,u.font=a+" "+r,u.fillText(m,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(y,16,b))}}}},{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,n=1/a;for(t=0;t<a;t++){var s=new Array(e[0].length),l=void 0;for(l=0;l<e.length;l++){var o=l*i,h=o+i,f=t*n,c=f+n,u=h<=f||c<=o?0:Math.min(Math.max(h,f),Math.max(c,o))-Math.max(Math.min(h,f),Math.min(c,o)),p=void 0;if(u>0)for(p=0;p<e[0].length;p++)null==s[p]&&(s[p]=0),s[p]+=u/n*e[l][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=s[v];r.push(d)}return r}}])&&n(t.prototype,a),r&&n(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.default=s,e.exports=t.default}},t={};var a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}(943);return a})()));
|
|
7
7
|
//# sourceMappingURL=wavesurfer.spectrogram.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.spectrogram.min.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/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, () => {\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} splitChannels=false Render with separate spectrograms for\n * the channels of the audio\n * @property {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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 {number} frequencyMin=0 Min frequency to scale spectrogram.\n * @property {number} frequencyMax=12000 Max frequency to scale spectrogram.\n * Set this to samplerate/2 to draw whole range of spectrogram.\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.params.height || this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n this.splitChannels = params.splitChannels;\n this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;\n\n // Getting file's original samplerate is difficult(#1248).\n // So set 12kHz default to render like wavesurfer.js 5.x.\n this.frequencyMin = params.frequencyMin || 0;\n this.frequencyMax = params.frequencyMax || 12000;\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 position: 'fixed',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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.channels}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.fftSamples / 2 * this.channels;\n this.canvas.style.width = width;\n this.canvas.style.height = this.height + 'px';\n }\n\n drawSpectrogram(frequenciesData, my) {\n if (!isNaN(frequenciesData[0][0])) { // data is 1ch [sample, freq] format\n // to [channel, sample, freq] format\n frequenciesData = [frequenciesData];\n }\n\n const spectrCc = my.spectrCc;\n const height = my.fftSamples / 2;\n const width = my.width;\n const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\n\n if (!spectrCc) {\n return;\n }\n\n for (let c = 0; c < frequenciesData.length; c++) { // for each channel\n const pixels = my.resample(frequenciesData[c]);\n const imageData = new ImageData(width, height);\n\n for (let i = 0; i < pixels.length; i++) {\n for (let j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n const redIndex = ((height - j) * width + 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 }\n\n // scale and stack spectrograms\n createImageBitmap(imageData).then(renderer =>\n spectrCc.drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * c, // destination x, y\n width, height // destination width, height\n )\n );\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channels = this.channels;\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n // This may differ from file samplerate. Browser resamples audio.\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\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\n for (let c = 0; c < channels; c++) { // for each channel\n const channelData = buffer.getChannelData(c);\n const channelFreq = [];\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelData.length) {\n const segment = channelData.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 channelFreq.push(array);\n // channelFreq: [sample, freq]\n\n currentOffset += fftSamples - noverlap;\n }\n frequencies.push(channelFreq);\n // frequencies: [channel, sample, freq]\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 = this.frequencyMin;\n const step = (this.frequencyMax - freqStart) / labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\n\n if (!ctx) {\n return;\n }\n\n for (let c = 0; c < this.channels; c++) { // for each channel\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * 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 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 = (1 + c) * 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 = (1 + c) * 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","splitChannels","channels","backend","numberOfChannels","frequencyMin","frequencyMax","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","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","isNaN","freqFrom","freqMin","freqMax","c","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","drawImage","callback","frequencies","uniqueSamplesPerPx","max","fft","channelData","getChannelData","channelFreq","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.spectrogram.min.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/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, () => {\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} splitChannels=false Render with separate spectrograms for\n * the channels of the audio\n * @property {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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 {number} frequencyMin=0 Min frequency to scale spectrogram.\n * @property {number} frequencyMax=12000 Max frequency to scale spectrogram.\n * Set this to samplerate/2 to draw whole range of spectrogram.\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.params.height || this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n this.splitChannels = params.splitChannels;\n this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;\n\n // Getting file's original samplerate is difficult(#1248).\n // So set 12kHz default to render like wavesurfer.js 5.x.\n this.frequencyMin = params.frequencyMin || 0;\n this.frequencyMax = params.frequencyMax || 12000;\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 position: 'absolute',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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.channels}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.fftSamples / 2 * this.channels;\n this.canvas.style.width = width;\n this.canvas.style.height = this.height + 'px';\n }\n\n drawSpectrogram(frequenciesData, my) {\n if (!isNaN(frequenciesData[0][0])) { // data is 1ch [sample, freq] format\n // to [channel, sample, freq] format\n frequenciesData = [frequenciesData];\n }\n\n const spectrCc = my.spectrCc;\n const height = my.fftSamples / 2;\n const width = my.width;\n const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\n\n if (!spectrCc) {\n return;\n }\n\n for (let c = 0; c < frequenciesData.length; c++) { // for each channel\n const pixels = my.resample(frequenciesData[c]);\n const imageData = new ImageData(width, height);\n\n for (let i = 0; i < pixels.length; i++) {\n for (let j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n const redIndex = ((height - j) * width + 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 }\n\n // scale and stack spectrograms\n createImageBitmap(imageData).then(renderer =>\n spectrCc.drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * c, // destination x, y\n width, height // destination width, height\n )\n );\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channels = this.channels;\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n // This may differ from file samplerate. Browser resamples audio.\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\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\n for (let c = 0; c < channels; c++) { // for each channel\n const channelData = buffer.getChannelData(c);\n const channelFreq = [];\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelData.length) {\n const segment = channelData.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 channelFreq.push(array);\n // channelFreq: [sample, freq]\n\n currentOffset += fftSamples - noverlap;\n }\n frequencies.push(channelFreq);\n // frequencies: [channel, sample, freq]\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 = this.frequencyMin;\n const step = (this.frequencyMax - freqStart) / labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\n\n if (!ctx) {\n return;\n }\n\n for (let c = 0; c < this.channels; c++) { // for each channel\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * 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 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 = (1 + c) * 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 = (1 + c) * 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","splitChannels","channels","backend","numberOfChannels","frequencyMin","frequencyMax","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","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","isNaN","freqFrom","freqMin","freqMax","c","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","drawImage","callback","frequencies","uniqueSamplesPerPx","max","fft","channelData","getChannelData","channelFreq","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|