@ -0,0 +1,42 @@ |
|||||
|
# Logs |
||||
|
logs |
||||
|
*.log |
||||
|
npm-debug.log* |
||||
|
|
||||
|
# Runtime data |
||||
|
pids |
||||
|
*.pid |
||||
|
*.seed |
||||
|
*.pid.lock |
||||
|
|
||||
|
# Directory for instrumented libs generated by jscoverage/JSCover |
||||
|
lib-cov |
||||
|
|
||||
|
# Coverage directory used by tools like istanbul |
||||
|
coverage |
||||
|
|
||||
|
# nyc test coverage |
||||
|
.nyc_output |
||||
|
|
||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) |
||||
|
.grunt |
||||
|
|
||||
|
# node-waf configuration |
||||
|
.lock-wscript |
||||
|
|
||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html) |
||||
|
build/Release |
||||
|
|
||||
|
# Dependency directories |
||||
|
node_modules |
||||
|
bower_components |
||||
|
jspm_packages |
||||
|
|
||||
|
# Optional npm cache directory |
||||
|
.npm |
||||
|
|
||||
|
# Optional eslint cache |
||||
|
.eslintcache |
||||
|
|
||||
|
# Optional REPL history |
||||
|
.node_repl_history |
@ -0,0 +1,10 @@ |
|||||
|
{ |
||||
|
"name": "p5jsTesting", |
||||
|
"homepage": "https://github.com/arnaucode/p5jsTesting", |
||||
|
"description": "", |
||||
|
"license": "MIT", |
||||
|
"dependencies": { |
||||
|
"tracking": "^1.1.3", |
||||
|
"pizzicato": "^0.5.1" |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<script src="libs/clmtrackr.js"></script> |
||||
|
<script src="model_pca_20_svm.js"></script> |
||||
|
<script src="//cdn.jsdelivr.net/p5.js/0.3.11/p5.min.js"></script> |
||||
|
<script src="libs/p5.dom.js"></script> |
||||
|
<script src="sketch.js"></script> |
||||
|
|
||||
|
<style> body { padding: 0; margin: 0} </style> |
||||
|
|
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,882 @@ |
|||||
|
/*! p5.dom.js v0.1.5 November 7, 2014 */ |
||||
|
/** |
||||
|
* <p>The web is much more than just canvas and p5.dom makes it easy to interact |
||||
|
* with other HTML5 objects, including text, hyperlink, image, input, video, |
||||
|
* audio, and webcam.</p> |
||||
|
* <p>There is a set of creation methods, DOM manipulation methods, and |
||||
|
* an extended p5.Element that supports a range of HTML elements. See the |
||||
|
* <a href="https://github.com/lmccart/p5.js/wiki/Beyond-the-canvas"> |
||||
|
* beyond the canvas tutorial</a> for a full overview of how this addon works. |
||||
|
* |
||||
|
* <p>Methods and properties shown in black are part of the p5.js core, items in |
||||
|
* blue are part of the p5.dom library. You will need to include an extra file |
||||
|
* in order to access the blue functions. See the |
||||
|
* <a href="http://p5js.org/libraries/#using-a-library">using a library</a> |
||||
|
* section for information on how to include this library. p5.dom comes with |
||||
|
* <a href="http://p5js.org/download">p5 complete</a> or you can download the single file |
||||
|
* <a href="https://raw.githubusercontent.com/lmccart/p5.js/master/lib/addons/p5.dom.js"> |
||||
|
* here</a>.</p> |
||||
|
* <p>See <a href="https://github.com/lmccart/p5.js/wiki/Beyond-the-canvas">tutorial: beyond the canvas]</a> |
||||
|
* for more info on how to use this libary.</a> |
||||
|
* |
||||
|
* @module p5.dom |
||||
|
* @submodule p5.dom |
||||
|
* @for p5.dom |
||||
|
* @main |
||||
|
*/ |
||||
|
|
||||
|
var p5DOM = (function(){ |
||||
|
|
||||
|
// =============================================================================
|
||||
|
// p5 additions
|
||||
|
// =============================================================================
|
||||
|
|
||||
|
/** |
||||
|
* Searches the page for an element with given ID and returns it as |
||||
|
* a p5.Element. The DOM node itself can be accessed with .elt. |
||||
|
* Returns null if none found. |
||||
|
* |
||||
|
* @method getElement |
||||
|
* @param {String} id id of element to search for |
||||
|
* @return {Object/p5.Element|Null} p5.Element containing node found |
||||
|
*/ |
||||
|
p5.prototype.getElement = function (e) { |
||||
|
var res = document.getElementById(e); |
||||
|
if (res) { |
||||
|
return new p5.Element(res); |
||||
|
} else { |
||||
|
return null; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Searches the page for elements with given class and returns an |
||||
|
* array of p5.Elements. The DOM nodes themselves can be accessed |
||||
|
* with .elt. Returns an empty array if none found. |
||||
|
* |
||||
|
* @method getElements |
||||
|
* @param {String} class class name of elements to search for |
||||
|
* @return {Array} array of p5.Element wrapped nodes found |
||||
|
*/ |
||||
|
p5.prototype.getElements = function (e) { |
||||
|
var arr = []; |
||||
|
var res = document.getElementsByClassName(e); |
||||
|
if (res) { |
||||
|
for (var j = 0; j < res.length; j++) { |
||||
|
var obj = new p5.Element(res[j]); |
||||
|
arr.push(obj); |
||||
|
} |
||||
|
} |
||||
|
return arr; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Removes all elements created by p5, except any canvas / graphics |
||||
|
* elements created by createCanvas or createGraphics. |
||||
|
* Event handlers are removed, and element is removed from the DOM. |
||||
|
* @method removeElements |
||||
|
* @example |
||||
|
* <div class='norender'><code> |
||||
|
* function setup() { |
||||
|
* createCanvas(100, 100); |
||||
|
* createDiv('this is some text'); |
||||
|
* createP('this is a paragraph'); |
||||
|
* } |
||||
|
* function mousePressed() { |
||||
|
* removeElements(); // this will remove the div and p, not canvas
|
||||
|
* } |
||||
|
* </code></div> |
||||
|
* |
||||
|
*/ |
||||
|
p5.prototype.removeElements = function (e) { |
||||
|
for (var i=0; i<this._elements.length; i++) { |
||||
|
if (!(this._elements[i].elt instanceof HTMLCanvasElement)) { |
||||
|
this._elements[i].remove(); |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Helpers for create methods. |
||||
|
*/ |
||||
|
function addElement(elt, pInst, media) { |
||||
|
var node = pInst._userNode ? pInst._userNode : document.body; |
||||
|
node.appendChild(elt); |
||||
|
var c = media ? new p5.MediaElement(elt) : new p5.Element(elt); |
||||
|
pInst._elements.push(c); |
||||
|
return c; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Creates a <div></div> element in the DOM with given inner HTML. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createDiv |
||||
|
* @param {String} html inner HTML for element created |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Creates a <p></p> element in the DOM with given inner HTML. Used |
||||
|
* for paragraph length text. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createP |
||||
|
* @param {String} html inner HTML for element created |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
|
||||
|
/** |
||||
|
* Creates a <span></span> element in the DOM with given inner HTML. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createSpan |
||||
|
* @param {String} html inner HTML for element created |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
var tags = ['div', 'p', 'span']; |
||||
|
tags.forEach(function(tag) { |
||||
|
var method = 'create' + tag.charAt(0).toUpperCase() + tag.slice(1); |
||||
|
p5.prototype[method] = function(html) { |
||||
|
var elt = document.createElement(tag); |
||||
|
elt.innerHTML = html; |
||||
|
return addElement(elt, this); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
/** |
||||
|
* Creates an <img /> element in the DOM with given src and |
||||
|
* alternate text. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createImg |
||||
|
* @param {String} src src path or url for image |
||||
|
* @param {String} alt alternate text to be used if image does not |
||||
|
* load |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createImg = function(src, alt) { |
||||
|
var elt = document.createElement('img'); |
||||
|
elt.src = src; |
||||
|
if (typeof alt !== 'undefined') { |
||||
|
elt.alt = alt; |
||||
|
} |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Creates an <a></a> element in the DOM for including a hyperlink. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createA |
||||
|
* @param {String} href url of page to link to |
||||
|
* @param {String} html inner html of link element to display |
||||
|
* @param {String} [target] target where new link should open, |
||||
|
* could be _blank, _self, _parent, _top. |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createA = function(href, html, target) { |
||||
|
var elt = document.createElement('a'); |
||||
|
elt.href = href; |
||||
|
elt.innerHTML = html; |
||||
|
if (target) elt.target = target; |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
/** INPUT **/ |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Creates a slider <input></input> element in the DOM. |
||||
|
* Use .size() to set the display length of the slider. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createSlider |
||||
|
* @param {Number} min minimum value of the slider |
||||
|
* @param {Number} max maximum value of the slider |
||||
|
* @param {Number} [value] default value of the slider |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createSlider = function(min, max, value) { |
||||
|
var elt = document.createElement('input'); |
||||
|
elt.type = 'range'; |
||||
|
elt.min = min; |
||||
|
elt.max = max; |
||||
|
if (value) elt.value = value; |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Creates a <button></button> element in the DOM. |
||||
|
* Use .size() to set the display size of the button. |
||||
|
* Use .mousePressed() to specify behavior on press. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createButton |
||||
|
* @param {String} label label displayed on the button |
||||
|
* @param {String} [value] value of the button |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createButton = function(label, value) { |
||||
|
var elt = document.createElement('button'); |
||||
|
elt.innerHTML = label; |
||||
|
elt.value = value; |
||||
|
if (value) elt.value = value; |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Creates an <input></input> element in the DOM for text input. |
||||
|
* Use .size() to set the display length of the box. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createInput |
||||
|
* @param {Number} [value] default value of the input box |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createInput = function(value) { |
||||
|
var elt = document.createElement('input'); |
||||
|
elt.type = 'text'; |
||||
|
if (value) elt.value = value; |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
/** VIDEO STUFF **/ |
||||
|
|
||||
|
function createMedia(pInst, type, src, callback) { |
||||
|
var elt = document.createElement(type); |
||||
|
if (typeof src === 'string') { |
||||
|
src = [src]; |
||||
|
} |
||||
|
for (var i=0; i<src.length; i++) { |
||||
|
var source = document.createElement('source'); |
||||
|
source.src = src[i]; |
||||
|
elt.appendChild(source); |
||||
|
} |
||||
|
if (typeof callback !== 'undefined') { |
||||
|
elt.addEventListener('canplaythrough', function() { |
||||
|
callback(); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
var c = addElement(elt, pInst, true); |
||||
|
c.loadedmetadata = false; |
||||
|
// set width and height onload metadata
|
||||
|
elt.addEventListener('loadedmetadata', function() { |
||||
|
c.width = elt.videoWidth; |
||||
|
c.height = elt.videoHeight; |
||||
|
c.loadedmetadata = true; |
||||
|
}); |
||||
|
|
||||
|
return c; |
||||
|
} |
||||
|
/** |
||||
|
* Creates an HTML5 <video> element in the DOM for simple playback |
||||
|
* of audio/video. Shown by default, can be hidden with .hide() |
||||
|
* and drawn into canvas using video(). Appends to the container |
||||
|
* node if one is specified, otherwise appends to body. The first parameter |
||||
|
* can be either a single string path to a video file, or an array of string |
||||
|
* paths to different formats of the same video. This is useful for ensuring |
||||
|
* that your video can play across different browsers, as each supports |
||||
|
* different formats. See <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">this |
||||
|
* page for further information about supported formats. |
||||
|
* |
||||
|
* @method createVideo |
||||
|
* @param {String|Array} src path to a video file, or array of paths for |
||||
|
* supporting different browsers |
||||
|
* @param {Object} [callback] callback function to be called upon |
||||
|
* 'canplaythrough' event fire, that is, when the |
||||
|
* browser can play the media, and estimates that |
||||
|
* enough data has been loaded to play the media |
||||
|
* up to its end without having to stop for |
||||
|
* further buffering of content |
||||
|
* @return {Object/p5.Element} pointer to video p5.Element |
||||
|
*/ |
||||
|
p5.prototype.createVideo = function(src, callback) { |
||||
|
return createMedia(this, 'video', src, callback); |
||||
|
}; |
||||
|
|
||||
|
/** AUDIO STUFF **/ |
||||
|
|
||||
|
/** |
||||
|
* Creates a hidden HTML5 <audio> element in the DOM for simple audio |
||||
|
* playback. Appends to the container node if one is specified, |
||||
|
* otherwise appends to body. The first parameter |
||||
|
* can be either a single string path to a audio file, or an array of string |
||||
|
* paths to different formats of the same audio. This is useful for ensuring |
||||
|
* that your audio can play across different browsers, as each supports |
||||
|
* different formats. See <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">this |
||||
|
* page for further information about supported formats. |
||||
|
* |
||||
|
* @method createAudio |
||||
|
* @param {String|Array} src path to an audio file, or array of paths for |
||||
|
* supporting different browsers |
||||
|
* @param {Object} [callback] callback function to be called upon |
||||
|
* 'canplaythrough' event fire, that is, when the |
||||
|
* browser can play the media, and estimates that |
||||
|
* enough data has been loaded to play the media |
||||
|
* up to its end without having to stop for |
||||
|
* further buffering of content |
||||
|
* @return {Object/p5.Element} pointer to audio p5.Element |
||||
|
*/ |
||||
|
p5.prototype.createAudio = function(src, callback) { |
||||
|
return createMedia(this, 'audio', src, callback); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** CAMERA STUFF **/ |
||||
|
|
||||
|
p5.prototype.VIDEO = 'video'; |
||||
|
p5.prototype.AUDIO = 'audio'; |
||||
|
|
||||
|
navigator.getUserMedia = navigator.getUserMedia || |
||||
|
navigator.webkitGetUserMedia || |
||||
|
navigator.mozGetUserMedia || |
||||
|
navigator.msGetUserMedia; |
||||
|
|
||||
|
/** |
||||
|
* Creates a new <video> element that contains the audio/video feed |
||||
|
* from a webcam. This can be drawn onto the canvas using video(). |
||||
|
* |
||||
|
* @method createCapture |
||||
|
* @param {String/Constant} type type of capture, either VIDEO or |
||||
|
* AUDIO if none specified, default both |
||||
|
* @return {Object/p5.Element} capture video p5.Element |
||||
|
*/ |
||||
|
p5.prototype.createCapture = function(type) { |
||||
|
var useVideo, useAudio; |
||||
|
if (!type) { |
||||
|
useVideo = true; |
||||
|
useAudio = true; |
||||
|
} else if (type === p5.prototype.VIDEO) { |
||||
|
useVideo = true; |
||||
|
} else if (type === p5.prototype.AUDIO) { |
||||
|
useAudio = true; |
||||
|
} |
||||
|
|
||||
|
if (navigator.getUserMedia) { |
||||
|
var elt = document.createElement('video'); |
||||
|
navigator.getUserMedia({video: useVideo, audio: useAudio}, function(stream) { |
||||
|
elt.src = window.URL.createObjectURL(stream); |
||||
|
elt.play(); |
||||
|
}, function(e) { console.log(e); }); |
||||
|
} else { |
||||
|
throw 'getUserMedia not supported in this browser'; |
||||
|
} |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Creates element with given tag in the DOM with given content. |
||||
|
* Appends to the container node if one is specified, otherwise |
||||
|
* appends to body. |
||||
|
* |
||||
|
* @method createElement |
||||
|
* @param {String} tag tag for the new element |
||||
|
* @param {String} [content] html content to be inserted into the element |
||||
|
* @return {Object/p5.Element} pointer to p5.Element holding created |
||||
|
* node |
||||
|
*/ |
||||
|
p5.prototype.createElement = function(tag, content) { |
||||
|
var elt = document.createElement(tag); |
||||
|
if (typeof content !== 'undefined') { |
||||
|
elt.innerHTML = content; |
||||
|
} |
||||
|
return addElement(elt, this); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
// =============================================================================
|
||||
|
// p5.Element additions
|
||||
|
// =============================================================================
|
||||
|
/** |
||||
|
* |
||||
|
* Adds specified class to the element. |
||||
|
* |
||||
|
* @for p5.Element |
||||
|
* @method addClass |
||||
|
* @param {String} class name of class to add |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.Element.prototype.addClass = function(c) { |
||||
|
if (this.elt.className) { |
||||
|
// PEND don't add class more than once
|
||||
|
//var regex = new RegExp('[^a-zA-Z\d:]?'+c+'[^a-zA-Z\d:]?');
|
||||
|
//if (this.elt.className.search(/[^a-zA-Z\d:]?hi[^a-zA-Z\d:]?/) === -1) {
|
||||
|
this.elt.className = this.elt.className+' '+c; |
||||
|
//}
|
||||
|
} else { |
||||
|
this.elt.className = c; |
||||
|
} |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Removes specified class from the element. |
||||
|
* |
||||
|
* @method removeClass |
||||
|
* @param {String} class name of class to remove |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.Element.prototype.removeClass = function(c) { |
||||
|
var regex = new RegExp('(?:^|\\s)'+c+'(?!\\S)'); |
||||
|
this.elt.className = this.elt.className.replace(regex, ''); |
||||
|
this.elt.className = this.elt.className.replace(/^\s+|\s+$/g, ""); //prettify (optional)
|
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Attaches the element as a child to the parent specified. |
||||
|
* Accepts either a string ID, DOM node, or p5.Element |
||||
|
* |
||||
|
* @method child |
||||
|
* @param {String|Object} child the ID, DOM node, or p5.Element |
||||
|
* to add to the current element |
||||
|
* @return {p5.Element} |
||||
|
* @example |
||||
|
* <div class='norender'><code> |
||||
|
* var div0 = createDiv('this is the parent'); |
||||
|
* var div1 = createDiv('this is the child'); |
||||
|
* div0.child(div1); // use p5.Element
|
||||
|
* </code></div> |
||||
|
* <div class='norender'><code> |
||||
|
* var div0 = createDiv('this is the parent'); |
||||
|
* var div1 = createDiv('this is the child'); |
||||
|
* div1.id('apples'); |
||||
|
* div0.child('apples'); // use id
|
||||
|
* </code></div> |
||||
|
* <div class='norender'><code> |
||||
|
* var div0 = createDiv('this is the parent'); |
||||
|
* var elt = document.getElementById('myChildDiv'); |
||||
|
* div0.child(elt); // use element from page
|
||||
|
* </code></div> |
||||
|
*/ |
||||
|
p5.Element.prototype.child = function(c) { |
||||
|
if (typeof c === 'string') { |
||||
|
c = document.getElementById(c); |
||||
|
} else if (c instanceof p5.Element) { |
||||
|
c = c.elt; |
||||
|
} |
||||
|
this.elt.appendChild(c); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* If an argument is given, sets the inner HTML of the element, |
||||
|
* replacing any existing html. If no arguments are given, returns |
||||
|
* the inner HTML of the element. |
||||
|
* |
||||
|
* @for p5.Element |
||||
|
* @method html |
||||
|
* @param {String} [html] the HTML to be placed inside the element |
||||
|
* @return {p5.Element|String} |
||||
|
*/ |
||||
|
p5.Element.prototype.html = function(html) { |
||||
|
if (typeof html !== 'undefined') { |
||||
|
this.elt.innerHTML = html; |
||||
|
return this; |
||||
|
} else { |
||||
|
return this.elt.innerHTML; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Sets the position of the element relative to (0, 0) of the |
||||
|
* window. Essentially, sets position:absolute and left and top |
||||
|
* properties of style. |
||||
|
* |
||||
|
* @method position |
||||
|
* @param {Number} x x-position relative to upper left of window |
||||
|
* @param {Number} y y-position relative to upper left of window |
||||
|
* @return {p5.Element} |
||||
|
* @example |
||||
|
* <div><code class='norender'> |
||||
|
* function setup() { |
||||
|
* var cnv = createCanvas(100, 100); |
||||
|
* // positions canvas 50px to right and 100px
|
||||
|
* // below upper left corner of the window
|
||||
|
* cnv.position(50, 100); |
||||
|
* } |
||||
|
* </code></div> |
||||
|
*/ |
||||
|
p5.Element.prototype.position = function(x, y) { |
||||
|
this.elt.style.position = 'absolute'; |
||||
|
this.elt.style.left = x+'px'; |
||||
|
this.elt.style.top = y+'px'; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Sets the given style (css) property of the element with the given value. |
||||
|
* If no value is specified, returns the value of the given property, |
||||
|
* or undefined if the property is not. |
||||
|
* |
||||
|
* @method style |
||||
|
* @param {String} property property to be set |
||||
|
* @param {String} [value] value to assign to property |
||||
|
* @return {String|p5.Element} value of property, if no value is specified |
||||
|
* or p5.Element |
||||
|
* @example |
||||
|
* <div><code class="norender"> |
||||
|
* var myDiv = createDiv("I like pandas."); |
||||
|
* myDiv.style("color", "#ff0000"); |
||||
|
* myDiv.style("font-size", "18px"); |
||||
|
* </code></div> |
||||
|
*/ |
||||
|
p5.Element.prototype.style = function(prop, val) { |
||||
|
if (typeof val === 'undefined') { |
||||
|
var attrs = prop.split(';'); |
||||
|
for (var i=0; i<attrs.length; i++) { |
||||
|
var parts = attrs[i].split(':'); |
||||
|
if (parts[0] && parts[1]) { |
||||
|
this.elt.style[parts[0].trim()] = parts[1].trim(); |
||||
|
} |
||||
|
} |
||||
|
console.log(this.elt.style) |
||||
|
} else { |
||||
|
this.elt.style[prop] = val; |
||||
|
} |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Adds a new attribute or changes the value of an existing attribute |
||||
|
* on the specified element. If no value is specified, returns the |
||||
|
* value of the given attribute, or null if attribute is not set. |
||||
|
* |
||||
|
* @method attribute |
||||
|
* @param {String} attr attribute to set |
||||
|
* @param {String} [value] value to assign to attribute |
||||
|
* @return {String|p5.Element} value of attribute, if no value is |
||||
|
* specified or p5.Element |
||||
|
* @example |
||||
|
* <div class="norender"><code> |
||||
|
* var myDiv = createDiv("I like pandas."); |
||||
|
*myDiv.attribute("align", "center"); |
||||
|
* </code></div> |
||||
|
*/ |
||||
|
p5.Element.prototype.attribute = function(attr, value) { |
||||
|
if (typeof value === 'undefined') { |
||||
|
return this.elt.getAttribute(attr); |
||||
|
} else { |
||||
|
this.elt.setAttribute(attr, value); |
||||
|
return this; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Either returns the value of the element if no arguments |
||||
|
* given, or sets the value of the element. |
||||
|
* |
||||
|
* @method value |
||||
|
* @param {String|Number} [value] |
||||
|
* @return {String|p5.Element} value of element, if no value is |
||||
|
* specified or p5.Element |
||||
|
*/ |
||||
|
p5.Element.prototype.value = function() { |
||||
|
if (arguments.length > 0) { |
||||
|
this.elt.value = arguments[0]; |
||||
|
return this; |
||||
|
} else { |
||||
|
if (this.elt.type === 'range') { |
||||
|
return parseFloat(this.elt.value); |
||||
|
} |
||||
|
else return this.elt.value; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Shows the current element. Essentially, setting display:block for the style. |
||||
|
* |
||||
|
* @method show |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.Element.prototype.show = function() { |
||||
|
this.elt.style.display = 'block'; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Hides the current element. Essentially, setting display:none for the style. |
||||
|
* |
||||
|
* @method hide |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.Element.prototype.hide = function() { |
||||
|
this.elt.style.display = 'none'; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* Sets the width and height of the element. AUTO can be used to |
||||
|
* only adjust one dimension. |
||||
|
* |
||||
|
* @method size |
||||
|
* @param {Number} w width of the element |
||||
|
* @param {Number} h height of the element |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.Element.prototype.size = function(w, h) { |
||||
|
var aW = w; |
||||
|
var aH = h; |
||||
|
var AUTO = p5.prototype.AUTO; |
||||
|
|
||||
|
if (aW !== AUTO || aH !== AUTO) { |
||||
|
if (aW === AUTO) { |
||||
|
aW = h * this.elt.width / this.elt.height; |
||||
|
} else if (aH === AUTO) { |
||||
|
aH = w * this.elt.height / this.elt.width; |
||||
|
} |
||||
|
// set diff for cnv vs normal div
|
||||
|
if (this.elt instanceof HTMLCanvasElement) { |
||||
|
var j = {}; |
||||
|
var k = this.elt.getContext('2d'); |
||||
|
for (var prop in k) { |
||||
|
j[prop] = k[prop]; |
||||
|
} |
||||
|
this.elt.setAttribute('width', aW * this._pInst._pixelDensity); |
||||
|
this.elt.setAttribute('height', aH * this._pInst._pixelDensity); |
||||
|
this.elt.setAttribute('style', 'width:' + aW + 'px !important; height:' + aH + 'px !important;'); |
||||
|
this._pInst.scale(this._pInst._pixelDensity, this._pInst._pixelDensity); |
||||
|
for (var prop in j) { |
||||
|
this.elt.getContext('2d')[prop] = j[prop]; |
||||
|
} |
||||
|
} else { |
||||
|
this.elt.style.width = aW+'px'; |
||||
|
this.elt.style.height = aH+'px'; |
||||
|
this.elt.width = aW; |
||||
|
this.elt.height = aH; |
||||
|
} |
||||
|
this.width = this.elt.offsetWidth; |
||||
|
this.height = this.elt.offsetHeight; |
||||
|
if (this._pInst) { // main canvas associated with p5 instance
|
||||
|
if (this._pInst._curElement.elt === this.elt) { |
||||
|
this._pInst._setProperty('width', this.elt.offsetWidth); |
||||
|
this._pInst._setProperty('height', this.elt.offsetHeight); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Removes the element and deregisters all listeners. |
||||
|
* @method remove |
||||
|
* @example |
||||
|
* <div class='norender'><code> |
||||
|
* var myDiv = createDiv('this is some text'); |
||||
|
* myDiv.remove(); |
||||
|
* </code></div> |
||||
|
*/ |
||||
|
p5.Element.prototype.remove = function() { |
||||
|
// deregister events
|
||||
|
for (var ev in this._events) { |
||||
|
this.elt.removeEventListener(ev, this._events[ev]); |
||||
|
} |
||||
|
if (this.elt.parentNode) { |
||||
|
this.elt.parentNode.removeChild(this.elt); |
||||
|
} |
||||
|
delete(this); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
// =============================================================================
|
||||
|
// p5.MediaElement additions
|
||||
|
// =============================================================================
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Extends p5.Element to handle audio and video. In addition to the methods |
||||
|
* of p5.Element, it also contains methods for controlling media. It is not |
||||
|
* called directly, but p5.MediaElements are created by calling createVideo, |
||||
|
* createAudio, and createCapture. |
||||
|
* |
||||
|
* @class p5.MediaElement |
||||
|
* @constructor |
||||
|
* @param {String} elt DOM node that is wrapped |
||||
|
* @param {Object} [pInst] pointer to p5 instance |
||||
|
*/ |
||||
|
p5.MediaElement = function(elt, pInst) { |
||||
|
p5.Element.call(this, elt, pInst); |
||||
|
}; |
||||
|
p5.MediaElement.prototype = Object.create(p5.Element.prototype); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Play an HTML5 media element. |
||||
|
* |
||||
|
* @method play |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.play = function() { |
||||
|
if (this.elt.currentTime === this.elt.duration) { |
||||
|
this.elt.currentTime = 0; |
||||
|
} |
||||
|
this.elt.play(); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Stops an HTML5 media element (sets current time to zero). |
||||
|
* |
||||
|
* @method stop |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.stop = function() { |
||||
|
this.elt.pause(); |
||||
|
this.elt.currentTime = 0; |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Pauses an HTML5 media element. |
||||
|
* |
||||
|
* @method pause |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.pause = function() { |
||||
|
this.elt.pause(); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Set 'loop' to true for an HTML5 media element, and starts playing. |
||||
|
* |
||||
|
* @method loop |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.loop = function() { |
||||
|
this.elt.setAttribute('loop', true); |
||||
|
this.play(); |
||||
|
return this; |
||||
|
}; |
||||
|
/** |
||||
|
* Set 'loop' to false for an HTML5 media element. Element will stop |
||||
|
* when it reaches the end. |
||||
|
* |
||||
|
* @method noLoop |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.noLoop = function() { |
||||
|
this.elt.setAttribute('loop', false); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* Set HTML5 media element to autoplay or not. |
||||
|
* |
||||
|
* @method autoplay |
||||
|
* @param {Boolean} autoplay whether the element should autoplay |
||||
|
* @return {p5.Element} |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.autoplay = function(val) { |
||||
|
this.elt.setAttribute('autoplay', val); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Sets volume for this HTML5 media element. If no argument is given, |
||||
|
* returns the current volume. |
||||
|
* |
||||
|
* @param {Number} [val] volume between 0.0 and 1.0 |
||||
|
* @return {Number|p5.MediaElement} current volume or p5.MediaElement |
||||
|
* @method volume |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.volume = function(val) { |
||||
|
if (typeof val === 'undefined') { |
||||
|
return this.elt.volume; |
||||
|
} else { |
||||
|
this.elt.volume = val; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* If no arguments are given, returns the current time of the elmeent. |
||||
|
* If an argument is given the current time of the element is set to it. |
||||
|
* |
||||
|
* @method time |
||||
|
* @param {Number} [time] time to jump to (in seconds) |
||||
|
* @return {Number|p5.MediaElement} current time (in seconds) |
||||
|
* or p5.MediaElement |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.time = function(val) { |
||||
|
if (typeof val === 'undefined') { |
||||
|
return this.elt.currentTime; |
||||
|
} else { |
||||
|
this.elt.currentTime = val; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* Returns the duration of the HTML5 media element. |
||||
|
* |
||||
|
* @method duration |
||||
|
* @return {Number} duration |
||||
|
*/ |
||||
|
p5.MediaElement.prototype.duration = function() { |
||||
|
return this.elt.duration; |
||||
|
}; |
||||
|
p5.MediaElement.prototype.pixels = []; |
||||
|
p5.MediaElement.prototype.loadPixels = function() { |
||||
|
if (this.loadedmetadata) { // wait for metadata for w/h
|
||||
|
if (!this.canvas) { |
||||
|
this.canvas = document.createElement('canvas'); |
||||
|
this.canvas.width = this.width; |
||||
|
this.canvas.height = this.height; |
||||
|
this.drawingContext = this.canvas.getContext('2d'); |
||||
|
} |
||||
|
this.drawingContext.drawImage(this.elt, 0, 0); |
||||
|
p5.prototype.loadPixels.call(this); |
||||
|
} |
||||
|
return this; |
||||
|
} |
||||
|
p5.MediaElement.prototype.updatePixels = function(x, y, w, h){ |
||||
|
if (this.loadedmetadata) { // wait for metadata
|
||||
|
p5.prototype.updatePixels.call(this, x, y, w, h); |
||||
|
} |
||||
|
return this; |
||||
|
} |
||||
|
p5.MediaElement.prototype.get = function(x, y, w, h){ |
||||
|
if (this.loadedmetadata) { // wait for metadata
|
||||
|
return p5.prototype.get.call(this, x, y, w, h); |
||||
|
} else return [0, 0, 0, 255]; |
||||
|
}; |
||||
|
p5.MediaElement.prototype.set = function(x, y, imgOrCol){ |
||||
|
if (this.loadedmetadata) { // wait for metadata
|
||||
|
p5.prototype.set.call(this, x, y, imgOrCol); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
})(); |
@ -0,0 +1,40 @@ |
|||||
|
var ctracker; |
||||
|
var slider; |
||||
|
|
||||
|
function setup() { |
||||
|
|
||||
|
// setup camera capture
|
||||
|
var videoInput = createCapture(); |
||||
|
videoInput.size(400, 300); |
||||
|
videoInput.position(0, 0); |
||||
|
|
||||
|
// setup canvas
|
||||
|
var cnv = createCanvas(400, 300); |
||||
|
cnv.position(0, 0); |
||||
|
|
||||
|
// setup tracker
|
||||
|
ctracker = new clm.tracker(); |
||||
|
ctracker.init(pModel); |
||||
|
ctracker.start(videoInput.elt); |
||||
|
|
||||
|
slider = createSlider(0, 50, 10); |
||||
|
slider.position(0, 400); |
||||
|
|
||||
|
noStroke(); |
||||
|
} |
||||
|
|
||||
|
function draw() { |
||||
|
clear(); |
||||
|
|
||||
|
// get array of face marker positions [x, y] format
|
||||
|
var positions = ctracker.getCurrentPosition(); |
||||
|
|
||||
|
for (var i=0; i<positions.length; i++) { |
||||
|
// set the color of the ellipse based on position on screen
|
||||
|
fill(map(positions[i][0], width*0.33, width*0.66, 0, 255), map(positions[i][1], height*0.33, height*0.66, 0, 255), 255); |
||||
|
// draw ellipse at each position point
|
||||
|
var val = slider.value(); |
||||
|
ellipse(positions[i][0], positions[i][1], val, val); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>proves de so</title> |
||||
|
<script src="bower_components/tracking/build/tracking-min.js"></script> |
||||
|
<script src="bower_components/pizzicato/distr/Pizzicato.js"></script> |
||||
|
|
||||
|
|
||||
|
<script src="colorTracking.js"></script> |
||||
|
<style> |
||||
|
video, |
||||
|
canvas { |
||||
|
margin-left: 100px; |
||||
|
margin-top: 35px; |
||||
|
position: absolute; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<video id="video" width="600" height="450" preload autoplay loop muted controls></video> |
||||
|
<canvas id="canvas" width="600" height="450"></canvas> |
||||
|
<button onclick="silence()">silenci</button> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,61 @@ |
|||||
|
window.onload = function() { |
||||
|
var video = document.getElementById('video'); |
||||
|
var canvas = document.getElementById('canvas'); |
||||
|
var context = canvas.getContext('2d'); |
||||
|
var trackerCyan = new tracking.ColorTracker(['cyan']); |
||||
|
tracking.track('#video', trackerCyan, { |
||||
|
camera: true |
||||
|
}); |
||||
|
trackerCyan.on('track', function(event) { |
||||
|
context.clearRect(0, 0, canvas.width, canvas.height); |
||||
|
event.data.forEach(function(rect) { |
||||
|
if (rect.color === 'custom') { |
||||
|
rect.color = trackerCyan.customColor; |
||||
|
} |
||||
|
context.strokeStyle = rect.color; |
||||
|
context.strokeRect(rect.x, rect.y, rect.width, rect.height); |
||||
|
context.font = '11px Helvetica'; |
||||
|
context.fillStyle = "#fff"; |
||||
|
context.fillText('x: ' + rect.x + 'px', rect.x + rect.width + 5, rect.y + 11); |
||||
|
context.fillText('y: ' + rect.y + 'px', rect.x + rect.width + 5, rect.y + 22); |
||||
|
actualizePosCyan(rect); |
||||
|
}); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
function actualizePosCyan(rect){ |
||||
|
sineWaveCyan.frequency=600-rect.y; |
||||
|
sineWaveCyan.volume=(rect.x/450); |
||||
|
console.log(sineWaveCyan.frequency); |
||||
|
} |
||||
|
|
||||
|
var sineWaveCyan = new Pizzicato.Sound({ |
||||
|
source: 'wave', |
||||
|
options: { |
||||
|
frequency: 440 |
||||
|
} |
||||
|
}); |
||||
|
/*var ringModulator = new Pizzicato.Effects.RingModulator({ |
||||
|
speed: 30, |
||||
|
distortion: 1, |
||||
|
mix: 0.5 |
||||
|
}); |
||||
|
|
||||
|
sineWave.addEffect(ringModulator);*/ |
||||
|
sineWaveCyan.volume=0.1; |
||||
|
sineWaveCyan.play(); |
||||
|
|
||||
|
/*var drum = new Pizzicato.Sound('./sounds/drum.mp3', function() { |
||||
|
// Sound loaded!
|
||||
|
drum.loop=true; |
||||
|
drum.play(); |
||||
|
});*/ |
||||
|
|
||||
|
function silence(){ |
||||
|
sineWaveCyan.volume=0; |
||||
|
} |
||||
|
|
||||
|
function updateValues(){ |
||||
|
//update display values, whe
|
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>proves de so</title> |
||||
|
<script src="bower_components/tracking/build/tracking-min.js"></script> |
||||
|
<script src="bower_components/pizzicato/distr/Pizzicato.js"></script> |
||||
|
|
||||
|
|
||||
|
<script src="colorTrackingSoundMaker.js"></script> |
||||
|
<style> |
||||
|
video, |
||||
|
canvas { |
||||
|
margin-left: 100px; |
||||
|
margin-top: 35px; |
||||
|
position: absolute; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<video id="video" width="600" height="450" preload autoplay loop muted controls></video> |
||||
|
<canvas id="canvas" width="600" height="450"></canvas> |
||||
|
<button onclick="silence()">silenci</button> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,57 @@ |
|||||
|
window.onload = function() { |
||||
|
var video = document.getElementById('video'); |
||||
|
var canvas = document.getElementById('canvas'); |
||||
|
var context = canvas.getContext('2d'); |
||||
|
var trackerCyan = new tracking.ColorTracker(['cyan']); |
||||
|
tracking.track('#video', trackerCyan, { |
||||
|
camera: true |
||||
|
}); |
||||
|
trackerCyan.on('track', function(event) { |
||||
|
context.clearRect(0, 0, canvas.width, canvas.height); |
||||
|
event.data.forEach(function(rect) { |
||||
|
if (rect.color === 'custom') { |
||||
|
rect.color = trackerCyan.customColor; |
||||
|
} |
||||
|
context.strokeStyle = rect.color; |
||||
|
context.strokeRect(rect.x, rect.y, rect.width, rect.height); |
||||
|
context.font = '11px Helvetica'; |
||||
|
context.fillStyle = "#fff"; |
||||
|
context.fillText('x: ' + rect.x + 'px', rect.x + rect.width + 5, rect.y + 11); |
||||
|
context.fillText('y: ' + rect.y + 'px', rect.x + rect.width + 5, rect.y + 22); |
||||
|
actualizePosCyan(rect); |
||||
|
}); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
function actualizePosCyan(rect){ |
||||
|
sineWaveCyan.frequency=600-rect.y; |
||||
|
sineWaveCyan.volume=(rect.x/450); |
||||
|
console.log(sineWaveCyan.frequency); |
||||
|
} |
||||
|
|
||||
|
var sineWaveCyan = new Pizzicato.Sound({ |
||||
|
source: 'wave', |
||||
|
options: { |
||||
|
frequency: 440 |
||||
|
} |
||||
|
}); |
||||
|
/*var ringModulator = new Pizzicato.Effects.RingModulator({ |
||||
|
speed: 30, |
||||
|
distortion: 1, |
||||
|
mix: 0.5 |
||||
|
}); |
||||
|
|
||||
|
sineWave.addEffect(ringModulator);*/ |
||||
|
sineWaveCyan.volume=0.1; |
||||
|
sineWaveCyan.play(); |
||||
|
|
||||
|
/*var drum = new Pizzicato.Sound('./sounds/drum.mp3', function() { |
||||
|
// Sound loaded!
|
||||
|
drum.loop=true; |
||||
|
drum.play(); |
||||
|
});*/ |
||||
|
|
||||
|
function silence(){ |
||||
|
sineWaveCyan.volume=0; |
||||
|
} |
@ -0,0 +1,28 @@ |
|||||
|
<!doctype html> |
||||
|
<html> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<title>proves de so</title> |
||||
|
<script src="bower_components/tracking/build/tracking-min.js"></script> |
||||
|
<script src="bower_components/pizzicato/distr/Pizzicato.js"></script> |
||||
|
|
||||
|
|
||||
|
<script src="index.js"></script> |
||||
|
<style> |
||||
|
video, |
||||
|
canvas { |
||||
|
margin-left: 100px; |
||||
|
margin-top: 35px; |
||||
|
position: absolute; |
||||
|
} |
||||
|
</style> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<video id="video" width="600" height="450" preload autoplay loop muted controls></video> |
||||
|
<canvas id="canvas" width="600" height="450"></canvas> |
||||
|
<button onclick="silence()">silenci</button> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
@ -0,0 +1,57 @@ |
|||||
|
window.onload = function() { |
||||
|
var video = document.getElementById('video'); |
||||
|
var canvas = document.getElementById('canvas'); |
||||
|
var context = canvas.getContext('2d'); |
||||
|
var trackerCyan = new tracking.ColorTracker(['cyan']); |
||||
|
tracking.track('#video', trackerCyan, { |
||||
|
camera: true |
||||
|
}); |
||||
|
trackerCyan.on('track', function(event) { |
||||
|
context.clearRect(0, 0, canvas.width, canvas.height); |
||||
|
event.data.forEach(function(rect) { |
||||
|
if (rect.color === 'custom') { |
||||
|
rect.color = trackerCyan.customColor; |
||||
|
} |
||||
|
context.strokeStyle = rect.color; |
||||
|
context.strokeRect(rect.x, rect.y, rect.width, rect.height); |
||||
|
context.font = '11px Helvetica'; |
||||
|
context.fillStyle = "#fff"; |
||||
|
context.fillText('x: ' + rect.x + 'px', rect.x + rect.width + 5, rect.y + 11); |
||||
|
context.fillText('y: ' + rect.y + 'px', rect.x + rect.width + 5, rect.y + 22); |
||||
|
actualizePosCyan(rect); |
||||
|
}); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
function actualizePosCyan(rect){ |
||||
|
sineWaveCyan.frequency=600-rect.y; |
||||
|
sineWaveCyan.volume=(rect.x/450); |
||||
|
console.log(sineWaveCyan.frequency); |
||||
|
} |
||||
|
|
||||
|
var sineWaveCyan = new Pizzicato.Sound({ |
||||
|
source: 'wave', |
||||
|
options: { |
||||
|
frequency: 440 |
||||
|
} |
||||
|
}); |
||||
|
/*var ringModulator = new Pizzicato.Effects.RingModulator({ |
||||
|
speed: 30, |
||||
|
distortion: 1, |
||||
|
mix: 0.5 |
||||
|
}); |
||||
|
|
||||
|
sineWave.addEffect(ringModulator);*/ |
||||
|
sineWaveCyan.volume=0.1; |
||||
|
sineWaveCyan.play(); |
||||
|
|
||||
|
/*var drum = new Pizzicato.Sound('./sounds/drum.mp3', function() { |
||||
|
// Sound loaded!
|
||||
|
drum.loop=true; |
||||
|
drum.play(); |
||||
|
});*/ |
||||
|
|
||||
|
function silence(){ |
||||
|
sineWaveCyan.volume=0; |
||||
|
} |