# HG changeset patch # User Lucas Thompson # Date 1490181493 0 # Node ID 376f56200aa108977606d476f48839fd95c82a53 # Parent 4c5b968a1056b598f60e829c3895b62aaca1057c# Parent 8c882ee9d097521bb8fe8066fbb72ef060a427f4 Merge branch 'master' of github.com:cannam/ugly-duckling into feature/list-analysis-cards diff -r 4c5b968a1056 -r 376f56200aa1 src/app/spectrogram/Spectrogram.ts --- a/src/app/spectrogram/Spectrogram.ts Wed Mar 22 11:18:04 2017 +0000 +++ b/src/app/spectrogram/Spectrogram.ts Wed Mar 22 11:18:13 2017 +0000 @@ -79,7 +79,7 @@ const defaults = { normalise: 'hybrid', gain: 40.0, - channel: 0, + channel: -1, stepSize: 512, blockSize: 1024 }; @@ -87,13 +87,30 @@ const mergedOptions: Framing & Object & {channel: number} = Object.assign({}, defaults, options); + const getSamples = ((buffer, channel) => { + const nch = buffer.numberOfChannels; + if (channel >= 0 || nch == 1) { + return buffer.getChannelData(channel); + } else { + const before = performance.now(); + console.log("mixing down " + nch + " channels for spectrogram..."); + const mixed = Float32Array.from(buffer.getChannelData(0)); + const n = mixed.length; + for (let ch = 1; ch < nch; ++ch) { + const buf = buffer.getChannelData(ch); + for (let i = 0; i < n; ++i) mixed[i] += buf[i]; + } + const scale = 1.0 / nch; + for (let i = 0; i < n; ++i) mixed[i] *= scale; + console.log("done in " + (performance.now() - before) + "ms"); + return mixed; + } + }); + super('entity', - new SpectrogramEntity( - buffer.getChannelData(mergedOptions.channel), - mergedOptions - ), - mergedOptions - ); + new SpectrogramEntity(getSamples(buffer, mergedOptions.channel), + mergedOptions), + mergedOptions); this.configureShape(Waves.shapes.Matrix, {}, mergedOptions); } diff -r 4c5b968a1056 -r 376f56200aa1 src/app/waveform/waveform.component.ts --- a/src/app/waveform/waveform.component.ts Wed Mar 22 11:18:04 2017 +0000 +++ b/src/app/waveform/waveform.component.ts Wed Mar 22 11:18:13 2017 +0000 @@ -291,12 +291,20 @@ }); this.addLayer(timeAxis, waveTrack, this.timeline.timeContext, true); - const waveformLayer = new wavesUI.helpers.WaveformLayer(buffer, { - top: 10, - height: height * 0.9, - color: 'darkblue' - }); - this.addLayer(waveformLayer, waveTrack, this.timeline.timeContext); + const nchannels = buffer.numberOfChannels; + const totalWaveHeight = height * 0.9; + const waveHeight = totalWaveHeight / nchannels; + + for (let ch = 0; ch < nchannels; ++ch) { + console.log("about to construct a waveform layer for channel " + ch); + const waveformLayer = new wavesUI.helpers.WaveformLayer(buffer, { + top: (height - totalWaveHeight)/2 + waveHeight * ch, + height: waveHeight, + color: 'darkblue', + channel: ch + }); + this.addLayer(waveformLayer, waveTrack, this.timeline.timeContext); + } this.cursorLayer = new wavesUI.helpers.CursorLayer({ height: height