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

目录
相关文章
|
24天前
|
人工智能 前端开发 API
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Gemini Coder 是一款基于 Google Gemini API 的 AI 应用生成工具,支持通过文本描述快速生成代码,并提供实时代码编辑和预览功能,简化开发流程。
114 38
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
|
2月前
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
82 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
|
3月前
|
Web App开发 移动开发 iOS开发
HTML5 Audio(音频)
HTML5 Audio 标准允许网页直接播放音频文件,无需依赖插件。通过 `&lt;audio&gt;` 标签,开发者可以在网页中嵌入音频,支持多种格式如 MP3、WAV 和 Ogg。主流浏览器如 IE9+、Firefox、Chrome、Safari 和 Opera 均支持此功能,但不同浏览器对音频格式的支持存在差异。使用 `&lt;source&gt;` 标签可指定多个源文件,确保兼容性。
|
3月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
78 1
|
3月前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
220 2
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
Web开发者必看:手把手教你如何轻松播放m3u8流地址,解锁视频播放新技能,让你的项目更上一层楼!
【10月更文挑战第23天】随着互联网技术的发展,m3u8格式因良好的兼容性和高压缩率被广泛用于网络流媒体传输。本文介绍如何在Web端播放m3u8流地址,包括引入视频播放器(如Video.js)、创建播放器容器、初始化播放器及播放m3u8流的具体步骤。此外,还涉及处理加密m3u8流的示例。
683 1
|
4月前
|
监控 负载均衡 API
Web、RESTful API 在微服务中有哪些作用?
在微服务架构中,Web 和 RESTful API 扮演着至关重要的角色。它们帮助实现服务之间的通信、数据交换和系统的可扩展性。
81 2
|
Web App开发 JavaScript 前端开发
ASP.NET MVC Web API 学习笔记---第一个Web API程序
1. Web API简单说明 近来很多大型的平台都公开了Web API。比如百度地图 Web API,做过地图相关的人都熟悉。公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScript来创建更丰富的HTML体验。
1165 0

热门文章

最新文章