diff --git a/src/components/chorus.js b/src/components/chorus.js index ba161db..9dd705b 100644 --- a/src/components/chorus.js +++ b/src/components/chorus.js @@ -5,7 +5,7 @@ import PropTypes from 'prop-types' import Tuna from 'tunajs'; type Props = { - bypass?: number; + bypass?: bool; children?: any; delay?: number; feedback?: number; @@ -22,14 +22,14 @@ export default class Chorus extends Component { context: Context; props: Props; static propTypes = { - bypass: PropTypes.number, + bypass: PropTypes.bool, children: PropTypes.node, delay: PropTypes.number, feedback: PropTypes.number, rate: PropTypes.number, }; static defaultProps = { - bypass: 0, + bypass: false, delay: 0.0045, feedback: 0.2, rate: 1.5, diff --git a/src/components/delay.js b/src/components/delay.js index ad9bb16..6c23e5d 100644 --- a/src/components/delay.js +++ b/src/components/delay.js @@ -5,7 +5,7 @@ import PropTypes from 'prop-types' import Tuna from 'tunajs'; type Props = { - bypass?: number; + bypass?: bool; children?: any; cutoff?: number; delayTime?: number; @@ -24,7 +24,7 @@ export default class Delay extends Component { context: Context; props: Props; static propTypes = { - bypass: PropTypes.number, + bypass: PropTypes.bool, children: PropTypes.node, cutoff: PropTypes.number, delayTime: PropTypes.number, @@ -33,7 +33,7 @@ export default class Delay extends Component { wetLevel: PropTypes.number, }; static defaultProps = { - bypass: 0, + bypass: false, cutoff: 2000, delayTime: 150, dryLevel: 1, diff --git a/src/components/overdrive.js b/src/components/overdrive.js index 264d3df..bd74ad2 100644 --- a/src/components/overdrive.js +++ b/src/components/overdrive.js @@ -6,7 +6,7 @@ import Tuna from 'tunajs'; type Props = { algorithmIndex?: number; - bypass?: number; + bypass?: bool; children?: any; curveAmount?: number; drive?: number; @@ -24,7 +24,7 @@ export default class Overdrive extends Component { props: Props; static propTypes = { algorithmIndex: PropTypes.number, - bypass: PropTypes.number, + bypass: PropTypes.bool, children: PropTypes.node, curveAmount: PropTypes.number, drive: PropTypes.number, @@ -32,7 +32,7 @@ export default class Overdrive extends Component { }; static defaultProps = { algorithmIndex: 0, - bypass: 0, + bypass: false, curveAmount: 1, drive: 0.7, outputGain: 0.5, diff --git a/src/components/phaser.js b/src/components/phaser.js new file mode 100644 index 0000000..2e44bd6 --- /dev/null +++ b/src/components/phaser.js @@ -0,0 +1,86 @@ +// @flow +/* eslint-disable no-restricted-syntax */ +import React, { Component } from 'react'; +import PropTypes from 'prop-types' +import Tuna from 'tunajs'; + +type Props = { + bypass?: bool; + children?: any; + baseModulationFrequency?: number, + stereoPhase?: number, + depth?: number, + feedback?: number, + rate?: number, +}; + +type Context = { + audioContext: Object; + connectNode: Object; +}; + +export default class Phaser extends Component { + connectNode: Object; + context: Context; + props: Props; + static propTypes = { + bypass: PropTypes.bool, + children: PropTypes.node, + baseModulationFrequency: PropTypes.number, + stereoPhase: Proptypes.number, + depth: PropTypes.number, + feedback: PropTypes.number, + rate: PropTypes.number, + }; + static defaultProps = { + rate: 0.1, + depth: 0.6, + feedback: 0.7, + stereoPhase: 40, + baseModulationFrequency: 700, + bypass: false + }; + static contextTypes = { + audioContext: PropTypes.object, + connectNode: PropTypes.object, + }; + static childContextTypes = { + audioContext: PropTypes.object, + connectNode: PropTypes.object, + }; + constructor(props: Props, context: Context) { + super(props); + + const tuna = new Tuna(context.audioContext); + + this.connectNode = phaser = new tuna.Phaser({ + rate: props.rate, + depth: props.depth, + feedback: props.feedback, + stereoPhase: props.stereoPhase, + baseModulationFrequency: props.baseModulationFrequency, + bypass: props.bypass + }); + + this.connectNode.connect(context.connectNode); + } + getChildContext(): Object { + return { + ...this.context, + connectNode: this.connectNode, + }; + } + componentWillReceiveProps(nextProps: Props) { + for (const prop in nextProps) { + if (this.connectNode[prop]) { + this.connectNode[prop] = nextProps[prop]; + } + } + } + componentWillUnmount() { + this.connectNode.disconnect(); + } + render(): React.Element { + return {this.props.children}; + } +} diff --git a/src/components/reverb.js b/src/components/reverb.js index c15d378..4c61186 100644 --- a/src/components/reverb.js +++ b/src/components/reverb.js @@ -5,7 +5,7 @@ import PropTypes from 'prop-types' import Tuna from 'tunajs'; type Props = { - bypass?: number; + bypass?: bool; children?: any; dryLevel?: number; highCut?: number; @@ -25,7 +25,7 @@ export default class Reverb extends Component { context: Context; props: Props; static propTypes = { - bypass: PropTypes.number, + bypass: PropTypes.bool, children: PropTypes.node, dryLevel: PropTypes.number, highCut: PropTypes.number, @@ -35,7 +35,7 @@ export default class Reverb extends Component { wetLevel: PropTypes.number, }; static defaultProps = { - bypass: 0, + bypass: false, dryLevel: 0.5, highCut: 22050, impulse: 'reverb/room.wav', diff --git a/src/index.js b/src/index.js index 6f672e3..10a8165 100644 --- a/src/index.js +++ b/src/index.js @@ -2,6 +2,7 @@ import Analyser from './components/analyser.js'; import Bitcrusher from './components/bitcrusher.js'; import Bus from './components/bus.js'; import Chorus from './components/chorus.js'; +import Phaser from './components/phaser.js'; import Compressor from './components/compressor.js'; import Delay from './components/delay.js'; import Filter from './components/filter.js'; @@ -22,6 +23,7 @@ export { Bus, Bitcrusher, Chorus, + Phaser, Compressor, Delay, Filter,