HTML5 Web Audio API实现【董小姐】播放

简介:

论坛有人发了matlab实现的董小姐,于是想在自己熟悉的领域也试试看。之前用Python做过发出指定频率的声音,但是这个对第三方库的依赖较大。于是准备在JavaScript中实现。

先发一个不错的参考资料:http://www.html5rocks.com/zh/tutorials/webaudio/intro/

首先需要处理Web Audio API名称的问题,并取得AudioContext的实例:


try {
  // Fix up for prefixing
  window.AudioContext = window.AudioContext || window.webkitAudioContext;
  context = new AudioContext();
} catch (e) {
  alert('Web Audio API is not supported in this browser. Chrome is strongly recommended!');
}


目前对Web Audio的支持,Chrome做的最好,Firefox正在努力,测试版已经实现,IE大家都明白,还不支持。

然后是声音的来源,我选择了MIDI.js中的钢琴声音,引入这个js文件,里面是base64编码后的钢琴各个按键的声音。对编码解码需要用到base64binary.js。用上面取得的context做音频解码。解码后回调函数中,将AudioBuffer存到数组中。这里MIDI.keyToNote是做钢琴按键到数字的转换。


var base64 = notes[key].split(',')[1];
var data = Base64Binary.decodeArrayBuffer(base64);
(function(note) {
  total ++;
  context.decodeAudioData(data, function(buffer) {
    MIDI.soundBuffer[type][note] = buffer;
    // trigger event;
    count ++;
    if(count == total)
      triggerEvent(document, "midi:init");
  })
})(MIDI.keyToNote[key]);

MIDI.playSound = function(note, time) {
  if(callback)
    setTimeout(callback, time * 1000);
  if(note == null || note < MIDI.pianoKeyOffset )
    return;
  var buffer = instrument[note];
  var source = context.createBufferSource(); 
  source.buffer = buffer; 
  source.connect(context.destination); 
  source.start(time);
}


其中context.destination指的是音频输出设备。捎带花了点时间做了歌词播放同步标记,Chrome的timer很准确啊,一首歌下来,音频播放和歌词看不出不同步。

项目代码上传到GitHub:https://github.com/JohnWong/midi-javascript

演示地址:http://impress.sinaapp.com/midi-javascript/missdong.html

目录
相关文章
|
1月前
|
JSON API 数据库
解释如何在 Python 中实现 Web 服务(RESTful API)。
解释如何在 Python 中实现 Web 服务(RESTful API)。
26 0
|
2月前
|
IDE Java API
使用Java Web技术构建RESTful API的实践指南
使用Java Web技术构建RESTful API的实践指南
|
3月前
|
XML 移动开发 前端开发
HTML5简介(什么是网页、什么是 HTML、Web标准)
网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。
37 0
|
3月前
|
前端开发 API Docker
web前端开发项目走proxy代理后端接口,构建发布到生产等环境后,如何修改api接口
web前端开发项目走proxy代理后端接口,构建发布到生产等环境后,如何修改api接口
42 0
|
11天前
|
前端开发 搜索推荐 数据安全/隐私保护
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
HTML标签详解 HTML5+CSS3+移动web 前端开发入门笔记(四)
18 1
|
11天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
29天前
|
移动开发 监控 数据可视化
组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态)
组态软件之万维组态、web组态、html组态、vue2/vue3组态,组态在工业自动化领域越来越重要,但由于市面上组态软件费用昂贵、集成复杂,使用技术门槛高,万维组态就应运而生;万维组态是一款功能强大的基于Web的可视化组态编辑器,采用标准HTML5技术,使用Vue2和Vue3语言,基于B/S架构进行开发,支持WEB端显示;支持快速集成,集成简单方便;支持在浏览器端完成便捷的人机交互,简单的拖拽即可完成可视化页面的设计;可快速构建和部署可扩展的SCADA、HMI、仪表板或LoT系统;
组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态)
|
1月前
|
移动开发 前端开发 HTML5
Web前端全栈HTML5通向大神之路
本套课程共三大阶段,六大部分,是WEB前端、混合开发与全栈开发必须要掌握的技能,从基础到实践,是从编程小白成长为全栈大神的最佳教程!
48 3
Web前端全栈HTML5通向大神之路
|
1月前
|
XML JSON API
通过Flask框架创建灵活的、可扩展的Web Restful API服务
通过Flask框架创建灵活的、可扩展的Web Restful API服务
|
1月前
|
缓存 监控 API
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架
58 0