summaryrefslogtreecommitdiff
path: root/animism-align/frontend/views/align/components/waveform.component.js
diff options
context:
space:
mode:
Diffstat (limited to 'animism-align/frontend/views/align/components/waveform.component.js')
-rw-r--r--animism-align/frontend/views/align/components/waveform.component.js108
1 files changed, 108 insertions, 0 deletions
diff --git a/animism-align/frontend/views/align/components/waveform.component.js b/animism-align/frontend/views/align/components/waveform.component.js
new file mode 100644
index 0000000..d4ff913
--- /dev/null
+++ b/animism-align/frontend/views/align/components/waveform.component.js
@@ -0,0 +1,108 @@
+import React, { Component } from 'react'
+// import { Link } from 'react-router-dom'
+// import { bindActionCreators } from 'redux'
+import { connect } from 'react-redux'
+
+import actions from '../../../actions'
+// import * as uploadActions from './upload.actions'
+
+import { DEFAULT_HEIGHT, WAVEFORM_HEIGHT, ZOOM_STEPS, ZOOM_LABEL_STEPS, ZOOM_TICK_STEPS } from '../constants'
+
+class Waveform extends Component {
+ constructor(props){
+ super(props)
+ this.canvasRef = React.createRef()
+ }
+ componentDidMount() {
+ this.resize()
+ this.draw()
+ }
+ componentDidUpdate() {
+ this.draw()
+ }
+ resize() {
+ const canvas = this.canvasRef.current
+ canvas.width = window.innerWidth
+ canvas.height = DEFAULT_HEIGHT
+ }
+ draw() {
+ const canvas = this.canvasRef.current
+ const ctx = canvas.getContext('2d')
+ const w = window.innerWidth
+ this.clearCanvas(ctx, w)
+ this.drawCurve(ctx, w)
+ }
+ clearCanvas(ctx, w) {
+ const h = WAVEFORM_HEIGHT
+ ctx.clearRect(0, 0, w, h)
+ ctx.fillStyle = 'rgba(0,0,0,0.5)'
+ ctx.fillRect(0, 0, w, h)
+ ctx.fillStyle = 'rgba(64,128,192,0.5)'
+ }
+ drawCurve(ctx, w) {
+ let { peaks, timeline } = this.props
+ let { start_ts, zoom, duration } = timeline
+
+ // console.log(start_ts)
+ // start_ts *= 10
+
+ let secondsPerPixel = ZOOM_STEPS[zoom] / 10 // 0.1 sec / step
+ let stepsPerPixel = ZOOM_STEPS[zoom] // 0.1 sec / step
+ let indexesPerPixel = stepsPerPixel * 2
+
+ let widthTimeDuration = window.innerWidth * secondsPerPixel // secs per pixel
+
+ let timeMin = start_ts
+ let timeMax = Math.min(start_ts + widthTimeDuration, duration)
+
+ let pixelMin = timeMin / secondsPerPixel
+ let pixelMax = timeMax / secondsPerPixel
+
+ // console.log('wf start_ts', pixelMin)
+
+ let stepMin = Math.floor(pixelMin * 2)
+ let stepMax = Math.floor(pixelMax * 2)
+ let stepWidth = stepMax - stepMin
+
+ let i = 0
+ let step = stepMin
+ let waveformPeak = WAVEFORM_HEIGHT / 2
+ let origin = (1 - peaks[step]) * waveformPeak
+ let y = origin
+ let peak
+
+ ctx.beginPath()
+ ctx.moveTo(0, y)
+ for (i = 0; i < stepWidth; i++) {
+ step = i * indexesPerPixel + stepMin
+ peak = peaks[step]
+ y = (1 - peak) * waveformPeak
+ ctx.lineTo(i, y)
+ }
+ for (i = stepWidth - 1; i > 0; i--) {
+ step = i * indexesPerPixel + stepMin
+ peak = peaks[step]
+ y = (1 + peak) * waveformPeak
+ ctx.lineTo(i, y)
+ }
+ ctx.lineTo(0, origin)
+ ctx.fillStyle = 'rgba(255,255,255,0.8)'
+ ctx.fill()
+ }
+ render() {
+ return (
+ <canvas ref={this.canvasRef} />
+ )
+ }
+}
+
+const mapStateToProps = state => ({
+ timeline: state.align.timeline,
+ peaks: state.site.peaks,
+})
+
+const mapDispatchToProps = dispatch => ({
+ // uploadActions: bindActionCreators({ ...uploadActions }, dispatch),
+})
+
+export default connect(mapStateToProps, mapDispatchToProps)(Waveform)