audiolet实现雷达式音调点添加编写音乐效果代码
代码语言:html
所属分类:多媒体
代码描述:audiolet实现雷达式音调点添加编写音乐效果代码,点击选择不同的音调在雷达中添加,就会有随着雷达波播放声音。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<style>
/*********************************************
* GLOBAL
*********************************************/
body, html {
overflow: hidden;
font-family: Helvetica, Arial, sans-serif;
color: #fff;
font-size: 11px;
background: #111;
height: 100%;
}
.main-container {
background: #111;
}
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
/*********************************************
* HEADER
*********************************************/
header {
position: relative;
width: 100%;
height: 36px;
margin: 0;
padding: 0 8px 8px 8px;
overflow: hidden;
z-index: 5;
background: #1e2121;
color: #eee;
-webkit-transition: height .22s ease-out;
-moz-transition: height .22s ease-out;
-o-transition: height .22s ease-out;
transition: height .22s ease-out;
}
header.open {
height: 165px;
}
header h1 {
font-family: Molengo, Helvetica, Arial, sans-serif;
float: left;
margin-top: 1px;
}
header .header-instruction {
float: left;
margin: 12px 0 0 15px;
font-size: 10px;
font-style: italic;
color: #999;
-webkit-transition: opacity .18s linear;
-moz-transition: opacity .18s linear;
-o-transition: opacity .18s linear;
transition: opacity .18s linear;
}
header.open .header-instruction {
opacity: 0;
}
header div.extra {
margin: 45px 0 0 20px;
clear: both;
-webkit-transition: opacity .18s linear;
-moz-transition: opacity .18s linear;
-o-transition: opacity .18s linear;
transition: opacity .18s linear;
}
header div.extra h3 {
margin-bottom: 10px;
}
header a {
color: #19d75a;
text-decoration: underline;
-webkit-transition: all .1s ease-out;
-moz-transition: all .1s ease-out;
-o-transition: all .1s ease-out;
transition: all .1s ease-in;
}
header a:hover {
color: #67f38f;
}
header section {
height: 120px;
padding: 0 25px;
float: left;
border-left: 1px #333 solid;
}
header p {
margin-bottom: 5px;
font-size: 12px;
letter-spacing: 0.05em;
}
#about {
padding-left: 0;
border: none;
}
#about p.credits {
margin: 15px 0 2px 0;
font-style: italic;
color: #666;
font-size: 11px;
line-height: 1.4em;
}
#share iframe,
#share div {
display: inline-block;
}
#retweet-button {
margin-right: 6px;
}
.no-canvas {
color: #999999;
font-size: 24px;
text-align: center;
margin-top: 150px;
}
/*********************************************
* EXPERIMENT STYLES
*********************************************/
#wrapper {
position: absolute;
font-size: 12px;
color: #f4f4f4;
cursor: default;
}
#wrapper canvas {
float: left;
background: #000;
background: url('../images/background.png') no-repeat;
border: 1px solid #222;
border-radius: 2px;
box-shadow: 0px 0px 20px rgba(0,0,0,0.5);
}
#wrapper .instructions {
display: block;
position: absolute;
left: 0px;
top: -22px;
opacity: 0;
-webkit-transition: all .12s ease;
-moz-transition: all .12s ease;
-ms-transition: all .12s ease;
-o-transition: all .12s ease;
transition: all .12s ease;
}
#wrapper.empty .instructions {
opacity: 1;
}
#wrapper .sidebar {
position: absolute;
right: 0;
top: 0;
width: 100px;
color: #fff;
opacity: 1;
font-size: 12px;
-webkit-transition: all .12s ease;
-moz-transition: all .12s ease;
-ms-transition: all .12s ease;
-o-transition: all .12s ease;
transition: all .12s ease;
}
#wrapper.empty .sidebar {
opacity: 0;
visibility: hidden;
}
#wrapper .sidebar button {
display: inline-block;
width: 48%;
padding: 6px;
margin-bottom: 14px;
color: #bbb;
background: rgba( 255, 255, 255, 0.05 );
opacity: 1;
border: none;
border-radius: 2px;
cursor: pointer;
font-size: 12px;
text-align: center;
-webkit-transition: all .12s ease;
-moz-transition: all .12s ease;
-ms-transition: all .12s ease;
-o-transition: all .12s ease;
transition: all .12s ease;
}
#wrapper .sidebar button:hover {
opacity: 1;
color: #fff;
background: rgba( 255, 255, 255, 0.2 );
}
/* SEQUENCER */
#wrapper .sidebar .sequencer {
padding-top: 14px;
border-top: 1px dotted rgba( 255, 255, 255, 0.08 );
}
#wrapper .sidebar .sequencer li {
display: block;
position: relative;
padding: 10px 6px;
margin-bottom: 4px;
width: 100%;
cursor: pointer;
background: #222;
box-shadow: 0px 0px 20px rgba(0,0,0,0.5);
border-radius: 2px;
-webkit-transition: all .12s ease;
-moz-transition: all .12s ease;
-ms-transition: all .12s ease;
-o-transition: all .12s ease;
transition: all .12s ease;
}
#wrapper .sidebar .sequencer li:hover {
background: #333;
}
#wrapper .sidebar .sequencer li .index {
opacity: 0.5;
}
#wrapper .sidebar .sequencer li .delete {
position: absolute;
right: 7px;
top: 3px;
font-family: Helvetica;
font-size: 20px;
opacity: 0.1;
}
#wrapper .sidebar .sequencer li:hover .delete {
opacity: 0.6;
}
#wrapper .sidebar .sequencer li .delete:hover {
opacity: 1;
}
#wrapper .sidebar .sequencer li .background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
-webkit-transition: opacity 1.5s linear;
-moz-transition: opacity 1.5s linear;
-ms-transition: opacity 1.5s linear;
-o-transition: opacity 1.5s linear;
transition: opacity 1.5s linear;
}
#wrapper .sidebar .sequencer li .background.instant {
-webkit-transition: none;
-moz-transition: none;
-ms-transition: none;
-o-transition: none;
transition: none;
}
#wrapper .sidebar .sequencer li.add-key {
background: #111;
color: #fff;
border: 1px solid rgba( 255, 255, 255, 0.05 );
}
#wrapper .sidebar .sequencer li.add-key:hover {
background: #222;
}
#wrapper .sidebar .sequencer-input {
visibility: hidden;
position: absolute;
width: 100px;
left: 0;
border-radius: 2px;
background: #222;
}
#wrapper .sidebar .sequencer-input:before {
content: '\2023';
position: absolute;
margin: 76px 0 0 100%;
left: -4px;
color: #222;
font-size: 50px;
}
#wrapper .sidebar .sequencer-input li {
padding: 10px 6px;
background: #222;
cursor: pointer;
-webkit-transition: all .12s ease;
-moz-transition: all .12s ease;
-ms-transition: all .12s ease;
-o-transition: all .12s ease;
transition: all .12s ease;
}
#wrapper .sidebar .sequencer-input li:hover {
background: #333;
}
#wrapper .sidebar .sequencer-input li+li {
border-top: 1px solid #333;
}
</style>
<link href='https://fonts.googleapis.com/css?family=Molengo' rel='stylesheet' type='text/css'>
</head>
<body>
<div class="main-container">
<div id="wrapper" class="empty">
<canvas></canvas>
<div class="sidebar">
<button class="save">Save</button>
<button class="reset">Reset</button>
<ul class="sequencer-input">
<li data-key="a" data-scale="min">A minor</li>
<li data-key="a" data-scale="maj">A major</li>
<li data-key="d" data-scale="min">D minor</li>
<li data-key="d" data-scale="maj">D major</li>
<li data-key="e" data-scale="min">E minor</li>
<li data-key="e" data-scale="maj">E major</li>
</ul>
<ul class="sequencer">
<li class="add-key">Add Key</li>
</ul>
</div>
<span class="instructions">Click on a pin to generate sound</span>
</div>
</div>
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/audiolet.js"></script>
<script>
/**
*
*/
var Capabilities = {
isOnline: function() {
return navigator.onLine;
},
isTouchDevice: function() {
return navigator.userAgent.match( /(iphone|ipad|ipod|android)/gi );
},
suportsLocalStorage: function() {
return ('localStorage' in window) && window['localStorage'] !== null;
}
};
/**
* Defines a 2D position.
*/
function Point( x, y ) {
this.x = x || 0;
this.y = y || 0;
}
Point.prototype.distanceTo = function( x, y ) {
var dx = x-this.x;
var dy = y-this.y;
return Math.sqrt(dx*dx + dy*dy);
};
Point.prototype.clonePosition = function() {
return { x: this.x, y: this.y };
};
Point.prototype.interpolate = function( x, y, amp ) {
this.x += ( x - this.x ) * amp;
this.y += ( y - this.y ) * amp;
};
/**
* Defines of a rectangular region.
*/
function Region() {
this.left = 999999;
this.top = 999999;
this.right = 0;
this.bottom = 0;
}
Region.prototype.reset = function() {
this.left = 999999;
this.top = 999999;
this.right = 0;
this.bottom = 0;
};
Region.prototype.inflate = function( x, y ) {
this.left = Math.min(this.left, x);
this.top = Math.min(this.top, y);
this.right = Math.max(this.right, x);
this.bottom = Math.max(this.bottom, y);
};
Region.prototype.expand = function( x, y ) {
this.left -= x;
this.top -= y;
this.right += x;
this.bottom += y;
};
Region.prototype.contains = function( x, y ) {
return x > this.left && x < this.right && y > this.top && y < this.bottom;
};
Region.prototype.size = function() {
return ( ( this.right - this.left ) + ( this.bottom - this.top ) ) / 2;
};
Region.prototype.center = function() {
return new Point( this.left + (this.right - this.left) / 2, this.top + (this.bottom - this.top) / 2 );
};
Region.prototype.toRectangle = function() {
return { x: this.left, y: this.top, width: this.right - this.left, height: this.bottom - this.top };
};
// shim layer with setTimeout fallback from http://paulirish.com/2011/requestanimationframe-for-smart-animating/
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback, /* DOMElement */ element){
window.setTimeout(callback, 1000 / 60);
};
})();
</script>
<script>
/**
* @author Hakim El Hattab
*/
var Radar = (function(){
var NODES_X = 12,
NODES_Y = 12,
BEAT_VELOCITY = 0.01,
BEAT_FREQUENCY = 2,
BEAT_LIMIT = 10,
// Distance threshold between active node and beat
ACTIVATION_DISTANCE = 20,
// Number of neighboring nodes to push aside on impact
WAVE_RADIUS = 3;
// The world dimensions
var world = {
width: 600,
height: 500,
center: new Point( 300, 250 )
};
// Mouse input tracking
var mouse = {
// The current position
x: 0,
y: 0,
// The position previous to the current
previousX: 0,
previousY: 0,
// The velocity, based on the difference between
// the current and next positions
velocityX: 0,
velocityY: 0,
// Flags if the mouse is currently pressed down
down: false,
// When dragging the action is defined by the first nodes
// reaction (activate/deactivate)
action: null,
// A list of node ID's for which action should not be
// taken until the next time the mouse is pressed down
exclude: []
};
var id = 0,
container,
canvas,
context,
sidebar,
sequencer,
sequencerInput,
sequencerInputElements,
sequencerAddButton,
saveButton,
resetButton,
query = {},
currentBeat = null,
defaultBeats = [
[ 'a', 'min' ],
[ 'a', 'min' ]
],
activateNodeDistance = 0,
// Seed is used to generate the note field so that random
// one persons's grid can be saved & replicated
// Some patterns to try:
// ?8643+d+maj+8+30+43+55+66+69
// ?8643+a+min+30+43+44+55+58+93+106+141
seed = Math.floor( Math.random() * 10000 ),
nodes = [],
savedNodes = [],
beats = [];
// Generate some scales (a, d & e)
// Freque.........完整代码请登录后点击上方下载按钮下载查看
网友评论0