{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/scripts/translate.js","webpack:///./src/scripts/movingAverage.js","webpack:///./src/scripts/TimePlanner.js","webpack:///./src/scripts/TimeShiftMixer.js","webpack:///./src/scripts/chScrubber.js","webpack:///./src/scripts/Captioner.js","webpack:///./src/scripts/Conductor.js","webpack:///./src/scripts/index.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","map","webpackContext","req","id","webpackContextResolve","e","Error","code","keys","resolve","translate","leftMin","leftMax","rightMin","rightMax","leftSpan","MovingAverageCalculator","constructor","factor","this","_mean","update","newValue","newMean","validate","count","Controller","require","TimePlanner","mixerAnxious","mixerRelaxed","captioner","events","chart","anxiousLowChangePaused","relaxedLowChangePaused","lastValue","lastTime","direction","startValue","endValue","durationAnxious","durationRelaxed","pidSettings","k_p","k_i","k_d","i_max","pidAnxious","pidRelaxed","interval","maxHertz","lastTempoTime","jumpiness","average","captions","addEventListener","val","track","changeTracks","undefined","anxiousFile","anxiousCaptions","relaxedFile","relaxedCaptions","changeTrack","start","Date","getTime","setCurrentTime","getDuration","reset","anxiousPaused","relaxedPaused","setInterval","intervalHandler","submit","newtime","evt","Event","dispatchEvent","play","mixer","pid","dur","desiredTime","setTarget","current","getCurrentTime","change","mean","num","min","max","datasets","x","y","setRate","end","pause","progress","clearInterval","utils","clamp","TimeShiftMixer","audioContext","readyCallback","audioReady","duration","sourceUrl","shifters","audioCompressed","audioDecompressed","reversed","windowSize","bufferSize","algorithm","shouldBePlaying","translatePosition","pos","newSrc","that","buffer","loader","url","setTimeout","decodeAudioData","decodedData","audioForwardsLoaded","clone","reverse","audioBackwardsLoaded","stop","OLATSPlayer","connect","destination","ready","state","resume","curr","time","position","round4","playing","Math","floor","shifterEnded","target","rate","speed","abs","ScrubberView","makeAccessors","createDOM","attachListeners","onValueChanged","onScrubStart","onScrubEnd","cleanValue","_value","propagate","redraw","_min","_max","getPageYFromValue","rect","elt","getBoundingClientRect","pare","parentNode","height","top","document","createElement","thumb","className","style","left","appendChild","frac","cachedTop","cachedHeight","self","mousedown","setValueFromPageY","pageY","preventDefault","changedTouches","passive","xOffset","pageXOffset","yOffset","pageYOffset","width","removeEventListener","Captioner","captionElement","list","rand","lastPosition","typewriter","Typewriter","autoStart","delay","typeString","random","scroller","getElementsByClassName","innerHTML","cap","querySelector","scrollTop","scrollHeight","reverseString","str","split","join","searchStrings","from","to","returners","changed","concat","caps","options","Conductor","initialPreload","anxiousIndex","relaxedIndex","anxiousEnded","relaxedEnded","anxiousStarted","relaxedStarted","relaxedTimeout","anxiousTimeout","preload","thing","event","clearTimeout","getElementById","classList","remove","add","next","getNextTrack","anxious","relaxed","tracks","currentAnxiousTrack","currentSection","credits","currentRelaxedTrack","constructTrackIndicators","creditList","Array","section","dir","trak","parseInt","sec","a","greens","blues","firstChild","removeChild","lastChild","el","allDone","preloader","LoaderType","analytics","domready","initialize","pageview","location","pathname","debug","Cookies","enableDebug","set","href","disableDebug","chartel","display","ctx","getContext","backgroundColor","Chart","type","responsive","animation","elements","line","tension","scales","xAxes","beginAtZero","scaleLabel","yAxes","labels","label","borderColor","createAudioContext","AudioContext","webkitAudioContext","latencyHint","anxiousReady","relaxedReady","timePlanner","err","alert","preloadFile","path","item","conductor","filePreloaded","indexOf","addFromLoaderType","load","navigateToPlayer","openPleaseWait","closePleaseWait","createTextNode","onComplete","scrubber","body","getElementsByTagName","openPlayerHelp","updateStartStop","startPos","endPos","upwards","downwards","toString","endheight","mult","upTop","hideStartStop","loadErrors","JSON","stringify","packFinished","loadTrackList","request","Request","fetch","then","response","json","previouslyFinished","strang","finished","parse","b","unpackFinished","catch","error","console","test","navigator","userAgent","MSStream"],"mappings":"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","file":"js/app.df5dab46.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([189,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","var map = {\n\t\"./af\": 14,\n\t\"./af.js\": 14,\n\t\"./ar\": 15,\n\t\"./ar-dz\": 16,\n\t\"./ar-dz.js\": 16,\n\t\"./ar-kw\": 17,\n\t\"./ar-kw.js\": 17,\n\t\"./ar-ly\": 18,\n\t\"./ar-ly.js\": 18,\n\t\"./ar-ma\": 19,\n\t\"./ar-ma.js\": 19,\n\t\"./ar-sa\": 20,\n\t\"./ar-sa.js\": 20,\n\t\"./ar-tn\": 21,\n\t\"./ar-tn.js\": 21,\n\t\"./ar.js\": 15,\n\t\"./az\": 22,\n\t\"./az.js\": 22,\n\t\"./be\": 23,\n\t\"./be.js\": 23,\n\t\"./bg\": 24,\n\t\"./bg.js\": 24,\n\t\"./bm\": 25,\n\t\"./bm.js\": 25,\n\t\"./bn\": 26,\n\t\"./bn.js\": 26,\n\t\"./bo\": 27,\n\t\"./bo.js\": 27,\n\t\"./br\": 28,\n\t\"./br.js\": 28,\n\t\"./bs\": 29,\n\t\"./bs.js\": 29,\n\t\"./ca\": 30,\n\t\"./ca.js\": 30,\n\t\"./cs\": 31,\n\t\"./cs.js\": 31,\n\t\"./cv\": 32,\n\t\"./cv.js\": 32,\n\t\"./cy\": 33,\n\t\"./cy.js\": 33,\n\t\"./da\": 34,\n\t\"./da.js\": 34,\n\t\"./de\": 35,\n\t\"./de-at\": 36,\n\t\"./de-at.js\": 36,\n\t\"./de-ch\": 37,\n\t\"./de-ch.js\": 37,\n\t\"./de.js\": 35,\n\t\"./dv\": 38,\n\t\"./dv.js\": 38,\n\t\"./el\": 39,\n\t\"./el.js\": 39,\n\t\"./en-au\": 40,\n\t\"./en-au.js\": 40,\n\t\"./en-ca\": 41,\n\t\"./en-ca.js\": 41,\n\t\"./en-gb\": 42,\n\t\"./en-gb.js\": 42,\n\t\"./en-ie\": 43,\n\t\"./en-ie.js\": 43,\n\t\"./en-il\": 44,\n\t\"./en-il.js\": 44,\n\t\"./en-in\": 45,\n\t\"./en-in.js\": 45,\n\t\"./en-nz\": 46,\n\t\"./en-nz.js\": 46,\n\t\"./en-sg\": 47,\n\t\"./en-sg.js\": 47,\n\t\"./eo\": 48,\n\t\"./eo.js\": 48,\n\t\"./es\": 49,\n\t\"./es-do\": 50,\n\t\"./es-do.js\": 50,\n\t\"./es-us\": 51,\n\t\"./es-us.js\": 51,\n\t\"./es.js\": 49,\n\t\"./et\": 52,\n\t\"./et.js\": 52,\n\t\"./eu\": 53,\n\t\"./eu.js\": 53,\n\t\"./fa\": 54,\n\t\"./fa.js\": 54,\n\t\"./fi\": 55,\n\t\"./fi.js\": 55,\n\t\"./fil\": 56,\n\t\"./fil.js\": 56,\n\t\"./fo\": 57,\n\t\"./fo.js\": 57,\n\t\"./fr\": 58,\n\t\"./fr-ca\": 59,\n\t\"./fr-ca.js\": 59,\n\t\"./fr-ch\": 60,\n\t\"./fr-ch.js\": 60,\n\t\"./fr.js\": 58,\n\t\"./fy\": 61,\n\t\"./fy.js\": 61,\n\t\"./ga\": 62,\n\t\"./ga.js\": 62,\n\t\"./gd\": 63,\n\t\"./gd.js\": 63,\n\t\"./gl\": 64,\n\t\"./gl.js\": 64,\n\t\"./gom-deva\": 65,\n\t\"./gom-deva.js\": 65,\n\t\"./gom-latn\": 66,\n\t\"./gom-latn.js\": 66,\n\t\"./gu\": 67,\n\t\"./gu.js\": 67,\n\t\"./he\": 68,\n\t\"./he.js\": 68,\n\t\"./hi\": 69,\n\t\"./hi.js\": 69,\n\t\"./hr\": 70,\n\t\"./hr.js\": 70,\n\t\"./hu\": 71,\n\t\"./hu.js\": 71,\n\t\"./hy-am\": 72,\n\t\"./hy-am.js\": 72,\n\t\"./id\": 73,\n\t\"./id.js\": 73,\n\t\"./is\": 74,\n\t\"./is.js\": 74,\n\t\"./it\": 75,\n\t\"./it-ch\": 76,\n\t\"./it-ch.js\": 76,\n\t\"./it.js\": 75,\n\t\"./ja\": 77,\n\t\"./ja.js\": 77,\n\t\"./jv\": 78,\n\t\"./jv.js\": 78,\n\t\"./ka\": 79,\n\t\"./ka.js\": 79,\n\t\"./kk\": 80,\n\t\"./kk.js\": 80,\n\t\"./km\": 81,\n\t\"./km.js\": 81,\n\t\"./kn\": 82,\n\t\"./kn.js\": 82,\n\t\"./ko\": 83,\n\t\"./ko.js\": 83,\n\t\"./ku\": 84,\n\t\"./ku.js\": 84,\n\t\"./ky\": 85,\n\t\"./ky.js\": 85,\n\t\"./lb\": 86,\n\t\"./lb.js\": 86,\n\t\"./lo\": 87,\n\t\"./lo.js\": 87,\n\t\"./lt\": 88,\n\t\"./lt.js\": 88,\n\t\"./lv\": 89,\n\t\"./lv.js\": 89,\n\t\"./me\": 90,\n\t\"./me.js\": 90,\n\t\"./mi\": 91,\n\t\"./mi.js\": 91,\n\t\"./mk\": 92,\n\t\"./mk.js\": 92,\n\t\"./ml\": 93,\n\t\"./ml.js\": 93,\n\t\"./mn\": 94,\n\t\"./mn.js\": 94,\n\t\"./mr\": 95,\n\t\"./mr.js\": 95,\n\t\"./ms\": 96,\n\t\"./ms-my\": 97,\n\t\"./ms-my.js\": 97,\n\t\"./ms.js\": 96,\n\t\"./mt\": 98,\n\t\"./mt.js\": 98,\n\t\"./my\": 99,\n\t\"./my.js\": 99,\n\t\"./nb\": 100,\n\t\"./nb.js\": 100,\n\t\"./ne\": 101,\n\t\"./ne.js\": 101,\n\t\"./nl\": 102,\n\t\"./nl-be\": 103,\n\t\"./nl-be.js\": 103,\n\t\"./nl.js\": 102,\n\t\"./nn\": 104,\n\t\"./nn.js\": 104,\n\t\"./oc-lnc\": 105,\n\t\"./oc-lnc.js\": 105,\n\t\"./pa-in\": 106,\n\t\"./pa-in.js\": 106,\n\t\"./pl\": 107,\n\t\"./pl.js\": 107,\n\t\"./pt\": 108,\n\t\"./pt-br\": 109,\n\t\"./pt-br.js\": 109,\n\t\"./pt.js\": 108,\n\t\"./ro\": 110,\n\t\"./ro.js\": 110,\n\t\"./ru\": 111,\n\t\"./ru.js\": 111,\n\t\"./sd\": 112,\n\t\"./sd.js\": 112,\n\t\"./se\": 113,\n\t\"./se.js\": 113,\n\t\"./si\": 114,\n\t\"./si.js\": 114,\n\t\"./sk\": 115,\n\t\"./sk.js\": 115,\n\t\"./sl\": 116,\n\t\"./sl.js\": 116,\n\t\"./sq\": 117,\n\t\"./sq.js\": 117,\n\t\"./sr\": 118,\n\t\"./sr-cyrl\": 119,\n\t\"./sr-cyrl.js\": 119,\n\t\"./sr.js\": 118,\n\t\"./ss\": 120,\n\t\"./ss.js\": 120,\n\t\"./sv\": 121,\n\t\"./sv.js\": 121,\n\t\"./sw\": 122,\n\t\"./sw.js\": 122,\n\t\"./ta\": 123,\n\t\"./ta.js\": 123,\n\t\"./te\": 124,\n\t\"./te.js\": 124,\n\t\"./tet\": 125,\n\t\"./tet.js\": 125,\n\t\"./tg\": 126,\n\t\"./tg.js\": 126,\n\t\"./th\": 127,\n\t\"./th.js\": 127,\n\t\"./tl-ph\": 128,\n\t\"./tl-ph.js\": 128,\n\t\"./tlh\": 129,\n\t\"./tlh.js\": 129,\n\t\"./tr\": 130,\n\t\"./tr.js\": 130,\n\t\"./tzl\": 131,\n\t\"./tzl.js\": 131,\n\t\"./tzm\": 132,\n\t\"./tzm-latn\": 133,\n\t\"./tzm-latn.js\": 133,\n\t\"./tzm.js\": 132,\n\t\"./ug-cn\": 134,\n\t\"./ug-cn.js\": 134,\n\t\"./uk\": 135,\n\t\"./uk.js\": 135,\n\t\"./ur\": 136,\n\t\"./ur.js\": 136,\n\t\"./uz\": 137,\n\t\"./uz-latn\": 138,\n\t\"./uz-latn.js\": 138,\n\t\"./uz.js\": 137,\n\t\"./vi\": 139,\n\t\"./vi.js\": 139,\n\t\"./x-pseudo\": 140,\n\t\"./x-pseudo.js\": 140,\n\t\"./yo\": 141,\n\t\"./yo.js\": 141,\n\t\"./zh-cn\": 142,\n\t\"./zh-cn.js\": 142,\n\t\"./zh-hk\": 143,\n\t\"./zh-hk.js\": 143,\n\t\"./zh-mo\": 144,\n\t\"./zh-mo.js\": 144,\n\t\"./zh-tw\": 145,\n\t\"./zh-tw.js\": 145\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 177;","\nexport function translate(value, leftMin, leftMax, rightMin, rightMax) {\n \n let leftSpan = leftMax - leftMin;\n if (leftSpan==0) { return rightMin; }\n\n let rightSpan = rightMax - rightMin;\n\n if (value < leftMin) { \n value = leftMin; } \n if (value > leftMax) { \n value = leftMax; } \n // # Convert the left range into a 0-1 range (float)\n let valueScaled = (value - leftMin) / (leftSpan);\n // # Convert the 0-1 range into a value in the right range.\n return rightMin + (valueScaled * rightSpan);\n }\n ","export class MovingAverageCalculator {\n\tconstructor(factor) {\n this._mean = 0\n this.factor = factor\n\t}\n\n\tupdate(newValue) {\n\n const newMean = (this._mean * this.factor) + (newValue* ( 1.0 - this.factor))\n\t\tthis._mean = newMean\n\t}\n\n\tget mean() {\n\t\tthis.validate()\n\t\treturn this._mean\n\t}\n\n\tvalidate() {\n\t\tif (this.count == 0) {\n\t\t\tthrow new Error('Mean is undefined')\n\t\t}\n\t}\n}\n","import { translate } from \"./translate.js\"\nimport { MovingAverageCalculator } from \"./movingAverage.js\"\nlet Controller = require('node-pid-controller');\n\nfunction clamp(num, min, max) {\n return num <= min ? min : num >= max ? max : num;\n }\n\nclass TimePlanner { \n\n constructor (mixerAnxious, mixerRelaxed, captioner, events, chart) {\n this.mixerAnxious = mixerAnxious;\n this.mixerRelaxed = mixerRelaxed;\n this.anxiousLowChangePaused = false;\n this.relaxedLowChangePaused = false;\n this.lastValue = 0;\n this.lastTime = 0;\n this.direction = 0;\n this.startValue = -1;\n this.endValue = 0;\n this.durationAnxious = 1;\n this.durationRelaxed = 1;\n this.pidSettings = {\n k_p: 2.00,\n k_i: .075,\n k_d: 0.75,\n i_max: 5.00};\n this.pidAnxious = new Controller(this.pidSettings);\n this.pidRelaxed = new Controller(this.pidSettings);\n // console.log(\"hello from TimePlanner. type of mixerAnxious is \" + typeof(this.mixerAnxious) + \" and mixerRelaxed is \" + typeof(this.mixerRelaxed));\n this.chart = chart;\n this.interval = false;\n this.maxHertz = 10;\n this.lastTempoTime = 0;\n this.jumpiness = 0.75;\n this.average = new MovingAverageCalculator(this.jumpiness);\n this.captioner = captioner;\n this.captions = [{},{}];\n this.events = events;\n\n this.events.addEventListener(\"anxious-track\", (val) => {\n // console.log(\"TimePlanner: caught a anxious-track\");\n val = val.track;\n this.changeTracks(val[\"filename\"],val[\"captions\"],undefined,undefined);\n });\n this.events.addEventListener(\"relaxed-track\", (val) => {\n // console.log(\"TimePlanner: caught a relaxed-track\");\n val = val.track;\n this.changeTracks(undefined,undefined,val[\"filename\"],val[\"captions\"]);\n });\n }\n \n changeTracks(anxiousFile=undefined, anxiousCaptions={}, relaxedFile=undefined, relaxedCaptions={}) {\n if (anxiousFile) {\n mixerAnxious.changeTrack(anxiousFile);\n this.captions[0]=anxiousCaptions;\n }\n if (relaxedFile) {\n mixerRelaxed.changeTrack(relaxedFile);\n this.captions[1]=relaxedCaptions;\n }\n }\n\n start (value) {\n let newtime = new Date().getTime();\n // console.log(\"PRESTART: \",value)\n // this.lastValue = value;\n // this.lastTime = newtime;\n this.direction = 0;\n this.startValue = -1;\n this.mixerAnxious.setCurrentTime.bind(this.mixerAnxious, 0.0)();\n this.mixerRelaxed.setCurrentTime.bind(this.mixerRelaxed, 0.0)();\n this.durationAnxious = this.mixerAnxious.getDuration.bind(this.mixerAnxious)();\n this.durationRelaxed = this.mixerRelaxed.getDuration.bind(this.mixerRelaxed)();\n this.pidAnxious.reset();\n this.pidRelaxed.reset();\n // this.mixerAnxious.pause.bind(this.mixerAnxious)();\n // this.mixerRelaxed.pause.bind(this.mixerRelaxed)();\n this.anxiousPaused = true;\n this.relaxedPaused = true;\n // this.output.currentTime = 0;\n this.interval = setInterval(this.intervalHandler.bind(this),1000/this.maxHertz);\n this.average = new MovingAverageCalculator(this.jumpiness);\n }\n\n intervalHandler() {\n let newtime = new Date().getTime();\n if (newtime - this.lastTempoTime > (1000.0 / this.maxHertz)) {\n this.submit(this.lastValue);\n }\n }\n submit (value) {\n let newtime = new Date().getTime();\n if (newtime - this.lastTempoTime < (1000.0 / this.maxHertz)) {\n return;\n }\n \n this.lastTempoTime = newtime;\n\n if (this.direction == 0) {\n if (this.startValue == -1 && value != 0 ) {\n this.startValue = value; \n this.lastValue = value;\n // console.log(\"START: \",value)\n return;\n // eat first two readings\n // also eat 0 readings since those seem to randomly happen at swipe start??\n } else { \n if (value < this.lastValue) { \n this.direction = 1; \n this.endValue = 0.0; \n var evt = new Event('track-start-0');\n evt.startValue = this.startValue;\n evt.endValue = this.endValue;\n events.dispatchEvent(evt);\n this.mixerAnxious.play.bind(this.mixerAnxious)(); \n this.mixerAnxious.setCurrentTime(0);\n this.anxiousPaused = false; \n this.captioner.start(this.captions[0]);\n // console.log(\"TimePlanner: assigned direction 1. lastValue \" + this.lastValue + \" value \" + value);\n return;\n }\n if (value > this.lastValue) { \n this.direction = -1; \n this.endValue = 1.0; \n var evt = new Event('track-start-1');\n evt.startValue = this.startValue;\n evt.endValue = this.endValue;\n events.dispatchEvent(evt);\n this.mixerRelaxed.play.bind(this.mixerRelaxed)(); \n this.mixerRelaxed.setCurrentTime(0);\n this.relaxedPaused = false;\n this.captioner.start(this.captions[1]);\n // console.log(\"TimePlanner: assigned direction -1. lastValue \" + this.lastValue + \" value \" + value);\n return;\n }\n\n }\n\n }\n if ( this.anxiousPaused && this.relaxedPaused ) { \n // console.log(\"all paused.\");\n return; }\n \n var mixer = this.mixerAnxious;\n\n var pid = this.pidAnxious;\n var dur = this.durationAnxious;\n var desiredTime = 0;\n\n if (value !== false) {\n if (this.direction > 0) {\n mixer = this.mixerAnxious;\n pid = this.pidAnxious;\n dur = this.durationAnxious;\n desiredTime = translate(this.startValue - value, this.endValue, this.startValue, 0, dur)\n \n } else {\n mixer = this.mixerRelaxed;\n pid = this.pidRelaxed;\n dur = this.durationRelaxed;\n desiredTime = translate(value, this.startValue, this.endValue, 0, dur)\n \n }\n\n pid.setTarget(desiredTime);\n }\n\n var current = mixer.getCurrentTime();\n \n this.average.update(pid.update(current));\n let change = this.average.mean;\n \n change = clamp(change, -5, 5);\n\n // if ((Math.abs(change) < 0.1) && (mixer.playing())) {\n // console.log(\"low change, rewinding: \" + change); \n // mixer.setCurrentTime(current - (1.0/this.maxHertz))\n // } \n \n // console.log(\"at \" + newtime + \" start value \" + this.startValue + \" end value \" + this.endValue + \" new value:\" + value + \" desiredTime:\" + desiredTime + \" current time:\" + current + \" new speed:\",change);\n if (this.chart) {\n this.chart.data.datasets[0].data.push({x: newtime, y: current});\n this.chart.data.datasets[1].data.push({x: newtime, y: desiredTime});\n this.chart.data.datasets[2].data.push({x: newtime, y: change});\n }\n mixer.setRate.bind(mixer,change)(); \n this.captioner.submit(current);\n \n\n \n // console.log(\"valueDiffPercent\",valueDiffPercent,\"percentPerSecond\",percentPerSecond,\"new speed:\",speed,\"duration\",dur,\"valueDiff\",valueDiff, \"value\",value,\"lastValue\",this.lastValue,\"direction\",this.direction);\n \n // Get current position from player.\n // Compute new desired position, and at what rate \n \n this.lastTime = newtime;\n this.lastValue = value;\n \n }\n\n end (value) {\n // console.log(\"END: \",value)\n // wrap up player\n // this.output.pause(); \n if (this.direction > 0) {\n this.mixerAnxious.pause();\n } else {\n this.mixerRelaxed.pause();\n }\n let progress = 0;\n if (this.direction > 0) {\n progress = translate(this.startValue - value, this.endValue, this.startValue, 0, 1.0) \n } else {\n progress = translate(value, this.startValue, this.endValue, 0, 1.0)\n }\n let name = 'track-end-' + (this.direction > 0 ? 0 : 1);\n // console.log(\"sending \" + name);\n let evt = new Event(name);\n evt.progress = progress;\n this.events.dispatchEvent(evt);\n\n this.direction = 0;\n this.startValue = -1;\n\n this.pidAnxious.reset();\n this.pidRelaxed.reset();\n clearInterval(this.interval);\n this.interval = false;\n }\n}\n\nexport default TimePlanner;\n","// require('soundtouch-js');\nimport { OLATSPlayer } from \"ola-ts\"\nvar utils = require('audio-buffer-utils');\n\nfunction clamp(num, min, max) {\n return num <= min ? min : num >= max ? max : num;\n }\n \nclass TimeShiftMixer { \n\n constructor (audioContext, readyCallback, events) {\n\n this.audioReady = false; \n this.duration = 0;\n\n this.sourceUrl = \"\";\n this.audioContext = audioContext;\n this.readyCallback = readyCallback;\n this.events = events;\n\n this.shifters = [false, false] ;\n this.audioCompressed = [false, false];\n this.audioDecompressed = [false, false];\n\n this.reversed = 0;\n this.maxHertz = 5;\n this.lastTempoTime = 0;\n this.windowSize = 2048;\n this.bufferSize = 8192;\n this.algorithm = \"Lanczos\";\n\n this.shouldBePlaying = true;\n \n // console.log(\"TimeShiftMixer constructed\");\n \n }\n\n translatePosition(pos) {\n if (this.reversed) {\n return this.duration - pos;\n }\n return pos;\n }\n\n changeTrack(newSrc) {\n // console.log(\"changeTrack to \" + newSrc);\n \n let that = this;\n var buffer;\n if (window.loader.get(newSrc)) {\n buffer = window.loader.get(newSrc).slice(0);\n }\n // console.log(buffer);\n if (!buffer) {\n // console.log(\"file isn't ready yet... \" + newSrc);\n let evt = new Event('preload-file');\n evt.url = newSrc;\n events.dispatchEvent(evt);\n setTimeout(function() {\n that.changeTrack(newSrc);\n\n }, 500);\n return;\n }\n that.audioCompressed[0] = buffer;\n\n that.audioContext.decodeAudioData(buffer, function(decodedData) {\n that.audioDecompressed[0] = decodedData;\n that.audioForwardsLoaded();\n\n that.audioDecompressed[1] = utils.clone(that.audioDecompressed[0]);\n utils.reverse(that.audioDecompressed[1]);\n that.audioBackwardsLoaded();\n // console.log(\"forwards/backwards decompressed audio loaded.\"); \n });\n \n // console.log(\"forwards compressed audio loaded.\"); \n\n }\n\n\n audioForwardsLoaded() {\n\n if (this.shifters[0]) {\n this.shifters[0].stop();\n this.shifters[0] = false;\n }\n \n this.shifters[0] = new OLATSPlayer(this.audioContext, this.audioDecompressed[0], this.windowSize, this.bufferSize, this.algorithm);\n this.shifters[0].connect(this.audioContext.destination);\n \n this.duration = this.audioDecompressed[0].duration;\n // console.log(\"new duration is \" + this.duration);\n // console.log(\"shifters[0] loaded\");\n if (this.ready()) {\n this.readyCallback();\n }\n }\n\n audioBackwardsLoaded() {\n if (this.shifters[1]) {\n this.shifters[1].stop();\n this.shifters[1] = false;\n }\n this.shifters[1] = new OLATSPlayer(this.audioContext, this.audioDecompressed[1], this.windowSize, this.bufferSize, this.algorithm);\n this.shifters[1].connect(this.audioContext.destination);\n\n // console.log(\"shifters[1] loaded\");\n if (this.ready()) {\n this.readyCallback();\n }\n }\n\n ready() {\n if (this.shifters[0] && this.shifters[1]) { \n return true;\n }\n return false;\n }\n\n play() {\n // console.log(\"Play: Time to play\");\n if (this.ready()) {\n if (this.audioContext.state != \"running\") {\n this.audioContext.resume();\n // console.log(\"Play: resumed context from play\");\n } \n this.shifters[this.reversed].play();\n if (!this.shouldBePlaying) {\n this.setCurrentTime(0);\n }\n // console.log(\"PLAY: \" + this.reversed)\n } else {\n // console.log(\"Play: shifters not yet ready for play.\")\n }\n this.shouldBePlaying = true;\n }\n \n pause() {\n // console.log(\"Pause: Time to pause\");\n if (this.ready()) {\n if (this.shifters[this.reversed]) {\n // this.shifters[this.reversed].disconnect(this.audioContext.destination);\n this.shifters[this.reversed].stop();\n // console.log(\"PAUSED: \" + this.reversed);\n } else {\n // console.log(\"already paused? \" + this.reversed);\n }\n }\n this.shouldBePlaying = false;\n }\n\n reverse() {\n if (this.ready()) {\n let curr = this.getCurrentTime()\n // console.log(\"reversing at position \" + curr)\n this.pause();\n // this.setCurrentTime(curr);\n this.reversed = 1 - this.reversed;\n this.play();\n this.setCurrentTime(curr);\n // console.log(\"Reverse: done\");\n }\n }\n\n setCurrentTime(time) {\n // console.log(\"setting time to \",time)\n if (this.ready()) {\n this.shifters[0].position = this.round4(44100 * ( clamp(time,0,this.duration * 0.95)));\n this.shifters[1].position = this.round4(44100 * (clamp((this.duration - time) ,this.duration * 0.05, this.duration)));\n }\n }\n\n getCurrentTime() {\n if (this.ready()) {\n let pos = ( this.shifters[this.reversed].position / 44100);\n // console.log(\"getCurrentTime: pos is \" + pos + \" and duration is \" + this.duration)\n if (this.reversed) {\n pos = this.duration - pos;\n }\n return pos;\n }\n }\n\n getDuration() {\n return this.duration;\n }\n\n playing() {\n // console.log(\"shifters[0] playing:\" + this.shifters[0].playing + \"shifters[1] playing:\" + this.shifters[1].playing )\n return (this.shifters[0].playing || this.shifters[1].playing);\n }\n\n round4(val) {\n return (Math.floor(val / 4)) * 4;\n }\n\n shifterEnded() {\n // console.log(\"track reached end...\");\n if(this.shouldBePlaying) {\n let target = this.duration * 0.95;\n if (this.reversed) {\n target = this.duration * 0.05;\n }\n // this.setCurrentTime(target);\n this.play();\n this.setCurrentTime(target);\n }\n }\n\n setRate(rate) {\n if (!this.ready()) {\n // console.log(\"not ready\");\n return;\n }\n if ((rate < -0.2) && (!this.reversed)) {\n this.reverse();\n } else if ((rate > 0.2) && (this.reversed)) {\n this.reverse();\n }\n \n let newtime = new Date().getTime();\n if (newtime - this.lastTempoTime >= (1000.0 / this.maxHertz)) {\n if ( ( rate > -0.01) && (rate < 0.01) ) { \n rate = 0.01;\n }\n this.shifters[0].speed = 1.0 / Math.abs(rate);\n this.shifters[1].speed = 1.0 / Math.abs(rate);\n this.lastTempoTime = newtime;\n // console.log(\"updated tempo to \",Math.abs(rate));\n }\n }\n\n end (value) {\n this.shouldBePlaying = false;\n this.pause();\n }\n}\n\nexport default TimeShiftMixer;\n\n\n\n\n\n\n","\n\nfunction ScrubberView() {\n this.makeAccessors();\n this.createDOM();\n this.attachListeners();\n this.onValueChanged = function () {};\n this.onScrubStart = function () {};\n this.onScrubEnd = function () {};\n }\n \n ScrubberView.prototype.makeAccessors = function () {\n var value = undefined;\n var min = 0;\n var max = 1;\n \n this.cleanValue = function (_value=undefined, propagate=true) {\n\n value = Math.max(min, Math.min(max, _value));\n value = _value;\n\n this.redraw(value);\n\n if (propagate) {\n this.onValueChanged(value);\n }\n return value;\n\n };\n\n \n this.min = function (_min) {\n if (_min === undefined) return min;\n if (min === _min) return this;\n min = _min;\n this.redraw(value);\n return this;\n };\n \n this.max = function (_max) {\n if (_max === undefined) return max;\n if (max === _max) return this;\n max = _max;\n this.redraw(value);\n return this;\n };\n\n this.getPageYFromValue = function(val) {\n var rect = this.elt.getBoundingClientRect(); \n var pare = this.elt.parentNode.getBoundingClientRect(); \n return ( (rect.height * val) + (rect.top - pare.top));\n }\n };\n \n ScrubberView.prototype.createDOM = function () {\n this.elt = document.createElement('div');\n this.track = document.createElement('div');\n this.thumb = document.createElement('div');\n \n this.elt.className = 'scrubber-vert';\n this.track.className = 'track';\n this.thumb.className = 'thumb';\n this.thumb.style.left = \"50%\";\n \n this.elt.appendChild(this.track);\n this.elt.appendChild(this.thumb);\n this.redraw(this.value);\n };\n \n ScrubberView.prototype.redraw = function (val) {\n var frac = (val - this.min())/(this.max() - this.min());\n this.thumb.style.top = 100 - (frac*100) + '%';\n\n };\n \n ScrubberView.prototype.attachListeners = function () {\n var self = this;\n var mousedown = false;\n var cachedLeft;\n var cachedWidth;\n var cachedTop;\n var cachedHeight;\n \n var setValueFromPageY = function (pageY, propagate=true) {\n var frac = Math.min(1, Math.max(1 - (pageY - cachedTop)/cachedHeight, 0));\n return self.cleanValue( (1-frac)*self.min() + frac*self.max(),propagate);\n };\n\n \n var start = function (evt) {\n evt.preventDefault();\n if (mousedown) {\n // console.log('double start');\n return;\n }\n // console.log(evt);\n let y = evt.pageY;\n if (y===undefined) {\n y = evt.changedTouches[0].pageY;\n }\n\n document.addEventListener('mouseup', stop, { passive: false});\n document.addEventListener('touchend', stop, { passive: false});\n \n mousedown = true;\n var rect = self.elt.getBoundingClientRect();\n // NOTE: page[X|Y]Offset and the width and height\n // properties of getBoundingClientRect are not\n // supported in IE8 and below.\n //\n // Scrubber doesn't attempt to support IE<9.\n var xOffset = window.pageXOffset;\n var yOffset = window.pageYOffset;\n \n cachedLeft = rect.left + xOffset;\n cachedWidth = rect.width;\n cachedTop = rect.top + yOffset;\n cachedHeight = rect.height;\n\n // console.log(\"our y is \" + y);\n let val = setValueFromPageY(y,true);\n self.onScrubStart(val);\n \n self.thumb.className += ' dragging';\n };\n \n var stop = function (evt) {\n document.removeEventListener('mouseup', stop);\n document.removeEventListener('touchend', stop);\n let y = evt.pageY;\n if (y===undefined) {\n y = evt.changedTouches[0].pageY;\n }\n let val = setValueFromPageY(y,false);\n mousedown = false;\n cachedLeft = undefined;\n cachedWidth = undefined;\n cachedTop = undefined;\n cachedHeight = undefined;\n self.thumb.className = 'thumb';\n\n self.onScrubEnd(val);\n self._value=undefined;\n };\n \n this.elt.addEventListener('mousedown', start, { passive: false});\n this.elt.addEventListener('touchstart', start, { passive: false});\n \n document.addEventListener('mousemove', function (evt) {\n if (!mousedown) return;\n evt.preventDefault();\n setValueFromPageY(evt.pageY);\n }, { passive: false});\n \n document.addEventListener('touchmove', function (evt) {\n if (!mousedown) return;\n evt.preventDefault();\n setValueFromPageY(evt.changedTouches[0].pageY);\n }, { passive: false});\n \n this.elt.addEventListener('mouseup', function (evt) {\n if (!mousedown) return;\n evt.preventDefault();\n setValueFromPageY(evt.pageY);\n }, { passive: false});\n \n this.elt.addEventListener('touchend', function (evt) {\n if (!mousedown) return;\n evt.preventDefault();\n setValueFromPageY(evt.changedTouches[0].pageY);\n }, { passive: false});\n };\n\n export default ScrubberView;\n ","import Typewriter from 'typewriter-effect/dist/core';\n\nfunction clamp(num, min, max) {\n return num <= min ? min : num >= max ? max : num;\n }\n\nfunction randomChoice(list) {\n // https://stackoverflow.com/questions/9071573/is-there-a-simple-way-to-make-a-random-selection-from-an-array-in-javascript-or \n //array length = 5;\n var rand = Math.random();\n //rand = 0.9999;\n rand *= list.length; //(5)\n //rand = 4.9995\n rand = Math.floor(rand);\n return list[rand];\n}\n\nclass Captioner { \n\n constructor (captionElement, events) {\n this.captionElement = captionElement;\n this.lastPosition = 0;\n this.captions = {};\n this.lastTime = 0;\n this.typewriter = new Typewriter('#ch-player-captions', {\n autoStart: true,\n delay: 1,\n });\n this.typewriter.typeString(randomChoice([\"Hello. \",\"Howdy. \",\"Gotta start somewhere. \",\"hiya! \"]));\n this.typewriter.start({});\n this.interval = setInterval(this.scroller.bind(this),250);\n }\n \n start (captions) {\n document.getElementsByClassName('Typewriter__wrapper')[0].innerHTML = \"\";\n this.lastPosition = 0;\n this.captions = captions;\n this.lastTime = new Date().getTime();\n }\n\n scroller() {\n let newtime = new Date().getTime();\n if (newtime - this.lastTime < 500) { // ms\n let cap = document.querySelector(this.captionElement);\n cap.scrollTop = cap.scrollHeight; \n }\n }\n\n reverseString(str) {\n return str.split(\"\").reverse().join(\"\");\n }\n \n searchStrings(from, to) {\n let returners = [];\n for (var key in this.captions) {\n if ((key >= from ) && (key < to)) {\n returners.push(this.captions[key]);\n }1\n }\n return returners;\n }\n submit (position) {\n this.lastTime = new Date().getTime();\n let changed = false;\n let concat = 1;\n if (position < this.lastPosition) {\n let caps = this.searchStrings(position, this.lastPosition).reverse();\n concat = caps.join(' ');\n for (var cap in caps) {\n this.typewriter.typeString(this.reverseString(caps[cap]) + \" \");\n changed = true;\n }\n } else if (position > this.lastPosition) {\n let caps = this.searchStrings(this.lastPosition, position);\n concat = caps.join(' ');\n for (var cap in caps) {\n this.typewriter.typeString(caps[cap] + \" \");\n changed = true;\n }\n }\n if (changed) {\n let delay = (100 / concat.length);\n this.typewriter.options.delay = delay;\n // console.log(\"setting delay to \" + delay)\n this.typewriter.start();\n }\n this.lastPosition = position;\n } \n}\n\nexport default Captioner;\n\n\n","\nfunction clamp(num, min, max) {\n return num <= min ? min : num >= max ? max : num;\n }\n\nclass Conductor { \n\n constructor (events) { \n // console.log(\"hello from Conductor\");\n this.events = events;\n // this.loader.on(\"comple\", this.fileLoaded, this);\n // this.loader.on(\"complete\", this.allDone, this);\n // this.loader.add(\"public/sec0-dir0-track0.mp3\");\n // this.loader.add(\"public/sec0-dir1-track0.mp3\");\n // this.loader.load();\n this.initialPreload.bind(this)();\n // this.preload(\"public/sec0-dir0-track0.mp3\");\n // this.preload(\"public/sec0-dir1-track0.mp3\");\n this.anxiousIndex = [0,0,0];\n this.relaxedIndex = [0,0,0];\n this.events.addEventListener(\"track-end-0\",this.anxiousEnded.bind(this));\n this.events.addEventListener(\"track-end-1\",this.relaxedEnded.bind(this));\n \n this.events.addEventListener(\"track-start-0\",this.anxiousStarted.bind(this));\n this.events.addEventListener(\"track-start-1\",this.relaxedStarted.bind(this));\n this.relaxedTimeout = undefined;\n this.anxiousTimeout = undefined;\n \n } \n\n preload(thing) {\n // console.log(\"Conductor: preloading \" + thing);\n var evt = new Event('preload-file');\n evt.url = thing;\n this.events.dispatchEvent(evt);\n }\n \n relaxedStarted(event) {\n if (this.relaxedTimeout) {\n clearTimeout(this.relaxedTimeout);\n }\n document.getElementById(\"ch-player-captions\").classList.remove(\"faded\");\n document.getElementById(\"ch-player\").classList.add(\"ch-blue\");\n document.getElementById(\"ch-player\").classList.remove(\"ch-green\");\n }\n\n anxiousStarted(event) {\n if (this.anxiousTimeout) {\n clearTimeout(this.anxiousTimeout);\n }\n document.getElementById(\"ch-player-captions\").classList.remove(\"faded\");\n document.getElementById(\"ch-player\").classList.add(\"ch-green\");\n document.getElementById(\"ch-player\").classList.remove(\"ch-blue\");\n }\n\n anxiousEnded(event) {\n if (this.anxiousTimeout) {\n clearTimeout(this.anxiousTimeout);\n }\n let progress = event.progress;\n if (progress > 0.5) {\n let evt = new Event('track-finished')\n evt.track = this.anxiousIndex;\n this.events.dispatchEvent(evt);\n }\n var that = this;\n var next = this.getNextTrack(0); \n document.getElementById(\"ch-player-captions\").classList.add(\"faded\");\n this.anxiousTimeout = setTimeout(function() {\n that.changeTracks(next,undefined);\n document.getElementById(\"ch-player\").classList.remove(\"ch-green\");\n },5000);\n }\n\n relaxedEnded(event) {\n if (this.relaxedTimeout) {\n clearTimeout(this.relaxedTimeout);\n }\n let progress = event.progress;\n if (progress > 0.5) {\n let evt = new Event('track-finished')\n evt.track = this.relaxedIndex;\n this.events.dispatchEvent(evt);\n }\n var that = this;\n var next = this.getNextTrack(1);\n document.getElementById(\"ch-player-captions\").classList.add(\"faded\");\n this.relaxedTimeout = setTimeout(function() {\n that.changeTracks(undefined,next);\n document.getElementById(\"ch-player\").classList.remove(\"ch-blue\");\n\n },5000);\n \n }\n changeTracks(anxious=undefined,relaxed=undefined) { \n\n if (this.relaxedTimeout) {\n clearTimeout(this.relaxedTimeout);\n }\n if (this.anxiousTimeout) {\n clearTimeout(this.anxiousTimeout);\n }\n if (Object.keys(window.tracks).length == 0) {\n let evt = new Event('open-please-wait');\n this.events.dispatchEvent(evt);\n setTimeout(function() { \n changeTrack(anxious,relaxed);\n }, 500);\n }\n let evt = new Event('close-please-wait');\n this.events.dispatchEvent(evt);\n\n if (anxious !== undefined) {\n let track = window.tracks[anxious[0]][anxious[1]][anxious[2]];\n let evt = new Event('anxious-track');\n evt.track = track;\n window.currentAnxiousTrack = track;\n window.currentSection=anxious[0];\n this.anxiousIndex=anxious;\n this.preload(track[\"filename\"]);\n this.events.dispatchEvent(evt);\n let next = this.getNextTrack(0);\n // console.log(\"next track: \" + next);\n this.preload(window.tracks[next[0]][next[1]][next[2]][\"filename\"]); \n setTimeout(this.credits.bind(this),250);\n\n }\n if (relaxed !==undefined) {\n let track = window.tracks[relaxed[0]][relaxed[1]][relaxed[2]];\n let evt = new Event('relaxed-track');\n evt.track = track;\n window.currentRelaxedTrack = track;\n window.currentSection=relaxed[0];\n this.relaxedIndex=relaxed;\n this.preload(track[\"filename\"]);\n this.events.dispatchEvent(evt);\n let next = this.getNextTrack(1);\n // console.log(\"next track: \" + next);\n this.preload(window.tracks[next[0]][next[1]][next[2]][\"filename\"]); \n setTimeout(this.credits.bind(this),250);\n }\n this.constructTrackIndicators();\n }\n\n credits() {\n var creditList = [];\n var credits = \"
\";\n\n let relaxed = this.relaxedIndex;\n let anxious = this.anxiousIndex;\n\n let track = window.tracks[anxious[0]][anxious[1]][anxious[2]];\n if (track[\"credit html\"]) {\n creditList.push('' + track[\"credit html\"] + '');\n } else if (track[\"credit\"]) {\n creditList.push('' + track[\"credit\"] + '');\n }\n\n track = window.tracks[relaxed[0]][relaxed[1]][relaxed[2]];\n if (track[\"credit html\"]) {\n creditList.push('' + track[\"credit html\"] + '');\n } else if (track[\"credit\"]) {\n creditList.push('' + track[\"credit\"] + '');\n }\n\n if (creditList.length) {\n credits = \"Audio credits: \" + Array.from(creditList).join(\"; \");\n }\n document.getElementById(\"ch-player-track-credits\").innerHTML = credits;\n }\n\n initialPreload() {\n if (Object.keys(window.tracks).length > 0) {\n for (var section in window.tracks) {\n this.preload(window.tracks[section][0][0][\"filename\"]);\n this.preload(window.tracks[section][1][0][\"filename\"]);\n }\n } else {\n // console.log(\"deferring initialPreload until window.tracks is available\");\n setTimeout(this.initialPreload.bind(this), 500);\n }\n }\n \n getNextTrack(dir) {\n var from = [0, 0, 0];\n var to = [ 0, 0, 1];\n\n if (dir > 0 ) { \n from = this.relaxedIndex; \n } else {\n from = this.anxiousIndex; \n }\n\n var trak = parseInt(from[2]);\n var sec = from[0];\n\n // First, check for subsequent, unplayed tracks\n for (let a = trak + 1; a < Object.keys(window.tracks[sec][dir]).length ; a++ ) {\n if (window.tracks[sec][dir][a][\"finished\"] != true) {\n return [sec, dir, a];\n }\n } \n // Then, preceding unplayed tracks\n for (let a = 0; a < trak ; a++ ) {\n if (window.tracks[sec][dir][a][\"finished\"] != true) {\n return [sec, dir, a];\n }\n } \n // Then subsequent played tracks\n\n for (let a = trak + 1; a < Object.keys(window.tracks[sec][dir]).length ; a++ ) {\n return [sec, dir, a];\n } \n\n // Then first track\n return [sec, dir, 0];\n\n }\n\n constructTrackIndicators(){ \n if (Object.keys(window.tracks).length == 0) {\n // console.log(\"deferring constructTrackIndicators until window.tracks is available\");\n setTimeout(this.constructTrackIndicators.bind(this), 500);\n return;\n }\n let section = window.currentSection;\n let greens = document.getElementById(\"ch-player-tracks-green\");\n let blues = document.getElementById(\"ch-player-tracks-blue\");\n while (greens.firstChild) {\n greens.removeChild(greens.lastChild);\n }\n while (blues.firstChild) {\n blues.removeChild(blues.lastChild);\n }\n \n let that = this;\n for (let track in window.tracks[section][0]) {\n let el = document.createElement(\"span\");\n el.classList = [\"ch-player-track-indicator\"];\n if (window.tracks[section][0][track][\"preloaded\"]==true) {\n el.classList.add(\"loaded\");\n }\n if (window.tracks[section][0][track][\"finished\"]==true) {\n el.classList.add(\"finished\");\n }\n if (track==this.anxiousIndex[2]) {\n el.classList.add(\"active\");\n el.classList.add(\"animate__animated\");\n el.classList.add(\"animate__flash\");\n }\n el.addEventListener(\"click\",function() { \n if (that.relaxedTimeout) {\n clearTimeout(that.relaxedTimeout);\n }\n if (that.anxiousTimeout) {\n clearTimeout(that.anxiousTimeout);\n }\n // console.log(\"changing to\" + [section, 0, track]);\n document.getElementById(\"ch-player\").classList.remove(\"ch-green\");\n document.getElementById(\"ch-player\").classList.remove(\"ch-blue\");\n document.getElementById(\"ch-player-captions\").classList.add(\"faded\");\n that.changeTracks.bind(that,[section,0,track],undefined)() } );\n greens.appendChild(el);\n }\n\n for (let track in window.tracks[section][1]) {\n let el = document.createElement(\"span\");\n el.classList = [\"ch-player-track-indicator\"];\n if (window.tracks[section][1][track][\"preloaded\"]==true) {\n el.classList.add(\"loaded\");\n }\n if (window.tracks[section][1][track][\"finished\"]==true) {\n el.classList.add(\"finished\");\n }\n if (track==this.relaxedIndex[2] ) {\n el.classList.add(\"active\");\n el.classList.add(\"animate__animated\");\n el.classList.add(\"animate__flash\");\n }\n el.addEventListener(\"click\",function() {\n if (that.relaxedTimeout) {\n clearTimeout(that.relaxedTimeout);\n }\n if (that.anxiousTimeout) {\n clearTimeout(that.anxiousTimeout);\n }\n // console.log(\"changing to\" + [section, 1, track]);\n document.getElementById(\"ch-player\").classList.remove(\"ch-green\");\n document.getElementById(\"ch-player\").classList.remove(\"ch-blue\");\n document.getElementById(\"ch-player-captions\").classList.add(\"faded\");\n that.changeTracks.bind(that,undefined,[section,1,track])() } );\n blues.appendChild(el);\n }\n }\n\n allDone(thing) {\n // console.log(\"We all done damb\");\n }\n}\n\nexport default Conductor;\n\n\n","import '../styles/index.scss';\n\nimport domready from 'domready';\nimport TimePlanner from './TimePlanner.js';\nimport TimeShiftMixer from './TimeShiftMixer.js';\nimport ScrubberView from './chScrubber.js';\nimport Chart from 'chart.js';\nimport Captioner from \"./Captioner.js\"\nimport Conductor from \"./Conductor.js\"\nimport Cookies from \"js-cookie\"\nvar preloader = require('preloader'); \nvar LoaderType = require('preloader/lib/loaders/LoaderArrayBuffer');\nvar analytics = require('universal-ga');\n\nwindow.tracks = [];\nwindow.currentAnxiousTrack = [0,0,0];\nwindow.currentRelaxedTrack = [0,1,0];\nwindow.currentSection = 0;\n\n\ndomready(function() { \n var readyRelaxed = false;\n var readyAnxious = false;\n\n analytics.initialize(\"UA-62966608-8\");\n\n analytics.pageview(window.location.pathname);\n var debug = false;\n if (Cookies.get(\"ch-debug\")) {\n debug = Cookies.get(\"ch-debug\");\n }\n window.enableDebug = function() {\n Cookies.set(\"ch-debug\",true);\n window.location.href=window.location.href;\n }\n window.disableDebug = function() {\n Cookies.remove(\"ch-debug\");\n window.location.href=window.location.href;\n }\n\n if (debug) {\n \n var chartel = document.getElementById('myChart');\n chartel.style.display=\"block\";\n var ctx = chartel.getContext('2d');\n document.getElementById('myChart').style.backgroundColor = 'rgba(255,255,255,255)';\n\n window.chart = new Chart(ctx, {\n // The type of chart we want to create\n type: 'line',\n \n options: {\n responsive: true, \n animation: {\n duration: 0, // general animation time\n },\n elements: {\n line: {\n tension: 0\n }\n },\n scales: {\n xAxes: [{\n type: 'linear', // MANDATORY TO SHOW YOUR POINTS! (THIS IS THE IMPORTANT BIT) \n display: true, // mandatory\n beginAtZero: false,\n scaleLabel: {\n display: true\n },\n }], \n yAxes: [{ // and your y axis customization as you see fit...\n display: true,\n beginAtZero: false,\n scaleLabel: {\n display: true \n }\n }],\n }\n },\n // The data for our dataset\n data: {\n labels: [\"time\"],\n datasets: [{\n label: 'current',\n borderColor: 'rgba(255, 99, 132,255)',\n data: []\n },{\n label: 'desired',\n borderColor: 'rgba(0,0,255,255)',\n data: []\n }, {\n label: 'change',\n borderColor: 'rgba(0,255,0,255)',\n data: []\n },{\n label: 'buffer',\n borderColor: 'rgba(255, 255, 0, 255)',\n data: []\n }]\n },\n });\n\n setInterval(function() { window.chart.update({duration: 0});}, 250);\n } else { \n window.chart = false;\n }\n \n function createAudioContext() {\n if (typeof window.audioContext != \"undefined\") { return; };\n\n window.audioContext = new (window.AudioContext || window.webkitAudioContext)({ latencyHint: 'interactive' });\n window.audioContext.resume();\n try {\n startAudioMixers();\n return true;\n } catch(err) {\n window.alert(\"Oops! We had trouble starting audio: \" + err)\n }\n return false;\n \n }\n \n function relaxedReady() {\n readyRelaxed = true;\n }\n \n function anxiousReady() {\n readyAnxious = true;\n }\n\n // https://stackoverflow.com/questions/15308371/custom-events-model-without-using-dom-events-in-javascript\n var EventTarget = function(options) {\n var target = document.createTextNode(null);\n \n // Pass EventTarget interface calls to DOM EventTarget object\n this.addEventListener = target.addEventListener.bind(target);\n this.removeEventListener = target.removeEventListener.bind(target);\n this.dispatchEvent = target.dispatchEvent.bind(target);\n }\n // Create an instance of your event target\n window.events = new EventTarget();\n\n function allDone(event) {\n // console.log(\"all done\");\n let evt = new Event('preloader-idle');\n events.dispatchEvent(evt);\n }\n \n window.loader = preloader({onComplete: allDone\n });\n\n function filePreloaded(item) {\n // console.log(\"thingie loaded\");\n // console.log(item);\n\n for (let sec in window.tracks) {\n for (let direction in window.tracks[sec]) {\n for (let track in window.tracks[sec][direction]) {\n if (window.tracks[sec][direction][track][\"filename\"] == item) {\n window.tracks[sec][direction][track][\"preloaded\"] = true;\n }\n }\n }\n }\n window.conductor.constructTrackIndicators();\n }\n \n function preloadFile(path,options={}) {\n options[\"onComplete\"]=function() { filePreloaded(path) } ;\n if (path.indexOf(\".mp3\") > -1 ) {\n window.loader.addFromLoaderType(path,LoaderType,options)\n } else {\n window.loader.add(path,options);\n }\n window.loader.load();\n }\n\n function preloadEvent(event) {\n let options = {};\n if (event.options) {\n options = event.options;\n }\n preloadFile(event.url);\n }\n\n function startAudioMixers(events) {\n \n // console.log(\"startAudioMixers\");\n \n window.mixerAnxious = new TimeShiftMixer(window.audioContext,anxiousReady,window.events);\n window.mixerRelaxed = new TimeShiftMixer(window.audioContext,relaxedReady,window.events);\n window.timePlanner = new TimePlanner(mixerAnxious,mixerRelaxed,captioner,window.events,chart);\n\n // window.mixerInterval = setInterval(function() {window.timePlanner.submit(scrubber.value())}, 200);\n }\n\n events.addEventListener(\"open-please-wait\",openPleaseWait);\n events.addEventListener(\"close-please-wait\",closePleaseWait);\n \n // events.addEventListener(\"track-start-0\", function(){document.getElementById(\"ch-player\").classList = \"row ch-green\";});\n // events.addEventListener(\"track-start-1\", function(){document.getElementById(\"ch-player\").classList = \"row ch-blue\";});\n\n events.addEventListener(\"preload-file\",preloadEvent);\n\n // these don't require audioContext \n window.captioner = new Captioner(\"#ch-player-captions\",window.events);\n window.conductor = new Conductor(window.events);\n\n\n // Make a new scrubber\n window.scrubber = new ScrubberView();\n // Append it to the dom\n document.getElementById('ch-player-contents').appendChild(scrubber.elt);\n\n // onScrubStart is called whenever a user starts scrubbing\n scrubber.onScrubStart = function(val) {\n timePlanner.start(val);\n };\n\n // onValueChanged is called whenever the scrubber is moved.\n scrubber.onValueChanged = (value) =>\n timePlanner.submit(value);\n // onScrubEnd is called whenever a user stops scrubbing\n scrubber.onScrubEnd = (value) => \n timePlanner.end(value);\n \n scrubber.min(0.0).max(1.0);\n\n function navigateToPlayer(target) {\n window.currentSection = target;\n // console.log(\"changing to section\"+target);\n if (window.tracks.length == 0) {\n openPleaseWait();\n setTimeout(\n function() {\n navigateToPlayer(target);\n }, 500);\n return;\n }\n closePleaseWait();\n createAudioContext(); // TK TK Later, when direct navigation is possible, init another way\n document.getElementById('ch-player').style.display = 'flex';\n document.getElementById('ch-menu').style.display = 'none';\n // scrubber.redraw();\n window.conductor.changeTracks.bind(window.conductor,[target,0,0],[target,1,0])();\n window.conductor.constructTrackIndicators();\n analytics.pageview(window.location.pathname + \"?section=\" + target);\n }\n\n function navigateToMenu(target) {\n document.getElementById('ch-player').style.display = 'none';\n document.getElementById('ch-menu').style.display = 'flex';\n // player.pause();\n }\n \n var body = document.getElementsByTagName('body')[0];\n\n function openPleaseWait() {\n body.classList.add('waiting');\n }\n\n function closePleaseWait() {\n body.classList.remove('waiting');\n }\n\n function openPlayerHelp() {\n body.classList.add('help-open');\n }\n \n function closePlayerHelp() {\n body.classList.remove('help-open');\n Cookies.set(\"closedPlayerHelp\",true)\n }\n\n function updateStartStop(evt) {\n // console.log(evt.startValue + \"+\" + evt.endValue);\n let startPos = scrubber.getPageYFromValue(1-evt.startValue);\n let endPos = scrubber.getPageYFromValue(1-evt.endValue);\n let end = document.getElementById(\"ch-scrubber-indicator-end\");\n let start=document.getElementById(\"ch-scrubber-indicator-start\");\n let upwards = document.getElementById(\"ch-scrubber-fade-upwards\");\n let downwards=document.getElementById(\"ch-scrubber-fade-downwards\");\n start.style.display=\"block\";\n start.style.top=(startPos.toString()) + \"px\";\n end.style.display=\"block\";\n let endheight = end.getBoundingClientRect().height;\n // console.log(end.getBoundingClientRect())\n let mult = endPos > startPos ? -1 : 1 ; \n if (endPos > startPos) { \n upwards.style.display=\"block\";\n let upTop = startPos - upwards.getBoundingClientRect().height ;\n \n upwards.style.top= upTop.toString() + \"px\"; \n // console.log(upwards.style.bottom);\n } else {\n downwards.style.display = \"block\";\n downwards.style.top=startPos.toString() + \"px\";\n }\n endPos += mult * (endheight / 2);\n end.style.top=(endPos.toString()) + \"px\";\n }\n function hideStartStop(evt) {\n\n document.getElementById(\"ch-scrubber-indicator-start\").style.display=\"none\";\n document.getElementById(\"ch-scrubber-indicator-end\").style.display=\"none\";\n document.getElementById(\"ch-scrubber-fade-upwards\").style.display=\"none\";\n document.getElementById(\"ch-scrubber-fade-downwards\").style.display=\"none\";\n }\n\n window.events.addEventListener(\"track-start-0\",updateStartStop);\n window.events.addEventListener(\"track-start-1\",updateStartStop);\n window.events.addEventListener(\"track-end-0\",hideStartStop);\n window.events.addEventListener(\"track-end-1\",hideStartStop);\n\n window.loadErrors = 0;\n function packFinished() {\n let returners = []\n for (let sec in window.tracks) {\n for (let direction in window.tracks[sec]) {\n for (let track in window.tracks[sec][direction]) {\n if (window.tracks[sec][direction][track][\"finished\"] == true ) {\n returners.push([ sec, direction, track]);\n }\n }\n }\n }\n return JSON.stringify(returners);\n }\n\n function unpackFinished(strang) {\n let finished = JSON.parse(strang);\n for (let b in finished) {\n let a = finished[b]\n window.tracks[a[0]][a[1]][a[2]][\"finished\"] = true;\n }\n }\n\n function trackFinished(event) {\n let trak = event.track;\n window.tracks[trak[0]][trak[1]][trak[2]][\"finished\"] = true;\n Cookies.set(\"finished\",packFinished());\n }\n\n window.events.addEventListener(\"track-finished\",trackFinished);\n\n function loadTrackList() {\n // console.log(\"loading track list...\");\n let request = new Request(\"public/closely-held-audio.json\");\n fetch(request)\n .then(response => response.json())\n .then(data => {\n for (let sec in data) {\n for (let direction in data[sec]) {\n for (let track in data[sec][direction]) {\n data[sec][direction][track][\"filename\"] = \"public/\" + data[sec][direction][track][\"filename\"];\n data[sec][direction][track][\"preloaded\"] = false;\n data[sec][direction][track][\"finished\"] = false;\n }\n }\n }\n window.tracks = data;\n\n let previouslyFinished = Cookies.get(\"finished\");\n if(previouslyFinished) {\n unpackFinished(previouslyFinished);\n }\n }).catch(error => {\n console.error(error);\n loadErrors++;\n if (loadErrors > 5) {\n window.alert(\"Sorry! Something bad is happening when we try to load our audio track list. Nerdy details: \" + error)\n } else {\n loadTrackList();\n }\n });\n }\n loadTrackList();\n\n let genre1 = document.getElementsByClassName(\"ch-genre-1\")[0];\n genre1.addEventListener(\"click\",function() {navigateToPlayer(0)});\n\n let genre2 = document.getElementsByClassName(\"ch-genre-2\")[0];\n genre2.addEventListener(\"click\",function() {navigateToPlayer(1)});\n\n let genre3 = document.getElementsByClassName(\"ch-genre-3\")[0];\n genre3.addEventListener(\"click\",function() {navigateToPlayer(2)});\n\n let genre4 = document.getElementsByClassName(\"ch-genre-4\")[0];\n genre4.addEventListener(\"click\",function() {navigateToPlayer(3)});\n\n let closebutton = document.getElementById(\"ch-player-close\");\n closebutton.addEventListener(\"click\",navigateToMenu);\n\n let playerhelpopen = document.getElementById(\"ch-player-help-open\");\n playerhelpopen.addEventListener(\"click\",openPlayerHelp);\n\n let playerhelpclose = document.getElementById(\"ch-player-help-close\");\n playerhelpclose.addEventListener(\"click\",closePlayerHelp);\n\n let resetbutton = document.getElementById('ch-reset');\n resetbutton.addEventListener(\"click\",function() {\n Cookies.remove(\"finished\");\n Cookies.remove(\"closedPlayerHelp\");\n window.location.href = window.location.href;\n })\n\n\n \n if(!Cookies.get('closedPlayerHelp')) {\n openPlayerHelp(); // show on first use\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\n if (iOS) {\n window.alert(\"Please make sure your device's Silent switch is turned off! \\n\\niOS thinks these sounds are notification dings, so it'll mute them if your Silent switch is on. \\n\\nThanks!\");\n }\n }\n\n}) "],"sourceRoot":""}