made with requirebin
Created
September 7, 2014 08:40
-
-
Save kirbysayshi/899be2a21f297b5f2498 to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// just because requirebin needs something to require...? | |
var vash = require('vash'); | |
var play = document.createElement('input'); | |
play.type = "button"; | |
play.value = "play/pause"; | |
document.body.appendChild(play); | |
play.onclick = function(e) { | |
evolve(null, state) | |
var lseq = state.seqs.lead; | |
var hseq = state.seqs.harmony; | |
var bseq = state.seqs.bass; | |
var start = ac.currentTime; | |
lseq.play(start); | |
hseq.play(start + ( 60 / hseq.tempo ) * 16); // 16 beat delay | |
bseq.play(start); | |
} | |
var ac = new (window.AudioContext ? AudioContext : webkitAudioContext); | |
// Just to wait until Sequence is defined, since I want to keep it | |
// at the bottom out of the way. | |
var state = null; | |
setTimeout(function() { | |
state = { | |
notes: { | |
lead: olead.slice(0), | |
harmony: oharmony.slice(0), | |
bass: obass.slice(0) | |
}, | |
seqs: { | |
lead: null, | |
harmony: null, | |
bass: null | |
} | |
}; | |
}) | |
function evolve(seed, state) { | |
var tempo = 132; | |
var lnotes = state.notes.lead.slice(0); | |
var hnotes = state.notes.harmony.slice(0); | |
var bnotes = state.notes.bass.slice(0); | |
// Do evolution of notes here... | |
for (var i = 0; i < lnotes.length; i++) { | |
var parts = lnotes[i].match(/([^\s]+)\s+([^\s]+)/); | |
var pitch = parts[1]; | |
var duration = parts[2]; | |
if (Math.random() > 0.8) { | |
} | |
} | |
var lseq = new Sequence( ac, tempo, lnotes ); | |
var hseq = new Sequence( ac, tempo, hnotes ); | |
var bseq = new Sequence( ac, tempo, bnotes ); | |
state.seqs.lead = lseq; | |
state.seqs.harmony = hseq; | |
state.seqs.bass = bseq; | |
lseq.staccato = 0.55; | |
hseq.staccato = 0.55; | |
bseq.staccato = 0.05; | |
bseq.smoothing = 0.4; | |
lseq.gain.gain.value = 1.0; | |
hseq.gain.gain.value = 0.8; | |
bseq.gain.gain.value = 0.65; | |
lseq.mid.frequency.value = 800; | |
lseq.mid.gain.value = 3; | |
hseq.mid.frequency.value = 1200; | |
bseq.mid.gain.value = 3; | |
bseq.bass.gain.value = 6; | |
bseq.bass.frequency.value = 80; | |
bseq.mid.gain.value = -6; | |
bseq.mid.frequency.value = 500; | |
bseq.treble.gain.value = -2; | |
bseq.treble.frequency.value = 1400; | |
} | |
var olead = [ | |
'- e', | |
'Bb3 e', | |
'A3 e', | |
'Bb3 e', | |
'G3 e', | |
'A3 e', | |
'F3 e', | |
'G3 e', | |
'E3 e', | |
'F3 e', | |
'G3 e', | |
'F3 e', | |
'E3 e', | |
'F3 e', | |
'D3 q', | |
'- e', | |
'Bb3 s', | |
'A3 s', | |
'Bb3 e', | |
'G3 e', | |
'A3 e', | |
'G3 e', | |
'F3 e', | |
'G3 e', | |
'E3 e', | |
'F3 e', | |
'G3 e', | |
'F3 e', | |
'E3 s', | |
'F3 s', | |
'E3 e', | |
'D3 q' | |
]; | |
var oharmony = [ | |
'- e', | |
'D4 e', | |
'C4 e', | |
'D4 e', | |
'Bb3 e', | |
'C4 e', | |
'A3 e', | |
'Bb3 e', | |
'G3 e', | |
'A3 e', | |
'Bb3 e', | |
'A3 e', | |
'G3 e', | |
'A3 e', | |
'F3 q', | |
'- e', | |
'D4 s', | |
'C4 s', | |
'D4 e', | |
'Bb3 e', | |
'C4 e', | |
'Bb3 e', | |
'A3 e', | |
'Bb3 e', | |
'G3 e', | |
'A3 e', | |
'Bb3 e', | |
'A3 e', | |
'G3 s', | |
'A3 s', | |
'G3 e', | |
'F3 q' | |
] | |
var obass = [ | |
'D3 q', | |
'- h', | |
'D3 q', | |
'A2 q', | |
'- h', | |
'A2 q', | |
'Bb2 q', | |
'- h', | |
'Bb2 q', | |
'F2 h', | |
'A2 h' | |
]; | |
;!function(a){function b(a){var c=a.split(h);this.frequency=b.getFrequency(c[0])||0,this.duration=b.getDuration(c[1])||0}function c(a,b,c){this.ac=a||new AudioContext,this.createFxNodes(),this.tempo=b||120,this.loop=!0,this.smoothing=0,this.staccato=0,this.notes=[],this.push.apply(this,c||[])}var d="B#-C|C#-Db|D|D#-Eb|E-Fb|E#-F|F#-Gb|G|G#-Ab|A|A#-Bb|B-Cb",e=440*Math.pow(Math.pow(2,1/12),-9),f=/^[0-9.]+$/,g=4,h=/\s+/,i=/(\d+)/,j={};d.split("|").forEach(function(a,b){a.split("-").forEach(function(a){j[a]=b})}),b.getFrequency=function(a){var b=a.split(i),c=j[b[0]],d=(b[1]||g)-g,f=e*Math.pow(Math.pow(2,1/12),c);return f*Math.pow(2,d)},b.getDuration=function(a){return f.test(a)?parseFloat(a):a.toLowerCase().split("").reduce(function(a,b){return a+("w"===b?4:"h"===b?2:"q"===b?1:"e"===b?.5:"s"===b?.25:0)},0)},c.prototype.createFxNodes=function(){var a=[["bass",100],["mid",1e3],["treble",2500]],b=this.gain=this.ac.createGain();return a.forEach(function(a,c){c=this[a[0]]=this.ac.createBiquadFilter(),c.type="peaking",c.frequency.value=a[1],b.connect(b=c)}.bind(this)),b.connect(this.ac.destination),this},c.prototype.push=function(){return Array.prototype.forEach.call(arguments,function(a){this.notes.push(a instanceof b?a:new b(a))}.bind(this)),this},c.prototype.createOscillator=function(){return this.stop(),this.osc=this.ac.createOscillator(),this.osc.type=this.waveType||"square",this.osc.connect(this.gain),this},c.prototype.scheduleNote=function(a,b){var c=60/this.tempo*this.notes[a].duration,d=c*(1-(this.staccato||0));return this.setFrequency(this.notes[a].frequency,b),this.smoothing&&this.notes[a].frequency&&this.slide(a,b,d),this.setFrequency(0,b+d),b+c},c.prototype.getNextNote=function(a){return this.notes[a<this.notes.length-1?a+1:0]},c.prototype.getSlideStartDelay=function(a){return a-Math.min(a,60/this.tempo*this.smoothing)},c.prototype.slide=function(a,b,c){var d=this.getNextNote(a),e=this.getSlideStartDelay(c);return this.setFrequency(this.notes[a].frequency,b+e),this.rampFrequency(d.frequency,b+c),this},c.prototype.setFrequency=function(a,b){return this.osc.frequency.setValueAtTime(a,b),this},c.prototype.rampFrequency=function(a,b){return this.osc.frequency.linearRampToValueAtTime(a,b),this},c.prototype.play=function(a){return a="number"==typeof a?a:this.ac.currentTime,this.createOscillator(),this.osc.start(a),this.notes.forEach(function(b,c){a=this.scheduleNote(c,a)}.bind(this)),this.osc.stop(a),this.osc.onended=this.loop?this.play.bind(this,a):null,this},c.prototype.stop=function(){return this.osc&&(this.osc.onended=null,this.osc.stop(0),this.osc.frequency.cancelScheduledValues(0),this.osc=null),this},a.Note=b,a.Sequence=c}("undefined"!=typeof window?window:this); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require=function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){},{}],2:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;var splitPath=function(filename){return splitPathRe.exec(filename).slice(1)};exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){var result=splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir};exports.basename=function(path,ext){var f=splitPath(path)[2];if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){return splitPath(path)[3]};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:3}],3:[function(require,module,exports){var process=module.exports={};process.nextTick=function(){var canSetImmediate=typeof window!=="undefined"&&window.setImmediate;var canPost=typeof window!=="undefined"&&window.postMessage&&window.addEventListener;if(canSetImmediate){return function(f){return window.setImmediate(f)}}if(canPost){var queue=[];window.addEventListener("message",function(ev){var source=ev.source;if((source===window||source===null)&&ev.data==="process-tick"){ev.stopPropagation();if(queue.length>0){var fn=queue.shift();fn()}}},true);return function nextTick(fn){queue.push(fn);window.postMessage("process-tick","*")}}return function nextTick(fn){setTimeout(fn,0)}}();process.title="browser";process.browser=true;process.env={};process.argv=[];function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")}},{}],vash:[function(require,module,exports){void 0;(function(vash){if(typeof define==="function"&&define["amd"]){define(vash)}else if(typeof module==="object"&&module["exports"]){module["exports"]=vash}else{window["vash"]=vash}})(function(exports){var vash=exports;var AT="AT",ASSIGN_OPERATOR="ASSIGN_OPERATOR",AT_COLON="AT_COLON",AT_STAR_CLOSE="AT_STAR_CLOSE",AT_STAR_OPEN="AT_STAR_OPEN",BACKSLASH="BACKSLASH",BRACE_CLOSE="BRACE_CLOSE",BRACE_OPEN="BRACE_OPEN",CONTENT="CONTENT",DOUBLE_QUOTE="DOUBLE_QUOTE",EMAIL="EMAIL",ESCAPED_QUOTE="ESCAPED_QUOTE",FORWARD_SLASH="FORWARD_SLASH",FUNCTION="FUNCTION",HARD_PAREN_CLOSE="HARD_PAREN_CLOSE",HARD_PAREN_OPEN="HARD_PAREN_OPEN",HTML_TAG_CLOSE="HTML_TAG_CLOSE",HTML_TAG_OPEN="HTML_TAG_OPEN",HTML_TAG_VOID_CLOSE="HTML_TAG_VOID_CLOSE",IDENTIFIER="IDENTIFIER",KEYWORD="KEYWORD",LOGICAL="LOGICAL",NEWLINE="NEWLINE",NUMERIC_CONTENT="NUMERIC_CONTENT",OPERATOR="OPERATOR",PAREN_CLOSE="PAREN_CLOSE",PAREN_OPEN="PAREN_OPEN",PERIOD="PERIOD",SINGLE_QUOTE="SINGLE_QUOTE",TEXT_TAG_CLOSE="TEXT_TAG_CLOSE",TEXT_TAG_OPEN="TEXT_TAG_OPEN",WHITESPACE="WHITESPACE";var PAIRS={};PAIRS[AT_STAR_OPEN]=AT_STAR_CLOSE;PAIRS[BRACE_OPEN]=BRACE_CLOSE;PAIRS[DOUBLE_QUOTE]=DOUBLE_QUOTE;PAIRS[HARD_PAREN_OPEN]=HARD_PAREN_CLOSE;PAIRS[PAREN_OPEN]=PAREN_CLOSE;PAIRS[SINGLE_QUOTE]=SINGLE_QUOTE;PAIRS[AT_COLON]=NEWLINE;PAIRS[FORWARD_SLASH]=FORWARD_SLASH;var TESTS=[EMAIL,/^([a-zA-Z0-9.%]+@[a-zA-Z0-9.\-]+\.(?:ca|co\.uk|com|edu|net|org))\b/,AT_STAR_OPEN,/^(@\*)/,AT_STAR_CLOSE,/^(\*@)/,AT_COLON,/^(@\:)/,AT,/^(@)/,PAREN_OPEN,/^(\()/,PAREN_CLOSE,/^(\))/,HARD_PAREN_OPEN,/^(\[)/,HARD_PAREN_CLOSE,/^(\])/,BRACE_OPEN,/^(\{)/,BRACE_CLOSE,/^(\})/,TEXT_TAG_OPEN,/^(<text>)/,TEXT_TAG_CLOSE,/^(<\/text>)/,HTML_TAG_OPEN,function(){var reHtml=/^(<[a-zA-Z@]+?[^>]*?["a-zA-Z]*>)/,reEmail=/([a-zA-Z0-9.%]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,4})\b/;var tok=this.scan(reHtml,HTML_TAG_OPEN);if(tok){this.spewIf(tok,reEmail);this.spewIf(tok,/(@)/);this.spewIf(tok,/(\/\s*>)/)}return tok},HTML_TAG_CLOSE,/^(<\/[^>@\b]+?>)/,HTML_TAG_VOID_CLOSE,/^(\/\s*>)/,PERIOD,/^(\.)/,NEWLINE,function(){var token=this.scan(/^(\n)/,NEWLINE);if(token){this.lineno++;this.charno=0}return token},WHITESPACE,/^(\s)/,FUNCTION,/^(function)(?![\d\w])/,KEYWORD,/^(case|catch|do|else|finally|for|function|goto|if|instanceof|return|switch|try|typeof|var|while|with)(?![\d\w])/,IDENTIFIER,/^([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)/,FORWARD_SLASH,/^(\/)/,OPERATOR,/^(===|!==|==|!==|>>>|<<|>>|>=|<=|>|<|\+|-|\/|\*|\^|%|\:|\?)/,ASSIGN_OPERATOR,/^(\|=|\^=|&=|>>>=|>>=|<<=|-=|\+=|%=|\/=|\*=|=)/,LOGICAL,/^(&&|\|\||&|\||\^)/,ESCAPED_QUOTE,/^(\\+['"])/,BACKSLASH,/^(\\)/,DOUBLE_QUOTE,/^(\")/,SINGLE_QUOTE,/^(\')/,NUMERIC_CONTENT,/^([0-9]+)/,CONTENT,/^([^\s})@.]+?)/];function VLexer(str){this.input=this.originalInput=str.replace(/^\uFEFF/,"").replace(/\r\n|\r/g,"\n");this.lineno=1;this.charno=0}VLexer.prototype={scan:function(regexp,type){var captures,token;if(captures=regexp.exec(this.input)){this.input=this.input.substr(captures[1].length);token={type:type,line:this.lineno,chr:this.charno,val:captures[1]||"",toString:function(){return"["+this.type+" ("+this.line+","+this.chr+"): "+this.val+"]"}};this.charno+=captures[0].length;return token}},spewIf:function(tok,re){var result,index,spew;if(tok){result=re.exec(tok.val);if(result){index=tok.val.indexOf(result[1]);spew=tok.val.substring(index);this.input=spew+this.input;this.charno-=spew.length;tok.val=tok.val.substring(0,index)}}return tok},advance:function(){var i,name,test,result;for(i=0;i<TESTS.length;i+=2){test=TESTS[i+1];test.displayName=TESTS[i];if(typeof test==="function"){result=test.call(this)}if(typeof test.exec==="function"){result=this.scan(test,TESTS[i])}if(result){return result}}}};var vQuery=function(node){return new vQuery.fn.init(node)};vQuery.prototype.init=function(astNode){if(typeof astNode==="string"){this.mode=astNode}this.maxCheck()};vQuery.fn=vQuery.prototype.init.prototype=vQuery.prototype;vQuery.fn.vquery="yep";vQuery.fn.constructor=vQuery;vQuery.fn.length=0;vQuery.fn.parent=null;vQuery.fn.mode=null;vQuery.fn.tagName=null;vQuery.fn.beget=function(mode,tagName){var child=vQuery(mode);child.parent=this;this.push(child);if(tagName){child.tagName=tagName}this.maxCheck();return child};vQuery.fn.closest=function(mode,tagName){var p=this;while(p){if(p.tagName!==tagName&&p.parent){p=p.parent}else{break}}return p};vQuery.fn.pushFlatten=function(node){var n=node,i,children;while(n.length===1&&n[0].vquery){n=n[0]}if(n.mode!==PRG){this.push(n)}else{for(i=0;i<n.length;i++){this.push(n[i])}}this.maxCheck();return this};vQuery.fn.push=function(nodes){if(vQuery.isArray(nodes)){if(nodes.vquery){nodes.forEach(function(node){node.parent=this},this)}Array.prototype.push.apply(this,nodes)}else{if(nodes.vquery){nodes.parent=this}Array.prototype.push.call(this,nodes)}this.maxCheck();return this.length};vQuery.fn.root=function(){var p=this;while(p&&p.parent&&(p=p.parent)){}return p};vQuery.fn.toTreeString=function(){var buffer=[],indent=1;function visitNode(node){var children,child;buffer.push(Array(indent).join(" |")+" +"+node.mode+" "+(node.tagName||""));indent+=1;children=node.slice();while(child=children.shift()){if(child.vquery===vQuery.fn.vquery){visitNode(child)}else{buffer.push(Array(indent).join(" |")+" "+(child?child.toString().replace(/(\r|\n)/g,""):"[empty]"))}}indent-=1;buffer.push(Array(indent).join(" |")+" -"+node.mode+" "+(node.tagName||""))}visitNode(this);return buffer.join("\n")};vQuery.fn.maxCheck=function(last){if(this.length>=vQuery.maxSize){var e=new Error;e.message="Maximum number of elements exceeded.\n"+"This is typically caused by an unmatched character or tag. Parse tree follows:\n"+this.toTreeString();e.name="vQueryDepthException";throw e}};vQuery.maxSize=1e5;vQuery.fn.flatten=function(){var reduced;return this.reduce(function flatten(all,tok,i,orig){if(tok.vquery){all.push({type:"META",val:"START"+tok.mode,tagName:tok.tagName});reduced=tok.reduce(flatten,all);reduced.push({type:"META",val:"END"+tok.mode,tagName:tok.tagName});return reduced}tok.mode=orig.mode;all.push(tok);return all},[])};vQuery.reconstitute=function(arr){return arr.reduce(function recon(ast,tok,i,orig){if(tok.type==="META"){ast=ast.parent}else{if(tok.mode!==ast.mode){ast=ast.beget(tok.mode,tok.tagName)}ast.push(tok)}return ast},vQuery(PRG))};vQuery.isArray=function(obj){return Object.prototype.toString.call(obj)=="[object Array]"};vQuery.extend=function(obj){var next,i,p;for(i=1;i<arguments.length;i++){next=arguments[i];for(p in next){obj[p]=next[p]}}return obj};vQuery.takeMethodsFromArray=function(){var methods=["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice","indexOf","lastIndexOf","filter","forEach","every","map","some","reduce","reduceRight"],arr=[],m;for(var i=0;i<methods.length;i++){m=methods[i];if(typeof arr[m]==="function"){if(!vQuery.fn[m]){(function(methodName){vQuery.fn[methodName]=function(){return arr[methodName].apply(this,Array.prototype.slice.call(arguments,0))}})(m)}}else{throw new Error("Vash requires ES5 array iteration methods, missing: "+m)}}};vQuery.takeMethodsFromArray();function VParser(tokens,options){this.options=options||{};this.tokens=tokens;this.ast=vQuery(PRG);this.prevTokens=[];this.inCommentLine=false}var PRG="PROGRAM",MKP="MARKUP",BLK="BLOCK",EXP="EXPRESSION";VParser.prototype={parse:function(){var curr,i,len,block;while(this.prevTokens.push(curr),curr=this.tokens.pop()){if(this.options.debugParser){console.log(this.ast&&this.ast.mode,curr.type,curr.toString(),curr.val)}if(this.ast.mode===PRG||this.ast.mode===null){this.ast=this.ast.beget(this.options.initialMode||MKP);if(this.options.initialMode===EXP){this.ast=this.ast.beget(EXP)}}if(this.ast.mode===MKP){this.handleMKP(curr);continue}if(this.ast.mode===BLK){this.handleBLK(curr);continue}if(this.ast.mode===EXP){this.handleEXP(curr);continue}}this.ast=this.ast.root();if(this.options.debugParser&&!this.options.initialMode){console.log(this.ast.toString());console.log(this.ast.toTreeString())}return this.ast},exceptionFactory:function(e,type,tok){if(type=="UNMATCHED"){e.name="UnmatchedCharacterError";this.ast=this.ast.root();if(tok){e.message="Unmatched "+tok.type+" at line "+tok.line+", character "+tok.chr+". Value: "+tok.val+"\n "+this.ast.toTreeString();e.lineNumber=tok.line}}return e},advanceUntilNot:function(untilNot){var curr,next,tks=[];while(next=this.tokens[this.tokens.length-1]){if(next.type===untilNot){curr=this.tokens.pop();tks.push(curr)}else{break}}return tks},advanceUntilMatched:function(curr,start,end,startEscape,endEscape){var next=curr,prev=null,nstart=0,nend=0,tks=[];while(next){if(next.type===start){if(prev&&prev.type!==startEscape&&start!==end||!prev){nstart++}else if(start===end&&prev.type!==startEscape){nend++}}else if(next.type===end){nend++;if(prev&&prev.type===endEscape){nend--}}tks.push(next);if(nstart===nend){break}prev=next;next=this.tokens.pop();if(!next){throw this.exceptionFactory(new Error,"UNMATCHED",curr)}}return tks.reverse()},subParse:function(curr,modeToOpen,includeDelimsInSub){var subTokens,closer,miniParse,parseOpts=vQuery.extend({},this.options);parseOpts.initialMode=modeToOpen;subTokens=this.advanceUntilMatched(curr,curr.type,PAIRS[curr.type],null,AT);subTokens.pop();closer=subTokens.shift();if(!includeDelimsInSub){this.ast.push(curr)}miniParse=new VParser(subTokens,parseOpts);miniParse.parse();if(includeDelimsInSub){miniParse.ast[0].unshift(curr);miniParse.ast[0].push(closer)}this.ast.pushFlatten(miniParse.ast);if(!includeDelimsInSub){this.ast.push(closer)}},handleMKP:function(curr){var next=this.tokens[this.tokens.length-1],ahead=this.tokens[this.tokens.length-2],tagName=null,opener;switch(curr.type){case AT_STAR_OPEN:this.advanceUntilMatched(curr,AT_STAR_OPEN,AT_STAR_CLOSE,AT,AT);break;case AT:if(next){if(this.options.saveAT)this.ast.push(curr);switch(next.type){case PAREN_OPEN:case IDENTIFIER:if(this.ast.length===0){this.ast=this.ast.parent;this.ast.pop()}this.ast=this.ast.beget(EXP);break;case KEYWORD:case FUNCTION:case BRACE_OPEN:if(this.ast.length===0){this.ast=this.ast.parent;this.ast.pop()}this.ast=this.ast.beget(BLK);break;case AT:case AT_COLON:next.type="CONTENT";this.ast.push(this.tokens.pop());break;default:this.ast.push(this.tokens.pop());break}}break;case TEXT_TAG_OPEN:case HTML_TAG_OPEN:tagName=curr.val.match(/^<([^\/ >]+)/i);if(tagName===null&&next&&next.type===AT&&ahead){tagName=ahead.val.match(/(.*)/)}if(this.ast.tagName){this.ast=this.ast.beget(MKP,tagName[1])}else{this.ast.tagName=tagName[1]}if(HTML_TAG_OPEN===curr.type||this.options.saveTextTag){this.ast.push(curr)}break;case TEXT_TAG_CLOSE:case HTML_TAG_CLOSE:tagName=curr.val.match(/^<\/([^>]+)/i);if(tagName===null&&next&&next.type===AT&&ahead){tagName=ahead.val.match(/(.*)/)}opener=this.ast.closest(MKP,tagName[1]);if(opener===null||opener.tagName!==tagName[1]){}else{this.ast=opener}if(HTML_TAG_CLOSE===curr.type||this.options.saveTextTag){this.ast.push(curr)}if(this.ast.parent&&this.ast.parent.mode===BLK){this.ast=this.ast.parent}break;case HTML_TAG_VOID_CLOSE:this.ast.push(curr);this.ast=this.ast.parent;break;case BACKSLASH:curr.val+="\\";this.ast.push(curr);break;default:this.ast.push(curr);break}},handleBLK:function(curr){var next=this.tokens[this.tokens.length-1],submode,opener,closer,subTokens,parseOpts,miniParse,i;switch(curr.type){case AT:if(next.type!==AT&&!this.inCommentLine){this.tokens.push(curr);this.ast=this.ast.beget(MKP)}else{next.type=CONTENT;this.ast.push(next);this.tokens.pop()}break;case AT_STAR_OPEN:this.advanceUntilMatched(curr,AT_STAR_OPEN,AT_STAR_CLOSE,AT,AT);break;case AT_COLON:this.subParse(curr,MKP,true);break;case TEXT_TAG_OPEN:case TEXT_TAG_CLOSE:case HTML_TAG_OPEN:case HTML_TAG_CLOSE:this.ast=this.ast.beget(MKP);this.tokens.push(curr);break;case FORWARD_SLASH:case SINGLE_QUOTE:case DOUBLE_QUOTE:if(curr.type===FORWARD_SLASH&&next&&next.type===FORWARD_SLASH){this.inCommentLine=true}if(!this.inCommentLine){subTokens=this.advanceUntilMatched(curr,curr.type,PAIRS[curr.type],BACKSLASH,BACKSLASH).map(function(tok){if(tok.type===AT)tok.type=CONTENT;return tok});this.ast.pushFlatten(subTokens.reverse())}else{this.ast.push(curr)}break;case NEWLINE:if(this.inCommentLine){this.inCommentLine=false}this.ast.push(curr);break;case BRACE_OPEN:case PAREN_OPEN:submode=this.options.favorText&&curr.type===BRACE_OPEN?MKP:BLK;this.subParse(curr,submode);subTokens=this.advanceUntilNot(WHITESPACE);next=this.tokens[this.tokens.length-1];if(next&&next.type!==KEYWORD&&next.type!==FUNCTION&&next.type!==BRACE_OPEN&&curr.type!==PAREN_OPEN){this.tokens.push.apply(this.tokens,subTokens.reverse());this.ast=this.ast.parent}else{this.ast.push(subTokens)}break;default:this.ast.push(curr);break}},handleEXP:function(curr){var ahead=null,opener,closer,parseOpts,miniParse,subTokens,prev,i;switch(curr.type){case KEYWORD:case FUNCTION:this.ast=this.ast.beget(BLK);this.tokens.push(curr);break;case WHITESPACE:case LOGICAL:case ASSIGN_OPERATOR:case OPERATOR:case NUMERIC_CONTENT:if(this.ast.parent&&this.ast.parent.mode===EXP){this.ast.push(curr)}else{this.ast=this.ast.parent;this.tokens.push(curr)}break;case IDENTIFIER:this.ast.push(curr);break;case SINGLE_QUOTE:case DOUBLE_QUOTE:if(this.ast.parent&&this.ast.parent.mode===EXP){subTokens=this.advanceUntilMatched(curr,curr.type,PAIRS[curr.type],BACKSLASH,BACKSLASH);this.ast.pushFlatten(subTokens.reverse())}else{this.ast=this.ast.parent;this.tokens.push(curr)}break;case HARD_PAREN_OPEN:case PAREN_OPEN:prev=this.prevTokens[this.prevTokens.length-1];ahead=this.tokens[this.tokens.length-1];if(curr.type===HARD_PAREN_OPEN&&ahead.type===HARD_PAREN_CLOSE){this.tokens.push(curr);this.ast=this.ast.parent;break}this.subParse(curr,EXP);ahead=this.tokens[this.tokens.length-1];if(prev&&prev.type===AT||ahead&&ahead.type===IDENTIFIER){this.ast=this.ast.parent}break;case BRACE_OPEN:this.tokens.push(curr);this.ast=this.ast.beget(BLK);break;case PERIOD:ahead=this.tokens[this.tokens.length-1];if(ahead&&(ahead.type===IDENTIFIER||ahead.type===KEYWORD||ahead.type===FUNCTION||ahead.type===PERIOD||this.ast.parent&&this.ast.parent.mode===EXP)){this.ast.push(curr)}else{this.ast=this.ast.parent;this.tokens.push(curr)}break;default:if(this.ast.parent&&this.ast.parent.mode!==EXP){this.ast=this.ast.parent;this.tokens.push(curr)}else{this.ast.push(curr)}break}}};function VCompiler(ast,originalMarkup,options){this.ast=ast;this.originalMarkup=originalMarkup||"";this.options=options||{};this.reQuote=/(['"])/gi;this.reEscapedQuote=/\\+(["'])/gi;this.reLineBreak=/\r?\n/gi;this.reHelpersName=/HELPERSNAME/g;this.reModelName=/MODELNAME/g;this.reOriginalMarkup=/ORIGINALMARKUP/g;this.buffer=[]}var VCP=VCompiler.prototype;VCP.insertDebugVars=function(tok){if(this.options.debug){this.buffer.push(this.options.helpersName+".vl = "+tok.line+", ",this.options.helpersName+".vc = "+tok.chr+"; \n")}};VCP.visitMarkupTok=function(tok,parentNode,index){this.insertDebugVars(tok);this.buffer.push("MKP("+tok.val.replace(this.reEscapedQuote,"\\\\$1").replace(this.reQuote,"\\$1").replace(this.reLineBreak,"\\n")+")MKP")};VCP.visitBlockTok=function(tok,parentNode,index){this.buffer.push(tok.val)};VCP.visitExpressionTok=function(tok,parentNode,index,isHomogenous){var start="",end="",parentParentIsNotEXP=parentNode.parent&&parentNode.parent.mode!==EXP;if(this.options.htmlEscape!==false){if(parentParentIsNotEXP&&index===0&&isHomogenous){start+=this.options.helpersName+".escape("}if(parentParentIsNotEXP&&index===parentNode.length-1&&isHomogenous){end+=").toHtmlString()"}}if(parentParentIsNotEXP&&index===0){this.insertDebugVars(tok);start="__vbuffer.push("+start}if(parentParentIsNotEXP&&index===parentNode.length-1){end+="); \n"}this.buffer.push(start+tok.val+end);if(parentParentIsNotEXP&&index===parentNode.length-1){this.insertDebugVars(tok)}};VCP.visitNode=function(node){var n,children=node.slice(0),nonExp,i,child;if(node.mode===EXP&&(node.parent&&node.parent.mode!==EXP)){nonExp=node.filter(VCompiler.findNonExp).length}for(i=0;i<children.length;i++){child=children[i];if(child.type&&child.type===AT||child.type===AT_COLON)continue;if(child.vquery){this.visitNode(child)}else if(node.mode===MKP){this.visitMarkupTok(child,node,i)}else if(node.mode===BLK){this.visitBlockTok(child,node,i)}else if(node.mode===EXP){this.visitExpressionTok(child,node,i,nonExp>0?false:true)}}};VCP.escapeForDebug=function(str){return str.replace(this.reLineBreak,"!LB!").replace(this.reQuote,"\\$1").replace(this.reEscapedQuote,"\\$1")};VCP.replaceDevTokens=function(str){return str.replace(this.reHelpersName,this.options.helpersName).replace(this.reModelName,this.options.modelName)};VCP.addHead=function(body){var options=this.options;var head=""+(options.debug?"try { \n":"")+"var __vbuffer = HELPERSNAME.buffer; \n"+"HELPERSNAME.options = __vopts; \n"+"MODELNAME = MODELNAME || {}; \n"+(options.useWith?"with( MODELNAME ){ \n":"");head=this.replaceDevTokens(head);return head+body};VCP.addHelperHead=function(body){var options=this.options;var head=""+(options.debug?"try { \n":"")+"var __vbuffer = this.buffer; \n"+"var MODELNAME = this.model; \n"+"var HELPERSNAME = this; \n";head=this.replaceDevTokens(head);return head+body};VCP.addFoot=function(body){var options=this.options;var foot=""+(options.simple?'return HELPERSNAME.buffer.join(""); \n':"(__vopts && __vopts.onRenderEnd && __vopts.onRenderEnd(null, HELPERSNAME)); \n"+"return (__vopts && __vopts.asContext) \n"+" ? HELPERSNAME \n"+" : HELPERSNAME.toString(); \n")+(options.useWith?"} \n":"")+(options.debug?"} catch( e ){ \n"+' HELPERSNAME.reportError( e, HELPERSNAME.vl, HELPERSNAME.vc, "ORIGINALMARKUP" ); \n'+"} \n":"");foot=this.replaceDevTokens(foot).replace(this.reOriginalMarkup,this.escapeForDebug(this.originalMarkup));return body+foot};VCP.addHelperFoot=function(body){var options=this.options;var foot=""+(options.debug?"} catch( e ){ \n"+' HELPERSNAME.reportError( e, HELPERSNAME.vl, HELPERSNAME.vc, "ORIGINALMARKUP" ); \n'+"} \n":"");foot=this.replaceDevTokens(foot).replace(this.reOriginalMarkup,this.escapeForDebug(this.originalMarkup));return body+foot};VCP.generate=function(){var options=this.options;this.buffer.length=0;this.visitNode(this.ast);var joined=this.buffer.join("").split(")MKPMKP(").join("").split("MKP(").join("__vbuffer.push('").split(")MKP").join("'); \n");if(!options.asHelper){joined=this.addHead(joined);joined=this.addFoot(joined)}else{joined=this.addHelperHead(joined);joined=this.addHelperFoot(joined)}if(options.debugCompiler){console.log(joined);console.log(options)}this.cmpFunc=vash.link(joined,options);return this.cmpFunc};VCompiler.noop=function(){};VCompiler.findNonExp=function(node){if(node.vquery&&node.mode===EXP){return node.filter(VCompiler.findNonExp).length>0}if(node.vquery&&node.mode!==EXP){return true}else{return false}};exports["config"]={useWith:false,modelName:"model",helpersName:"html",htmlEscape:true,debug:true,debugParser:false,debugCompiler:false,simple:false,favorText:false,externs:["window","document"],saveTextTag:false,saveAT:false};exports["compile"]=function compile(markup,options){if(markup===""||typeof markup!=="string"){throw new Error("Empty or non-string cannot be compiled")}var l,tok,tokens=[],p,c,cmp,i;options=vQuery.extend({},exports.config,options||{});l=new VLexer(markup);while(tok=l.advance()){tokens.push(tok)}tokens.reverse();p=new VParser(tokens,options);p.parse();c=new VCompiler(p.ast,markup,options);cmp=c.generate();return cmp};var slice=Array.prototype.slice,reHelperFuncHead=/vash\.helpers\.([^= ]+?)\s*=\s*function([^(]*?)\(([^)]*?)\)\s*{/,reHelperFuncTail=/\}$/,reBatchSeparator=/^\/\/\s*@\s*batch\s*=\s*(.*?)$/;var splitByNamedTpl=function(reSeparator,markup,resultHandler,keepSeparator){var lines=markup.split(/[\n\r]/g),tpls={},paths=[],currentPath="";lines.forEach(function(line,i){var pathResult=reSeparator.exec(line),handlerResult=pathResult?resultHandler.apply(pathResult,pathResult):null;if(handlerResult){currentPath=handlerResult;tpls[currentPath]=[]}if((!handlerResult||keepSeparator)&&line){tpls[currentPath].push(line)}});Object.keys(tpls).forEach(function(key){tpls[key]=tpls[key].join("\n")});return tpls};var compileBatchOrHelper=function(type,str,options){var separator=type==="helper"?reHelperFuncHead:reBatchSeparator;var tpls=splitByNamedTpl(separator,str,function(ma,name){return name.replace(/^\s+|\s+$/,"")},type==="helper"?true:false);if(tpls){Object.keys(tpls).forEach(function(path){tpls[path]=type==="helper"?compileSingleHelper(tpls[path],options):vash.compile("@{"+tpls[path]+"}",options)});tpls.toClientString=function(){return Object.keys(tpls).reduce(function(prev,curr){if(curr==="toClientString"){return prev}return prev+tpls[curr].toClientString()+"\n"},"")}}return tpls};var compileSingleHelper=function(str,options){options=options||{};var def=str.replace(/^[\s\n\r]+|[\s\n\r]+$/,"").match(reHelperFuncHead),args=def[3].split(",").map(function(arg){return arg.replace(" ","")}),name=def[1],body=str.replace(reHelperFuncHead,"").replace(reHelperFuncTail,"");body="@{"+body+"}";options.args=args;options.asHelper=name;return vash.compile(body,options)};exports["compileHelper"]=compileBatchOrHelper.bind(null,"helper");exports["compileBatch"]=exports["batch"]=compileBatchOrHelper.bind(null,"batch");exports["VLexer"]=VLexer;exports["VParser"]=VParser;exports["VCompiler"]=VCompiler;exports["vQuery"]=vQuery;(function(){vash=typeof vash==="undefined"?{}:vash;if(!vash.compile){if(typeof define==="function"&&define["amd"]){define(function(){return vash})}else if(typeof module==="object"&&module["exports"]){module["exports"]=vash}else{window["vash"]=vash}}var helpers=vash["helpers"];var Helpers=function(model){this.buffer=new Buffer;this.model=model;this.options=null;this.vl=0;this.vc=0};vash["helpers"]=helpers=Helpers.prototype={constructor:Helpers,config:{},tplcache:{}};helpers.toString=helpers.toHtmlString=function(){return this.buffer._vo.join("")};var HTML_REGEX=/[&<>"'`]/g,HTML_REPLACER=function(match){return HTML_CHARS[match]},HTML_CHARS={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"};helpers["raw"]=function(val){var func=function(){return val};val=val!=null?val:"";return{toHtmlString:func,toString:func}};helpers["escape"]=function(val){var func=function(){return val};val=val!=null?val:"";if(typeof val.toHtmlString!=="function"){val=val.toString().replace(HTML_REGEX,HTML_REPLACER);return{toHtmlString:func,toString:func}}return val};var Buffer=function(){this._vo=[]};Buffer.prototype.mark=function(debugName){var mark=new Mark(this,debugName);mark.markedIndex=this._vo.length;this._vo.push(mark.uid);return mark};Buffer.prototype.fromMark=function(mark){var found=mark.findInBuffer();if(found>-1){mark.destroy();return this._vo.splice(found,this._vo.length)}return[]};Buffer.prototype.spliceMark=function(mark,numToRemove,add){var found=mark.findInBuffer();if(found>-1){mark.destroy();arguments[0]=found;return this._vo.splice.apply(this._vo,arguments)}return[]};Buffer.prototype.empty=function(){return this._vo.splice(0,this._vo.length)};Buffer.prototype.push=function(buffer){return this._vo.push(buffer)};Buffer.prototype.pushConcat=function(buffer){var buffers;if(Array.isArray(buffer)){buffers=buffer}else if(arguments.length>1){buffers=Array.prototype.slice.call(arguments)}else{buffers=[buffer]}for(var i=0;i<buffers.length;i++){this._vo.push(buffers[i])}return this.__vo};Buffer.prototype.indexOf=function(str){for(var i=0;i<this._vo.length;i++){if(str.test&&this._vo[i]&&this._vo[i].search(str)>-1||this._vo[i]==str){return i}}return-1};Buffer.prototype.lastIndexOf=function(str){var i=this._vo.length;while(--i>=0){if(str.test&&this._vo[i]&&this._vo[i].search(str)>-1||this._vo[i]==str){return i}}return-1};Buffer.prototype.splice=function(){return this._vo.splice.apply(this._vo,arguments)};Buffer.prototype.index=function(idx){return this._vo[idx]};Buffer.prototype.flush=function(){return this.empty().join("")};Buffer.prototype.toString=Buffer.prototype.toHtmlString=function(){return this._vo.join("")};var Mark=vash["Mark"]=function(buffer,debugName){this.uid="[VASHMARK-"+~~(Math.random()*1e7)+(debugName?":"+debugName:"")+"]";this.markedIndex=0;this.buffer=buffer;this.destroyed=false};var reMark=Mark.re=/\[VASHMARK\-\d{1,8}(?::[\s\S]+?)?]/g;Mark.uidLike=function(str){return(str||"").search(reMark)>-1};Mark.prototype.destroy=function(){var found=this.findInBuffer();if(found>-1){this.buffer.splice(found,1);this.markedIndex=-1}this.destroyed=true};Mark.prototype.findInBuffer=function(){if(this.destroyed){return-1}if(this.markedIndex&&this.buffer.index(this.markedIndex)===this.uid){return this.markedIndex}var escaped=this.uid.replace(/(\[|\])/g,"\\$1");var re=new RegExp(escaped);return this.markedIndex=this.buffer.indexOf(re)};helpers.constructor.reportError=function(e,lineno,chr,orig,lb){lb=lb||"!LB!";var lines=orig.split(lb),contextSize=lineno===0&&chr===0?lines.length-1:3,start=Math.max(0,lineno-contextSize),end=Math.min(lines.length,lineno+contextSize);var contextStr=lines.slice(start,end).map(function(line,i,all){var curr=i+start+1;return(curr===lineno?" > ":" ")+(curr<10?" ":"")+curr+" | "+line}).join("\n");e.vashlineno=lineno;e.vashcharno=chr;e.message="Problem while rendering template at line "+lineno+", character "+chr+".\nOriginal message: "+e.message+"."+"\nContext: \n\n"+contextStr+"\n\n";throw e};helpers["reportError"]=function(){this.constructor.reportError.apply(this,arguments)};vash["link"]=function(cmpFunc,options){var originalFunc,cmpOpts;if(!options.args){options.args=[options.modelName,options.helpersName,"__vopts","vash"]}if(typeof cmpFunc==="string"){originalFunc=cmpFunc;try{cmpOpts=options.args.slice();cmpOpts.push(cmpFunc);cmpFunc=Function.apply(null,cmpOpts)}catch(e){helpers.reportError(e,0,0,originalFunc,/\n/)}}cmpFunc.options={simple:options.simple,modelName:options.modelName,helpersName:options.helpersName};var linked;if(options.asHelper){cmpFunc.options.args=options.args;cmpFunc.options.asHelper=options.asHelper;linked=function(){return cmpFunc.apply(this,slice.call(arguments))};helpers[options.asHelper]=linked}else{linked=function(model,opts){if(options.simple){var ctx={buffer:[],escape:Helpers.prototype.escape,raw:Helpers.prototype.raw};return cmpFunc(model,ctx,opts,vash)}opts=divineRuntimeTplOptions(model,opts);return cmpFunc(model,opts&&opts.context||new Helpers(model),opts,vash)}}linked["toString"]=function(){return cmpFunc.toString()};linked["_toString"]=function(){return Function.prototype.toString.call(linked)};linked["toClientString"]=function(){return"vash.link( "+cmpFunc.toString()+", "+JSON.stringify(cmpFunc.options)+" )"};return linked};function divineRuntimeTplOptions(model,opts){if(typeof opts==="function"){opts={onRenderEnd:opts}}if(model&&model.onRenderEnd){opts=opts||{};if(!opts.onRenderEnd){opts.onRenderEnd=model.onRenderEnd}delete model.onRenderEnd}if(!opts){opts={}}return opts}var slice=Array.prototype.slice;vash["lookup"]=function(path,model){var tpl=vash.helpers.tplcache[path];if(!tpl){throw new Error("Could not find template: "+path)}if(model){return tpl(model)}else return tpl};vash["install"]=function(path,tpl){var cache=vash.helpers.tplcache;if(typeof tpl==="string"){if(!vash.compile){throw new Error("vash.install(path, [string]) is not available in the standalone runtime.") | |
}tpl=vash.compile(tpl)}else if(typeof path==="object"){tpl=path;Object.keys(tpl).forEach(function(path){cache[path]=tpl[path]});return cache}return cache[path]=tpl};vash["uninstall"]=function(path){var cache=vash.helpers.tplcache,deleted=false;if(typeof path==="string"){return delete cache[path]}else{Object.keys(cache).forEach(function(key){if(cache[key]===path){deleted=delete cache[key]}});return deleted}}})();(function(){var helpers=vash.helpers;helpers.trim=function(val){return val.replace(/^\s*|\s*$/g,"")};helpers.config.highlighter=null;helpers.highlight=function(lang,cb){var startMark=this.buffer.mark();cb();var cbOutLines=this.buffer.fromMark(startMark);this.buffer.push("<pre><code>");if(helpers.config.highlighter){this.buffer.push(helpers.config.highlighter(lang,cbOutLines.join("")).value)}else{this.buffer.push(cbOutLines)}this.buffer.push("</code></pre>")}})();(function(){if(typeof window==="undefined"){var fs=require("fs"),path=require("path")}var helpers=vash.helpers;helpers.config.browser=false;vash.loadFile=function(filepath,options,cb){options=vQuery.extend({},vash.config,options||{});var browser=helpers.config.browser,tpl;if(!browser&&options.settings&&options.settings.views){filepath=path.normalize(filepath);if(filepath.indexOf(path.normalize(options.settings.views))===-1){filepath=path.join(options.settings.views,filepath)}if(!path.extname(filepath)){filepath+="."+(options.settings["view engine"]||"vash")}}try{tpl=options.cache||browser?helpers.tplcache[filepath]||(helpers.tplcache[filepath]=vash.compile(fs.readFileSync(filepath,"utf8"))):vash.compile(fs.readFileSync(filepath,"utf8"));cb&&cb(null,tpl)}catch(e){cb&&cb(e,null)}};vash.renderFile=function(filepath,options,cb){vash.loadFile(filepath,options,function(err,tpl){var prevORE=options.onRenderEnd;cb(err,!err&&tpl(options,function(err,ctx){ctx.finishLayout();if(prevORE)prevORE(err,ctx)}))})};helpers._ensureLayoutProps=function(){this.appends=this.appends||{};this.prepends=this.prepends||{};this.blocks=this.blocks||{};this.blockMarks=this.blockMarks||{}};helpers.finishLayout=function(){this._ensureLayoutProps();var self=this,name,marks,blocks,prepends,appends,injectMark,m,content;for(name in this.blockMarks){marks=this.blockMarks[name];prepends=this.prepends[name];blocks=this.blocks[name];appends=this.appends[name];injectMark=marks.pop();m=this.buffer.mark();prepends&&prepends.forEach(function(p){self.buffer.pushConcat(p)});block=blocks.pop();block&&this.buffer.pushConcat(block);appends&&appends.forEach(function(a){self.buffer.pushConcat(a)});content=this.buffer.fromMark(m);content=compactContent(content);content.unshift(injectMark,0);this.buffer.spliceMark.apply(this.buffer,content)}for(name in this.blockMarks){this.blockMarks[name].forEach(function(m){m.destroy()})}delete this.blockMarks;delete this.prepends;delete this.blocks;delete this.appends;return this.toString()};function compactContent(content){var re=vash.Mark.re;var parts=[];var str="";content.forEach(function(part){if(re.exec(part)){parts.push(str,part);str=""}else{str+=part||""}});parts.push(str);return parts}helpers.extend=function(path,ctn){var self=this,buffer=this.buffer,origModel=this.model,layoutCtx;this._ensureLayoutProps();vash.loadFile(path,this.model,function(err,tpl){var start=self.buffer.mark();ctn(self.model);var content=self.buffer.fromMark(start);self.isExtending=true;tpl(self.model,{context:self});self.isExtending=false});this.model=origModel};helpers.include=function(name,model){var self=this,buffer=this.buffer,origModel=this.model;vash.loadFile(name,this.model,function(err,tpl){tpl(model||self.model,{context:self})});this.model=origModel};helpers.block=function(name,ctn){this._ensureLayoutProps();var self=this,marks=this.blockMarks[name]||(this.blockMarks[name]=[]),blocks=this.blocks[name]||(this.blocks[name]=[]),start,content;if(ctn){start=this.buffer.mark();ctn(this.model);content=this.buffer.fromMark(start);if(content.length&&!this.isExtending){blocks.push(content)}if(content.length&&this.isExtending){blocks.unshift(content)}}marks.push(this.buffer.mark("block-"+name))};helpers._handlePrependAppend=function(type,name,ctn){this._ensureLayoutProps();var start=this.buffer.mark(),content,stack=this[type],namedStack=stack[name]||(stack[name]=[]);ctn(this.model);content=this.buffer.fromMark(start);namedStack.push(content)};helpers.append=function(name,ctn){this._handlePrependAppend("appends",name,ctn)};helpers.prepend=function(name,ctn){this._handlePrependAppend("prepends",name,ctn)}})();exports.__express=exports.renderFile;return exports}({version:"0.7.12-1"}))},{fs:1,path:2}]},{},[]);var vash=require("vash");var play=document.createElement("input");play.type="button";play.value="play/pause";document.body.appendChild(play);play.onclick=function(e){evolve(null,state);var lseq=state.seqs.lead;var hseq=state.seqs.harmony;var bseq=state.seqs.bass;var start=ac.currentTime;lseq.play(start);hseq.play(start+60/hseq.tempo*16);bseq.play(start)};var ac=new(window.AudioContext?AudioContext:webkitAudioContext);var state=null;setTimeout(function(){state={notes:{lead:olead.slice(0),harmony:oharmony.slice(0),bass:obass.slice(0)},seqs:{lead:null,harmony:null,bass:null}}});function evolve(seed,state){var tempo=132;var lnotes=state.notes.lead.slice(0);var hnotes=state.notes.harmony.slice(0);var bnotes=state.notes.bass.slice(0);for(var i=0;i<lnotes.length;i++){var parts=lnotes[i].match(/([^\s]+)\s+([^\s]+)/);var pitch=parts[1];var duration=parts[2];if(Math.random()>.8){}}var lseq=new Sequence(ac,tempo,lnotes);var hseq=new Sequence(ac,tempo,hnotes);var bseq=new Sequence(ac,tempo,bnotes);state.seqs.lead=lseq;state.seqs.harmony=hseq;state.seqs.bass=bseq;lseq.staccato=.55;hseq.staccato=.55;bseq.staccato=.05;bseq.smoothing=.4;lseq.gain.gain.value=1;hseq.gain.gain.value=.8;bseq.gain.gain.value=.65;lseq.mid.frequency.value=800;lseq.mid.gain.value=3;hseq.mid.frequency.value=1200;bseq.mid.gain.value=3;bseq.bass.gain.value=6;bseq.bass.frequency.value=80;bseq.mid.gain.value=-6;bseq.mid.frequency.value=500;bseq.treble.gain.value=-2;bseq.treble.frequency.value=1400}var olead=["- e","Bb3 e","A3 e","Bb3 e","G3 e","A3 e","F3 e","G3 e","E3 e","F3 e","G3 e","F3 e","E3 e","F3 e","D3 q","- e","Bb3 s","A3 s","Bb3 e","G3 e","A3 e","G3 e","F3 e","G3 e","E3 e","F3 e","G3 e","F3 e","E3 s","F3 s","E3 e","D3 q"];var oharmony=["- e","D4 e","C4 e","D4 e","Bb3 e","C4 e","A3 e","Bb3 e","G3 e","A3 e","Bb3 e","A3 e","G3 e","A3 e","F3 q","- e","D4 s","C4 s","D4 e","Bb3 e","C4 e","Bb3 e","A3 e","Bb3 e","G3 e","A3 e","Bb3 e","A3 e","G3 s","A3 s","G3 e","F3 q"];var obass=["D3 q","- h","D3 q","A2 q","- h","A2 q","Bb2 q","- h","Bb2 q","F2 h","A2 h"];!function(a){function b(a){var c=a.split(h);this.frequency=b.getFrequency(c[0])||0,this.duration=b.getDuration(c[1])||0}function c(a,b,c){this.ac=a||new AudioContext,this.createFxNodes(),this.tempo=b||120,this.loop=!0,this.smoothing=0,this.staccato=0,this.notes=[],this.push.apply(this,c||[])}var d="B#-C|C#-Db|D|D#-Eb|E-Fb|E#-F|F#-Gb|G|G#-Ab|A|A#-Bb|B-Cb",e=440*Math.pow(Math.pow(2,1/12),-9),f=/^[0-9.]+$/,g=4,h=/\s+/,i=/(\d+)/,j={};d.split("|").forEach(function(a,b){a.split("-").forEach(function(a){j[a]=b})}),b.getFrequency=function(a){var b=a.split(i),c=j[b[0]],d=(b[1]||g)-g,f=e*Math.pow(Math.pow(2,1/12),c);return f*Math.pow(2,d)},b.getDuration=function(a){return f.test(a)?parseFloat(a):a.toLowerCase().split("").reduce(function(a,b){return a+("w"===b?4:"h"===b?2:"q"===b?1:"e"===b?.5:"s"===b?.25:0)},0)},c.prototype.createFxNodes=function(){var a=[["bass",100],["mid",1e3],["treble",2500]],b=this.gain=this.ac.createGain();return a.forEach(function(a,c){c=this[a[0]]=this.ac.createBiquadFilter(),c.type="peaking",c.frequency.value=a[1],b.connect(b=c)}.bind(this)),b.connect(this.ac.destination),this},c.prototype.push=function(){return Array.prototype.forEach.call(arguments,function(a){this.notes.push(a instanceof b?a:new b(a))}.bind(this)),this},c.prototype.createOscillator=function(){return this.stop(),this.osc=this.ac.createOscillator(),this.osc.type=this.waveType||"square",this.osc.connect(this.gain),this},c.prototype.scheduleNote=function(a,b){var c=60/this.tempo*this.notes[a].duration,d=c*(1-(this.staccato||0));return this.setFrequency(this.notes[a].frequency,b),this.smoothing&&this.notes[a].frequency&&this.slide(a,b,d),this.setFrequency(0,b+d),b+c},c.prototype.getNextNote=function(a){return this.notes[a<this.notes.length-1?a+1:0]},c.prototype.getSlideStartDelay=function(a){return a-Math.min(a,60/this.tempo*this.smoothing)},c.prototype.slide=function(a,b,c){var d=this.getNextNote(a),e=this.getSlideStartDelay(c);return this.setFrequency(this.notes[a].frequency,b+e),this.rampFrequency(d.frequency,b+c),this},c.prototype.setFrequency=function(a,b){return this.osc.frequency.setValueAtTime(a,b),this},c.prototype.rampFrequency=function(a,b){return this.osc.frequency.linearRampToValueAtTime(a,b),this},c.prototype.play=function(a){return a="number"==typeof a?a:this.ac.currentTime,this.createOscillator(),this.osc.start(a),this.notes.forEach(function(b,c){a=this.scheduleNote(c,a)}.bind(this)),this.osc.stop(a),this.osc.onended=this.loop?this.play.bind(this,a):null,this},c.prototype.stop=function(){return this.osc&&(this.osc.onended=null,this.osc.stop(0),this.osc.frequency.cancelScheduledValues(0),this.osc=null),this},a.Note=b,a.Sequence=c}("undefined"!=typeof window?window:this); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "requirebin-sketch", | |
"version": "1.0.0", | |
"dependencies": { | |
"vash": "0.7.12-1" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<style type='text/css'>html, body { margin: 0; padding: 0; border: 0; } | |
body, html { height: 100%; width: 100%; }</style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment