├── .gitignore ├── .jshintrc ├── Gruntfile.js ├── LICENSE-MIT ├── README.md ├── bin └── update-website.sh ├── non-npm ├── angular-1-4-fixed.js ├── angular-bind-polymer.js ├── file-saver │ ├── FileSaver.js │ ├── FileSaver.min.js │ ├── LICENSE.md │ ├── README.md │ └── demo │ │ ├── demo.css │ │ ├── demo.js │ │ ├── demo.min.js │ │ └── index.xhtml └── viktor │ ├── globals.js │ └── patch-sharing.js ├── npm-shrinkwrap.json ├── package.json ├── src ├── app │ ├── 3rd-party │ │ └── google-api │ │ │ └── module.js │ ├── app.js │ └── ui │ │ ├── controller │ │ ├── compressor.js │ │ ├── delay.js │ │ ├── keyboard.js │ │ ├── master-controls.js │ │ ├── master-volume.js │ │ ├── modulation-wheel.js │ │ ├── pitch-bend.js │ │ └── reverb.js │ │ ├── fixes.js │ │ ├── module.js │ │ ├── module │ │ ├── footer │ │ │ ├── controller │ │ │ │ └── footer.js │ │ │ ├── module.js │ │ │ └── template │ │ │ │ └── footer.html │ │ ├── instruments │ │ │ └── synth │ │ │ │ ├── controller │ │ │ │ ├── envelopes.js │ │ │ │ ├── filter.js │ │ │ │ ├── lfo.js │ │ │ │ ├── mixer.js │ │ │ │ ├── modulation.js │ │ │ │ ├── noise.js │ │ │ │ ├── oscillator-bank.js │ │ │ │ └── polyphony.js │ │ │ │ ├── module.js │ │ │ │ └── template │ │ │ │ ├── envelopes.html │ │ │ │ ├── filter.html │ │ │ │ ├── lfo.html │ │ │ │ ├── mixer.html │ │ │ │ ├── modulation+polyphony.html │ │ │ │ ├── noise.html │ │ │ │ ├── oscillator-bank.html │ │ │ │ └── synth.html │ │ ├── maillist │ │ │ ├── controller │ │ │ │ ├── maillist.js │ │ │ │ └── midi-data.js │ │ │ ├── module.js │ │ │ └── template │ │ │ │ └── maillist.html │ │ ├── patch-library │ │ │ ├── controller │ │ │ │ ├── drop-down.js │ │ │ │ └── patch-library.js │ │ │ ├── module.js │ │ │ └── template │ │ │ │ ├── drop-down.html │ │ │ │ └── patch-library.html │ │ ├── settings │ │ │ ├── controller │ │ │ │ └── settings.js │ │ │ ├── module.js │ │ │ └── template │ │ │ │ └── settings.html │ │ ├── t-shirts │ │ │ ├── controller │ │ │ │ └── t-shirts.js │ │ │ ├── module.js │ │ │ └── template │ │ │ │ └── t-shirts.html │ │ └── typed-ad │ │ │ ├── controller │ │ │ └── typed-ad.js │ │ │ ├── module.js │ │ │ └── template │ │ │ └── typed-ad.html │ │ └── template │ │ ├── compressor.html │ │ ├── daw.html │ │ ├── delay.html │ │ ├── keyboard.html │ │ ├── master-controls.html │ │ ├── master-volume.html │ │ ├── modulation-wheel.html │ │ ├── pitch-bend.html │ │ └── reverb.html ├── client │ ├── images │ │ ├── 0-100-knob.png │ │ ├── 0-100-slider-base.png │ │ ├── 6-range-knob.png │ │ ├── cards │ │ │ ├── facebook-card.jpg │ │ │ └── twitter-card.jpg │ │ ├── lfo-knob.png │ │ ├── noise-slider-base.png │ │ ├── range-knob.png │ │ ├── slider-knob.png │ │ ├── switch.png │ │ ├── synth-base-panel.jpg │ │ ├── t-shirts │ │ │ ├── button-dark.png │ │ │ ├── button-light.png │ │ │ ├── ghost-jam.png │ │ │ ├── metalic.png │ │ │ ├── metalic2.png │ │ │ ├── mono.png │ │ │ ├── sketch-light.png │ │ │ ├── sketch.png │ │ │ └── true-color.png │ │ └── wheel.png │ ├── index.html │ └── styles │ │ ├── ads.styl │ │ ├── bootstrap-override.styl │ │ ├── daw │ │ ├── bottom-row.styl │ │ ├── daw.styl │ │ ├── keyboard.styl │ │ ├── modals.styl │ │ ├── patch-library │ │ │ ├── drop-down.styl │ │ │ └── patch-library.styl │ │ ├── settings │ │ │ └── modal.styl │ │ ├── synth │ │ │ ├── control-bank.styl │ │ │ ├── envelopes.styl │ │ │ ├── mixer.styl │ │ │ ├── modulation.styl │ │ │ ├── noise.styl │ │ │ ├── oscillator-bank.styl │ │ │ └── synth.styl │ │ └── t-shirts │ │ │ └── t-shirts.styl │ │ ├── fonts.styl │ │ ├── footer.styl │ │ ├── maillist.styl │ │ ├── main.styl │ │ ├── social.styl │ │ ├── variables.styl │ │ └── viktor-round-button.styl └── server │ ├── client │ ├── bower.json │ └── non-bower │ │ └── webaudio-controls │ │ ├── .gitignore │ │ ├── Gruntfile.js │ │ ├── LICENSE │ │ ├── README.md │ │ ├── bower.json │ │ ├── bower_components │ │ ├── NodeBind │ │ │ ├── conf │ │ │ │ ├── karma.conf.js │ │ │ │ └── mocha.conf.js │ │ │ └── src │ │ │ │ └── NodeBind.js │ │ ├── TemplateBinding │ │ │ ├── build.json │ │ │ ├── load.js │ │ │ ├── src │ │ │ │ ├── TemplateBinding.js │ │ │ │ └── template_element.css │ │ │ └── template-instantiation.md │ │ ├── URL │ │ │ ├── testharness.css │ │ │ ├── testharness.js │ │ │ ├── testharnessreport.js │ │ │ ├── url.js │ │ │ ├── urltestgenerator.html │ │ │ ├── urltestharness.html │ │ │ ├── urltestparser.js │ │ │ ├── urltestrunner.html │ │ │ └── urltests.txt │ │ ├── core-component-page │ │ │ └── core-component-page.html │ │ ├── observe-js │ │ │ ├── conf │ │ │ │ ├── karma.conf.js │ │ │ │ └── mocha.conf.js │ │ │ ├── observe-js.html │ │ │ ├── src │ │ │ │ └── observe.js │ │ │ └── util │ │ │ │ └── planner.js │ │ ├── polymer-expressions │ │ │ ├── build.json │ │ │ ├── conf │ │ │ │ ├── karma.conf.js │ │ │ │ └── mocha.conf.js │ │ │ ├── polymer-expressions.html │ │ │ ├── smoke.html │ │ │ ├── src │ │ │ │ └── polymer-expressions.js │ │ │ └── third_party │ │ │ │ └── esprima │ │ │ │ ├── CONTRIBUTING.md │ │ │ │ ├── LICENSE.BSD │ │ │ │ └── esprima.js │ │ ├── polymer-gestures │ │ │ ├── .gitignore │ │ │ ├── banner.txt │ │ │ ├── build.json │ │ │ ├── conf │ │ │ │ └── karma.conf.js │ │ │ ├── polymer-gestures.html │ │ │ ├── polymer-gestures.js │ │ │ ├── src │ │ │ │ ├── dispatcher.js │ │ │ │ ├── eventFactory.js │ │ │ │ ├── hold.js │ │ │ │ ├── mouse.js │ │ │ │ ├── ms.js │ │ │ │ ├── pinch.js │ │ │ │ ├── platform-events.js │ │ │ │ ├── pointer.js │ │ │ │ ├── pointermap.js │ │ │ │ ├── scope.js │ │ │ │ ├── tap.js │ │ │ │ ├── targetfind.js │ │ │ │ ├── touch-action.js │ │ │ │ ├── touch.js │ │ │ │ └── track.js │ │ │ └── test │ │ │ │ ├── html │ │ │ │ ├── content-handler.html │ │ │ │ ├── focus.html │ │ │ │ └── ghostclick.html │ │ │ │ ├── js │ │ │ │ ├── eventListeners.js │ │ │ │ ├── fake.js │ │ │ │ ├── gestures.js │ │ │ │ ├── pointermap.js │ │ │ │ └── setup.js │ │ │ │ └── runner.html │ │ ├── polymer │ │ │ ├── PRIMER.md │ │ │ ├── build.bat │ │ │ ├── explainer │ │ │ │ ├── data-bind.vsdx │ │ │ │ └── samples.html │ │ │ ├── polymer-micro.html │ │ │ ├── polymer-mini.html │ │ │ ├── polymer.html │ │ │ ├── src │ │ │ │ ├── expr │ │ │ │ │ ├── focus.html │ │ │ │ │ ├── gestures.html │ │ │ │ │ ├── log.html │ │ │ │ │ ├── sinspect.html │ │ │ │ │ ├── style-auditor.html │ │ │ │ │ └── style-protector.html │ │ │ │ ├── features │ │ │ │ │ ├── micro │ │ │ │ │ │ ├── attributes.html │ │ │ │ │ │ ├── constructor.html │ │ │ │ │ │ ├── extends.html │ │ │ │ │ │ ├── mixins.html │ │ │ │ │ │ └── properties.html │ │ │ │ │ ├── mini │ │ │ │ │ │ ├── ready.html │ │ │ │ │ │ ├── shadow.html │ │ │ │ │ │ ├── shady.html │ │ │ │ │ │ └── template.html │ │ │ │ │ └── standard │ │ │ │ │ │ ├── annotations.html │ │ │ │ │ │ ├── configure.html │ │ │ │ │ │ ├── effects.html │ │ │ │ │ │ ├── events.html │ │ │ │ │ │ ├── notify-path.html │ │ │ │ │ │ ├── resolveUrl.html │ │ │ │ │ │ ├── styling.html │ │ │ │ │ │ ├── utils.html │ │ │ │ │ │ └── x-styling.html │ │ │ │ ├── lib │ │ │ │ │ ├── annotations │ │ │ │ │ │ ├── annotations.html │ │ │ │ │ │ └── demo │ │ │ │ │ │ │ └── app-chrome.html │ │ │ │ │ ├── array-observe.html │ │ │ │ │ ├── array-splice.html │ │ │ │ │ ├── async.html │ │ │ │ │ ├── base.html │ │ │ │ │ ├── bind │ │ │ │ │ │ ├── bind-annotations.html │ │ │ │ │ │ ├── bind-effects.html │ │ │ │ │ │ ├── bind.html │ │ │ │ │ │ └── demo │ │ │ │ │ │ │ ├── app-chrome.html │ │ │ │ │ │ │ ├── app.html │ │ │ │ │ │ │ └── src │ │ │ │ │ │ │ ├── annotations-bind-demo.html │ │ │ │ │ │ │ └── bind-demo.html │ │ │ │ │ ├── case-map.html │ │ │ │ │ ├── collection.html │ │ │ │ │ ├── css-parse.html │ │ │ │ │ ├── debounce.html │ │ │ │ │ ├── dom-api.html │ │ │ │ │ ├── dom-module.html │ │ │ │ │ ├── event-api.html │ │ │ │ │ ├── gestures.html │ │ │ │ │ ├── lang.html │ │ │ │ │ ├── module.html │ │ │ │ │ ├── polymer.html │ │ │ │ │ ├── resolve-url.html │ │ │ │ │ ├── settings.html │ │ │ │ │ ├── style-defaults.html │ │ │ │ │ ├── style-transformer.html │ │ │ │ │ ├── style-util.html │ │ │ │ │ ├── template │ │ │ │ │ │ ├── templatizer.html │ │ │ │ │ │ ├── x-array-selector.html │ │ │ │ │ │ ├── x-autobind.html │ │ │ │ │ │ ├── x-if.html │ │ │ │ │ │ ├── x-repeat.html │ │ │ │ │ │ └── x-template.html │ │ │ │ │ └── x-style.html │ │ │ │ └── polymer.html │ │ │ └── wct.conf.js │ │ └── webcomponentsjs │ │ │ ├── CustomElements.js │ │ │ ├── CustomElements.min.js │ │ │ ├── HTMLImports.js │ │ │ ├── HTMLImports.min.js │ │ │ ├── ShadowDOM.js │ │ │ ├── ShadowDOM.min.js │ │ │ ├── build.log │ │ │ ├── webcomponents-lite.js │ │ │ ├── webcomponents-lite.min.js │ │ │ ├── webcomponents.js │ │ │ └── webcomponents.min.js │ │ ├── img │ │ ├── LittlePhatty.png │ │ ├── LittlePhatty_sample.png │ │ ├── bg.png │ │ ├── defknob2.png │ │ ├── demo.png │ │ ├── hsliderbody.png │ │ ├── hsliderknob.png │ │ ├── hsw5.png │ │ ├── sample3.png │ │ ├── switch_toggle.png │ │ ├── testknob.png │ │ ├── vernier.png │ │ ├── vsliderbody.png │ │ └── vsliderknob.png │ │ ├── lib │ │ ├── webaudio-controls.min.html │ │ ├── webaudio-keyboard.min.html │ │ ├── webaudio-knob.min.html │ │ ├── webaudio-param.min.html │ │ ├── webaudio-slider.min.html │ │ └── webaudio-switch.min.html │ │ ├── package.json │ │ ├── sample1.html │ │ ├── sample2.html │ │ ├── sample3.html │ │ ├── sample4.html │ │ └── webcomponents │ │ ├── webaudio-controls.html │ │ ├── webaudio-controls.min.html │ │ ├── webaudio-keyboard.html │ │ ├── webaudio-knob.html │ │ ├── webaudio-param.html │ │ ├── webaudio-slider.html │ │ └── webaudio-switch.html │ └── server.js └── test ├── data └── patch-sharing.js └── patch-sharing-test.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules 4 | 5 | src/server/client/bower_components 6 | src/server/client/impulses 7 | src/server/client/css 8 | src/server/client/js 9 | src/server/client/images 10 | src/server/client/index.html -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": "nofunc", 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "unused": true, 11 | "boss": true, 12 | "eqnull": true, 13 | "node": true, 14 | "predef": ["describe", "it", "before", "beforeEach", "after", "afterEach", "module", "window", "document", "navigator", "FileReader", "Blob", "ga", "$", "alert"] 15 | } 16 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-2019 Nikolay Tsenkov nikolay@tsenkov.net 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /bin/update-website.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | mkdir build && cd build/ 4 | 5 | git clone https://github.com/nicroto/viktor.git 6 | 7 | cd viktor 8 | 9 | git checkout gh-pages 10 | 11 | rm -rf * 12 | 13 | cp -R ../../src/server/client/ . 14 | 15 | git add --all 16 | 17 | git commit -m "update website" 18 | 19 | git push -------------------------------------------------------------------------------- /non-npm/angular-bind-polymer.js: -------------------------------------------------------------------------------- 1 | angular.module('eee-c.angularBindPolymer', []). 2 | directive('bindPolymer', ['$parse', function($parse) { 3 | 'use strict'; 4 | return { 5 | restrict: 'A', 6 | scope : false, 7 | compile: function bindPolymerCompile($element, $attr) { 8 | var attrMap = {}; 9 | 10 | for (var prop in $attr) { 11 | if (angular.isString($attr[prop])) { 12 | var _match = $attr[prop].match(/\{\{\s*([\.\w]+)\s*\}\}/); 13 | if (_match) { 14 | attrMap[prop] = $parse(_match[1]); 15 | } 16 | } 17 | } 18 | 19 | return function bindPolymerLink(scope, element, attrs) { 20 | 21 | // When Polymer sees a change to the bound variable, 22 | // $apply / $digest the changes here in Angular 23 | var observer = new MutationObserver(function processMutations(mutations) { 24 | mutations.forEach(function processMutation(mutation) { 25 | var attributeName, newValue, oldValue, newType, oldType, getter; 26 | attributeName = mutation.attributeName; 27 | 28 | if(attributeName in attrMap) { 29 | newValue = element.attr(attributeName); 30 | getter = attrMap[attributeName]; 31 | oldValue = getter(scope); 32 | newType = typeof newValue; 33 | oldType = typeof oldValue; 34 | 35 | if ( oldType !== newType && newType === "string" ) { 36 | if ( oldType === "number" ) { 37 | newValue = parseFloat( newValue ); 38 | } else if ( oldType === "boolean" ) { 39 | newValue = ( newValue === "true" ); 40 | } 41 | } 42 | 43 | if(oldValue != newValue && angular.isFunction(getter.assign)) { 44 | getter.assign(scope, newValue); 45 | } 46 | } 47 | }); 48 | scope.$apply(); 49 | }); 50 | 51 | observer.observe(element[0], {attributes: true}); 52 | scope.$on('$destroy', observer.disconnect.bind(observer)); 53 | } 54 | } 55 | }; 56 | }]); -------------------------------------------------------------------------------- /non-npm/file-saver/LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright © 2015 [Eli Grey][1]. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | 9 | [1]: http://eligrey.com 10 | -------------------------------------------------------------------------------- /non-npm/file-saver/demo/demo.css: -------------------------------------------------------------------------------- 1 | html { 2 | background-color: #DDD; 3 | } 4 | body { 5 | -webkit-box-sizing: content-box; 6 | -moz-box-sizing: content-box; 7 | box-sizing: content-box; 8 | width: 900px; 9 | margin: 0 auto; 10 | font-family: Verdana, Helvetica, Arial, sans-serif; 11 | -webkit-box-shadow: 0 0 10px 2px rgba(0, 0, 0, .5); 12 | -moz-box-shadow: 0 0 10px 2px rgba(0, 0, 0, .5); 13 | box-shadow: 0 0 10px 2px rgba(0, 0, 0, .5); 14 | padding: 7px 25px 70px; 15 | background-color: #FFF; 16 | } 17 | h1, h2, h3, h4, h5, h6 { 18 | font-family: Georgia, "Times New Roman", serif; 19 | } 20 | h2, form { 21 | text-align: center; 22 | } 23 | form { 24 | margin-top: 5px; 25 | } 26 | .input { 27 | width: 500px; 28 | height: 300px; 29 | margin: 0 auto; 30 | display: block; 31 | } 32 | section { 33 | margin-top: 40px; 34 | } 35 | #canvas { 36 | cursor: crosshair; 37 | } 38 | #canvas, #html { 39 | border: 1px solid #000; 40 | } 41 | .filename { 42 | text-align: right; 43 | } 44 | #html { 45 | -webkit-box-sizing: border-box; 46 | -moz-box-sizing: border-box; 47 | box-sizing: border-box; 48 | overflow: auto; 49 | padding: 1em; 50 | } 51 | -------------------------------------------------------------------------------- /non-npm/viktor/globals.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | 5 | FACEBOOK_APP_ID: 1435210983455180, 6 | 7 | GOOGLE_API_KEY: "AIzaSyA_ZvkfZiWe1uJlRbuXpWsSqYGV523Vvps", 8 | 9 | EMAILLIST_API_KEY: "PSpPFKcg1MaLYljElHup" 10 | 11 | }; -------------------------------------------------------------------------------- /src/app/3rd-party/google-api/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | GLOBALS = require( "globals" ), 5 | mod = angular.module( "google-api", [] ); 6 | 7 | mod.run( [ "$window", "googleApi", function( $window, googleApi ) { 8 | 9 | $window.initGoogleApiAngular = function() { 10 | var gapi = $window.gapi; 11 | 12 | gapi.client.setApiKey( GLOBALS.GOOGLE_API_KEY ); 13 | gapi.client.load( 'urlshortener', 'v1' ).then( function() { 14 | console.log( "Google API loaded!" ); 15 | googleApi.api = gapi; 16 | googleApi.loaded = true; 17 | } ); 18 | }; 19 | 20 | } ] ); 21 | 22 | mod.service( "googleApi",[ function() { 23 | var self = this; 24 | 25 | self.loaded = false; 26 | self.api = null; 27 | } ] ); 28 | 29 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/app.js: -------------------------------------------------------------------------------- 1 | /* jshint -W117 */ 2 | 3 | 'use strict'; 4 | 5 | var angular = require( "angular" ), 6 | store = require( "store" ), 7 | queryStringUtils = require( "querystring" ), 8 | app = angular.module( "app", [ 9 | require( "angular-bootstrap-npm" ), 10 | require( "ng-file-upload" ).name, 11 | require( "angular-bind-polymer" ).name, 12 | require( "./ui/fixes" ).name, 13 | require( "./ui/module" ).name, 14 | require( "./3rd-party/google-api/module" ).name 15 | ] ), 16 | NV1Engine = require( "viktor-nv1-engine" ), 17 | patchSharing = require( "non-npm-patch-sharing" ), 18 | AudioContext = global.AudioContext || global.webkitAudioContext, 19 | is_iOS = /(iPad|iPhone|iPod)/g.test( navigator.userAgent ), 20 | is_chrome = /Chrome/.test( navigator.userAgent ) && /Google Inc/.test( navigator.vendor ), 21 | queryString = window.location.search.substr( 1 ), 22 | dawEngine, 23 | patchLibrary, 24 | globalVars = { 25 | sizeRatio: 1200 / 1200 26 | }, 27 | bootstrap = function() { 28 | var result = NV1Engine.create( AudioContext, store ); 29 | 30 | dawEngine = result.dawEngine; 31 | patchLibrary = result.patchLibrary; 32 | 33 | patchSharing.resolvePatchSelection( queryString, patchLibrary ); 34 | 35 | dawEngine.loadPatch( patchLibrary.getSelected().patch ); 36 | 37 | // !!! BOOTSTRAP !!! 38 | angular.resumeBootstrap(); 39 | }; 40 | 41 | // !!! DEFFERS THE BOOTSTRAP !!! 42 | global.name = "NG_DEFER_BOOTSTRAP!"; 43 | 44 | app.config( [ "dawEngineProvider", function( dawEngineProvider ) { 45 | dawEngineProvider.dawEngine = dawEngine; 46 | } ] ); 47 | 48 | app.factory( "globalVars", function() { 49 | return globalVars; 50 | } ); 51 | 52 | app.factory( "patchSharing", function() { 53 | return patchSharing; 54 | } ); 55 | 56 | app.factory( "patchLibrary", function() { 57 | return patchLibrary; 58 | } ); 59 | 60 | angular.element( document ).ready( function () { 61 | var $button = angular.element( document.querySelector( "#loadSynthButton" ) ); 62 | 63 | if ( is_iOS || is_chrome ) { 64 | $button.removeClass( "hide" ); 65 | $button.one( "click", function() { 66 | $button.remove(); 67 | bootstrap(); 68 | initGoogleApi(); 69 | } ); 70 | } else { 71 | $button.remove(); 72 | bootstrap(); 73 | } 74 | 75 | // show Privacy Policy 76 | var queryParams = queryStringUtils.parse( queryString ), 77 | privacyPolicyParam = queryParams.privacy; 78 | 79 | if ( privacyPolicyParam ) { 80 | var footerCtrl = angular.element( document.querySelector( "footer" ) ).controller(); 81 | if ( footerCtrl ) { 82 | footerCtrl.openPrivacyPolicyModal(); 83 | } 84 | } 85 | } ); 86 | 87 | module.exports = app; -------------------------------------------------------------------------------- /src/app/ui/controller/compressor.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.controller( "CompressorCtrl", [ "$scope", "globalVars", "dawEngine", "patchLibrary", function( $scope, globalVars, dawEngine, patchLibrary ) { 6 | var self = this, 7 | settingsChangeHandler = function( newValue, oldValue ) { 8 | if ( newValue === oldValue ) { 9 | return; 10 | } 11 | 12 | dawEngine.compressorSettings = { 13 | enabled : self.enabled, 14 | threshold : self.threshold, 15 | ratio : self.ratio, 16 | knee : self.knee, 17 | attack : self.attack, 18 | release : self.release, 19 | makeupGain : self.makeupGain 20 | }; 21 | 22 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 23 | }, 24 | settings, 25 | pollSettings = function() { 26 | settings = dawEngine.compressorSettings; 27 | 28 | self.enabled = settings.enabled; 29 | self.threshold = settings.threshold; 30 | self.ratio = settings.ratio; 31 | self.knee = settings.knee; 32 | self.attack = settings.attack; 33 | self.release = settings.release; 34 | self.makeupGain = settings.makeupGain; 35 | }, 36 | watchers = [], 37 | registerForChanges = function() { 38 | [ 39 | "compressor.enabled.value", 40 | "compressor.threshold.value", 41 | "compressor.ratio.value", 42 | "compressor.knee.value", 43 | "compressor.attack.value", 44 | "compressor.release.value", 45 | "compressor.makeupGain.value" 46 | ].forEach( function( path ) { 47 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 48 | } ); 49 | }, 50 | unregisterFromChanges = function() { 51 | watchers.forEach( function( unregister ) { 52 | unregister(); 53 | } ); 54 | watchers = []; 55 | }; 56 | 57 | self.knobWidth = Math.round(45 * globalVars.sizeRatio); 58 | 59 | pollSettings(); 60 | 61 | registerForChanges(); 62 | 63 | dawEngine.onPatchChange( function() { 64 | unregisterFromChanges(); 65 | pollSettings(); 66 | registerForChanges(); 67 | } ); 68 | } ] ); 69 | 70 | mod.directive( "compressor", [ "$templateCache", function( $templateCache ) { 71 | return { 72 | restrict: "E", 73 | replace: true, 74 | template: $templateCache.get( "compressor.html" ) 75 | }; 76 | } ] ); 77 | 78 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/delay.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "DelayCtrl", [ "$scope", "dawEngine", "patchLibrary", function( $scope, dawEngine, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | dawEngine.delaySettings = { 15 | time : settingsConvertor.transposeParam( self.time, settings.time.range ), 16 | feedback: settingsConvertor.transposeParam( self.feedback, settings.feedback.range ), 17 | dry : settingsConvertor.transposeParam( self.dry, settings.dry.range ), 18 | wet : settingsConvertor.transposeParam( self.wet, settings.wet.range ) 19 | }; 20 | 21 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 22 | }, 23 | settings, 24 | pollSettings = function() { 25 | settings = dawEngine.delaySettings; 26 | 27 | self.time = settingsConvertor.transposeParam( settings.time, [ 0, 100 ] ); 28 | self.feedback = settingsConvertor.transposeParam( settings.feedback, [ 0, 100 ] ); 29 | self.dry = settingsConvertor.transposeParam( settings.dry, [ 0, 100 ] ); 30 | self.wet = settingsConvertor.transposeParam( settings.wet, [ 0, 100 ] ); 31 | }, 32 | watchers = [], 33 | registerForChanges = function() { 34 | [ 35 | "delay.time.value", 36 | "delay.feedback.value", 37 | "delay.dry.value", 38 | "delay.wet.value" 39 | ].forEach( function( path ) { 40 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 41 | } ); 42 | }, 43 | unregisterFromChanges = function() { 44 | watchers.forEach( function( unregister ) { 45 | unregister(); 46 | } ); 47 | watchers = []; 48 | }; 49 | 50 | pollSettings(); 51 | 52 | registerForChanges(); 53 | 54 | dawEngine.onPatchChange( function() { 55 | unregisterFromChanges(); 56 | pollSettings(); 57 | registerForChanges(); 58 | } ); 59 | } ] ); 60 | 61 | mod.directive( "delay", [ "$templateCache", function( $templateCache ) { 62 | return { 63 | restrict: "E", 64 | replace: true, 65 | template: $templateCache.get( "delay.html" ) 66 | }; 67 | } ] ); 68 | 69 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/master-controls.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.directive( "masterControls", [ "$templateCache", function( $templateCache ) { 6 | return { 7 | restrict: "E", 8 | replace: true, 9 | template: $templateCache.get( "master-controls.html" ) 10 | }; 11 | } ] ); 12 | 13 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/master-volume.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ), 4 | LEVEL_RANGE = [ 0, 100 ]; 5 | 6 | module.exports = function( mod ) { 7 | 8 | mod.controller( "MasterVolumeCtrl", [ "$scope", "dawEngine", "patchLibrary", function( $scope, dawEngine, patchLibrary ) { 9 | var self = this, 10 | settingsChangeHandler = function( newValue, oldValue ) { 11 | if ( newValue === oldValue ) { 12 | return; 13 | } 14 | 15 | dawEngine.masterVolumeSettings = { 16 | level: settingsConvertor.transposeParam( self.level, settings.level.range ) 17 | }; 18 | 19 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 20 | }, 21 | settings, 22 | pollSettings = function() { 23 | settings = dawEngine.masterVolumeSettings; 24 | self.level = settingsConvertor.transposeParam( settings.level, LEVEL_RANGE ); 25 | }, 26 | watchers = [], 27 | registerForChanges = function() { 28 | [ 29 | "masterVolume.level.value" 30 | ].forEach( function( path ) { 31 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 32 | } ); 33 | }, 34 | unregisterFromChanges = function() { 35 | watchers.forEach( function( unregister ) { 36 | unregister(); 37 | } ); 38 | watchers = []; 39 | }; 40 | 41 | pollSettings(); 42 | 43 | registerForChanges(); 44 | 45 | dawEngine.onPatchChange( function() { 46 | unregisterFromChanges(); 47 | pollSettings(); 48 | registerForChanges(); 49 | } ); 50 | } ] ); 51 | 52 | mod.directive( "masterVolume", [ "$templateCache", function( $templateCache ) { 53 | return { 54 | restrict: "E", 55 | replace: true, 56 | template: $templateCache.get( "master-volume.html" ) 57 | }; 58 | } ] ); 59 | 60 | mod.directive( "masterVolumeValue", [ "$document", "dawEngine", function( $document, dawEngine ) { 61 | 62 | return { 63 | restrict: "A", 64 | link: function( scope, $element ) { 65 | dawEngine.addExternalMidiMessageHandler( function( type, parsed ) { 66 | if ( type === "volume" ) { 67 | $element[ 0 ].setValue( 68 | settingsConvertor.transposeParam( parsed.volume, LEVEL_RANGE ).value 69 | ); 70 | } 71 | } ); 72 | } 73 | }; 74 | 75 | } ] ); 76 | 77 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/modulation-wheel.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ), 4 | RATE_RANGE = [ 0, 128 ]; 5 | 6 | module.exports = function( mod ) { 7 | 8 | mod.controller( "ModulationWheelCtrl", [ "$scope", "dawEngine", function( $scope, dawEngine ) { 9 | var self = this, 10 | settingsChangeHandler = function( newValue, oldValue ) { 11 | if ( newValue === oldValue ) { 12 | return; 13 | } 14 | 15 | var modulationSettings = dawEngine.modulationSettings; 16 | 17 | modulationSettings.rate = settingsConvertor.transposeParam( self.modulation, settings.rate.range ); 18 | 19 | dawEngine.modulationSettings = modulationSettings; 20 | }, 21 | settings, 22 | pollSettings = function() { 23 | settings = dawEngine.modulationSettings; 24 | 25 | self.modulation = settingsConvertor.transposeParam( settings.rate, RATE_RANGE ); 26 | }, 27 | watchers = [], 28 | registerForChanges = function() { 29 | [ 30 | "modulationWheel.modulation.value" 31 | ].forEach( function( path ) { 32 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 33 | } ); 34 | }, 35 | unregisterFromChanges = function() { 36 | watchers.forEach( function( unregister ) { 37 | unregister(); 38 | } ); 39 | watchers = []; 40 | }; 41 | 42 | pollSettings(); 43 | 44 | registerForChanges(); 45 | 46 | dawEngine.onPatchChange( function() { 47 | unregisterFromChanges(); 48 | pollSettings(); 49 | registerForChanges(); 50 | } ); 51 | } ] ); 52 | 53 | mod.directive( "modulationWheel", [ "$templateCache", function( $templateCache ) { 54 | return { 55 | restrict: "E", 56 | replace: true, 57 | template: $templateCache.get( "modulation-wheel.html" ) 58 | }; 59 | } ] ); 60 | 61 | mod.directive( "modWheelValue", [ "dawEngine", function( dawEngine ) { 62 | 63 | return { 64 | restrict: "A", 65 | link: function( scope, $element ) { 66 | dawEngine.addExternalMidiMessageHandler( function( type, parsed ) { 67 | if ( type === "modulationWheel" ) { 68 | $element[ 0 ].setValue( 69 | settingsConvertor.transposeParam( parsed.modulation, RATE_RANGE ).value 70 | ); 71 | } 72 | } ); 73 | } 74 | }; 75 | 76 | } ] ); 77 | 78 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/pitch-bend.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ), 4 | BEND_RANGE = [ 0, 128 ], 5 | RANGE_CENTER = settingsConvertor.getRangeCenter( BEND_RANGE ); 6 | 7 | module.exports = function( mod ) { 8 | 9 | mod.controller( "PitchBendCtrl", [ "$scope", "dawEngine", function( $scope, dawEngine ) { 10 | var self = this, 11 | settingsChangeHandler = function() { 12 | dawEngine.pitchSettings = { 13 | bend: settingsConvertor.transposeParam( self.bend, settings.bend.range ) 14 | }; 15 | }, 16 | settings = dawEngine.pitchSettings; 17 | 18 | self.bend = settingsConvertor.transposeParam( settings.bend, BEND_RANGE ); 19 | 20 | [ 21 | "pitch.bend.value" 22 | ].forEach( function( path ) { 23 | $scope.$watch( path, settingsChangeHandler ); 24 | } ); 25 | 26 | } ] ); 27 | 28 | mod.directive( "pitchBend", [ "$templateCache", function( $templateCache ) { 29 | return { 30 | restrict: "E", 31 | replace: true, 32 | template: $templateCache.get( "pitch-bend.html" ) 33 | }; 34 | } ] ); 35 | 36 | mod.directive( "pitchBendValue", [ "$document", "dawEngine", function( $document, dawEngine ) { 37 | 38 | return { 39 | restrict: "A", 40 | link: function( scope, $element ) { 41 | dawEngine.addExternalMidiMessageHandler( function( type, parsed ) { 42 | if ( type === "pitchBend" ) { 43 | $element[ 0 ].setValue( 44 | settingsConvertor.transposeParam( parsed.pitchBend, BEND_RANGE ).value 45 | ); 46 | } 47 | } ); 48 | 49 | // handle pitch return to center 50 | var isPitchBending = false; 51 | $document.on( "mouseup", function() { 52 | if ( isPitchBending ) { 53 | isPitchBending = false; 54 | $element.attr( "value", RANGE_CENTER ); 55 | } 56 | } ); 57 | $element.on( "mousedown", function() { 58 | isPitchBending = true; 59 | } ); 60 | } 61 | }; 62 | 63 | } ] ); 64 | 65 | }; -------------------------------------------------------------------------------- /src/app/ui/controller/reverb.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "ReverbCtrl", [ "$scope", "dawEngine", "patchLibrary", function( $scope, dawEngine, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | dawEngine.reverbSettings = { 15 | level: settingsConvertor.transposeParam( self.level, settings.level.range ) 16 | }; 17 | 18 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 19 | }, 20 | settings, 21 | pollSettings = function() { 22 | settings = dawEngine.reverbSettings; 23 | self.level = settingsConvertor.transposeParam( settings.level, [ 0, 100 ] ); 24 | }, 25 | watchers = [], 26 | registerForChanges = function() { 27 | [ 28 | "reverb.level.value" 29 | ].forEach( function( path ) { 30 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 31 | } ); 32 | }, 33 | unregisterFromChanges = function() { 34 | watchers.forEach( function( unregister ) { 35 | unregister(); 36 | } ); 37 | watchers = []; 38 | }; 39 | 40 | pollSettings(); 41 | 42 | registerForChanges(); 43 | 44 | dawEngine.onPatchChange( function() { 45 | unregisterFromChanges(); 46 | pollSettings(); 47 | registerForChanges(); 48 | } ); 49 | } ] ); 50 | 51 | mod.directive( "reverb", [ "$templateCache", function( $templateCache ) { 52 | return { 53 | restrict: "E", 54 | replace: true, 55 | template: $templateCache.get( "reverb.html" ) 56 | }; 57 | } ] ); 58 | 59 | }; -------------------------------------------------------------------------------- /src/app/ui/fixes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | mod = angular.module( "fixes", [] ); 5 | 6 | mod.directive( "updateNumberValue", function() { 7 | 8 | return { 9 | restrict: "A", 10 | link: function( scope, element ) { 11 | angular.element( element ).on( "change", function( e ) { 12 | var $element = angular.element( e.target ); 13 | if ( parseFloat( $element.attr( "value" ) ) !== e.target.value ) { 14 | $element.attr( "value", e.target.value ); 15 | } 16 | } ); 17 | } 18 | }; 19 | 20 | } ); 21 | 22 | mod.directive( "knobRedraw", [ "$document", function( $document ) { 23 | 24 | return { 25 | restrict: "A", 26 | link: function( scope, $element, attrs ) { 27 | var tryRedraw = function( $element ) { 28 | var element = $element[ 0 ]; 29 | if ( element.redraw && "function" === typeof( element.redraw ) ) { 30 | element.redraw(); 31 | } 32 | }; 33 | 34 | $document.bind( "WebComponentsReady", function() { 35 | tryRedraw( $element ); 36 | } ); 37 | attrs.$observe( "value", function() { 38 | tryRedraw( $element ); 39 | } ); 40 | 41 | } 42 | }; 43 | 44 | } ] ); 45 | 46 | mod.directive( "updateControlValue", [ "$document", function( $document ) { 47 | 48 | return { 49 | restrict: "A", 50 | link: function( scope, $element, attrs ) { 51 | var trySet = function( $element, newValue ) { 52 | var control = $element.length && $element[ 0 ]; 53 | if ( control && control.setValue && "function" === typeof( control.setValue ) ) { 54 | control.setValue( newValue ); 55 | } 56 | }; 57 | 58 | $document.bind( "WebComponentsReady", function() { 59 | trySet( $element, parseFloat( $element.attr( "value" ) ) ); 60 | } ); 61 | attrs.$observe( "value", function( newValueStr ) { 62 | trySet( $element, parseFloat( newValueStr ) ); 63 | } ); 64 | } 65 | }; 66 | 67 | } ] ); 68 | 69 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | template = require( "./template/daw.html" ), 5 | mod = angular.module( "dawModule", [ 6 | template.name, 7 | require( "./module/settings/module" ).name, 8 | require( "./module/patch-library/module" ).name, 9 | require( "./module/instruments/synth/module" ).name, 10 | require( "./module/maillist/module" ).name, 11 | require( "./module/typed-ad/module" ).name, 12 | require( "./module/footer/module" ).name, 13 | require( "./module/t-shirts/module" ).name, 14 | 15 | require( "./template/master-controls.html" ).name, 16 | require( "./template/compressor.html" ).name, 17 | require( "./template/delay.html" ).name, 18 | require( "./template/reverb.html" ).name, 19 | require( "./template/master-volume.html" ).name, 20 | require( "./template/pitch-bend.html" ).name, 21 | require( "./template/modulation-wheel.html" ).name, 22 | require( "./template/keyboard.html" ).name 23 | ] ), 24 | Synth = require( "viktor-nv1-engine" ).Synth, 25 | synth; 26 | 27 | mod.provider( "dawEngine", function dawEngineProvider() { 28 | 29 | var self = this; 30 | 31 | self.dawEngine = null; 32 | 33 | self.$get = function dawEngineFactory() { 34 | return self.dawEngine; 35 | }; 36 | 37 | } ); 38 | 39 | mod.factory( "synth",[ "dawEngine", function( dawEngine ) { 40 | if ( !synth ) { 41 | dawEngine.instruments.forEach( function( instrument ) { 42 | if ( instrument instanceof Synth ) { 43 | // cache the instance 44 | synth = instrument; 45 | } 46 | } ); 47 | } 48 | 49 | return synth; 50 | } ] ); 51 | 52 | mod.directive( "dawContainer", [ "$templateCache", function($templateCache) { 53 | return { 54 | restrict: "E", 55 | replace: true, 56 | template: $templateCache.get( template.name ) 57 | }; 58 | } ] ); 59 | 60 | // Directives (without a controller) 61 | require( "./controller/master-controls" )( mod ); 62 | 63 | // Controllers 64 | require( "./controller/compressor" )( mod ); 65 | require( "./controller/delay" )( mod ); 66 | require( "./controller/reverb" )( mod ); 67 | require( "./controller/master-volume" )( mod ); 68 | require( "./controller/pitch-bend" )( mod ); 69 | require( "./controller/modulation-wheel" )( mod ); 70 | require( "./controller/keyboard" )( mod ); 71 | 72 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/footer/controller/footer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.controller( "FooterCtrl", [ "$scope", "$modal", function( $scope, $modal ) { 6 | var self = this; 7 | 8 | self.openPrivacyPolicyModal = function() { 9 | $modal.open( { 10 | animation: $scope.animationsEnabled, 11 | templateUrl: 'privacyPolicyModal.html', 12 | controller: 'FooterModalCtrl', 13 | controllerAs: 'footerModal', 14 | size: null, 15 | resolve: null 16 | } ); 17 | }; 18 | 19 | self.openAboutModal = function() { 20 | $modal.open( { 21 | animation: $scope.animationsEnabled, 22 | templateUrl: 'aboutModal.html', 23 | controller: 'FooterModalCtrl', 24 | controllerAs: 'footerModal', 25 | size: null, 26 | resolve: null 27 | } ); 28 | }; 29 | } ] ); 30 | 31 | mod.directive( "footerDirective", [ "$templateCache", function( $templateCache ) { 32 | return { 33 | restrict: "E", 34 | replace: true, 35 | template: $templateCache.get( "footer.html" ) 36 | }; 37 | } ] ); 38 | 39 | mod.controller( "FooterModalCtrl", [ "$modalInstance", function( $modalInstance ) { 40 | var self = this; 41 | 42 | self.close = function() { 43 | $modalInstance.dismiss(); 44 | }; 45 | } ] ); 46 | 47 | }; -------------------------------------------------------------------------------- /src/app/ui/module/footer/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | template = require( "./template/footer.html" ), 5 | mod = angular.module( "footerModule", [ 6 | template.name 7 | ] ); 8 | 9 | // Controllers 10 | require( "./controller/footer" )( mod ); 11 | 12 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/filter.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "FilterCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | synth.filterSettings = { 15 | cutoff: settingsConvertor.transposeParam( self.cutoff, settings.cutoff.range ), 16 | emphasis: settingsConvertor.transposeParam( self.emphasis, settings.emphasis.range ), 17 | envAmount: settingsConvertor.transposeParam( self.envAmount, settings.envAmount.range ) 18 | }; 19 | 20 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 21 | }, 22 | settings, 23 | pollSettings = function() { 24 | settings = synth.filterSettings; 25 | 26 | self.cutoff = settingsConvertor.transposeParam( settings.cutoff, [ 0, 500 ] ); 27 | self.emphasis = settingsConvertor.transposeParam( settings.emphasis, [ 1, 100 ] ); 28 | self.envAmount = settingsConvertor.transposeParam( settings.envAmount, [ 0, 100 ] ); 29 | }, 30 | watchers = [], 31 | registerForChanges = function() { 32 | [ 33 | "filter.cutoff.value", 34 | "filter.emphasis.value", 35 | "filter.envAmount.value" 36 | ].forEach( function( path ) { 37 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 38 | } ); 39 | }, 40 | unregisterFromChanges = function() { 41 | watchers.forEach( function( unregister ) { 42 | unregister(); 43 | } ); 44 | watchers = []; 45 | }; 46 | 47 | pollSettings(); 48 | 49 | registerForChanges(); 50 | 51 | dawEngine.onPatchChange( function() { 52 | unregisterFromChanges(); 53 | pollSettings(); 54 | registerForChanges(); 55 | } ); 56 | } ] ); 57 | 58 | mod.directive( "filter", [ "$templateCache", function( $templateCache ) { 59 | return { 60 | restrict: "E", 61 | replace: true, 62 | template: $templateCache.get( "filter.html" ) 63 | }; 64 | } ] ); 65 | 66 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/lfo.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "LFOCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | synth.lfoSettings = { 15 | waveform: self.waveform, 16 | rate: self.rate, 17 | amount: settingsConvertor.transposeParam( self.amount, settings.amount.range ) 18 | }; 19 | 20 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 21 | }, 22 | settings, 23 | pollSettings = function() { 24 | settings = synth.lfoSettings; 25 | 26 | self.waveform = settings.waveform; 27 | self.rate = settings.rate; 28 | self.amount = settingsConvertor.transposeParam( settings.amount, [ 0, 100 ] ); 29 | }, 30 | watchers = [], 31 | registerForChanges = function() { 32 | [ 33 | "lfo.waveform.value", 34 | "lfo.rate.value", 35 | "lfo.amount.value" 36 | ].forEach( function( path ) { 37 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 38 | } ); 39 | }, 40 | unregisterFromChanges = function() { 41 | watchers.forEach( function( unregister ) { 42 | unregister(); 43 | } ); 44 | watchers = []; 45 | }; 46 | 47 | pollSettings(); 48 | 49 | registerForChanges(); 50 | 51 | dawEngine.onPatchChange( function() { 52 | unregisterFromChanges(); 53 | pollSettings(); 54 | registerForChanges(); 55 | } ); 56 | } ] ); 57 | 58 | mod.directive( "lfo", [ "$templateCache", function( $templateCache ) { 59 | return { 60 | restrict: "E", 61 | replace: true, 62 | template: $templateCache.get( "lfo.html" ) 63 | }; 64 | } ] ); 65 | 66 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/mixer.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "MixerCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | synth.mixerSettings = { 15 | volume1: { 16 | enabled: self.volume1.enabled, 17 | level: settingsConvertor.transposeParam( self.volume1.level, settings.volume1.level.range ) 18 | }, 19 | volume2: { 20 | enabled: self.volume2.enabled, 21 | level: settingsConvertor.transposeParam( self.volume2.level, settings.volume2.level.range ) 22 | }, 23 | volume3: { 24 | enabled: self.volume3.enabled, 25 | level: settingsConvertor.transposeParam( self.volume3.level, settings.volume3.level.range ) 26 | } 27 | }; 28 | 29 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 30 | }, 31 | settings, 32 | pollSettings = function() { 33 | settings = synth.mixerSettings; 34 | 35 | self.volume1 = { 36 | enabled: settings.volume1.enabled, 37 | level: settingsConvertor.transposeParam( settings.volume1.level, [ 0, 100 ] ) 38 | }; 39 | self.volume2 = { 40 | enabled: settings.volume2.enabled, 41 | level: settingsConvertor.transposeParam( settings.volume2.level, [ 0, 100 ] ) 42 | }; 43 | self.volume3 = { 44 | enabled: settings.volume3.enabled, 45 | level: settingsConvertor.transposeParam( settings.volume3.level, [ 0, 100 ] ) 46 | }; 47 | }, 48 | watchers = [], 49 | registerForChanges = function() { 50 | [ 51 | "mixer.volume1.enabled.value", 52 | "mixer.volume1.level.value", 53 | "mixer.volume2.enabled.value", 54 | "mixer.volume2.level.value", 55 | "mixer.volume3.enabled.value", 56 | "mixer.volume3.level.value" 57 | ].forEach( function( path ) { 58 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 59 | } ); 60 | }, 61 | unregisterFromChanges = function() { 62 | watchers.forEach( function( unregister ) { 63 | unregister(); 64 | } ); 65 | watchers = []; 66 | }; 67 | 68 | pollSettings(); 69 | 70 | registerForChanges(); 71 | 72 | dawEngine.onPatchChange( function() { 73 | unregisterFromChanges(); 74 | pollSettings(); 75 | registerForChanges(); 76 | } ); 77 | } ] ); 78 | 79 | mod.directive( "mixer", [ "$templateCache", function( $templateCache ) { 80 | return { 81 | restrict: "E", 82 | replace: true, 83 | template: $templateCache.get( "mixer.html" ) 84 | }; 85 | } ] ); 86 | 87 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/modulation.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "ModulationCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | synth.modulationSettings = { 15 | waveform: self.waveform, 16 | portamento: settingsConvertor.transposeParam( self.portamento, settings.portamento.range ), 17 | rate: synth.modulationSettings.rate 18 | }; 19 | 20 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 21 | }, 22 | settings, 23 | pollSettings = function() { 24 | settings = synth.modulationSettings; 25 | 26 | self.waveform = settings.waveform; 27 | self.portamento = settingsConvertor.transposeParam( settings.portamento, [ 0, 100 ] ); 28 | }, 29 | watchers = [], 30 | registerForChanges = function() { 31 | [ 32 | "modulation.waveform.value", 33 | "modulation.portamento.value" 34 | ].forEach( function( path ) { 35 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 36 | } ); 37 | }, 38 | unregisterFromChanges = function() { 39 | watchers.forEach( function( unregister ) { 40 | unregister(); 41 | } ); 42 | watchers = []; 43 | }; 44 | 45 | pollSettings(); 46 | 47 | registerForChanges(); 48 | 49 | dawEngine.onPatchChange( function() { 50 | unregisterFromChanges(); 51 | pollSettings(); 52 | registerForChanges(); 53 | } ); 54 | } ] ); 55 | 56 | mod.directive( "modulationPlusPolyphony", [ "$templateCache", function( $templateCache ) { 57 | return { 58 | restrict: "E", 59 | replace: true, 60 | template: $templateCache.get( "modulation+polyphony.html" ) 61 | }; 62 | } ] ); 63 | 64 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/noise.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var settingsConvertor = require( "viktor-nv1-settings-convertor" ); 4 | 5 | module.exports = function( mod ) { 6 | 7 | mod.controller( "NoiseCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 8 | var self = this, 9 | settingsChangeHandler = function( newValue, oldValue ) { 10 | if ( newValue === oldValue ) { 11 | return; 12 | } 13 | 14 | synth.noiseSettings = { 15 | enabled: self.enabled, 16 | level: settingsConvertor.transposeParam( self.level, settings.level.range ), 17 | type: self.type 18 | }; 19 | 20 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 21 | }, 22 | settings, 23 | pollSettings = function() { 24 | settings = synth.noiseSettings; 25 | 26 | self.enabled = settings.enabled; 27 | self.level = settingsConvertor.transposeParam( settings.level, [ 0, 100 ] ); 28 | self.type = settings.type; 29 | }, 30 | watchers = [], 31 | registerForChanges = function() { 32 | [ 33 | "noise.enabled.value", 34 | "noise.level.value", 35 | "noise.type.value" 36 | ].forEach( function( path ) { 37 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 38 | } ); 39 | }, 40 | unregisterFromChanges = function() { 41 | watchers.forEach( function( unregister ) { 42 | unregister(); 43 | } ); 44 | watchers = []; 45 | }; 46 | 47 | pollSettings(); 48 | 49 | registerForChanges(); 50 | 51 | dawEngine.onPatchChange( function() { 52 | unregisterFromChanges(); 53 | pollSettings(); 54 | registerForChanges(); 55 | } ); 56 | } ] ); 57 | 58 | mod.directive( "noise", [ "$templateCache", function( $templateCache ) { 59 | return { 60 | restrict: "E", 61 | replace: true, 62 | template: $templateCache.get( "noise.html" ) 63 | }; 64 | } ] ); 65 | 66 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/controller/polyphony.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.controller( "PolyphonyCtrl", [ "$scope", "dawEngine", "synth", "patchLibrary", function( $scope, dawEngine, synth, patchLibrary ) { 6 | var self = this, 7 | settingsChangeHandler = function( newValue, oldValue ) { 8 | if ( newValue === oldValue ) { 9 | return; 10 | } 11 | 12 | settings = synth.polyphonySettings; 13 | 14 | synth.polyphonySettings = { 15 | voiceCount: self.voiceCount, 16 | sustain: settings.sustain 17 | }; 18 | 19 | patchLibrary.preserveUnsaved( dawEngine.getPatch() ); 20 | }, 21 | settings, 22 | pollSettings = function() { 23 | settings = synth.polyphonySettings; 24 | 25 | self.voiceCount = settings.voiceCount; 26 | }, 27 | watchers = [], 28 | registerForChanges = function() { 29 | [ 30 | "polyphony.voiceCount.value" 31 | ].forEach( function( path ) { 32 | watchers.push( $scope.$watch( path, settingsChangeHandler ) ); 33 | } ); 34 | }, 35 | unregisterFromChanges = function() { 36 | watchers.forEach( function( unregister ) { 37 | unregister(); 38 | } ); 39 | watchers = []; 40 | }; 41 | 42 | pollSettings(); 43 | 44 | registerForChanges(); 45 | 46 | dawEngine.onPatchChange( function() { 47 | unregisterFromChanges(); 48 | pollSettings(); 49 | registerForChanges(); 50 | } ); 51 | } ] ); 52 | 53 | // directive is defined in the modulation controller 54 | 55 | }; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | template = require( "./template/synth.html" ), 5 | mod = angular.module( "synth", [ 6 | template.name, 7 | require( "./template/modulation+polyphony.html" ).name, 8 | require( "./template/oscillator-bank.html" ).name, 9 | require( "./template/mixer.html" ).name, 10 | require( "./template/noise.html" ).name, 11 | require( "./template/envelopes.html" ).name, 12 | require( "./template/filter.html" ).name, 13 | require( "./template/lfo.html" ).name 14 | ] ); 15 | 16 | mod.directive( "synth", [ "$templateCache", function( $templateCache ) { 17 | return { 18 | restrict: "E", 19 | replace: true, 20 | template: $templateCache.get( template.name ) 21 | }; 22 | } ] ); 23 | 24 | // Controllers 25 | require( "./controller/polyphony" )( mod ); 26 | require( "./controller/modulation" )( mod ); 27 | require( "./controller/oscillator-bank" )( mod ); 28 | require( "./controller/mixer" )( mod ); 29 | require( "./controller/noise" )( mod ); 30 | require( "./controller/envelopes" )( mod ); 31 | require( "./controller/filter" )( mod ); 32 | require( "./controller/lfo" )( mod ); 33 | 34 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/filter.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Cutoff
4 | 9 |
10 |
11 |
Emphasis
12 | 17 |
18 |
19 |
Simple/Env
20 | 25 |
26 |

LP Filter

27 |
-------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/lfo.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Form
4 | 9 |
10 |
11 |
Rate
12 | 17 |
18 |
19 |
Clean/LFO
20 | 25 |
26 |

LFO

27 |
-------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/mixer.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 | 10 |
11 |
12 | 17 |
18 |
19 | 24 |
25 |
26 |
27 |
28 | 33 |
34 |
35 | 40 |
41 |
42 | 47 |
48 |
49 |
50 |
51 |
On/Off
52 |
Volume
53 |
54 |

Mixer

55 |
-------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/modulation+polyphony.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
Form
5 | 10 |
11 |
12 |
Glide
13 | 18 |
19 |

Modulation

20 |
21 |
22 |
23 | 28 |
Voices
29 |
30 |

Polyphony

31 |
32 |
-------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/noise.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 8 |
9 |
10 | 15 |
16 |
17 | 24 |
25 |

Noise

26 |
-------------------------------------------------------------------------------- /src/app/ui/module/instruments/synth/template/synth.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
-------------------------------------------------------------------------------- /src/app/ui/module/maillist/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | template = require( "./template/maillist.html" ), 5 | mod = angular.module( "maillistModule", [ 6 | template.name 7 | ] ); 8 | 9 | // Controllers 10 | require( "./controller/maillist" )( mod ); 11 | 12 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/maillist/template/maillist.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Big news coming soon!

4 |
5 |
6 | 7 | 8 |
9 | 10 |
11 |
12 | 13 |
14 | 15 | 21 |
22 |
23 | 24 |
25 |
26 |
27 | 28 |
29 |
30 |

Thanks for subscribing! We've sent you an email with a confirmation link.

31 |
32 |
33 |
34 |
-------------------------------------------------------------------------------- /src/app/ui/module/patch-library/controller/drop-down.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.controller( "DropDownCtrl", [ "dawEngine", "patchLibrary", function( dawEngine, patchLibrary ) { 6 | var self = this, 7 | defaultPatches, 8 | customPatches, 9 | selectedName, 10 | pollSettings = function() { 11 | defaultPatches = patchLibrary.getDefaultNames(); 12 | customPatches = patchLibrary.getCustomNames(); 13 | selectedName = patchLibrary.getSelected().name; 14 | 15 | self.patches = [ { name: "Built-in", separator: "presentation" } ] 16 | .concat( defaultPatches.map( function( patchName, originalIndex ) { 17 | return { name: patchName, originalIndex: originalIndex }; 18 | } ) ) 19 | .concat( [ { name: "User's", separator: "presentation" } ] ) 20 | .concat( customPatches.map( function( patchName, originalIndex ) { 21 | return { name: patchName, isCustom: true, originalIndex: originalIndex }; 22 | } ) ); 23 | self.selectedName = selectedName; 24 | }; 25 | 26 | pollSettings(); 27 | 28 | self.getSelectedName = function() { 29 | var name = self.selectedName; 30 | 31 | if ( name.length > 28 ) { 32 | return name.substr( 0, 24 ) + "..."; 33 | } else { 34 | return name; 35 | } 36 | }; 37 | 38 | self.selectPatch = function( patch ) { 39 | if ( !patch.separator ) { 40 | patchLibrary.selectPatch( patch.name ); 41 | } 42 | }; 43 | 44 | self.selectPrevious = function() { 45 | var previousName = patchLibrary.getPreviousName( selectedName ); 46 | 47 | patchLibrary.selectPatch( previousName ? previousName : defaultPatches[ 0 ] ); 48 | }; 49 | 50 | self.selectNext = function() { 51 | var nextName = patchLibrary.getNextName( selectedName ); 52 | 53 | patchLibrary.selectPatch( nextName ? nextName : defaultPatches[ 0 ] ); 54 | }; 55 | 56 | patchLibrary.onSelectionChange( function() { 57 | pollSettings(); 58 | } ); 59 | 60 | } ] ); 61 | 62 | mod.directive( "dropDown", [ "$templateCache", function( $templateCache ) { 63 | return { 64 | restrict: "E", 65 | replace: true, 66 | template: $templateCache.get( "drop-down.html" ) 67 | }; 68 | } ] ); 69 | 70 | }; -------------------------------------------------------------------------------- /src/app/ui/module/patch-library/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | mod = angular.module( "patch-library", [ 5 | require( "./template/patch-library.html" ).name, 6 | require( "./template/drop-down.html" ).name 7 | ] ); 8 | 9 | // Controllers 10 | require( "./controller/patch-library" )( mod ); 11 | require( "./controller/drop-down" )( mod ); 12 | 13 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/patch-library/template/drop-down.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 18 |
19 | 20 |
-------------------------------------------------------------------------------- /src/app/ui/module/settings/controller/settings.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function( mod ) { 4 | 5 | mod.controller( "SettingsCtrl", [ "$scope", "$modal", "dawEngine", 6 | function( $scope, $modal, dawEngine ) { 7 | var self = this; 8 | 9 | self.openSettingsModal = function() { 10 | $modal.open( { 11 | animation: $scope.animationsEnabled, 12 | templateUrl: 'settingsModal.html', 13 | controller: 'SettingsModalCtrl', 14 | controllerAs: 'settingsModal', 15 | size: null, 16 | resolve: { 17 | midiController: function() { 18 | return dawEngine.midiController; 19 | } 20 | } 21 | } ); 22 | }; 23 | 24 | } ] ); 25 | 26 | mod.controller( "SettingsModalCtrl", [ "$modalInstance", "$window", "midiController", 27 | function( $modalInstance, $window, midiController ) { 28 | var self = this, 29 | onMidiMessageFunc = midiController.onMidiMessage.bind( midiController ); 30 | 31 | self.midiInputs = midiController.inputs; 32 | 33 | self.inputStateChange = function( input ) { 34 | if ( input.value.onmidimessage !== null ) { 35 | input.value.onmidimessage = null; 36 | } else { 37 | input.value.onmidimessage = onMidiMessageFunc; 38 | } 39 | }; 40 | 41 | self.close = function() { 42 | $modalInstance.dismiss(); 43 | }; 44 | } ] ); 45 | 46 | mod.directive( "settings", [ "$templateCache", function( $templateCache ) { 47 | return { 48 | restrict: "E", 49 | replace: true, 50 | template: $templateCache.get( "settings.html" ) 51 | }; 52 | } ] ); 53 | 54 | mod.directive( "autofocus", function() { 55 | return { 56 | restrict: "A", 57 | link: function ( scope, element ) { 58 | element[0].focus(); 59 | } 60 | }; 61 | } ); 62 | 63 | }; -------------------------------------------------------------------------------- /src/app/ui/module/settings/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | mod = angular.module( "settings", [ 5 | require( "./template/settings.html" ).name 6 | ] ); 7 | 8 | // Controllers 9 | require( "./controller/settings" )( mod ); 10 | 11 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/settings/template/settings.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 7 |
8 |
9 | 10 | 39 |
-------------------------------------------------------------------------------- /src/app/ui/module/t-shirts/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | mod = angular.module( "t-shirts", [ 5 | require( "./template/t-shirts.html" ).name 6 | ] ); 7 | 8 | // Controllers 9 | require( "./controller/t-shirts" )( mod ); 10 | 11 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/typed-ad/controller/typed-ad.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | var Typed = require( "typedjs" ); 5 | 6 | var ADS = [ 7 | 8 | { 9 | url: "https://www.anrdoezrs.net/click-100274574-13899542", 10 | text: [ 11 | "Hey there!", 12 | "Wanna record a full song?", 13 | "Right in your browser?", 14 | "Click right... HERE!" 15 | ], 16 | weight: 3 17 | }, 18 | 19 | { 20 | url: "https://forms.gle/E4ctbsMXk1n2U8dM9", 21 | text: [ 22 | "Hey there!", 23 | "This is NV-1's creator, Nikolay - nice to meet you!", 24 | "Would you be interested in taking a course on Audio Processing & Synthesis in the Browser?", 25 | "CLICK HERE to let me know!" 26 | ], 27 | weight: 1 28 | }, 29 | 30 | { 31 | url: "https://forms.gle/7rr44vAqBrAKxUEU7", 32 | text: [ 33 | "Hey there!", 34 | "Do you want to build your own synth?", 35 | "Click HERE to make an inquiry!" 36 | ], 37 | weight: 1 38 | }, 39 | 40 | { 41 | url: "https://forms.gle/Tnn2xfNtzjfPzGUM8", 42 | text: [ 43 | "Hey there!", 44 | "Do you teach with NV-1?", 45 | "CLICK HERE to help me better understand how you use my synth!" 46 | ], 47 | weight: 1 48 | } 49 | ]; 50 | 51 | function getAd () { 52 | 53 | var indexChance = []; 54 | 55 | ADS.forEach((value, index) => { 56 | 57 | indexChance = indexChance.concat ( Array.from( { length: Math.floor( value.weight * 10 ) } ).map( x => index )); 58 | }); 59 | 60 | return ADS [ 61 | indexChance[ Math.floor( Math.random() * indexChance.length ) ] 62 | ]; 63 | } 64 | 65 | module.exports = function( mod ) { 66 | 67 | mod.controller( "TypedAdController", [ "$scope", function ($scope) { 68 | 69 | var self = this, 70 | ad = getAd (); 71 | 72 | self.url = ad.url; 73 | 74 | $scope.options = { 75 | strings: ad.text, 76 | typeSpeed: 80, 77 | startDelay: 1200, 78 | smartBackspace: true, 79 | backDelay: 5000, 80 | loop: true, 81 | showCursor: false 82 | }; 83 | } ] ); 84 | 85 | mod.directive( "typedAd", [ "$templateCache", function( $templateCache ) { 86 | return { 87 | restrict: "E", 88 | replace: true, 89 | template: $templateCache.get( "typed-ad.html" ), 90 | link: function ( $scope ) { 91 | 92 | $scope.typedObj = new Typed ( ".type-in-here", $scope.options); 93 | } 94 | }; 95 | } ] ); 96 | }; -------------------------------------------------------------------------------- /src/app/ui/module/typed-ad/module.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var angular = require( "angular" ), 4 | template = require( "./template/typed-ad.html" ), 5 | mod = angular.module( "typed-ad", [ 6 | template.name 7 | ] ); 8 | 9 | // Controllers 10 | require( "./controller/typed-ad" )( mod ); 11 | 12 | module.exports = mod; -------------------------------------------------------------------------------- /src/app/ui/module/typed-ad/template/typed-ad.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |

6 |
7 |
8 | 9 |
10 |
-------------------------------------------------------------------------------- /src/app/ui/template/compressor.html: -------------------------------------------------------------------------------- 1 |
2 |

Compressor

3 |
4 |
5 | 10 |
11 |
12 | 19 |
Threshold
20 |
21 |
22 | 29 |
Ratio
30 |
31 |
32 | 39 |
Knee
40 |
41 |
42 | 49 |
Attack
50 |
51 |
52 | 59 |
Release
60 |
61 |
62 | 69 |
Gain
70 |
71 |
72 |
-------------------------------------------------------------------------------- /src/app/ui/template/daw.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 | 7 |
8 |
9 | 10 |
11 |
12 |
13 | 14 |
15 |
16 |
17 | 18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 | 26 |
-------------------------------------------------------------------------------- /src/app/ui/template/delay.html: -------------------------------------------------------------------------------- 1 |
2 |

Delay

3 |
4 |
5 | 12 |
Time
13 |
14 |
15 | 22 |
Feed
23 |
24 |
25 | 32 |
Dry
33 |
34 |
35 | 42 |
Wet
43 |
44 |
45 |
-------------------------------------------------------------------------------- /src/app/ui/template/keyboard.html: -------------------------------------------------------------------------------- 1 |
2 | 5 | 8 |
-------------------------------------------------------------------------------- /src/app/ui/template/master-controls.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 |
6 |
7 | 8 | 9 |
10 |
11 | 12 |
-------------------------------------------------------------------------------- /src/app/ui/template/master-volume.html: -------------------------------------------------------------------------------- 1 |
2 |

Volume

3 |
4 | 10 |
Level
11 |
12 |
-------------------------------------------------------------------------------- /src/app/ui/template/modulation-wheel.html: -------------------------------------------------------------------------------- 1 |
2 | 9 |
-------------------------------------------------------------------------------- /src/app/ui/template/pitch-bend.html: -------------------------------------------------------------------------------- 1 |
2 | 9 |
-------------------------------------------------------------------------------- /src/app/ui/template/reverb.html: -------------------------------------------------------------------------------- 1 |
2 |

Reverb

3 |
4 | 11 |
Level
12 |
13 |
-------------------------------------------------------------------------------- /src/client/images/0-100-knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/0-100-knob.png -------------------------------------------------------------------------------- /src/client/images/0-100-slider-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/0-100-slider-base.png -------------------------------------------------------------------------------- /src/client/images/6-range-knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/6-range-knob.png -------------------------------------------------------------------------------- /src/client/images/cards/facebook-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/cards/facebook-card.jpg -------------------------------------------------------------------------------- /src/client/images/cards/twitter-card.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/cards/twitter-card.jpg -------------------------------------------------------------------------------- /src/client/images/lfo-knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/lfo-knob.png -------------------------------------------------------------------------------- /src/client/images/noise-slider-base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/noise-slider-base.png -------------------------------------------------------------------------------- /src/client/images/range-knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/range-knob.png -------------------------------------------------------------------------------- /src/client/images/slider-knob.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/slider-knob.png -------------------------------------------------------------------------------- /src/client/images/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/switch.png -------------------------------------------------------------------------------- /src/client/images/synth-base-panel.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/synth-base-panel.jpg -------------------------------------------------------------------------------- /src/client/images/t-shirts/button-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/button-dark.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/button-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/button-light.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/ghost-jam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/ghost-jam.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/metalic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/metalic.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/metalic2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/metalic2.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/mono.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/sketch-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/sketch-light.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/sketch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/sketch.png -------------------------------------------------------------------------------- /src/client/images/t-shirts/true-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/t-shirts/true-color.png -------------------------------------------------------------------------------- /src/client/images/wheel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/client/images/wheel.png -------------------------------------------------------------------------------- /src/client/styles/ads.styl: -------------------------------------------------------------------------------- 1 | 2 | $horizontal-ad-width = 655px 3 | $horizontal-ad-height = 81px 4 | $vertical-ad-width = 300px 5 | $vertical-ad-height = 300px 6 | 7 | 8 | body > div.ad 9 | position: absolute 10 | 11 | &.ad-left 12 | &.ad-right 13 | top: 187px 14 | 15 | &.ad-left 16 | left: 0 17 | 18 | img 19 | margin-left: -38px 20 | 21 | /* temporary */ 22 | &:hover 23 | height: 250px 24 | 25 | &.ad-right 26 | right: 0 27 | 28 | img 29 | margin-right: -38px 30 | 31 | img 32 | opacity: 0.1 33 | width: $vertical-ad-width 34 | height: $vertical-ad-height 35 | transform: scale(0.40) 36 | transition: all 0.2s 37 | 38 | &:hover 39 | margin-left: 0 40 | margin-right: 0 41 | opacity: 1 42 | transform: scale(1) 43 | transition: all 0.5s 44 | 45 | &.ad-bottom 46 | 47 | a 48 | position: fixed 49 | bottom: 0 50 | left: 50% 51 | 52 | & > div 53 | position: relative 54 | left: -50% 55 | margin-top: 0px 56 | color: #c5c2c2 57 | opacity: 0.7 58 | transform: scale(0.8) 59 | transition: all 0.2s 60 | 61 | h3 62 | display: inline-block 63 | 64 | &:hover 65 | margin-top: -30px 66 | opacity: 1 67 | transform: scale(1) 68 | transition: all 0.5s -------------------------------------------------------------------------------- /src/client/styles/bootstrap-override.styl: -------------------------------------------------------------------------------- 1 | /* Grid */ 2 | .container { 3 | padding-right: 0px; 4 | padding-left: 0px; 5 | margin-right: auto; 6 | margin-left: auto; 7 | } 8 | 9 | @media (min-width: 768px) { 10 | .container { 11 | width: 100%; 12 | } 13 | } 14 | @media (min-width: 992px) { 15 | .container { 16 | width: 100%; 17 | } 18 | } 19 | @media (min-width: 1200px) { 20 | .container { 21 | width: 100%; 22 | } 23 | } 24 | 25 | /* Buttons */ 26 | .viktor.btn 27 | color: #CDCDCD 28 | background-color: #345776 29 | border-color: #63717E 30 | &:hover, 31 | &:focus 32 | color: #DBDBDB 33 | background-color: #3F6A91 34 | outline: none -------------------------------------------------------------------------------- /src/client/styles/daw/bottom-row.styl: -------------------------------------------------------------------------------- 1 | #bottomRow 2 | .wheel 3 | margin-top: 26px 4 | 5 | #masterControls 6 | .effects 7 | h4, h5, h6 8 | margin-top: 0px 9 | margin-bottom: 1px 10 | 11 | .master-column-bank 12 | margin-right: 2px 13 | 14 | .master-control-bank 15 | border-radius: 10px 16 | border: 1px solid #8E8E8E 17 | 18 | .on-off-switch 19 | position: absolute 20 | top: 0 21 | 22 | .effects 23 | margin-left: -30px 24 | 25 | .compressor 26 | margin-bottom: 3px -------------------------------------------------------------------------------- /src/client/styles/daw/daw.styl: -------------------------------------------------------------------------------- 1 | @import "synth/*" 2 | @import "settings/*" 3 | @import "patch-library/*" 4 | @import "t-shirts/*" 5 | 6 | body 7 | 8 | .daw-container-outer 9 | position: relative 10 | width: $panel-width 11 | height: $panel-height - 20px 12 | margin-top: -20px 13 | margin-left: auto 14 | margin-right: auto 15 | 16 | #dawContainer 17 | position: relative 18 | width: $panel-width 19 | height: $panel-height 20 | margin-top: 20px 21 | margin-left: auto 22 | margin-right: auto 23 | padding-bottom: 195px 24 | border-radius: 14px 25 | background-position: 50% 50% 26 | background-repeat: none 27 | background-image: url("../images/synth-base-panel.jpg") 28 | background-size: contain 29 | box-shadow: 0px 10px 28px rgba( 0, 0, 0, 0.8 ) 30 | color: #eee 31 | transform: scale(0.9) 32 | 33 | #upperRow 34 | width: 95.5% 35 | 36 | >div 37 | padding: 0 38 | 39 | .top-row-item 40 | margin-top: 15px 41 | 42 | #bottomRow 43 | position: absolute 44 | bottom: 10px 45 | width: 100% -------------------------------------------------------------------------------- /src/client/styles/daw/keyboard.styl: -------------------------------------------------------------------------------- 1 | .keyboard 2 | position: absolute 3 | width: 539px 4 | bottom: 10px 5 | left: 188px -------------------------------------------------------------------------------- /src/client/styles/daw/modals.styl: -------------------------------------------------------------------------------- 1 | .modal-dialog 2 | .modal-content 3 | background-color: $panel-grey 4 | color: $panel-text-grey 5 | font-weight: 200 6 | h1, h2, h3, h4, h5, h6 7 | color: $panel-header-grey 8 | label 9 | font-weight: $font-weight 10 | input 11 | background-color: gray 12 | color: white 13 | .close 14 | color: white 15 | opacity: 0.6 16 | text-shadow: none 17 | &:focus 18 | outline: none 19 | opacity: 0.8 20 | &:active 21 | opacity: 0.3 -------------------------------------------------------------------------------- /src/client/styles/daw/patch-library/drop-down.styl: -------------------------------------------------------------------------------- 1 | @import "../../variables" 2 | 3 | #patchesDropDown 4 | display: inline-block 5 | .arrow-button 6 | top: 2px 7 | cursor: pointer 8 | &:hover 9 | text-decoration: none 10 | .display-container 11 | display: inline-block 12 | border: solid 1px #3D3D3D 13 | width: $preset-library-width 14 | background-color: green 15 | -webkit-box-shadow: inset 2px 2px 31px 2px rgba(0,0,0,0.57) 16 | -moz-box-shadow: inset 2px 2px 31px 2px rgba(0,0,0,0.57) 17 | box-shadow: inset 2px 2px 31px 2px rgba(0,0,0,0.57) 18 | .display-container-inner 19 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0.05, rgba(150, 150, 150, 0.69)), color-stop(1, rgba(230, 230, 230, 0))) 20 | background: -moz-linear-gradient(top, rgba(150, 150, 150, 0.69) 5%, rgba(230, 230, 230, 0) 100%) 21 | background: -webkit-linear-gradient(top, rgba(150, 150, 150, 0.69) 5%, rgba(230, 230, 230, 0) 100%) 22 | background: -o-linear-gradient(top, rgba(150, 150, 150, 0.69) 5%, rgba(230, 230, 230, 0) 100%) 23 | background: -ms-linear-gradient(top, rgba(150, 150, 150, 0.69) 5%, rgba(230, 230, 230, 0) 100%) 24 | background: linear-gradient(to bottom, rgba(150, 150, 150, 0.69) 5%, rgba(230, 230, 230, 0) 100%) 25 | .dropdown-toggle 26 | padding: 12px 10px 8px 10px 27 | cursor: pointer 28 | color: black 29 | font-family: "orbitron_light" 30 | text-shadow: 2px 2px rgba(6, 6, 6, 0.13) 31 | .dropdown-menu 32 | width: $preset-library-width 33 | background-color: $panel-grey 34 | color: $panel-text-grey 35 | border: solid 1px #8e8e8e 36 | padding: 20px 37 | font-size: 1.1em 38 | overflow: scroll 39 | height: 346px 40 | > li 41 | line-height: 1.62857143 42 | border-bottom: solid 1px rgba(255,255,255,0.1) 43 | white-space: nowrap 44 | overflow: hidden 45 | &.regular-item 46 | cursor: pointer 47 | &:hover:before 48 | position: absolute 49 | content: "" 50 | width: 5px 51 | height: 1px 52 | left: 7px 53 | margin-top: 11px 54 | border-bottom: solid 1px rgba(255,255,255,0.4) 55 | &:hover:after 56 | position: absolute 57 | content: "" 58 | width: 5px 59 | height: 1px 60 | right: 7px 61 | margin-top: 11px 62 | border-bottom: solid 1px rgba(255,255,255,0.4) 63 | .dropdown-header 64 | text-align: center 65 | font-size: 19px 66 | color: $panel-header-grey -------------------------------------------------------------------------------- /src/client/styles/daw/patch-library/patch-library.styl: -------------------------------------------------------------------------------- 1 | @import "../../variables" 2 | 3 | #patchLibrary 4 | height: $patch-library-height 5 | color: black 6 | 7 | #patchActions 8 | margin-left: 10px 9 | position: absolute 10 | display: inline-block 11 | width: $patch-actions-width 12 | text-align: left 13 | 14 | #libActions 15 | display: inline-block 16 | position: absolute 17 | top: 0px 18 | right: -24px 19 | width: $lib-actions-width 20 | 21 | .share-patch-body 22 | text-align: center 23 | 24 | #urlField 25 | width: 50% 26 | margin: auto 27 | text-align: center -------------------------------------------------------------------------------- /src/client/styles/daw/settings/modal.styl: -------------------------------------------------------------------------------- 1 | .settings-section 2 | 3 | ul > li 4 | list-style: none 5 | 6 | label 7 | margin-left: 10px -------------------------------------------------------------------------------- /src/client/styles/daw/synth/control-bank.styl: -------------------------------------------------------------------------------- 1 | .control-bank 2 | margin-right: 2px 3 | border: 1px solid $control-bank-border-color 4 | border-radius: 10px 5 | 6 | .control-bank.two-row 7 | > .row:first-child 8 | padding-top: 43px 9 | > .row:last-of-type 10 | padding-bottom: 57px 11 | 12 | .control-bank.tri-row.single-column 13 | &>.row>h5 14 | margin-top: 10px 15 | .row:last-of-type 16 | margin-bottom: 15px -------------------------------------------------------------------------------- /src/client/styles/daw/synth/envelopes.styl: -------------------------------------------------------------------------------- 1 | .envelopes .envelope 2 | margin-top: 10px 3 | 4 | .envelopes .col-xs-3 5 | padding: 0 -------------------------------------------------------------------------------- /src/client/styles/daw/synth/mixer.styl: -------------------------------------------------------------------------------- 1 | .oscillator-volume > .row 2 | padding-top: 30px 3 | 4 | .oscillator-switch > .row 5 | margin-top: 52px 6 | &:first-child 7 | margin-top: 39px -------------------------------------------------------------------------------- /src/client/styles/daw/synth/modulation.styl: -------------------------------------------------------------------------------- 1 | .modulation-polyphony 2 | 3 | .row 4 | margin-left: 0 5 | margin-right: 0 6 | 7 | h4 8 | margin-top: 0 9 | 10 | h5 11 | margin-top: 5px 12 | 13 | .modulation 14 | border-bottom: solid 1px $control-bank-border-color 15 | 16 | h5:first-of-type 17 | margin-bottom: 9px 18 | 19 | h5:last-of-type 20 | margin-bottom: 5px 21 | 22 | .polyphony 23 | margin-top: 8px 24 | 25 | h4 26 | margin-top: 2px -------------------------------------------------------------------------------- /src/client/styles/daw/synth/noise.styl: -------------------------------------------------------------------------------- 1 | .noise 2 | > .row 3 | margin-top: 40px 4 | &:last-of-type 5 | margin-bottom: 35px -------------------------------------------------------------------------------- /src/client/styles/daw/synth/oscillator-bank.styl: -------------------------------------------------------------------------------- 1 | .oscillator 2 | &>h5 3 | margin-top: 5px 4 | &>.col-xs-4 5 | padding: 0 -------------------------------------------------------------------------------- /src/client/styles/daw/synth/synth.styl: -------------------------------------------------------------------------------- 1 | #synthContainer 2 | margin-left: -7px 3 | margin-top: 12px -------------------------------------------------------------------------------- /src/client/styles/daw/t-shirts/t-shirts.styl: -------------------------------------------------------------------------------- 1 | #tShirtsSection 2 | 3 | // variables 4 | $negative-angle = 30deg 5 | $angle = -30deg 6 | 7 | a.t-shirts-button 8 | display: block 9 | width: 90px 10 | 11 | & > img 12 | position: absolute 13 | width: 50px 14 | -webkit-transition: -webkit-transform .2s ease-in-out 15 | transition: transform .2s ease-in-out 16 | 17 | &.left-t-shirt 18 | left: 0 19 | -webkit-filter: drop-shadow(-6px 5px 5px #222) 20 | filter: drop-shadow(-6px 5px 5px #222) 21 | 22 | &.right-t-shirt 23 | right: 0 24 | -webkit-filter: drop-shadow(5px 5px 5px #222) 25 | filter: drop-shadow(5px 5px 5px #222) 26 | 27 | &:hover, 28 | &.animate-button 29 | text-decoration: none 30 | 31 | & > img 32 | 33 | &.left-t-shirt 34 | -webkit-transform: rotate($angle) 35 | transform: rotate($angle) 36 | 37 | &.right-t-shirt 38 | -webkit-transform: rotate($negative-angle) 39 | transform: rotate($negative-angle) 40 | 41 | &:active 42 | text-decoration: none 43 | 44 | & > img 45 | margin-top: 5px 46 | 47 | .t-shirt-container 48 | 49 | & > .row:nth-child(2) 50 | margin-top: 20px 51 | margin-bottom: 20px 52 | 53 | .t-shirt 54 | 55 | & > img 56 | width: 100% 57 | max-width: 170px 58 | 59 | @media (min-width: 768px) 60 | 61 | & > img 62 | width: 170px 63 | -------------------------------------------------------------------------------- /src/client/styles/fonts.styl: -------------------------------------------------------------------------------- 1 | 2 | @font-face 3 | font-family: 'orbitron_medium' 4 | src: url('../bower_components/orbitron/webfonts/orbitron-medium-webfont.eot') 5 | src: url('../bower_components/orbitron/webfonts/orbitron-medium-webfont.woff') format('woff'), 6 | url('../bower_components/orbitron/webfonts/orbitron-medium-webfont.ttf') format('truetype'), 7 | url('../bower_components/orbitron/webfonts/orbitron-medium-webfont.svg') format('svg') 8 | font-weight: normal 9 | font-style: normal 10 | 11 | @font-face 12 | font-family: 'orbitron_light' 13 | src: url('../bower_components/orbitron/webfonts/orbitron-light-webfont.eot') 14 | src: url('../bower_components/orbitron/webfonts/orbitron-light-webfont.woff') format('woff'), 15 | url('../bower_components/orbitron/webfonts/orbitron-light-webfont.ttf') format('truetype'), 16 | url('../bower_components/orbitron/webfonts/orbitron-light-webfont.svg') format('svg') 17 | font-weight: normal 18 | font-style: normal -------------------------------------------------------------------------------- /src/client/styles/footer.styl: -------------------------------------------------------------------------------- 1 | footer 2 | width: 50%; 3 | margin-top: 10px 4 | margin-left: auto; 5 | margin-right: auto; 6 | margin-bottom: 60px; 7 | text-align: center 8 | color: $footer-color 9 | font-size: 1.1em 10 | a 11 | color: $footer-color 12 | &:visited 13 | color: $footer-color 14 | text-decoration: none 15 | &:hover, 16 | &:active 17 | text-decoration: none 18 | cursor: pointer 19 | color: $footer-selection 20 | ul.social-links 21 | & > li 22 | margin-top: -10px 23 | font-size: 2em 24 | text-align: center 25 | display: inline-block 26 | padding-right: 5px 27 | padding-left: 5px -------------------------------------------------------------------------------- /src/client/styles/maillist.styl: -------------------------------------------------------------------------------- 1 | .email-subscription-panel 2 | margin-top: 10px 3 | margin-bottom: 23px 4 | margin-left: -92px 5 | color: $footer-color 6 | 7 | h4 8 | color: $text-on-highlight-on-dark-background 9 | position: relative 10 | display: inline 11 | margin: auto 12 | margin-right: 14px 13 | 14 | form 15 | display: inline-block 16 | padding-top: 10px 17 | padding-bottom: 10px 18 | 19 | &>div, &>button 20 | display: inline-block 21 | margin-top: 0px 22 | margin-bottom: 0px 23 | 24 | #email 25 | width: 350px 26 | height: 45px 27 | margin: auto 28 | text-align: center 29 | font-size: 1.7em 30 | transition: all 0.5s ease 31 | background-color: $background-color 32 | color: $footer-color 33 | &::placeholder 34 | color: $footer-color 35 | &:focus 36 | background-color: $highlight-on-dark-background 37 | transition: all .5s ease 38 | color: $text-on-highlight-on-dark-background 39 | &::placeholder 40 | color: $text-dark-background 41 | transition: all 1s ease 42 | 43 | #submit.btn.btn-default 44 | height: 45px 45 | margin-top: -8px 46 | margin-left: 17px 47 | color: $footer-color 48 | background-color: $background-color 49 | border-color: $footer-color 50 | &:hover, 51 | &:focus 52 | color: $text-dark-background 53 | background-color: $background-color 54 | border-color: #969696 55 | outline: none 56 | &:active 57 | color: $text-dark-background 58 | background-color: $highlight-on-dark-background 59 | border-color: #9B9B9B 60 | text-decoration: none 61 | outline: none 62 | 63 | #successfulSubscribeView 64 | .fa-check 65 | color: $green-on-dark 66 | font-size: 2.8em -------------------------------------------------------------------------------- /src/client/styles/main.styl: -------------------------------------------------------------------------------- 1 | @import "variables" 2 | @import "fonts" 3 | @import "bootstrap-override" 4 | @import "daw/*" 5 | @import "social" 6 | @import "maillist" 7 | @import "footer" 8 | @import "viktor-round-button" 9 | @import "ads" 10 | 11 | html, 12 | body, 13 | h1, h2, h3, h4, h5, h6 14 | font-weight: $font-weight 15 | 16 | /* Safari renders text lighter */ 17 | {$safari-only} 18 | html, 19 | body, 20 | h1, h2, h3, h4, h5, h6 21 | font-weight: $font-weight-safari 22 | 23 | html, 24 | body 25 | background-color: $background-color 26 | 27 | .form-control.ng-invalid 28 | border-color: inherit 29 | outline: 0 30 | -webkit-box-shadow: none 31 | box-shadow: none 32 | &:focus 33 | border-color: #a94442 34 | outline: 0 35 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) 36 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) 37 | 38 | .form-control.ng-valid 39 | border-color: inherit 40 | outline: 0 41 | -webkit-box-shadow: none 42 | box-shadow: none 43 | &:focus 44 | border-color: rgba(30, 192, 37, 0.66) 45 | outline: 0 46 | -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(63, 183, 99, 0.6) 47 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(63, 183, 99, 0.6) 48 | 49 | .inline-block 50 | display: inline-block 51 | 52 | .no-padding 53 | padding: 0 54 | 55 | .noselect 56 | -webkit-touch-callout: none 57 | -webkit-user-select: none 58 | -khtml-user-select: none 59 | -moz-user-select: none 60 | -ms-user-select: none 61 | user-select: none 62 | 63 | .centered 64 | position: fixed 65 | top: 50% 66 | left: 50% 67 | /* bring your own prefixes */ 68 | transform: translate(-50%, -50%) 69 | 70 | .move-pixel-up 71 | top: -1px 72 | 73 | .horizontal-divider 74 | color: $panel-text-grey -------------------------------------------------------------------------------- /src/client/styles/social.styl: -------------------------------------------------------------------------------- 1 | #socialButtons 2 | display: inline-block 3 | position: fixed 4 | top: 0 5 | margin-left: 20px 6 | margin-top: 20px 7 | 8 | .fb-like 9 | display: block; 10 | margin-bottom: 10px; -------------------------------------------------------------------------------- /src/client/styles/variables.styl: -------------------------------------------------------------------------------- 1 | /* Browser-specific selectors */ 2 | 3 | $safari-only = '_::-webkit-full-page-media, _:future, :root' 4 | 5 | /* Sizes */ 6 | 7 | $panel-width = 1200px 8 | $panel-height = $panel-width / 2 9 | 10 | $round-button-size = (40px / 1200px) * $panel-width 11 | 12 | $preset-library-width = (270px / 1200px) * $panel-width 13 | 14 | $patch-library-height = (60px / 1200px) * $panel-width 15 | $patch-actions-width = (150px / 1200px) * $panel-width 16 | $lib-actions-width = (200px / 1200px) * $panel-width 17 | 18 | 19 | /* Colors */ 20 | 21 | $background-dark-color = #2b2b2b 22 | $text-dark-background = #929292 23 | $background-color = #27363C 24 | $control-bank-border-color = #8E8E8E 25 | $border-on-dark-background = #616161 26 | $panel-grey = #2a2a2a 27 | $panel-text-grey = #868686 28 | $panel-header-grey = #ABABAB 29 | $footer-color = #565656 30 | $footer-selection = #EEE 31 | 32 | $highlight-on-dark-background = #414141 33 | $text-on-highlight-on-dark-background = #c5c2c2 34 | 35 | $green-on-dark = rgb(0, 112, 0) 36 | 37 | /* Font */ 38 | 39 | $font-weight = 100 40 | $font-weight-safari = 200 -------------------------------------------------------------------------------- /src/client/styles/viktor-round-button.styl: -------------------------------------------------------------------------------- 1 | @import "variables" 2 | 3 | .viktor-round-button, 4 | .viktor-round-button.glyphicon 5 | width: $round-button-size 6 | height: $round-button-size 7 | position: relative 8 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0.05, rgba(150, 150, 150, 0.19)), color-stop(1, rgba(230, 230, 230, 0))) 9 | background: -moz-linear-gradient(top, rgba(150, 150, 150, 0.19) 5%, rgba(230, 230, 230, 0) 100%) 10 | background: -webkit-linear-gradient(top, rgba(150, 150, 150, 0.19) 5%, rgba(230, 230, 230, 0) 100%) 11 | background: -o-linear-gradient(top, rgba(150, 150, 150, 0.19) 5%, rgba(230, 230, 230, 0) 100%) 12 | background: -ms-linear-gradient(top, rgba(150, 150, 150, 0.19) 5%, rgba(230, 230, 230, 0) 100%) 13 | background: linear-gradient(to bottom, rgba(150, 150, 150, 0.19) 5%, rgba(230, 230, 230, 0) 100%) 14 | border-radius: $round-button-size 15 | border: 1px solid #0f0f0f 16 | display: inline-block 17 | cursor: pointer 18 | padding: 12px 12px 19 | text-decoration: none 20 | &:active 21 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0.05, rgba(230, 230, 230, 0)), color-stop(1, rgba(150, 150, 150, 0.19))) 22 | background: -moz-linear-gradient(top, rgba(230, 230, 230, 0) 5%, rgba(150, 150, 150, 0.19) 100%) 23 | background: -webkit-linear-gradient(top, rgba(230, 230, 230, 0) 5%, rgba(150, 150, 150, 0.19) 100%) 24 | background: -o-linear-gradient(top, rgba(230, 230, 230, 0) 5%, rgba(150, 150, 150, 0.19) 100%) 25 | background: -ms-linear-gradient(top, rgba(230, 230, 230, 0) 5%, rgba(150, 150, 150, 0.19) 100%) 26 | background: linear-gradient(to bottom, rgba(230, 230, 230, 0) 5%, rgba(150, 150, 150, 0.19) 100%) 27 | 28 | -------------------------------------------------------------------------------- /src/server/client/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "viktor-website", 3 | "version": "0.1.0", 4 | "authors": [ 5 | "nicroto " 6 | ], 7 | "description": "The website of the Viktor synthesizer.", 8 | "private": true, 9 | "ignore": [ 10 | "**/.*", 11 | "node_modules", 12 | "bower_components", 13 | "test", 14 | "tests" 15 | ], 16 | "dependencies": { 17 | "bootstrap": "~3.3.4", 18 | "orbitron": "*", 19 | "font-awesome": "~4.3.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .DS_Store 4 | Thumbs.db 5 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webaudio-controls", 3 | "version": "1.0.0", 4 | "description": "GUI parts library for Web application using [Polymer] WebComponents", 5 | "license": "Apache2", 6 | "ignore": [ 7 | "**/.*", 8 | "node_modules", 9 | "bower_components", 10 | "test", 11 | "tests" 12 | ], 13 | "dependencies": { 14 | "polymer": "Polymer/polymer#^0.8.0-rc.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/NodeBind/conf/karma.conf.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | module.exports = function(karma) { 12 | var common = require('../../tools/test/karma-common.conf.js'); 13 | karma.set(common.mixin_common_opts(karma, { 14 | // base path, that will be used to resolve files and exclude 15 | basePath: '../../', 16 | 17 | // list of files / patterns to load in the browser 18 | files: [ 19 | 'NodeBind/node_modules/chai/chai.js', 20 | 'NodeBind/conf/mocha.conf.js', 21 | 'observe-js/src/observe.js', 22 | 'NodeBind/src/NodeBind.js', 23 | 'NodeBind/tests/*.js', 24 | ], 25 | })); 26 | }; 27 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/NodeBind/conf/mocha.conf.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | mocha.setup({ 12 | ui:'tdd', 13 | ignoreLeaks: true 14 | }); 15 | var assert = chai.assert; 16 | 17 | var forceCollectObservers = true; -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/TemplateBinding/build.json: -------------------------------------------------------------------------------- 1 | [ 2 | "../observe-js/src/observe.js", 3 | "../NodeBind/src/NodeBind.js", 4 | "src/TemplateBinding.js" 5 | ] 6 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/TemplateBinding/load.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 2 | // This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 3 | // The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 4 | // The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 5 | // Code distributed by Google as part of the polymer project is also 6 | // subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 7 | 8 | (function() { 9 | var thisFile = 'load.js'; 10 | var libLocation = ''; 11 | 12 | function write(inSrc) { 13 | document.write(''); 14 | } 15 | 16 | var script = document.querySelector('script[src*="' + thisFile + '"]'); 17 | if (script) 18 | libLocation = script.src.slice(0, script.src.indexOf(thisFile)); 19 | 20 | document.write(''); 22 | 23 | write('../observe-js/src/observe.js'); 24 | write('../NodeBind/src/NodeBind.js'); 25 | if (window.WCT && (WCT.util.getParam('build') === 'min' || WCT.util.getParam('build') === 'min/')) { 26 | write('TemplateBinding.min.js'); 27 | } else { 28 | write('src/TemplateBinding.js'); 29 | } 30 | })(); 31 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/TemplateBinding/src/template_element.css: -------------------------------------------------------------------------------- 1 | /* 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | template, 12 | thead[template], 13 | tbody[template], 14 | tfoot[template], 15 | th[template], 16 | tr[template], 17 | td[template], 18 | colgroup[template], 19 | col[template], 20 | option[template] { 21 | display: none; 22 | } 23 | 24 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/TemplateBinding/template-instantiation.md: -------------------------------------------------------------------------------- 1 | This doc has been moved to https://github.com/Polymer/docs/blob/master/docs/polymer/template.md 2 | 3 | Viewable at http://www.polymer-project.org/docs/polymer/template.html 4 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/URL/testharness.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans; 3 | } 4 | 5 | #log .warning, 6 | #log .warning a { 7 | color: black; 8 | background: yellow; 9 | } 10 | 11 | #log .error, 12 | #log .error a { 13 | color: white; 14 | background: red; 15 | } 16 | 17 | #log pre { 18 | border: 1px solid black; 19 | padding: 1em; 20 | } 21 | 22 | section#summary { 23 | margin-bottom:1em; 24 | } 25 | 26 | table#results { 27 | border-collapse:collapse; 28 | table-layout:fixed; 29 | width:100%; 30 | } 31 | 32 | table#results th:first-child, 33 | table#results td:first-child { 34 | width:4em; 35 | } 36 | 37 | table#results th:last-child, 38 | table#results td:last-child { 39 | width:50%; 40 | } 41 | 42 | table#results.assertions th:last-child, 43 | table#results.assertions td:last-child { 44 | width:35%; 45 | } 46 | 47 | table#results th { 48 | padding:0; 49 | padding-bottom:0.5em; 50 | border-bottom:medium solid black; 51 | } 52 | 53 | table#results td { 54 | padding:1em; 55 | padding-bottom:0.5em; 56 | border-bottom:thin solid black; 57 | } 58 | 59 | tr.pass > td:first-child { 60 | color:green; 61 | } 62 | 63 | tr.fail > td:first-child { 64 | color:red; 65 | } 66 | 67 | tr.timeout > td:first-child { 68 | color:red; 69 | } 70 | 71 | tr.notrun > td:first-child { 72 | color:blue; 73 | } 74 | 75 | .pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child { 76 | font-variant:small-caps; 77 | } 78 | 79 | table#results span { 80 | display:block; 81 | } 82 | 83 | table#results span.expected { 84 | font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace; 85 | white-space:pre; 86 | } 87 | 88 | table#results span.actual { 89 | font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace; 90 | white-space:pre; 91 | } 92 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/URL/testharnessreport.js: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/URL/urltestharness.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 60 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/URL/urltestrunner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
61 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/observe-js/conf/karma.conf.js:
--------------------------------------------------------------------------------
 1 | /*
 2 |  * @license
 3 |  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 4 |  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 5 |  * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 6 |  * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 7 |  * Code distributed by Google as part of the polymer project is also
 8 |  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 9 |  */
10 | 
11 | module.exports = function(karma) {
12 |   var common = require('../../tools/test/karma-common.conf.js');
13 |   karma.set(common.mixin_common_opts(karma, {
14 |     // base path, that will be used to resolve files and exclude
15 |     basePath: '../',
16 | 
17 |     // list of files / patterns to load in the browser
18 |     files: [
19 |       'node_modules/chai/chai.js',
20 |       'conf/mocha.conf.js',
21 |       'src/observe.js',
22 |       'util/array_reduction.js',
23 |       'tests/*.js'
24 |     ],
25 | 
26 |     // list of files to exclude
27 |     exclude: [
28 |       'tests/d8_array_fuzzer.js',
29 |       'tests/d8_planner_test.js'
30 |     ],
31 |   }));
32 | };
33 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/observe-js/conf/mocha.conf.js:
--------------------------------------------------------------------------------
 1 | /*
 2 |  * @license
 3 |  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 4 |  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 5 |  * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 6 |  * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 7 |  * Code distributed by Google as part of the polymer project is also
 8 |  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 9 |  */
10 | 
11 | mocha.setup({
12 |   ui:'tdd',
13 |   ignoreLeaks: true
14 | });
15 | var assert = chai.assert;
16 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/observe-js/observe-js.html:
--------------------------------------------------------------------------------
 1 | 
 9 | 
10 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/build.json:
--------------------------------------------------------------------------------
1 | [
2 |   "third_party/esprima/esprima.js",
3 |   "src/polymer-expressions.js"
4 | ]
5 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/conf/karma.conf.js:
--------------------------------------------------------------------------------
 1 | /*
 2 |  * @license
 3 |  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 4 |  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 5 |  * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 6 |  * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 7 |  * Code distributed by Google as part of the polymer project is also
 8 |  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 9 |  */
10 | 
11 | module.exports = function(karma) {
12 |   var common = require('../../tools/test/karma-common.conf.js');
13 |   karma.set(common.mixin_common_opts(karma, {
14 |     // base path, that will be used to resolve files and exclude
15 |     basePath: '../../',
16 | 
17 |     // list of files / patterns to load in the browser
18 |     files: [
19 |       'polymer-expressions/node_modules/chai/chai.js',
20 |       'polymer-expressions/conf/mocha.conf.js',
21 |       'TemplateBinding/load.js',
22 |       'polymer-expressions/third_party/esprima/esprima.js',
23 |       'polymer-expressions/src/polymer-expressions.js',
24 |       'polymer-expressions/tests/tests.js',
25 |       {pattern: 'NodeBind/src/*.js', included: false},
26 |       {pattern: 'TemplateBinding/src/*.css', included: false},
27 |       {pattern: 'TemplateBinding/src/*.js', included: false},
28 |       {pattern: 'observe-js/src/*.js', included: false}
29 |     ]
30 |   }));
31 | };
32 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/conf/mocha.conf.js:
--------------------------------------------------------------------------------
 1 | /*
 2 |  * @license
 3 |  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 4 |  * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 5 |  * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 6 |  * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 7 |  * Code distributed by Google as part of the polymer project is also
 8 |  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 9 |  */
10 | 
11 | mocha.setup({
12 |   ui:'tdd',
13 |   ignoreLeaks: true
14 | });
15 | var assert = chai.assert;
16 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/polymer-expressions.html:
--------------------------------------------------------------------------------
 1 | 
 7 | 
 8 | 
 9 | 
10 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/smoke.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
10 | 
11 | 
12 | PolymerExpressions tests
13 | 
14 | 
15 | 
16 | 
17 | 
18 | 
19 | 
20 | 
21 | 
22 | 
32 | 
33 | 
34 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/third_party/esprima/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guide 2 | 3 | This page describes how to contribute changes to Esprima. 4 | 5 | Please do **not** create a pull request without reading this guide first. Failure to do so may result in the **rejection** of the pull request. 6 | 7 | **1. Create a ticket in the [issue tracker](http://issues.esprima.org)**. 8 | This serves as a placeholder for important feedback, review, or any future updates. 9 | 10 | **2. Run all the tests**. This requires Node.js: `npm install` to set up, `npm test` to run the tests. 11 | 12 | **3. Work on a feature branch**. If the change still needs some tweaks, it will not clutter the master branch. 13 | 14 | **4. Write a reasonable commit message:** 15 | 16 | * Keep the first line < 72 characters. Write additional paragraphs if necessary. 17 | * Put the link to the ticket. This is important for cross-referencing purposes. 18 | 19 | 20 | For more information, please check the [detailed contribution guide](http://esprima.org/doc/index.html#contribution). 21 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-expressions/third_party/esprima/LICENSE.BSD: -------------------------------------------------------------------------------- 1 | Redistribution and use in source and binary forms, with or without 2 | modification, are permitted provided that the following conditions are met: 3 | 4 | * Redistributions of source code must retain the above copyright 5 | notice, this list of conditions and the following disclaimer. 6 | * Redistributions in binary form must reproduce the above copyright 7 | notice, this list of conditions and the following disclaimer in the 8 | documentation and/or other materials provided with the distribution. 9 | 10 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 11 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 12 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 13 | ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY 14 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 15 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 16 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 17 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 18 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 19 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 20 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/banner.txt: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/build.json: -------------------------------------------------------------------------------- 1 | [ 2 | "src/scope.js", 3 | "src/targetfind.js", 4 | "src/touch-action.js", 5 | "src/eventFactory.js", 6 | "src/pointermap.js", 7 | "src/dispatcher.js", 8 | "src/mouse.js", 9 | "src/touch.js", 10 | "src/ms.js", 11 | "src/pointer.js", 12 | "src/platform-events.js", 13 | "src/track.js", 14 | "src/hold.js", 15 | "src/tap.js", 16 | "src/pinch.js" 17 | ] 18 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/conf/karma.conf.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | module.exports = function(karma) { 12 | var common = require('../../tools/test/karma-common.conf.js'); 13 | karma.set(common.mixin_common_opts(karma, { 14 | // base path, that will be used to resolve files and exclude 15 | basePath: '../../', 16 | 17 | // list of files / patterns to load in the browser 18 | files: [ 19 | 'polymer-gestures/node_modules/chai/chai.js', 20 | 'polymer-gestures/src/scope.js', 21 | 'polymer-gestures/src/targetfind.js', 22 | 'polymer-gestures/src/touch-action.js', 23 | 'polymer-gestures/src/eventFactory.js', 24 | 'polymer-gestures/src/pointermap.js', 25 | 'polymer-gestures/src/dispatcher.js', 26 | 'polymer-gestures/src/mouse.js', 27 | 'polymer-gestures/src/touch.js', 28 | 'polymer-gestures/src/ms.js', 29 | 'polymer-gestures/src/pointer.js', 30 | 'polymer-gestures/src/platform-events.js', 31 | 'polymer-gestures/src/track.js', 32 | 'polymer-gestures/src/hold.js', 33 | 'polymer-gestures/src/tap.js', 34 | 'polymer-gestures/test/js/setup.js', 35 | 'polymer-gestures/test/js/fake.js', 36 | 'polymer-gestures/test/js/*.js' 37 | ] 38 | })); 39 | }; 40 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/polymer-gestures.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/polymer-gestures.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | (function() { 10 | var thisFile = 'polymer-gestures.js'; 11 | var scopeName = 'PolymerGestures'; 12 | var modules = [ 13 | 'src/scope.js', 14 | 'src/targetfind.js', 15 | 'src/touch-action.js', 16 | 'src/eventFactory.js', 17 | 'src/pointermap.js', 18 | 'src/dispatcher.js', 19 | 'src/mouse.js', 20 | 'src/touch.js', 21 | 'src/ms.js', 22 | 'src/pointer.js', 23 | 'src/platform-events.js', 24 | 'src/track.js', 25 | 'src/hold.js', 26 | 'src/tap.js', 27 | 'src/pinch.js' 28 | ]; 29 | 30 | window[scopeName] = { 31 | entryPointName: thisFile, 32 | modules: modules 33 | }; 34 | 35 | var script = document.currentScript || document.querySelector('script[src $= "' + thisFile + '"]'); 36 | var src = script.attributes.src.value; 37 | var basePath = src.slice(0, src.indexOf(thisFile)); 38 | 39 | if (!window.PolymerLoader) { 40 | var path = basePath + '../tools/loader/loader.js'; 41 | document.write(''); 42 | } 43 | 44 | document.write(''); 45 | 46 | })(); 47 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/src/platform-events.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | 10 | /** 11 | * This module contains the handlers for native platform events. 12 | * From here, the dispatcher is called to create unified pointer events. 13 | * Included are touch events (v1), mouse events, and MSPointerEvents. 14 | */ 15 | (function(scope) { 16 | 17 | var dispatcher = scope.dispatcher; 18 | var nav = window.navigator; 19 | 20 | if (window.PointerEvent) { 21 | dispatcher.registerSource('pointer', scope.pointerEvents); 22 | } else if (nav.msPointerEnabled) { 23 | dispatcher.registerSource('ms', scope.msEvents); 24 | } else { 25 | dispatcher.registerSource('mouse', scope.mouseEvents); 26 | if (window.ontouchstart !== undefined) { 27 | dispatcher.registerSource('touch', scope.touchEvents); 28 | } 29 | } 30 | 31 | // Work around iOS bugs https://bugs.webkit.org/show_bug.cgi?id=135628 and https://bugs.webkit.org/show_bug.cgi?id=136506 32 | var ua = navigator.userAgent; 33 | var IS_IOS = ua.match(/iPad|iPhone|iPod/) && 'ontouchstart' in window; 34 | 35 | dispatcher.IS_IOS = IS_IOS; 36 | scope.touchEvents.IS_IOS = IS_IOS; 37 | 38 | dispatcher.register(document, true); 39 | })(window.PolymerGestures); 40 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/src/pointer.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | 10 | (function(scope) { 11 | var dispatcher = scope.dispatcher; 12 | var pointermap = dispatcher.pointermap; 13 | var pointerEvents = { 14 | events: [ 15 | 'pointerdown', 16 | 'pointermove', 17 | 'pointerup', 18 | 'pointercancel' 19 | ], 20 | prepareEvent: function(inEvent) { 21 | var e = dispatcher.cloneEvent(inEvent); 22 | e._source = 'pointer'; 23 | return e; 24 | }, 25 | register: function(target) { 26 | dispatcher.listen(target, this.events); 27 | }, 28 | unregister: function(target) { 29 | if (target.nodeType === Node.DOCUMENT_NODE) { 30 | return; 31 | } 32 | dispatcher.unlisten(target, this.events); 33 | }, 34 | cleanup: function(id) { 35 | pointermap['delete'](id); 36 | }, 37 | pointerdown: function(inEvent) { 38 | var e = this.prepareEvent(inEvent); 39 | e.target = scope.findTarget(inEvent); 40 | pointermap.set(e.pointerId, e.target); 41 | dispatcher.down(e); 42 | }, 43 | pointermove: function(inEvent) { 44 | var target = pointermap.get(inEvent.pointerId); 45 | if (target) { 46 | var e = this.prepareEvent(inEvent); 47 | e.target = target; 48 | dispatcher.move(e); 49 | } 50 | }, 51 | pointerup: function(inEvent) { 52 | var e = this.prepareEvent(inEvent); 53 | e.relatedTarget = scope.findTarget(inEvent); 54 | e.target = pointermap.get(e.pointerId); 55 | dispatcher.up(e); 56 | this.cleanup(inEvent.pointerId); 57 | }, 58 | pointercancel: function(inEvent) { 59 | var e = this.prepareEvent(inEvent); 60 | e.relatedTarget = scope.findTarget(inEvent); 61 | e.target = pointermap.get(e.pointerId); 62 | dispatcher.cancel(e); 63 | this.cleanup(inEvent.pointerId); 64 | } 65 | }; 66 | 67 | scope.pointerEvents = pointerEvents; 68 | })(window.PolymerGestures); 69 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/src/pointermap.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | 10 | /** 11 | * This module implements an map of pointer states 12 | */ 13 | (function(scope) { 14 | var USE_MAP = window.Map && window.Map.prototype.forEach; 15 | var POINTERS_FN = function(){ return this.size; }; 16 | function PointerMap() { 17 | if (USE_MAP) { 18 | var m = new Map(); 19 | m.pointers = POINTERS_FN; 20 | return m; 21 | } else { 22 | this.keys = []; 23 | this.values = []; 24 | } 25 | } 26 | 27 | PointerMap.prototype = { 28 | set: function(inId, inEvent) { 29 | var i = this.keys.indexOf(inId); 30 | if (i > -1) { 31 | this.values[i] = inEvent; 32 | } else { 33 | this.keys.push(inId); 34 | this.values.push(inEvent); 35 | } 36 | }, 37 | has: function(inId) { 38 | return this.keys.indexOf(inId) > -1; 39 | }, 40 | 'delete': function(inId) { 41 | var i = this.keys.indexOf(inId); 42 | if (i > -1) { 43 | this.keys.splice(i, 1); 44 | this.values.splice(i, 1); 45 | } 46 | }, 47 | get: function(inId) { 48 | var i = this.keys.indexOf(inId); 49 | return this.values[i]; 50 | }, 51 | clear: function() { 52 | this.keys.length = 0; 53 | this.values.length = 0; 54 | }, 55 | // return value, key, map 56 | forEach: function(callback, thisArg) { 57 | this.values.forEach(function(v, i) { 58 | callback.call(thisArg, v, this.keys[i], this); 59 | }, this); 60 | }, 61 | pointers: function() { 62 | return this.keys.length; 63 | } 64 | }; 65 | 66 | scope.PointerMap = PointerMap; 67 | })(window.PolymerGestures); 68 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/src/scope.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | window.PolymerGestures = {}; 11 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/src/touch-action.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 4 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 5 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 6 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 7 | * Code distributed by Google as part of the polymer project is also 8 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 9 | */ 10 | 11 | (function() { 12 | function shadowSelector(v) { 13 | return 'html /deep/ ' + selector(v); 14 | } 15 | function selector(v) { 16 | return '[touch-action="' + v + '"]'; 17 | } 18 | function rule(v) { 19 | return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + ';}'; 20 | } 21 | var attrib2css = [ 22 | 'none', 23 | 'auto', 24 | 'pan-x', 25 | 'pan-y', 26 | { 27 | rule: 'pan-x pan-y', 28 | selectors: [ 29 | 'pan-x pan-y', 30 | 'pan-y pan-x' 31 | ] 32 | }, 33 | 'manipulation' 34 | ]; 35 | var styles = ''; 36 | // only install stylesheet if the browser has touch action support 37 | var hasTouchAction = typeof document.head.style.touchAction === 'string'; 38 | // only add shadow selectors if shadowdom is supported 39 | var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot; 40 | 41 | if (hasTouchAction) { 42 | attrib2css.forEach(function(r) { 43 | if (String(r) === r) { 44 | styles += selector(r) + rule(r) + '\n'; 45 | if (hasShadowRoot) { 46 | styles += shadowSelector(r) + rule(r) + '\n'; 47 | } 48 | } else { 49 | styles += r.selectors.map(selector) + rule(r.rule) + '\n'; 50 | if (hasShadowRoot) { 51 | styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n'; 52 | } 53 | } 54 | }); 55 | 56 | var el = document.createElement('style'); 57 | el.textContent = styles; 58 | document.head.appendChild(el); 59 | } 60 | })(); 61 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/test/html/content-handler.html: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | content tap 14 | 15 | 16 | 41 | 42 | 43 |
Tap the gray box with touch. If the screen turns green, the test passed. If it turns red, the test failed.
44 | 45 |
46 |
47 |
48 | 49 |
50 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/test/html/focus.html: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | Ghostclick 14 | 15 | 16 | 41 | 42 | 43 |
Tap the gray box with touch. If the screen turns green, the test passed. If it turns red, the test failed.
44 |
45 | 46 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/test/js/pointermap.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | 10 | suite('PointerMap', function() { 11 | var PointerMap = PolymerGestures.PointerMap; 12 | var p; 13 | setup(function() { 14 | p = new PointerMap(); 15 | }); 16 | 17 | test('PointerMap has Map API', function() { 18 | var keys = [ 19 | 'set', 20 | 'get', 21 | 'has', 22 | 'delete', 23 | 'pointers', 24 | 'clear', 25 | 'forEach' 26 | ]; 27 | keys.forEach(function(k) { 28 | assert.property(PointerMap.prototype, k); 29 | }); 30 | }); 31 | test('PointerMap .set', function() { 32 | p.set(1, true); 33 | if (!window.Map || !(p instanceof Map)) { 34 | assert.lengthOf(p.keys, 1); 35 | assert.lengthOf(p.values, 1); 36 | } 37 | assert.equal(p.pointers(), 1); 38 | }); 39 | test('PointerMap .get', function() { 40 | var p = new PointerMap(); 41 | 42 | }); 43 | test('PointerMap .pointers', function() { 44 | assert.isFunction(p.pointers); 45 | assert.equal(p.pointers(), 0); 46 | p.set(1, true); 47 | assert.equal(p.pointers(), 1); 48 | p.set(1, false); 49 | assert.equal(p.pointers(), 1); 50 | }); 51 | test('PointerMap .has', function() { 52 | p.set(1, true); 53 | assert.isTrue(p.has(1)); 54 | assert.isFalse(p.has(0)); 55 | }); 56 | test('PointerMap .delete', function() { 57 | p.set(1, true); 58 | p.set(2, false); 59 | assert.equal(p.pointers(), 2); 60 | p.delete(1); 61 | assert.equal(p.pointers(), 1); 62 | assert.isFalse(p.get(2)); 63 | }); 64 | test('PointerMap .clear', function() { 65 | p.set(1, true); 66 | p.clear(); 67 | assert.equal(p.pointers(), 0); 68 | }); 69 | test('PointerMap .forEach', function() { 70 | p.set(1, true); 71 | p.set(2, false); 72 | p.set(3, {}); 73 | p.forEach(function(v, k, m) { 74 | assert.ok(k); 75 | assert.equal(p.get(k), v); 76 | // assert.equal(m, p); 77 | }); 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/test/js/setup.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 3 | * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt 4 | * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt 5 | * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt 6 | * Code distributed by Google as part of the polymer project is also 7 | * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt 8 | */ 9 | 10 | mocha.setup({ui: 'tdd'}); 11 | assert = chai.assert; 12 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer-gestures/test/runner.html: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | Polymer Gestures test runner 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/build.bat: -------------------------------------------------------------------------------- 1 | START /B vulcanize polymer-simplex.html --inline --strip -output dist/polymer-simplex.html 2 | START /B vulcanize polymer.html --inline --strip -output dist/polymer.html 3 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/explainer/data-bind.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/bower_components/polymer/explainer/data-bind.vsdx -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/explainer/samples.html: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | Explainer Samples 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 30 | 31 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/polymer-micro.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 35 | 36 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/polymer-mini.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 45 | 46 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/polymer.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/expr/focus.html: -------------------------------------------------------------------------------- 1 | 10 | 23 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/expr/gestures.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/expr/log.html: -------------------------------------------------------------------------------- 1 | 10 | 22 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/expr/style-protector.html: -------------------------------------------------------------------------------- 1 | 2 | 53 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/micro/constructor.html: -------------------------------------------------------------------------------- 1 | 10 | 75 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/micro/extends.html: -------------------------------------------------------------------------------- 1 | 10 | 80 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/micro/mixins.html: -------------------------------------------------------------------------------- 1 | 10 | 41 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/mini/shadow.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 41 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/mini/template.html: -------------------------------------------------------------------------------- 1 | 10 | 61 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/features/standard/resolveUrl.html: -------------------------------------------------------------------------------- 1 | 10 | 28 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/annotations/demo/app-chrome.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Template Test 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 34 | 35 |

36 | 
37 |   
56 | 
57 |   
58 | 
59 | 
60 | 
61 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/async.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
69 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/bind/demo/app-chrome.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 |   Bind Test
 6 | 
 7 |   
 8 |   
 9 | 
10 |   
16 | 
17 |   
18 |   
19 | 
20 | 
21 | 
22 | 
23 |   

24 | 
25 |   

26 | 
27 | 
28 | 
29 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/bind/demo/app.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 |   Bind Test
 6 | 
 7 |   
 8 |   
 9 | 
10 |   
11 | 
12 |   
18 | 
19 |   
20 |   
21 | 
22 | 
23 | 
24 | 
25 |   

26 |   

27 | 
28 | 
29 | 
30 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/bind/demo/src/annotations-bind-demo.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 | 
 6 | 
 7 | 
 8 | 
 9 | 
16 | 
17 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/case-map.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
47 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/debounce.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
70 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/dom-module.html:
--------------------------------------------------------------------------------
 1 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/event-api.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
93 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/lang.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
22 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/module.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
57 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/polymer.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
78 | 
79 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/settings.html:
--------------------------------------------------------------------------------
 1 | 
10 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/style-defaults.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
33 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/style-util.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
12 | 
13 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/template/x-autobind.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
52 | 
53 | 
81 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/lib/template/x-template.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
12 | 
13 | 
40 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/src/polymer.html:
--------------------------------------------------------------------------------
 1 | 
10 | 
11 | 
12 | 
13 | 
14 | 
15 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/polymer/wct.conf.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 |   suites: ['test/runner.html'], 
3 | };
4 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/bower_components/webcomponentsjs/build.log:
--------------------------------------------------------------------------------
 1 | BUILD LOG
 2 | ---------
 3 | Build Time: 2015-04-13T13:57:39-0700
 4 | 
 5 | NODEJS INFORMATION
 6 | ==================
 7 | nodejs: v0.12.0
 8 | gulp: 3.8.11
 9 | gulp-audit: 1.0.0
10 | gulp-concat: 2.5.2
11 | gulp-header: 1.2.2
12 | gulp-uglify: 1.2.0
13 | run-sequence: 1.0.2
14 | web-component-tester: 2.2.6
15 | 
16 | REPO REVISIONS
17 | ==============
18 | webcomponentsjs: ef29f20f1678f1b121ea5acce84cf36c599f7627
19 | 
20 | BUILD HASHES
21 | ============
22 | CustomElements.js: 2292abfeeb0ca0e03314f35edc50867c89b2dc93
23 | CustomElements.min.js: 131750c5b4297103b7702bb9123498bd5d4113a3
24 | HTMLImports.js: 5488833312a155d45744190715c0a702ba4d1340
25 | HTMLImports.min.js: 3d3cc90f2ff3fd718cb80253b4dc18ac54157411
26 | ShadowDOM.js: bf6aa1c79006401b100f0b60caa8b4f60333c209
27 | ShadowDOM.min.js: bf7028b266a9567556e3e99946dee55b451db0a8
28 | webcomponents-lite.js: 22a5d4a7b77eff8bca4dff1d0ed8c0cf11bd43e1
29 | webcomponents-lite.min.js: 45223241dc94cf226d7626e6f85af2370e186134
30 | webcomponents.js: eb64d78f556c672f905a703e10dba21bfe97694b
31 | webcomponents.min.js: 65d1bdca02300557e2055f91b236c20624ca0317


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/LittlePhatty.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/LittlePhatty.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/LittlePhatty_sample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/LittlePhatty_sample.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/bg.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/defknob2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/defknob2.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/demo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/demo.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/hsliderbody.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/hsliderbody.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/hsliderknob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/hsliderknob.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/hsw5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/hsw5.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/sample3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/sample3.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/switch_toggle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/switch_toggle.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/testknob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/testknob.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/vernier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/vernier.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/vsliderbody.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/vsliderbody.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/img/vsliderknob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nicroto/viktor/2b0509343a63323935abbfbba42b2fd65fb9b806/src/server/client/non-bower/webaudio-controls/img/vsliderknob.png


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/lib/webaudio-param.min.html:
--------------------------------------------------------------------------------
1 | 
6 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "webaudio-controls",
 3 |   "dependencies": {
 4 |     "grunt": "~0.4.1"
 5 |   },
 6 |   "devDependencies": {
 7 |     "grunt-banner": "^0.4.0",
 8 |     "grunt-contrib-clean": "~0.5.0",
 9 |     "grunt-contrib-connect": "^0.10.1",
10 |     "grunt-vulcanize": "^0.6.4"
11 |   }
12 | }
13 | 


--------------------------------------------------------------------------------
/src/server/client/non-bower/webaudio-controls/sample4.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 4 | 
 5 | [Polymer] WebAudio-Keyboard Test
 6 | 
 7 | 
 8 | 
 9 | 
10 | 
43 | 
44 | 
45 | 	MidiOut : 

46 | Program : 47 |

48 | Volume :

49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /src/server/client/non-bower/webaudio-controls/webcomponents/webaudio-controls.html: -------------------------------------------------------------------------------- 1 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/server/server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var http = require('http'), 4 | pathUtils = require('path'), 5 | express = require("express"), 6 | app = express(), 7 | PORT = process.env.PORT || 5000; 8 | 9 | app.use( express.static( pathUtils.resolve( __dirname, "client" ) ) ); 10 | 11 | http.createServer(app).listen( PORT, function() { 12 | console.log('Express server listening on port ' + PORT); 13 | console.log('http://localhost:' + PORT); 14 | } ); --------------------------------------------------------------------------------