生命的伊始,婴儿用明亮的哭声宣告一个新生命的诞生,睁开双眼之前,一双小耳朵已经开始聆听这个世界。在如今的用户体验领域,几乎所有公司都会有视觉设计师,却鲜有注重听觉交互的公司。随着各大厂商对HTML5支持的日渐完善,前端工程师其实早已可以摆弄各种音波,让复合型开发走得更远。

  声波是一种机械波,通过波的物理属性我们可以做很多事情。比如,利用声波的频率编码进行数据传递,分析频域或者时域的数据进行可视化应用,或者结合光波的特性做些视听联动。通过HTML5中的Web Auido规范,以上所有都能实现。我在自己的github里面建立了一个项目,整理了之前写的一些web audio相关的东西,欢迎互相学习交流。

  千里之行始于足下,这系列的开篇,我会从基本的如何使用HTML5发出do,ri,mi开始。

  所谓的音乐是由时值和音高组成,这里每一个音高都有自己频率。在web audio中,可以通过oscillator节点,产生指定频率的声音。代码如下:

 var context = new webkitAudioContext(),
osc = context.createOscillator();
osc.frequency.value = 440;
osc.connect(context.destination);
osc.start(0);

通过osc对象frequency属性的value值,上面的代码产生了一个440HZ的音。运行代码浏览器就会持续发出440HZ的音,在12平均律中这就是A1的音高。有了这个基准音,我们就能推断出其他音的频率,让浏览器发出不同音高的声音。至于各中关系,就需要首先介绍一下12平均律。

  在乐理中,每组音由12个音组成,音名分别是C,C#,D,D#,E,F,F#,G,G#,A,A#,B,每2个音之间相差半个音程,同时每相邻半音的频率比值为2^(1/12)。B之后就是C,进入下一个循环,A1就是小字1组中A的频率值。根据半音频率的比值,小字1组中A#的频率就是440*2^(1/12) HZ。

  因为这些音的音高是一定的,且数量有限,所以我们可以预先计算出这些音对应的频率值并储存起来,避免重复计算。读者可根据个人需要决定要初始化的音高数目。

var MusicalAlphabet = ['C','C#','D','D#','E','F','F#','G','G#','A','A#','B'],
freqChat={},
freqRange=3,//C1-B3
i,j,base; for(i=1;i<freqRange;i++){
freqChat[i]={};
base = (i-1)*12;
for(j=0;j<12;j++){
//A1=440
freqChat[i][MusicalAlphabet[j]]=440*Math.pow(2,(base+j-9)/12);
}
}

  在自然C大调中,我们选取C,D,E,F,G,A,B构成一组音。其唱名便对应do,ri,mi,fa,so,la,si。音高只和音名对应,和唱名无关。有了各音高的频率,我们可以很方便地初始化各种调式,不懂音律的同学可以自行搜索学习。

  有了音高,接下来需要学习的就是时值了。要控制一个音符发声的长短,最直接的方法就是调用oscillator节点start和end方法。代码如下:

 var context = new webkitAudioContext();
var osc = context.createOscillator();
osc.frequency.value = 440;
osc.connect(context.destination);
var _c = context.currentTime;
osc.start(_c);
osc.stop(_c+1);

  需要注意的是,web audio有自己的时间轴,通过context对象的currentTime属性可以获取当前时间。根据W3C规范,这是一个只读的属性。oscillator的start和end方法的参数都是double型,所以这里 osc.stop(_c+1)表示的是在当前时间1秒后停止。常见的节拍器上的数字,表示的是一分钟多少拍,这里简单除下就可以得出各个每一拍的物理时间了。

  有了最基本的音高和时值,我们就可以动手写写最简单的谱子了。当然,滑音、颤音、推弦等演奏技巧,失真、混响等效果还需要别的web audio节点的辅助才能完成,这些节点以及开篇讲到的一些技术我都会在以后的博文中慢慢讲述。

  转发请注明出处http://www.cnblogs.com/Arthus/p/4071049.html

摇滚吧HTML5!有声前端交互!(一)的更多相关文章

  1. 摇滚吧HTML5!有声前端交互!(Hello, Jsonic!)

    软件工程师们摆弄1和0编写他们的乌托邦,音乐人门把玩12平均律上的音符构筑他们的伊甸园.最近,我偶然看了<蓝色骨头>这部电影,片中的男主角是位黑客,同时又兼具音乐创作的才华.在现实生活中, ...

  2. 摇滚吧HTML5!Jsonic超声波前端交互!

    前些年吹过一阵canvas制作html5游戏的东风,相信不少同学重温了一把高中物理课本上的牛顿定律.时光如梭,你是否还记得牛顿定律后面一章的各种机械波的物理定律?环视四周,光纤.wifi.蓝牙.广播都 ...

  3. 【自学系列一】HTML5大前端学习路线+视频教程(完整版)

    今年,本公司全新发布了囊括Java.HTML5前端.大数据.Python爬虫.全链UI设计.软件测试.Unity 3D.Go语言等多个技术方向的全套视频. 面对这么多的知识点,有的盆友就麻爪了…… 我 ...

  4. HTML5+CSS3前端开发资源整合

    HTML5+CSS3前端开发资源整合   推个广告 个人网站:http://www.51pansou.com HTML5视频下载:HTML5视频 HTML5源码下载:HTML5源码 meta相关: & ...

  5. [转载]HTML5游戏前端开发秘籍

    http://isux.tencent.com/html5-game-development-cheats.html 转载至腾讯ISUX HTML5游戏前端开发秘籍 本文由米随随编写 QQ空间Andr ...

  6. SpringBoot学习笔记(4):与前端交互的日期格式

    SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...

  7. 了解php数据转json格式与前端交互基础

    php数据转json格式与前端交互 ArryJson1.php <?php $test=array(); $word=array("我12","要43", ...

  8. Dynatable – 基于 HTML5 & jQuery 的交互表格插件

    Dynatable 一款有趣的,语义化,交互式的表格插件,使用 jQuery,HTML5 和 JSON 实现.Dynatable 的目的是提供一种简单的.可扩展的 API,能够轻松的浏览和操作大规模的 ...

  9. 目前几款基于html5的前端框架:如Bootstrap、Foundation、Semantic UI 、Amaze UI

    Bootstrap是由Twitter在2011年8月推出的开源WEB前端框架,集合CSS 和HTML,使用了最新的浏览器技术,为快速WEB开发提供了一套前端工具包,包括布局.网格.表格.按钮.表单.导 ...

随机推荐

  1. 下载doxygen

    官网首页:http://www.stack.nl/~dimitri/doxygen/index.html 下载页面:http://www.stack.nl/~dimitri/doxygen/downl ...

  2. Sqlserver2012 alwayson部署攻略

    http://wenku.baidu.com/link?url=3Gl5nwxE6Rq4ZKGaKWpYZ1D4OdwVLcVeMoGTOmFSILDJzanPy9fwMPRwr7CRu4HhDzXr ...

  3. Java学习日记-4 StringBuffer类和数组

    一.StringBuffer类 StringBuffer是一个可变字符序列. 1.1 构造函数 StringBuffer() 构造一个不带字符的字符缓冲区,初始容量为16个字符. StringBuff ...

  4. H - Food - hdu 4292(简单最大流)

    题目大意:有N个人,然后有F种食品和D种饮料,每个人都有喜欢的饮料和食品,求出来这些食品最多能满足多少人的需求. 输入描述: 分析:以前是做过类似的题目的,不过输入的信息量比较大,还是使用邻接表的好些 ...

  5. H - Can you answer these queries? - (区间查询更新)

    有一列数,(都是2^63范围内的并且都大于0的整数),现在呢有一些操作, 操作 0 可以把区间LR内的所有数都变成它的平方根数(是取整后的),操作 1 可以就是求区间LR内的和了. 分析:因为这个操作 ...

  6. jquery append

    将已经存在的一个dom对象A,通过jquery append插入另一个dom对象B,将会改变dom树结构--即A成为了B的子元素. 举个例子: js: $(".table-container ...

  7. 日积月累:ProguardGui进行jar包代码混淆

    前面文章<Proguard进行源代码混淆>讲解过怎么使用Proguard工具对Android的源代码进行混淆的方法(感兴趣的朋友可以访问:http://blog.csdn.net/p106 ...

  8. LOAD DATA INFILE Syntax--官方

    LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_n ...

  9. 【移动开发】WIFI热点通信(一)

    之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后来发现DEMO里面还是有许 ...

  10. Java学习之路(一)了解Java

    Java“白皮书”的关键术语 1)简单性 相对于C++:没有头文件.指针运算.结构.联合.操作符重载.虚基类. 另一方面是小:java微型版(Java Micro Edition)用于嵌入式设备 2) ...