Mercurial > hg > ugly-duckling
changeset 118:5a4cd7add25a
Update colour mappers to slightly changed API; add green & sunset
author | Chris Cannam <cannam@all-day-breakfast.com> |
---|---|
date | Tue, 14 Mar 2017 11:57:21 +0000 |
parents | b8627a18c72d |
children | 5eca702db8d5 |
files | src/app/waveform/waveform.component.ts |
diffstat | 1 files changed, 53 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/app/waveform/waveform.component.ts Tue Mar 14 11:05:58 2017 +0000 +++ b/src/app/waveform/waveform.component.ts Tue Mar 14 11:57:21 2017 +0000 @@ -160,15 +160,12 @@ interpolatingMapper(hexColours) { const colours = hexColours.map(n => { const i = parseInt(n, 16); - return [ (i >> 16) & 255, (i >> 8) & 255, i & 255, 255 ]; + return [ ((i >> 16) & 255) / 255.0, + ((i >> 8) & 255) / 255.0, + ((i) & 255) / 255.0 ]; }); const last = colours.length - 1; return (value => { - // value must be in the range [0,1]. We quantize to 256 levels, - // as the PNG encoder deep inside uses a limited palette for - // simplicity. Should document this for the mapper. Also that - // individual colour values should be integers - value = Math.round(value * 255) / 255; const m = value * last; if (m >= last) { return colours[last]; @@ -181,10 +178,9 @@ const prop1 = m - base; const c0 = colours[base]; const c1 = colours[base+1]; - return [ Math.round(c0[0] * prop0 + c1[0] * prop1), - Math.round(c0[1] * prop0 + c1[1] * prop1), - Math.round(c0[2] * prop0 + c1[2] * prop1), - 255 ]; + return [ c0[0] * prop0 + c1[0] * prop1, + c0[1] * prop0 + c1[1] * prop1, + c0[2] * prop0 + c1[2] * prop1 ]; }); } @@ -198,6 +194,45 @@ return this.interpolatingMapper(hexColours); } + hsv2rgb(h, s, v) { // all values in range [0, 1] + const i = Math.floor(h * 6); + const f = h * 6 - i; + const p = v * (1 - s); + const q = v * (1 - f * s); + const t = v * (1 - (1 - f) * s); + let r = 0, g = 0, b = 0; + switch (i % 6) { + case 0: r = v, g = t, b = p; break; + case 1: r = q, g = v, b = p; break; + case 2: r = p, g = v, b = t; break; + case 3: r = p, g = q, b = v; break; + case 4: r = t, g = p, b = v; break; + case 5: r = v, g = p, b = q; break; + } + return [ r, g, b ]; + } + + greenMapper() { + const blue = 0.6666; + const pieslice = 0.3333; + return (value => { + const h = blue - value * 2.0 * pieslice; + const s = 0.5 + value / 2.0; + const v = value; + return this.hsv2rgb(h, s, v); + }); + } + + sunsetMapper() { + return (value => { + let r = (value - 0.24) * 2.38; + let g = (value - 0.64) * 2.777; + let b = (3.6 * value); + if (value > 0.277) b = 2.0 - b; + return [ r, g, b ]; + }); + } + renderWaveform(buffer: AudioBuffer): void { const height: number = this.trackDiv.nativeElement.getBoundingClientRect().height / 2; const waveTrack = this.timeline.getTrackById('wave'); @@ -346,10 +381,12 @@ const gridTrack = this.timeline.getTrackById('grid'); const spectrogramLayer = new wavesUI.helpers.SpectrogramLayer(buffer, { - top: 10, + top: height * 0.05, height: height * 0.9, stepSize: 512, - fftSize: 1024 + fftSize: 1024, + normalise: 'none', + mapper: this.sunsetMapper() }); this.addLayer(spectrogramLayer, gridTrack, this.timeline.timeContext); @@ -362,8 +399,8 @@ if (!extracted.features.hasOwnProperty('shape') || !extracted.features.hasOwnProperty('data')) return; const features: FeatureCollection = (extracted.features as FeatureCollection); const outputDescriptor = extracted.outputDescriptor; - const height = this.trackDiv.nativeElement.getBoundingClientRect().height; - const waveTrack = this.timeline.getTrackById('main'); + const height = this.trackDiv.nativeElement.getBoundingClientRect().height / 2; + const waveTrack = this.timeline.getTrackById('wave'); // TODO refactor all of this switch (features.shape) { @@ -502,8 +539,8 @@ const matrixEntity = new wavesUI.utils.PrefilledMatrixEntity(matrixData); let matrixLayer = new wavesUI.helpers.MatrixLayer(matrixEntity, { gain, - height: height * 0.8, - top: height * 0.1, + height: height * 0.9, + top: height * 0.05, normalise: 'none', mapper: this.iceMapper() });