siriWave.js的demo
demo.html
<style>body { background: #000; }</style>
<script src="../siriwave.js"></script>
<div id="container" style="width: 900px; height: 300px; background: #000"></div>
<script>
	var SW = new SiriWave({
}); var ctx = new (window.AudioContext || window.webkitAudioContext)();
var analyser = ctx.createAnalyser();
analyser.connect(ctx.destination);
analyser.fftSize = 2048; var bufferLength = analyser.frequencyBinCount;
function getAverageVolume(data) {
var values = 0;
var length = data.length;
for (var i = 0; i < data.length; i++) {
values += data[i];
}
return values / data.length;
} window.navigator.getUserMedia(
{ audio: true },
function(stream) {
var input = ctx.createMediaStreamSource(stream);
console.log()
input.connect(analyser); var processor = ctx.createScriptProcessor(2048, 1, 1);
processor.connect(ctx.destination); processor.onaudioprocess = function() {
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var average = getAverageVolume(array);
SW.setAmplitude(average / 140);
};
},
function(){
console.log(1)
}
); </script>
siriwave.js
(function() {
//
// Siri Wave iOS9 Style curve
function SiriWave9Curve(opt) {
	this.controller = opt.controller;
	this.definition = opt.definition;
	this.tick = 0;
	this._respawn();
}
SiriWave9Curve.prototype._respawn = function() {
	this.amplitude = 0.3 + Math.random() * 0.7;
	this.seed = Math.random();
	this.openClass = 2 + (Math.random()*3)|0;
};
SiriWave9Curve.prototype._ypos = function(i) {
	var p = this.tick;
	var y = -1 * Math.abs(Math.sin(p)) * this.controller.amplitude * this.amplitude * this.controller.cache.heightMax * Math.pow(1 / (1 + Math.pow(this.openClass * i, 2)), 2);
	if (Math.abs(y) < 0.001) {
		this._respawn();
	}
	return y;
};
SiriWave9Curve.prototype._draw = function(sign) {
	var ctx = this.controller.ctx;
	this.tick += this.controller.speed * (1 - 0.5 * Math.sin(this.seed * Math.PI));
	ctx.beginPath();
	var xBase = this.controller.cache.width2 + (-this.controller.cache.width4 + this.seed * (this.controller.cache.width2));
	var yBase = this.controller.cache.height2;
	var x, y;
	var xInit = null;
	for (var i = -3; i <= 3; i += 0.01) {
		x = xBase + i * this.controller.cache.width4;
		y = yBase + ((sign || 1) * this._ypos(i));
		xInit = xInit || x;
		ctx.lineTo(x, y);
	}
	var height = Math.abs(this._ypos(0));
	var gradient = ctx.createRadialGradient(xBase, yBase, height * 1.15, xBase, yBase, height * 0.3);
	gradient.addColorStop(0, 'rgba(' + this.definition.color + ', 0.4)');
	gradient.addColorStop(1, 'rgba(' + this.definition.color + ', 0.2)');
	ctx.fillStyle = gradient;
	ctx.lineTo(xInit, yBase);
	ctx.closePath();
	ctx.fill();
};
SiriWave9Curve.prototype.draw = function() {
	this._draw(-1);
	this._draw(1);
};
SiriWave9Curve.prototype.definition = [
{ color: '32,133,252' },
{
	color: '94,252,169'
},
{
	color: '253,71,103'
},
{
	color: '255,252,0'
},
{ color: '253,0,255' }
];
// Standard Curve
function SiriWaveCurve(opt) {
	this.controller = opt.controller;
	this.definition = opt.definition;
}
SiriWaveCurve.prototype._globAttenuationEquation = function(x) {
	if (SiriWaveCurve.prototype._globAttenuationEquation.cache[x] == null) {
		SiriWaveCurve.prototype._globAttenuationEquation.cache[x] = Math.pow(4 / (4 + Math.pow(x, 4)), 4);
	}
	return SiriWaveCurve.prototype._globAttenuationEquation.cache[x];
};
SiriWaveCurve.prototype._globAttenuationEquation.cache = {};
SiriWaveCurve.prototype._xpos = function(i) {
	return this.controller.cache.width2 + i * this.controller.cache.width4;
};
SiriWaveCurve.prototype._ypos = function(i) {
	var att = (this.controller.cache.heightMax * this.controller.amplitude) / this.definition.attenuation;
	return this.controller.cache.height2 + this._globAttenuationEquation(i) * att * Math.sin(this.controller.frequency * i - this.controller.phase);
};
SiriWaveCurve.prototype.draw = function() {
	var ctx = this.controller.ctx;
	ctx.moveTo(0,0);
	ctx.beginPath();
	ctx.strokeStyle = 'rgba(' + this.controller.color + ',' + this.definition.opacity + ')';
	ctx.lineWidth = this.definition.lineWidth;
	for (var i = -2; i <= 2; i += 0.01) {
		var y = this._ypos(i);
		if (Math.abs(i) >= 1.90) y = this.controller.cache.height2;
		ctx.lineTo(this._xpos(i), y);
	}
	ctx.stroke();
};
SiriWaveCurve.prototype.definition = [
{ attenuation: -2, lineWidth: 1, opacity: 0.1 },
{ attenuation: -6, lineWidth: 1, opacity: 0.2 },
{ attenuation: 4, lineWidth: 1, opacity: 0.4 },
{ attenuation: 2, lineWidth: 1, opacity: 0.6 },
{ attenuation: 1, lineWidth: 1.5, opacity: 1 },
];
// Expose API
function SiriWave(opt) {
	opt = opt || {};
	this.phase = 0;
	this.run = false;
	this.cache = {};
	if (opt.container == null) {
		console.warn("SiriWaveJS: no container defined, using body");
		opt.container = document.body;
	}
	this.style = opt.style || 'ios';
	this.container = opt.container;
	this.width = opt.width || window.getComputedStyle(this.container).width.replace('px', '');
	this.height = opt.height || window.getComputedStyle(this.container).height.replace('px', '');
	this.ratio = opt.ratio || window.devicePixelRatio || 1;
	this.cache.width = this.ratio * this.width;
	this.cache.height = this.ratio * this.height;
	this.cache.height2 = this.cache.height / 2;
	this.cache.width2 = this.cache.width / 2;
	this.cache.width4 = this.cache.width / 4;
	this.cache.heightMax = (this.cache.height2) - 4;
	// Constructor opt
	this.amplitude = (opt.amplitude == undefined) ? 1 : opt.amplitude;
	this.speed = (opt.speed == undefined) ? 0.2 : opt.speed;
	this.frequency = (opt.frequency == undefined) ? 6 : opt.frequency;
	this.color = this._hex2rgb(opt.color || '#fff');
	// Interpolation
	this.speedInterpolationSpeed = opt.speedInterpolationSpeed || 0.005;
	this.amplitudeInterpolationSpeed = opt.amplitudeInterpolationSpeed || 0.05;
	this.cache.interpolation = {
		speed: this.speed,
		amplitude: this.amplitude
	};
	// Canvas
	this.canvas = document.createElement('canvas');
	this.ctx = this.canvas.getContext('2d');
	this.canvas.width = this.cache.width;
	this.canvas.height = this.cache.height;
	if (opt.cover) {
		this.canvas.style.width = this.canvas.style.height = '100%';
	} else {
		this.canvas.style.width = (this.cache.width / this.ratio) + 'px';
		this.canvas.style.height = (this.cache.height / this.ratio) + 'px';
	}
	this.curves = [];
	var i = 0, j = 0;
	if (this.style === 'ios9') {
		for (; i < SiriWave9Curve.prototype.definition.length; i++) {
			for (j = 0; j < (3 * Math.random()) | 0; j++) {
				this.curves.push(new SiriWave9Curve({
					controller: this,
					definition: SiriWave9Curve.prototype.definition[i]
				}));
			}
		}
	} else {
		for (; i < SiriWaveCurve.prototype.definition.length; i++) {
			this.curves.push(new SiriWaveCurve({
				controller: this,
				definition: SiriWaveCurve.prototype.definition[i]
			}));
		}
	}
	// Start
	this.container.appendChild(this.canvas);
	if (opt.autostart) {
		this.start();
	}
}
SiriWave.prototype._hex2rgb = function(hex){
	var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
	hex = hex.replace(shorthandRegex, function(m,r,g,b) { return r + r + g + g + b + b; });
	var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
	return result ?
	parseInt(result[1],16).toString()+','+parseInt(result[2], 16).toString()+','+parseInt(result[3], 16).toString()
	: null;
};
SiriWave.prototype._interpolate = function(propertyStr) {
	increment = this[ propertyStr + 'InterpolationSpeed' ];
	if (Math.abs(this.cache.interpolation[propertyStr] - this[propertyStr]) <= increment) {
		this[propertyStr] = this.cache.interpolation[propertyStr];
	} else {
		if (this.cache.interpolation[propertyStr] > this[propertyStr]) {
			this[propertyStr] += increment;
		} else {
			this[propertyStr] -= increment;
		}
	}
};
SiriWave.prototype._clear = function() {
	this.ctx.globalCompositeOperation = 'destination-out';
	this.ctx.fillRect(0, 0, this.cache.width, this.cache.height);
	this.ctx.globalCompositeOperation = 'source-over';
};
SiriWave.prototype._draw = function() {
	for (var i = 0, len = this.curves.length; i < len; i++) {
		this.curves[i].draw();
	}
};
SiriWave.prototype._startDrawCycle = function() {
	if (this.run === false) return;
	this._clear();
	// Interpolate values
	this._interpolate('amplitude');
	this._interpolate('speed');
	this._draw();
	this.phase = (this.phase + Math.PI * this.speed) % (2 * Math.PI);
	if (window.requestAnimationFrame) {
		window.requestAnimationFrame(this._startDrawCycle.bind(this));
	} else {
		setTimeout(this._startDrawCycle.bind(this), 20);
	}
};
/* API */
SiriWave.prototype.start = function() {
	this.phase = 0;
	this.run = true;
	this._startDrawCycle();
};
SiriWave.prototype.stop = function() {
	this.phase = 0;
	this.run = false;
};
SiriWave.prototype.setSpeed = function(v, increment) {
	this.cache.interpolation.speed = v;
};
SiriWave.prototype.setAmplitude = function(v) {
	this.cache.interpolation.amplitude = Math.max(Math.min(v, 1), 0);
};
if (typeof define === 'function' && define.amd) {
	define(function(){ return SiriWave; });
} else {
	window.SiriWave = SiriWave;
}
//
})();
siriWave.js的demo的更多相关文章
- Three.js基本 Demo
		对于新手来说,几个简单的例子非常实用,偶然发现几个不错的Demo,分享给大家! Three.js基本 Demo 1.最基本的Hello World:http://stemkoski.github.io ... 
- 微信JS SDK Demo 官方案例[转]
		摘要: 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用 ... 
- 微信JS SDK Demo
		微信JS-SDK 分享到朋友圈 分享给朋友 分享到QQ 拍照或从手机相册中选图 识别音频并返回识别结果 使用微信内置地图查看位置原文:http://www.cnblogs.com/txw1958/p/ ... 
- 微信JS SDK Demo 官方案例
		微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享 ... 
- 高德地图根据经纬度转换成地址JS代码demo
		<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ... 
- [整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题
		花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是遇到了些问题,特整理在此. <1>.由于node.msi安装包已经自动添加了 ... 
- js闭包Demo
		我们先看一个关于Javascript利用循环绑定事件的例子: 例如:一个不确定长度的列表,在鼠标经过某一条的时候改变背景. ﹤!DOCTYPE html PUBLIC "-//W3C// ... 
- anguar.js tutorial demo
		http://docs.angularjs.cn/tutorial angular 入门demo : PhoneCat Tutorial App 别人的DEMO(官方版):http://angular ... 
- Vue2.0 vue-source.js  jsonp demo  vue跨域请求
		以调用百度的输入提示接口为例 ===================================================================================== ... 
随机推荐
- 解决You are using pip version 10.0.1, however version 18.1 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command.
			pip install ...出现问题 直接输入python - pip install --upgrade pip就可以了 
- tableView header Refresh 下拉刷新/上拉加载
			一. UIScrollView 的分类 //作为入口 #import <UIKit/UIKit.h> #import "RefreshHeader.h" #import ... 
- C#中简单操作Mysql数据库
			以C#访问MySQL数据库,执行简单的CRUD. MySql.Data.dll是C#操作MySQL的驱动文件,是C#连接MySQL必要插件,使C#语言更简洁的操作MySQL数据库.可以用NuGet命令 ... 
- Angular material mat-icon 资源参考_Toggle
			ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ... 
- Python——免费观看全网视频小程序
			说明,这个小程序是基于网站“全民解析”,调用该网站的接口,实现数据传输观看视频,若该网站凉凉,则此程序凉凉. 开始之前的分析: 进入全民解析网站,我们首先查看一下网页的html代码,发现该站观看视频的 ... 
- 批量生成python自动化测试脚本
			先前有家供应商与我们合作开发自动化工程,采用的py unittest作为脚本运行框架.我发现他们出的脚本都是挨个手写的,格式上也是参差不齐.所以有了根据用例表批量生成脚本的一段小代码 对一个测试脚本必 ... 
- storm(3)-本机模式-helloworld
			pom.xml <dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-c ... 
- CentOS6.5安装testlink1.9.14
			前提条件:准备一台CentOS6.5虚拟机,配置好IP,关闭iptables和selinux. 这里提供上我的云盘软件,可以去这里下载:http://pan.baidu.com/s/1qXymele ... 
- JDBC(2)-使用statment接口实现增删改操作
			1.Statement接口引入 作用:用于执行静态SQL语句并返回它所生成结果的对象. int executeUpdate(String sql) :执行给定SQL语句,该语句可能为insert.up ... 
- how to install mapr sandbox
			Sometimes we need a standalone envrionment to test Hadoop and Spark, mapr is a choice to do that in ... 
