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

时间: 2024-12-22 21:52:49

HTML5 Web Audio API实现【董小姐】播放的相关文章

开大你的音响,感受HTML5 Audio API带来的视听盛宴

话说HTML5的炫酷真的是让我爱不释手,即使在这个提到IE就伤心不完的年代.但话又说回来,追求卓越Web创造更美世界这样高的追求什么时候又与IE沾过边儿呢?所以当你在看本文并且我们开始讨论HTML5等前沿东西的时候,我们默认是把IE排除在外的.本文的例子可以工作在最新的Chrome及Firefox浏览器下,其他浏览器暂未测试. 若下方未出现演示页面请刷新.  你也可以点此全屏演示  或者前往GitHub进行代码下载然后本地运行. 你还可以 下载示例音乐(如果你手头没有音频文件的话) 文件列表:b

HTML5打造的炫酷本地音乐播放器-喵喵Player

将之前捣腾的音乐频谱效果加上一个播放列表就成了现在的喵喵播放器(Meow meow Player,额知道这名字很二很装萌~),全HTML5打造的网页程序,可本地运行也可以挂服务器上用.   在线Demo及源码 你可以访问下面的地址打开在线demo: http://wayou.github.io/MeowmeowPlayer/ 项目github地址: https://github.com/Wayou/MeowmeowPlayer/   示例音乐下载,提供给硬盘里没有Music的同学:http://

Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!

继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https://github.com/Wayou/3D_Audio_Spectrum_VIsualizer/tree/master 在线演示地址:http://wayou.github.io/3D_Audio_Spectrum_VIsualizer 如果你想的话,可以从这里下载示例音乐:http://pan.b

HTML5 audio标签使用js进行播放控制实例

HTML5 audio标签使用js进行播放控制实例  <audio>标签可以在HTML5浏览器中播放音频文件. <audio>默认提供一个控制面板,但是有些时候我们只需要播放声音,控制面板由我们自己来定义其显示的状态. 这里我们可以使用JS来进行控制,代码如下:   代码如下: var audio ; window.onload = function(){ initAudio(); } var initAudio = function(){ //audio = document.c

HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)

1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息.   但是cookie有下面几个问题: a:大小:cookies的大小被限制在4KB b:带宽:cookies随HTTP事务一起被发送,因此会浪费一部分发送的cookies时使用的带宽. c:复杂性:要正确的操纵cookies是很困难的.   Web Storage分为两种: <1>sessionStorag

html5使用Audio标签打造音乐播放器的例子

这个是我们今天的重头戏,也是一切的根源,使用HTML5的audio标签去打造播放器,在用这个之前我们需要了解些audio标签的基本用法. 你可以这样: <audio controls>   <source src="horse.ogg" type="audio/ogg">   <source src="horse.mp3" type="audio/mpeg"> 您的浏览器不支持 audio

html5的audio标签无法再移动设备上自动播放

做了个微信应用,想加一个背景音乐,使用html5的audio标签在电脑浏览器上上可以自动播放,而在移动设备上无论是设置autoplay属性还是使用js调用play()方法,都不能自动播放,请问有何解决方案. 原因分析 HTML5中的autoplay属性是设置为自动播放.如果设置了该属性,视频或音频将自动播放. 但是需要注意的是部分浏览器比如Safari屏蔽了autoplay属性.因为autoplay在移动网络环境下可能会造成用户流量费剧增. iOS 3.2之前可以通过js模拟一个点击事件来触发,

html5声频audio和视频video

      html5作为下一代web标准,年前轩起了html5热潮.对于html5我只是本着了解看看.关于html5和RIA(silverlight,flash,JavaFx等)我不想说什么,也没有什么可说的,存在就有其存在的理由.孰优孰劣,留给事实.时间来证明的.      在html5中出现了一些新特性: canvas 元素 视频 video 和 声频audio 元素 : 对本地离线存储(localStorage,sessionStorage)的支持 : 新增特殊内容元素:article.

如何用HTML 5 Audio API开发游戏音乐

介绍 音频在很大程度上使得多媒体体验非常引人注目.如果你曾经尝试在关闭声音的情况下看电影,你就很可能 已经注意到了这一点. 游戏也不例外!我最喜爱的视频游戏的回忆里包含了音乐和声效.在二十年后的今天,大多 情况下,当玩我最爱的游戏时,我仍然不能把"塞尔达"里近藤浩二的乐曲和马特大气的暗黑配乐从我的头脑里驱逐掉.这 同样适用于音效,例如魔兽里单位实时点击的响应,以及任天堂的经典例子. 游戏的音频提出了一些有趣的挑战. 要创建令人着迷的游戏音乐,设计人员需要调节潜在的不可预知的状态.实际上