Tone.js没有使用React

时间:2017-06-12 19:50:18

标签: javascript reactjs meteor web-audio web-audio-api

我想实现一个基本的Tone Player来加载文件夹中的文件,然后按下ReactJS中的按钮来播放它。

import React, { Component, PropTypes } from 'react';
import ReactDOM from 'react-dom';
import Tone from 'tone';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import Slider from 'material-ui/Slider';
import RaisedButton from 'material-ui/RaisedButton';


let sound = new Tone.Player("kick.wav").toMaster();
export default class App extends Component {

render() {

    return(
        <MuiThemeProvider>
            <div>
                <Slider min={0} max={100} step={10} className = "Slider1Test1" style={{height: 400}} axis="y"/>
                <RaisedButton label="A" className = "RaisedB1Test1" style={{width: 10}}/>

                <Slider min={0} max={100} step={10} className = "Slider2Test1" style={{height: 400}} axis="y"/>
                <RaisedButton label="B" className = "RaisedB2Test1" style={{width: 10}}/>
            </div>
        </MuiThemeProvider>
    );
}
}

但这会产生错误:

  

未捕获(在承诺中)DOMException:无法解码音频数据modules.js?hash = 625032f ...:48100 Uncaught(in promise)Tone.Buffer:   无法解码音频数据:kick.wav

我尝试过“./kick.wav”,“。/ kick.ogg”,“。/ kill.mp3”。我试过给出完整的路径。我尝试通过提供XMLHTTPRequest来仅使用Web音频 - 它始终是相同的错误。

我是新手做出反应 - 如果有正确的方法,请告诉我。我需要使用componentDidMount吗? (我也尝试过使用它。请让我知道正确的方法)。 感谢

1 个答案:

答案 0 :(得分:2)

看起来您正在使用meteor,这会以某种方式阻止您向服务器加载文件的请求。最简单的解决方案是在根目录中创建一个public文件夹,并将样本放在那里。然后将./kick.wav传递给您的Tone.Player构造函数。构造函数在引擎盖下发出GET请求,并自动找到您的文件。随着更改,我必须添加此代码以在缓冲区加载完毕后播放示例:

const x = new Tone.Player('./kick.wav').toMaster()
Tone.Buffer.on('load', () => {
    x.start();
})