aw-highstock_rails 7.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +22 -0
- data/LICENSE.txt +21 -0
- data/README.md +53 -0
- data/Rakefile +10 -0
- data/aw-highstock_rails.gemspec +28 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/aw/highstock_rails.rb +9 -0
- data/lib/aw/highstock_rails/version.rb +5 -0
- data/vendor/assets/javascripts/highstock/css/annotations/popup.css +229 -0
- data/vendor/assets/javascripts/highstock/css/annotations/popup.scss +235 -0
- data/vendor/assets/javascripts/highstock/css/highcharts.css +890 -0
- data/vendor/assets/javascripts/highstock/css/highcharts.scss +788 -0
- data/vendor/assets/javascripts/highstock/css/stocktools/gui.css +268 -0
- data/vendor/assets/javascripts/highstock/css/stocktools/gui.scss +270 -0
- data/vendor/assets/javascripts/highstock/css/themes/dark-unica.css +951 -0
- data/vendor/assets/javascripts/highstock/css/themes/dark-unica.scss +122 -0
- data/vendor/assets/javascripts/highstock/css/themes/grid-light.css +904 -0
- data/vendor/assets/javascripts/highstock/css/themes/grid-light.scss +33 -0
- data/vendor/assets/javascripts/highstock/css/themes/sand-signika.css +920 -0
- data/vendor/assets/javascripts/highstock/css/themes/sand-signika.scss +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/ControlPoint.js +130 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/MockPoint.js +415 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/annotations.src.js +1231 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableCircle.js +92 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableImage.js +101 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableLabel.js +452 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllablePath.js +175 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/ControllableRect.js +93 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/controllableMixin.js +411 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/controllable/markerMixin.js +214 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/eventEmitterMixin.js +271 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/navigationBindings.js +1283 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/popup.js +1069 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/CrookedLine.js +191 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/ElliottWave.js +76 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Fibonacci.js +247 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/InfinityLine.js +185 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Measure.js +928 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Pitchfork.js +203 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/Tunnel.js +242 -0
- data/vendor/assets/javascripts/highstock/es-modules/annotations/types/VerticalLine.js +157 -0
- data/vendor/assets/javascripts/highstock/es-modules/error-messages.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/error.js +1 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/acceleration-bands.src.js +199 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/accumulation-distribution.src.js +129 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ao.src.js +206 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/apo.src.js +148 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/aroon-oscillator.src.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/aroon.src.js +173 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/atr.src.js +151 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/bollinger-bands.src.js +209 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/cci.src.js +131 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/chaikin.src.js +167 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/cmf.src.js +246 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/dema.src.js +191 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/dpo.src.js +138 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ema.src.js +166 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ichimoku-kinko-hyo.src.js +850 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/indicators.src.js +425 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/keltner-channels.src.js +193 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/macd.src.js +417 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/mfi.src.js +198 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/momentum.src.js +119 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/natr.src.js +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/pivot-points.src.js +360 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/ppo.src.js +152 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/price-channel.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/price-envelopes.src.js +251 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/psar.src.js +307 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/regressions.src.js +427 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/roc.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/rsi.src.js +163 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/stochastic.src.js +193 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/supertrend.src.js +544 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/tema.src.js +247 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/trix.src.js +96 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/volume-by-price.src.js +671 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/vwap.src.js +189 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/williams-r.src.js +128 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/wma.src.js +146 -0
- data/vendor/assets/javascripts/highstock/es-modules/indicators/zigzag.src.js +221 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highcharts-3d.src.js +17 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highcharts-more.src.js +22 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/highstock.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/acceleration-bands.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/accumulation-distribution.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ao.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/apo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/aroon-oscillator.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/aroon.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/atr.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/bollinger-bands.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/cci.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/chaikin.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/cmf.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/dema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/dpo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ichimoku-kinko-hyo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/indicators-all.src.js +49 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/indicators.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/keltner-channels.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/macd.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/mfi.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/momentum.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/natr.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/pivot-points.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/ppo.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/price-channel.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/price-envelopes.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/psar.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/regressions.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/roc.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/rsi.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/stochastic.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/supertrend.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/tema.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/trix.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/volume-by-price.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/vwap.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/williams-r.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/wma.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/indicators/zigzag.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/accessibility.src.js +13 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/annotations-advanced.src.js +20 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/annotations.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/arrow-symbols.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/boost-canvas.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/boost.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/bullet.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/current-date-indicator.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/cylinder.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/data.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/datagrouping.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/debugger.src.js +13 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/dependency-wheel.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/drag-panes.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/draggable-points.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/drilldown.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/export-data.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/exporting.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/full-screen.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/funnel.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/grid-axis.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/heatmap.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/histogram-bellcurve.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/item-series.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/networkgraph.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/no-data-to-display.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/offline-exporting.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/oldie-polyfills.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/oldie.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/overlapping-datalabels.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/parallel-coordinates.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pareto.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pathfinder.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/pattern-fill.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/price-indicator.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sankey.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/series-label.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/solid-gauge.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sonification.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/static-scale.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/stock-tools.src.js +12 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/stock.src.js +19 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/streamgraph.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/sunburst.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/tilemap.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/timeline.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/treegrid.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/treemap.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/variable-pie.src.js +11 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/variwide.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/vector.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/venn.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/windbarb.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/wordcloud.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/modules/xrange.src.js +10 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/avocado.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/avocado.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-blue.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-green.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/dark-unica.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/gray.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/grid-light.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/grid.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sand-signika.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/skies.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sunset.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/masters/themes/sunset.src.js +9 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/ajax.js +123 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/centered-series.js +116 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/derived-series.js +150 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/download-url.js +103 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/draw-point.js +51 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/geometry-circles.js +300 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/geometry.js +50 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/indicator-required.js +49 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/multipe-lines.js +223 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/navigation.js +59 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/nodes.js +76 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/on-series.js +167 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/polygon.js +293 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/reduce-array.js +53 -0
- data/vendor/assets/javascripts/highstock/es-modules/mixins/tree-series.js +256 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/a11y-i18n.src.js +524 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/annotations-legacy.src.js +1951 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/bellcurve.src.js +173 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/boost-canvas.src.js +732 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/boost.src.js +3730 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/bullet.src.js +361 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/cylinder.src.js +389 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/data.src.js +2417 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/debugger.src.js +109 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/dependency-wheel.src.js +199 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/drag-panes.src.js +624 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/draggable-points.src.js +2625 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/drilldown.src.js +1300 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/export-data.src.js +983 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/exporting.src.js +2149 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/full-screen.src.js +40 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/funnel.src.js +552 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/histogram.src.js +229 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/item-series.src.js +150 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/keyboard-navigation.src.js +1606 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/QuadTree.js +175 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/layouts.js +506 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/networkgraph/networkgraph.src.js +740 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/no-data-to-display.src.js +260 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/offline-exporting.src.js +710 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/oldie-polyfills.src.js +121 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/oldie.src.js +1556 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/overlapping-datalabels.src.js +250 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/parallel-coordinates.src.js +492 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/pareto.src.js +152 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/pattern-fill.src.js +607 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/price-indicator.src.js +149 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sankey.src.js +809 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/screen-reader.src.js +954 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/series-label.src.js +1042 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/solid-gauge.src.js +486 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Earcon.js +184 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Instrument.js +582 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/Timeline.js +702 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/chartSonify.js +1026 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/instrumentDefinitions.js +37 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/musicalFrequencies.js +113 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/pointSonify.js +385 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/sonification.js +107 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sonification/utilities.js +178 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/static-scale.src.js +88 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/stock-tools-bindings.js +1950 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/stock-tools-gui.js +1458 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/streamgraph.src.js +132 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/sunburst.src.js +1041 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/tilemap.src.js +769 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/timeline.src.js +750 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/treemap.src.js +1803 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/variable-pie.src.js +459 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/variwide.src.js +350 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/vector.src.js +354 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/venn.src.js +1192 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/windbarb.src.js +380 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/wordcloud.src.js +1103 -0
- data/vendor/assets/javascripts/highstock/es-modules/modules/xrange.src.js +761 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Axis.js +669 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Chart.js +1753 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Column.js +437 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Math.js +206 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Pie.js +207 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/SVGRenderer.js +1002 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Scatter.js +154 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/Series.js +73 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-3d/VMLRenderer.js +62 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/ArrowSymbols.js +198 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/CurrentDateIndicator.js +100 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GanttChart.js +140 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GanttSeries.js +415 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/GridAxis.js +961 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/Pathfinder.js +1298 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/PathfinderAlgorithms.js +816 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/Tree.js +158 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-gantt/TreeGrid.js +1003 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/ColorAxis.js +1103 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/ColorSeriesMixin.js +138 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/GeoJSON.js +435 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/HeatmapSeries.js +474 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/Map.js +477 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapAxis.js +124 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapBubbleSeries.js +274 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapLineSeries.js +143 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapNavigation.js +357 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapPointSeries.js +187 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapPointer.js +132 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-map/MapSeries.js +1294 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/AreaRangeSeries.js +725 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/AreaSplineRangeSeries.js +98 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BoxPlotSeries.js +617 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BubbleLegend.js +1167 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/BubbleSeries.js +661 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ColumnPyramidSeries.js +288 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ColumnRangeSeries.js +278 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/ErrorBarSeries.js +172 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/GaugeSeries.js +618 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/PackedBubbleSeries.js +567 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/Pane.js +399 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/Polar.js +634 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/PolygonSeries.js +151 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/RadialAxis.js +685 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts-more/WaterfallSeries.js +765 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts.js +684 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/AreaSeries.js +578 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/AreaSplineSeries.js +122 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Axis.js +6453 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/BarSeries.js +153 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/CandlestickSeries.js +358 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Chart.js +2307 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Color.js +301 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ColumnSeries.js +1125 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DataGrouping.js +1115 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DataLabels.js +1431 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/DateTimeAxis.js +134 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Dynamics.js +1301 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/FlagsSeries.js +739 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Globals.js +75 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Html.js +539 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Interaction.js +1299 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Legend.js +1411 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/LogarithmicAxis.js +168 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/MSPointer.js +176 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Navigator.js +2486 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/OHLCSeries.js +412 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Options.js +3732 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/OrdinalAxis.js +962 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PieSeries.js +1328 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PlotBandSeries.experimental.js +74 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/PlotLineOrBand.js +1061 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Point.js +681 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Pointer.js +1332 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/RangeSelector.js +2063 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Responsive.js +295 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ScatterSeries.js +278 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/ScrollablePlotArea.js +266 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Scrollbar.js +1134 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Series.js +5864 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/SplineSeries.js +267 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Stacking.js +604 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/StockChart.js +951 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/SvgRenderer.js +5109 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Tick.js +746 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Time.js +881 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Tooltip.js +1318 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/TouchPointer.js +404 -0
- data/vendor/assets/javascripts/highstock/es-modules/parts/Utilities.js +2751 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/avocado.js +37 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-blue.js +259 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-green.js +261 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/dark-unica.js +220 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/gray.js +267 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/grid-light.js +81 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/grid.js +110 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/sand-signika.js +111 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/skies.js +100 -0
- data/vendor/assets/javascripts/highstock/es-modules/themes/sunset.js +36 -0
- data/vendor/assets/javascripts/highstock/highcharts-3d.js +85 -0
- data/vendor/assets/javascripts/highstock/highcharts-3d.js.map +1 -0
- data/vendor/assets/javascripts/highstock/highcharts-more.js +101 -0
- data/vendor/assets/javascripts/highstock/highcharts-more.js.map +1 -0
- data/vendor/assets/javascripts/highstock/highstock.js +583 -0
- data/vendor/assets/javascripts/highstock/highstock.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/acceleration-bands.src.js +448 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/accumulation-distribution.src.js +156 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ao.src.js +233 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/apo.src.js +223 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon-oscillator.src.js +426 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/aroon.src.js +423 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/atr.src.js +178 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/bollinger-bands.src.js +458 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/cci.src.js +158 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/chaikin.src.js +370 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/cmf.src.js +273 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/dema.src.js +266 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/dpo.src.js +166 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ema.src.js +193 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.js +22 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ichimoku-kinko-hyo.src.js +877 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.js +117 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators-all.src.js +9389 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/indicators.src.js +500 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/keltner-channels.src.js +442 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.js +18 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/macd.src.js +444 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/mfi.src.js +225 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/momentum.src.js +146 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/natr.src.js +101 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/pivot-points.src.js +387 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/ppo.src.js +227 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.js +16 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/price-channel.src.js +450 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.js +15 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/price-envelopes.src.js +278 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/psar.src.js +334 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.js +14 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/regressions.src.js +454 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/roc.src.js +176 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/rsi.src.js +190 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/stochastic.src.js +494 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.js +17 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/supertrend.src.js +571 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.js +14 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/tema.src.js +322 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/trix.src.js +171 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.js +21 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/volume-by-price.src.js +698 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/vwap.src.js +216 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/williams-r.src.js +207 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.js +12 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/wma.src.js +173 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.js +13 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.js.map +1 -0
- data/vendor/assets/javascripts/highstock/indicators/zigzag.src.js +248 -0
- data/vendor/assets/javascripts/highstock/lib/canvg.js +130 -0
- data/vendor/assets/javascripts/highstock/lib/canvg.src.js +3073 -0
- data/vendor/assets/javascripts/highstock/lib/jspdf.js +283 -0
- data/vendor/assets/javascripts/highstock/lib/jspdf.src.js +21627 -0
- data/vendor/assets/javascripts/highstock/lib/rgbcolor.js +17 -0
- data/vendor/assets/javascripts/highstock/lib/rgbcolor.src.js +299 -0
- data/vendor/assets/javascripts/highstock/lib/svg2pdf.js +38 -0
- data/vendor/assets/javascripts/highstock/lib/svg2pdf.src.js +4390 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.js +73 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/accessibility.src.js +3103 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.js +132 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/annotations-advanced.src.js +8230 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.js +94 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/annotations.src.js +6001 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/arrow-symbols.src.js +225 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/boost-canvas.src.js +756 -0
- data/vendor/assets/javascripts/highstock/modules/boost.js +65 -0
- data/vendor/assets/javascripts/highstock/modules/boost.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/boost.src.js +3752 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/bullet.src.js +388 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/current-date-indicator.src.js +127 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/cylinder.src.js +413 -0
- data/vendor/assets/javascripts/highstock/modules/data.js +37 -0
- data/vendor/assets/javascripts/highstock/modules/data.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/data.src.js +2565 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.js +25 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/datagrouping.src.js +1140 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.js +28 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/debugger.src.js +267 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/dependency-wheel.src.js +301 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.js +18 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/drag-panes.src.js +649 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.js +40 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/draggable-points.src.js +2650 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.js +29 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/drilldown.src.js +1321 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.js +27 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/export-data.src.js +1234 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.js +35 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/exporting.src.js +2233 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.js +11 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/full-screen.src.js +68 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/funnel.src.js +576 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/grid-axis.src.js +988 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.js +28 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/heatmap.src.js +1731 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.js +16 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/histogram-bellcurve.src.js +570 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/item-series.src.js +176 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.js +31 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/networkgraph.src.js +1348 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/no-data-to-display.src.js +285 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/offline-exporting.src.js +838 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/oldie-polyfills.src.js +150 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.js +35 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/oldie.src.js +1582 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.js +9 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/overlapping-datalabels.src.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.js +18 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/parallel-coordinates.src.js +517 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.js +14 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pareto.src.js +327 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.js +34 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pathfinder.src.js +2336 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.js +21 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/pattern-fill.src.js +634 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/price-indicator.src.js +176 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.js +22 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sankey.src.js +911 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/series-label.src.js +1065 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/solid-gauge.src.js +510 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.js +53 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sonification.src.js +3341 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.js +12 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/static-scale.src.js +114 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.js +65 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/stock-tools.src.js +3437 -0
- data/vendor/assets/javascripts/highstock/modules/stock.js +151 -0
- data/vendor/assets/javascripts/highstock/modules/stock.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/stock.src.js +10907 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.js +10 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/streamgraph.src.js +158 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.js +52 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/sunburst.src.js +3174 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.js +26 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/tilemap.src.js +1402 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.js +23 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/timeline.src.js +778 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.js +50 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/treegrid.src.js +2917 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.js +39 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/treemap.src.js +2083 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.js +16 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/variable-pie.src.js +485 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.js +15 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/variwide.src.js +376 -0
- data/vendor/assets/javascripts/highstock/modules/vector.js +13 -0
- data/vendor/assets/javascripts/highstock/modules/vector.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/vector.src.js +381 -0
- data/vendor/assets/javascripts/highstock/modules/venn.js +30 -0
- data/vendor/assets/javascripts/highstock/modules/venn.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/venn.src.js +1624 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.js +17 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/windbarb.src.js +574 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.js +25 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/wordcloud.src.js +1475 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.js +20 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.js.map +1 -0
- data/vendor/assets/javascripts/highstock/modules/xrange.src.js +788 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.js +9 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/avocado.src.js +63 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-blue.src.js +285 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-green.src.js +287 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.js +14 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/dark-unica.src.js +246 -0
- data/vendor/assets/javascripts/highstock/themes/gray.js +15 -0
- data/vendor/assets/javascripts/highstock/themes/gray.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/gray.src.js +293 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/grid-light.src.js +107 -0
- data/vendor/assets/javascripts/highstock/themes/grid.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/grid.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/grid.src.js +136 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/sand-signika.src.js +137 -0
- data/vendor/assets/javascripts/highstock/themes/skies.js +11 -0
- data/vendor/assets/javascripts/highstock/themes/skies.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/skies.src.js +126 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.js +9 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.js.map +1 -0
- data/vendor/assets/javascripts/highstock/themes/sunset.src.js +62 -0
- metadata +781 -0
@@ -0,0 +1,53 @@
|
|
1
|
+
/*
|
2
|
+
Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
Sonification module
|
4
|
+
|
5
|
+
(c) 2012-2019 ystein Moseng
|
6
|
+
|
7
|
+
License: www.highcharts.com/license
|
8
|
+
*/
|
9
|
+
(function(l){"object"===typeof module&&module.exports?(l["default"]=l,module.exports=l):"function"===typeof define&&define.amd?define(function(){return l}):l("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(l){var t=function(c){function f(c){this.init(c)}var g={type:"oscillator",playCallbackInterval:20,oscillator:{waveformShape:"sine"}};f.prototype.init=function(b){this.initAudioContext()?(this.options=c.merge(g,b),this.id=this.options.id=b&&b.id||c.uniqueKey(),b=c.audioContext,this.gainNode=
|
10
|
+
b.createGain(),this.setGain(0),(this.panNode=b.createStereoPanner&&b.createStereoPanner())?(this.setPan(0),this.gainNode.connect(this.panNode),this.panNode.connect(b.destination)):this.gainNode.connect(b.destination),"oscillator"===this.options.type&&this.initOscillator(this.options.oscillator),this.playCallbackTimers=[]):c.error(29)};f.prototype.copy=function(b){return new f(c.merge(this.options,{id:null},b))};f.prototype.initAudioContext=function(){var b=c.win.AudioContext||c.win.webkitAudioContext,
|
11
|
+
d=!!c.audioContext;return b?(c.audioContext=c.audioContext||new b,!d&&c.audioContext&&"running"===c.audioContext.state&&c.audioContext.suspend(),!!(c.audioContext&&c.audioContext.createOscillator&&c.audioContext.createGain)):!1};f.prototype.initOscillator=function(b){this.oscillator=c.audioContext.createOscillator();this.oscillator.type=b.waveformShape;this.oscillator.connect(this.gainNode);this.oscillatorStarted=!1};f.prototype.setPan=function(b){this.panNode&&this.panNode.pan.setValueAtTime(b,c.audioContext.currentTime)};
|
12
|
+
f.prototype.setGain=function(b,d){this.gainNode&&(1.2<b&&(console.warn("Highcharts sonification warning: Volume of instrument set too high."),b=1.2),d?(this.gainNode.gain.setValueAtTime(this.gainNode.gain.value,c.audioContext.currentTime),this.gainNode.gain.linearRampToValueAtTime(b,c.audioContext.currentTime+d/1E3)):this.gainNode.gain.setValueAtTime(b,c.audioContext.currentTime))};f.prototype.cancelGainRamp=function(){this.gainNode&&this.gainNode.gain.cancelScheduledValues(0)};f.prototype.getValidFrequency=
|
13
|
+
function(b,d,a){var e=this.options.allowedFrequencies,g=c.pick(a,Infinity),f=c.pick(d,-Infinity);return e&&e.length?e.reduce(function(a,d){return Math.abs(d-b)<Math.abs(a-b)&&d<g&&d>f?d:a},Infinity):b};f.prototype.clearPlayCallbackTimers=function(){this.playCallbackTimers.forEach(function(c){clearInterval(c)});this.playCallbackTimers=[]};f.prototype.setFrequency=function(c,d){d=d||{};c=this.getValidFrequency(c,d.min,d.max);"oscillator"===this.options.type&&this.oscillatorPlay(c)};f.prototype.oscillatorPlay=
|
14
|
+
function(b){this.oscillatorStarted||(this.oscillator.start(),this.oscillatorStarted=!0);this.oscillator.frequency.setValueAtTime(b,c.audioContext.currentTime)};f.prototype.preparePlay=function(){this.setGain(.001);"suspended"===c.audioContext.state&&c.audioContext.resume();this.oscillator&&!this.oscillatorStarted&&(this.oscillator.start(),this.oscillatorStarted=!0)};f.prototype.play=function(b){var d=this,a=b.duration||0,e=function(a,c,e){var g=b.duration,f=0,q=d.options.playCallbackInterval;if("function"===
|
15
|
+
typeof a){var n=setInterval(function(){f++;var b=f*q/g;if(1<=b)d[c](a(1),e),clearInterval(n);else d[c](a(b),e)},q);d.playCallbackTimers.push(n)}else d[c](a,e)};if(d.id)if("suspended"===c.audioContext.state||this.oscillator&&!this.oscillatorStarted)d.preparePlay(),setTimeout(function(){d.play(b)},10);else{d.playCallbackTimers.length&&d.clearPlayCallbackTimers();d.cancelGainRamp();d.stopOscillatorTimeout&&(clearTimeout(d.stopOscillatorTimeout),delete d.stopOscillatorTimeout);d.stopTimeout&&(clearTimeout(d.stopTimeout),
|
16
|
+
delete d.stopTimeout,d.stopCallback&&(d._play=d.play,d.play=function(){},d.stopCallback("cancelled"),d.play=d._play));var g=a<c.sonification.fadeOutDuration+20;d.stopCallback=b.onEnd;var f=function(){delete d.stopTimeout;d.stop(g)};a?(d.stopTimeout=setTimeout(f,g?a:a-c.sonification.fadeOutDuration),e(b.frequency,"setFrequency",null,{minFrequency:b.minFrequency,maxFrequency:b.maxFrequency}),e(c.pick(b.volume,1),"setGain",4),e(c.pick(b.pan,0),"setPan")):f()}};f.prototype.mute=function(){this.setGain(.0001,
|
17
|
+
.8*c.sonification.fadeOutDuration)};f.prototype.stop=function(b,d,a){var e=this,g=function(){e.stopOscillatorTimeout&&delete e.stopOscillatorTimeout;try{e.oscillator.stop()}catch(p){}e.oscillator.disconnect(e.gainNode);e.initOscillator(e.options.oscillator);d&&d(a);e.stopCallback&&e.stopCallback(a)};e.playCallbackTimers.length&&e.clearPlayCallbackTimers();e.stopTimeout&&clearTimeout(e.stopTimeout);b?(e.setGain(0),g()):(e.mute(),e.stopOscillatorTimeout=setTimeout(g,c.sonification.fadeOutDuration+100))};
|
18
|
+
return f}(l),r=function(c){function f(c){this.init(c||[])}f.prototype.init=function(c){this.supportedSignals=c;this.signals={}};f.prototype.registerSignalCallbacks=function(c){var b=this;b.supportedSignals.forEach(function(d){c[d]&&(b.signals[d]=b.signals[d]||[]).push(c[d])})};f.prototype.clearSignalCallbacks=function(c){var b=this;c?c.forEach(function(c){b.signals[c]&&delete b.signals[c]}):b.signals={}};f.prototype.emitSignal=function(c,b){var d;this.signals[c]&&this.signals[c].forEach(function(c){c=
|
19
|
+
c(b);d=void 0!==c?c:d});return d};return{musicalFrequencies:c,SignalHandler:f,getMusicalScale:function(f){return c.filter(function(c,d){var a=d%12+1;return f.some(function(c){return c===a})})},calculateDataExtremes:function(c,b){return c.series.reduce(function(c,a){a.points.forEach(function(a){a=void 0!==a[b]?a[b]:a.options[b];c.min=Math.min(c.min,a);c.max=Math.max(c.max,a)});return c},{min:Infinity,max:-Infinity})},virtualAxisTranslate:function(c,b,d){var a=b.max-b.min;c=d.min+(d.max-d.min)*(c-b.min)/
|
20
|
+
a;return 0<a?Math.max(Math.min(c,d.max),d.min):d.min}}}([16.351597831287414,17.323914436054505,18.354047994837977,19.445436482630058,20.601722307054366,21.826764464562746,23.12465141947715,24.499714748859326,25.956543598746574,27.5,29.13523509488062,30.86770632850775,32.70319566257483,34.64782887210901,36.70809598967594,38.890872965260115,41.20344461410875,43.653528929125486,46.2493028389543,48.999429497718666,51.91308719749314,55,58.27047018976124,61.7354126570155,65.40639132514966,69.29565774421802,
|
21
|
+
73.41619197935188,77.78174593052023,82.4068892282175,87.30705785825097,92.4986056779086,97.99885899543733,103.82617439498628,110,116.54094037952248,123.47082531403103,130.8127826502993,138.59131548843604,146.8323839587038,155.56349186104046,164.81377845643496,174.61411571650194,184.9972113558172,195.99771799087463,207.65234878997256,220,233.08188075904496,246.94165062806206,261.6255653005986,277.1826309768721,293.6647679174076,311.1269837220809,329.6275569128699,349.2282314330039,369.9944227116344,
|
22
|
+
391.99543598174927,415.3046975799451,440,466.1637615180899,493.8833012561241,523.2511306011972,554.3652619537442,587.3295358348151,622.2539674441618,659.2551138257398,698.4564628660078,739.9888454232688,783.9908719634985,830.6093951598903,880,932.3275230361799,987.7666025122483,1046.5022612023945,1108.7305239074883,1174.6590716696303,1244.5079348883237,1318.5102276514797,1396.9129257320155,1479.9776908465376,1567.981743926997,1661.2187903197805,1760,1864.6550460723597,1975.533205024496,2093.004522404789,
|
23
|
+
2217.4610478149766,2349.31814333926,2489.0158697766474,2637.02045530296,2793.825851464031,2959.955381693075,3135.9634878539946,3322.437580639561,3520,3729.3100921447194,3951.066410048992,4186.009044809578]),w=function(c,f){var g={};["sine","square","triangle","sawtooth"].forEach(function(b){g[b]=new c({oscillator:{waveformShape:b}});g[b+"Musical"]=new c({allowedFrequencies:f.musicalFrequencies,oscillator:{waveformShape:b}});g[b+"Major"]=new c({allowedFrequencies:f.getMusicalScale([1,3,5,6,8,10,12]),
|
24
|
+
oscillator:{waveformShape:b}})});return g}(t,r),x=function(c){function f(c){this.init(c||{})}f.prototype.init=function(f){this.options=f;this.options.id||(this.options.id=this.id=c.uniqueKey());this.instrumentsPlaying={}};f.prototype.sonify=function(f){var b=c.merge(this.options,f),d=c.pick(b.volume,1),a=b.pan,e=this,h=f&&f.onEnd,g=e.options.onEnd;b.instruments.forEach(function(b){var f="string"===typeof b.instrument?c.sonification.instruments[b.instrument]:b.instrument,q=c.merge(b.playOptions),k,
|
25
|
+
p;f&&f.play?b.playOptions&&("function"!==typeof b.playOptions.volume&&(q.volume=c.pick(d,1)*c.pick(b.playOptions.volume,1)),q.pan=c.pick(a,q.pan),k=q.onEnd,q.onEnd=function(){delete e.instrumentsPlaying[p];k&&k.apply(this,arguments);Object.keys(e.instrumentsPlaying).length||(h&&h.apply(this,arguments),g&&g.apply(this,arguments))},b=f.copy(),p=b.id,e.instrumentsPlaying[p]=b,b.play(q)):c.error(30)})};f.prototype.cancelSonify=function(c){var b=this.instrumentsPlaying,d=b&&Object.keys(b);d&&d.length&&
|
26
|
+
(d.forEach(function(a){b[a].stop(!c,null,"cancelled")}),this.instrumentsPlaying={})};return f}(l),y=function(c,f){var g={minDuration:20,maxDuration:2E3,minVolume:.1,maxVolume:1,minPan:-1,maxPan:1,minFrequency:220,maxFrequency:2200};return{pointSonify:function(b){var d=this,a=d.series.chart,e=b.dataExtremes||{},h=function(a,b,h,g){if("number"===typeof a||void 0===a)return a;if("function"===typeof a)return b?function(c){return a(d,e,c)}:a(d,e);if("string"===typeof a)return e[a]=e[a]||f.calculateDataExtremes(d.series.chart,
|
27
|
+
a),f.virtualAxisTranslate(c.pick(d[a],d.options[a]),e[a],h,g)};a.sonification.currentlyPlayingPoint=d;d.sonification=d.sonification||{};d.sonification.instrumentsPlaying=d.sonification.instrumentsPlaying||{};var p=d.sonification.signalHandler=d.sonification.signalHandler||new f.SignalHandler(["onEnd"]);p.clearSignalCallbacks();p.registerSignalCallbacks({onEnd:b.onEnd});!d.isNull&&d.visible&&d.series.visible?b.instruments.forEach(function(b){var e="string"===typeof b.instrument?c.sonification.instruments[b.instrument]:
|
28
|
+
b.instrument,f=b.instrumentMapping||{},k=c.merge(g,b.instrumentOptions),q=e.id,l=function(c){b.onEnd&&b.onEnd.apply(this,arguments);a.sonification&&a.sonification.currentlyPlayingPoint&&delete a.sonification.currentlyPlayingPoint;d.sonification&&d.sonification.instrumentsPlaying&&(delete d.sonification.instrumentsPlaying[q],Object.keys(d.sonification.instrumentsPlaying).length||p.emitSignal("onEnd",c))};e&&e.play?(d.sonification.instrumentsPlaying[e.id]=e,e.play({frequency:h(f.frequency,!0,{min:k.minFrequency,
|
29
|
+
max:k.maxFrequency}),duration:h(f.duration,!1,{min:k.minDuration,max:k.maxDuration}),pan:h(f.pan,!0,{min:k.minPan,max:k.maxPan}),volume:h(f.volume,!0,{min:k.minVolume,max:k.maxVolume}),onEnd:l,minFrequency:k.minFrequency,maxFrequency:k.maxFrequency})):c.error(30)}):p.emitSignal("onEnd")},pointCancelSonify:function(c){var b=this.sonification&&this.sonification.instrumentsPlaying,a=b&&Object.keys(b);a&&a.length&&(a.forEach(function(a){b[a].stop(!c,null,"cancelled")}),this.sonification.instrumentsPlaying=
|
30
|
+
{},this.sonification.signalHandler.emitSignal("onEnd","cancelled"))}}}(l,r),A=function(c,f){function g(a,b){return"function"===typeof b?b(a):c.pick(a[b],a.options[b])}function b(c,a){return c.points.reduce(function(c,b){b=g(b,a);c.min=Math.min(c.min,b);c.max=Math.max(c.max,b);return c},{min:Infinity,max:-Infinity})}function d(a,b,d){return(b||[]).reduce(function(c,b){Object.keys(b.instrumentMapping||{}).forEach(function(d){d=b.instrumentMapping[d];"string"!==typeof d||c[d]||(c[d]=f.calculateDataExtremes(a,
|
31
|
+
d))});return c},c.merge(d))}function a(a,b){return b.reduce(function(b,d){var e=d.earcon;d.condition?(d=d.condition(a),d instanceof c.sonification.Earcon?b.push(d):d&&b.push(e)):d.onPoint&&a.id===d.onPoint&&b.push(e);return b},[])}function e(a){return a.map(function(a){var b=a.instrument,b=("string"===typeof b?c.sonification.instruments[b]:b).copy();return c.merge(a,{instrument:b})})}function h(n,m){var h=m.timeExtremes||b(n,m.pointPlayTime,m.dataExtremes),z=d(n.chart,m.instruments,m.dataExtremes),
|
32
|
+
p=e(m.instruments),k=n.points.reduce(function(b,d){var e=a(d,m.earcons||[]),n=f.virtualAxisTranslate(g(d,m.pointPlayTime),h,{min:0,max:m.duration});return b.concat(new c.sonification.TimelineEvent({eventObject:d,time:n,id:d.id,playOptions:{instruments:p,dataExtremes:z}}),e.map(function(a){return new c.sonification.TimelineEvent({eventObject:a,time:n})}))},[]);return new c.sonification.TimelinePath({events:k,onStart:function(){if(m.onStart)m.onStart(n)},onEventStart:function(a){var b=a.options&&a.options.eventObject;
|
33
|
+
if(b instanceof c.Point){if(!b.series.visible&&!b.series.chart.series.some(function(c){return c.visible}))return a.timelinePath.timeline.pause(),a.timelinePath.timeline.resetCursor(),!1;if(m.onPointStart)m.onPointStart(a,b)}},onEventEnd:function(a){var b=a.event&&a.event.options&&a.event.options.eventObject;if(b instanceof c.Point&&m.onPointEnd)m.onPointEnd(a.event,b)},onEnd:function(){if(m.onEnd)m.onEnd(n)}})}function p(a,d,e){var f=e.seriesOptions||{};return c.merge({dataExtremes:d,timeExtremes:b(a,
|
34
|
+
e.pointPlayTime),instruments:e.instruments,onStart:e.onSeriesStart,onEnd:e.onSeriesEnd,earcons:e.earcons},c.isArray(f)?c.find(f,function(b){return b.id===c.pick(a.id,a.options.id)})||{}:f,{pointPlayTime:e.pointPlayTime})}function q(a,b,d){var e;"sequential"===a||"simultaneous"===a?(e=b.series.reduce(function(a,c){c.visible&&a.push({series:c,seriesOptions:d(c)});return a},[]),"simultaneous"===a&&(e=[e])):e=a.reduce(function(a,e){e=c.splat(e).reduce(function(a,e){var f;if("string"===typeof e){var n=
|
35
|
+
b.get(e);n.visible&&(f={series:n,seriesOptions:d(n)})}else e instanceof c.sonification.Earcon&&(f=new c.sonification.TimelinePath({events:[new c.sonification.TimelineEvent({eventObject:e})]}));e.silentWait&&(f=new c.sonification.TimelinePath({silentWait:e.silentWait}));f&&a.push(f);return a},[]);e.length&&a.push(e);return a},[]);return e}function l(a,b){return b?a.reduce(function(d,e,f){e=c.splat(e);d.push(e);f<a.length-1&&e.some(function(a){return a.series})&&d.push(new c.sonification.TimelinePath({silentWait:b}));
|
36
|
+
return d},[]):a}function u(a){return a.reduce(function(a,b){b=c.splat(b);return a+(1===b.length&&b[0].options&&b[0].options.silentWait||0)},0)}function k(a){var b=a.reduce(function(a,c){(c=c.events)&&c.length&&(a.min=Math.min(c[0].time,a.min),a.max=Math.max(c[c.length-1].time,a.max));return a},{min:Infinity,max:-Infinity});a.forEach(function(a){var d=a.events,e=d&&d.length,f=[];e&&d[0].time<=b.min||f.push(new c.sonification.TimelineEvent({time:b.min}));e&&d[d.length-1].time>=b.max||f.push(new c.sonification.TimelineEvent({time:b.max}));
|
37
|
+
f.length&&a.addTimelineEvents(f)})}function v(a){return a.reduce(function(a,b){return a+c.splat(b).reduce(function(a,c){return(c=c.series&&c.seriesOptions&&c.seriesOptions.timeExtremes)?Math.max(a,c.max-c.min):a},0)},0)}function r(a,b){var d=Math.max(b-u(a),0),e=v(a);return a.reduce(function(a,b){b=c.splat(b).reduce(function(a,b){b instanceof c.sonification.TimelinePath?a.push(b):b.series&&(b.seriesOptions.duration=b.seriesOptions.duration||f.virtualAxisTranslate(b.seriesOptions.timeExtremes.max-
|
38
|
+
b.seriesOptions.timeExtremes.min,{min:0,max:e},{min:0,max:d}),a.push(h(b.series,b.seriesOptions)));return a},[]);a.push(b);return a},[])}return{chartSonify:function(a){this.sonification.timeline&&this.sonification.timeline.pause();var b=d(this,a.instruments,a.dataExtremes),e=q(a.order,this,function(c){return p(c,b,a)}),e=l(e,a.afterSeriesWait||0),e=r(e,a.duration);e.forEach(function(a){k(a)});this.sonification.timeline=new c.sonification.Timeline({paths:e,onEnd:a.onEnd});this.sonification.timeline.play()},
|
39
|
+
seriesSonify:function(a){a=h(this,a);var b=this.chart.sonification;b.timeline&&b.timeline.pause();b.timeline=new c.sonification.Timeline({paths:[a]});b.timeline.play()},pause:function(a){this.sonification.timeline?this.sonification.timeline.pause(c.pick(a,!0)):this.sonification.currentlyPlayingPoint&&this.sonification.currentlyPlayingPoint.cancelSonify(a)},resume:function(a){this.sonification.timeline&&this.sonification.timeline.play(a)},rewind:function(a){this.sonification.timeline&&this.sonification.timeline.rewind(a)},
|
40
|
+
cancel:function(a){this.pauseSonify(a);this.resetSonifyCursor()},getCurrentPoints:function(){var a;return this.sonification.timeline?(a=this.sonification.timeline.getCursor(),Object.keys(a).map(function(b){return a[b].eventObject}).filter(function(a){return a instanceof c.Point})):[]},setCursor:function(a){var b=this.sonification.timeline;b&&c.splat(a).forEach(function(a){b.setCursor(a.id)})},resetCursor:function(){this.sonification.timeline&&this.sonification.timeline.resetCursor()},resetCursorEnd:function(){this.sonification.timeline&&
|
41
|
+
this.sonification.timeline.resetCursorEnd()}}}(l,r),B=function(c,f){function g(a){this.init(a||{})}function b(a){this.init(a)}function d(a){this.init(a||{})}g.prototype.init=function(a){this.options=a;this.time=a.time||0;this.id=this.options.id=a.id||c.uniqueKey()};g.prototype.play=function(a){var b=this.options.eventObject,d=this.options.onEnd,f=a&&a.onEnd,g=this.options.playOptions&&this.options.playOptions.onEnd;a=c.merge(this.options.playOptions,a);b&&b.sonify?(a.onEnd=d||f||g?function(){var a=
|
42
|
+
arguments;[d,f,g].forEach(function(b){b&&b.apply(this,a)})}:void 0,b.sonify(a)):(f&&f(),d&&d())};g.prototype.cancel=function(a){this.options.eventObject.cancelSonify(a)};b.prototype.init=function(a){this.options=a;this.id=this.options.id=a.id||c.uniqueKey();this.cursor=0;this.eventsPlaying={};this.events=a.silentWait?[new g({time:0}),new g({time:a.silentWait})]:this.options.events;this.sortEvents();this.updateEventIdMap();this.signalHandler=new f.SignalHandler(["playOnEnd","masterOnEnd","onStart",
|
43
|
+
"onEventStart","onEventEnd"]);this.signalHandler.registerSignalCallbacks(c.merge(a,{masterOnEnd:a.onEnd}))};b.prototype.sortEvents=function(){this.events=this.events.sort(function(a,b){return a.time-b.time})};b.prototype.updateEventIdMap=function(){this.eventIdMap=this.events.reduce(function(a,b,c){a[b.id]=c;return a},{})};b.prototype.addTimelineEvents=function(a){this.events=this.events.concat(a);this.sortEvents();this.updateEventIdMap()};b.prototype.getCursor=function(){return this.events[this.cursor]};
|
44
|
+
b.prototype.setCursor=function(a){a=this.eventIdMap[a];return void 0!==a?(this.cursor=a,!0):!1};b.prototype.play=function(a){this.pause();this.signalHandler.emitSignal("onStart");this.signalHandler.clearSignalCallbacks(["playOnEnd"]);this.signalHandler.registerSignalCallbacks({playOnEnd:a});this.playEvents(1)};b.prototype.rewind=function(a){this.pause();this.signalHandler.emitSignal("onStart");this.signalHandler.clearSignalCallbacks(["playOnEnd"]);this.signalHandler.registerSignalCallbacks({playOnEnd:a});
|
45
|
+
this.playEvents(-1)};b.prototype.resetCursor=function(){this.cursor=0};b.prototype.resetCursorEnd=function(){this.cursor=this.events.length-1};b.prototype.pause=function(a){var b=this;clearTimeout(b.nextScheduledPlay);Object.keys(b.eventsPlaying).forEach(function(c){b.eventsPlaying[c]&&b.eventsPlaying[c].cancel(a)});b.eventsPlaying={}};b.prototype.playEvents=function(a){var b=this,c=b.events[this.cursor],d=b.events[this.cursor+a],f,g=function(a){b.signalHandler.emitSignal("masterOnEnd",a);b.signalHandler.emitSignal("playOnEnd",
|
46
|
+
a)};c.timelinePath=b;!1===b.signalHandler.emitSignal("onEventStart",c)?g({event:c,cancelled:!0}):(b.eventsPlaying[c.id]=c,c.play({onEnd:function(a){a={event:c,cancelled:!!a};delete b.eventsPlaying[c.id];b.signalHandler.emitSignal("onEventEnd",a);d||g(a)}}),d&&(f=Math.abs(d.time-c.time),1>f?(b.cursor+=a,b.playEvents(a)):this.nextScheduledPlay=setTimeout(function(){b.cursor+=a;b.playEvents(a)},f)))};d.prototype.init=function(a){this.options=a;this.cursor=0;this.paths=a.paths;this.pathsPlaying={};this.signalHandler=
|
47
|
+
new f.SignalHandler(["playOnEnd","masterOnEnd","onPathStart","onPathEnd"]);this.signalHandler.registerSignalCallbacks(c.merge(a,{masterOnEnd:a.onEnd}))};d.prototype.play=function(a){this.pause();this.signalHandler.clearSignalCallbacks(["playOnEnd"]);this.signalHandler.registerSignalCallbacks({playOnEnd:a});this.playPaths(1)};d.prototype.rewind=function(a){this.pause();this.signalHandler.clearSignalCallbacks(["playOnEnd"]);this.signalHandler.registerSignalCallbacks({playOnEnd:a});this.playPaths(-1)};
|
48
|
+
d.prototype.playPaths=function(a){var b=c.splat(this.paths[this.cursor]),d=this.paths[this.cursor+a],f=this,g=this.signalHandler,l=0,r=function(e){g.emitSignal("onPathStart",e);f.pathsPlaying[e.id]=e;e[0<a?"play":"rewind"](function(h){h=h&&h.cancelled;var k={path:e,cancelled:h};delete f.pathsPlaying[e.id];g.emitSignal("onPathEnd",k);l++;l>=b.length&&(d&&!h?(f.cursor+=a,c.splat(d).forEach(function(b){b[0<a?"resetCursor":"resetCursorEnd"]()}),f.playPaths(a)):(g.emitSignal("playOnEnd",k),g.emitSignal("masterOnEnd",
|
49
|
+
k)))})};b.forEach(function(a){a&&(a.timeline=f,setTimeout(function(){r(a)},c.sonification.fadeOutTime))})};d.prototype.pause=function(a){var b=this;Object.keys(b.pathsPlaying).forEach(function(c){b.pathsPlaying[c]&&b.pathsPlaying[c].pause(a)});b.pathsPlaying={}};d.prototype.resetCursor=function(){this.paths.forEach(function(a){c.splat(a).forEach(function(a){a.resetCursor()})});this.cursor=0};d.prototype.resetCursorEnd=function(){this.paths.forEach(function(a){c.splat(a).forEach(function(a){a.resetCursorEnd()})});
|
50
|
+
this.cursor=this.paths.length-1};d.prototype.setCursor=function(a){return this.paths.some(function(b){return c.splat(b).some(function(b){return b.setCursor(a)})})};d.prototype.getCursor=function(){return this.getCurrentPlayingPaths().reduce(function(a,b){a[b.id]=b.getCursor();return a},{})};d.prototype.atStart=function(){return!this.getCurrentPlayingPaths().some(function(a){return a.cursor})};d.prototype.getCurrentPlayingPaths=function(){return c.splat(this.paths[this.cursor])};return{TimelineEvent:g,
|
51
|
+
TimelinePath:b,Timeline:d}}(l,r);(function(c,f,g,b,d,a,e,h){c.sonification={fadeOutDuration:20,utilities:e,Instrument:f,instruments:g,Earcon:b,TimelineEvent:h.TimelineEvent,TimelinePath:h.TimelinePath,Timeline:h.Timeline};c.Point.prototype.sonify=d.pointSonify;c.Point.prototype.cancelSonify=d.pointCancelSonify;c.Series.prototype.sonify=a.seriesSonify;c.extend(c.Chart.prototype,{sonify:a.chartSonify,pauseSonify:a.pause,resumeSonify:a.resume,rewindSonify:a.rewind,cancelSonify:a.cancel,getCurrentSonifyPoints:a.getCurrentPoints,
|
52
|
+
setSonifyCursor:a.setCursor,resetSonifyCursor:a.resetCursor,resetSonifyCursorEnd:a.resetCursorEnd,sonification:{}})})(l,t,w,x,y,A,r,B)});
|
53
|
+
//# sourceMappingURL=sonification.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sonification.js.map","lineCount":52,"mappings":"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","sources":["sonification.src.js"],"names":["factory","module","exports","define","amd","Highcharts","undefined","Instrument","H","options","init","defaultOptions","type","playCallbackInterval","oscillator","waveformShape","prototype","Instrument.prototype.init","initAudioContext","merge","id","uniqueKey","ctx","audioContext","gainNode","createGain","setGain","panNode","createStereoPanner","setPan","connect","destination","initOscillator","playCallbackTimers","error","copy","Instrument.prototype.copy","Instrument.prototype.initAudioContext","Context","win","AudioContext","webkitAudioContext","hasOldContext","state","suspend","createOscillator","Instrument.prototype.initOscillator","oscillatorStarted","Instrument.prototype.setPan","panValue","pan","setValueAtTime","currentTime","Instrument.prototype.setGain","gainValue","rampTime","console","warn","gain","value","linearRampToValueAtTime","cancelGainRamp","Instrument.prototype.cancelGainRamp","cancelScheduledValues","getValidFrequency","Instrument.prototype.getValidFrequency","frequency","min","max","validFrequencies","allowedFrequencies","maximum","pick","Infinity","minimum","length","reduce","acc","cur","Math","abs","clearPlayCallbackTimers","Instrument.prototype.clearPlayCallbackTimers","forEach","timer","clearInterval","setFrequency","Instrument.prototype.setFrequency","frequencyLimits","limits","validFrequency","oscillatorPlay","Instrument.prototype.oscillatorPlay","start","preparePlay","Instrument.prototype.preparePlay","resume","play","Instrument.prototype.play","instrument","duration","setOrStartTimer","setter","setterData","target","currentDurationIx","callbackInterval","setInterval","curTime","push","setTimeout","stopOscillatorTimeout","clearTimeout","stopTimeout","stopCallback","_play","instrument.play","immediate","sonification","fadeOutDuration","onEnd","onStop","stop","minFrequency","maxFrequency","volume","mute","Instrument.prototype.mute","Instrument.prototype.stop","immediately","onStopped","callbackData","instr","reset","e","disconnect","utilities","musicalFrequencies","SignalHandler","supportedSignals","SignalHandler.prototype.init","signals","registerSignalCallbacks","SignalHandler.prototype.registerSignalCallbacks","signalHandler","supportedSignal","clearSignalCallbacks","SignalHandler.prototype.clearSignalCallbacks","signalNames","signalName","emitSignal","SignalHandler.prototype.emitSignal","data","retval","handler","result","getMusicalScale","semitones","filter","freq","i","interval","some","allowedInterval","calculateDataExtremes","chart","prop","series","extremes","points","point","val","virtualAxisTranslate","dataExtremes","lenValueAxis","virtualAxisValue","frequencies","instruments","waveform","Earcon","Earcon.prototype.init","instrumentsPlaying","sonify","Earcon.prototype.sonify","playOptions","masterVolume","masterPan","earcon","playOnEnd","masterOnEnd","opts","instrumentOpts","instrOnEnd","copyId","instrumentOpts.onEnd","apply","arguments","Object","keys","instrumentCopy","cancelSonify","Earcon.prototype.cancelSonify","fadeOut","playing","instrIds","pointSonifyFunctions","defaultInstrumentOptions","minDuration","maxDuration","minVolume","maxVolume","minPan","maxPan","pointSonify","getMappingValue","makeFunction","allowedExtremes","allowedValues","time","currentlyPlayingPoint","isNull","visible","instrumentDefinition","mapping","instrumentMapping","instrumentOptions","cancelled","pointCancelSonify","chartSonifyFunctions","getPointTimeValue","timeProp","getTimeExtremes","getExtremesForInstrumentProps","newExtremes","instrumentParameter","getPointEarcons","earconDefinitions","earcons","earconDefinition","condition","cond","onPoint","makeInstrumentCopies","map","instrumentDef","buildTimelinePathFromSeries","timeExtremes","pointPlayTime","timelineEvents","events","concat","TimelineEvent","eventObject","TimelinePath","onStart","onEventStart","event","Point","timelinePath","timeline","pause","resetCursor","onPointStart","onEventEnd","eventData","onPointEnd","buildSeriesOptions","chartSonifyOptions","seriesOptions","onSeriesStart","onSeriesEnd","isArray","find","optEntry","buildPathOrder","orderOptions","seriesOptionsCallback","order","seriesList","orderList","orderDef","simulItems","splat","items","item","itemObject","get","silentWait","addAfterSeriesWaits","wait","newOrder","simultaneousPaths","getWaitTime","waitTime","def","syncSimultaneousPaths","paths","path","hasEvents","eventsToAdd","addTimelineEvents","getSimulPathDurationTotal","durationTotal","maxPathDuration","buildPathsFromOrder","totalAvailableDurationMs","totalUsedDuration","allPaths","simulPaths","chartSonify","afterSeriesWait","Timeline","seriesSonify","chartSonification","rewind","cancel","pauseSonify","resetSonifyCursor","getCurrentPoints","cursorObj","getCursor","eventObj","setCursor","resetCursorEnd","timelineClasses","TimelineEvent.prototype.init","TimelineEvent.prototype.play","playOptionsOnEnd","args","TimelineEvent.prototype.cancel","TimelinePath.prototype.init","cursor","eventsPlaying","sortEvents","updateEventIdMap","TimelinePath.prototype.sortEvents","sort","a","b","TimelinePath.prototype.updateEventIdMap","eventIdMap","TimelinePath.prototype.addTimelineEvents","newEvents","TimelinePath.prototype.getCursor","TimelinePath.prototype.setCursor","eventId","ix","TimelinePath.prototype.play","playEvents","TimelinePath.prototype.rewind","TimelinePath.prototype.resetCursor","TimelinePath.prototype.resetCursorEnd","TimelinePath.prototype.pause","nextScheduledPlay","TimelinePath.prototype.playEvents","direction","curEvent","nextEvent","timeDiff","signalData","Timeline.prototype.init","pathsPlaying","Timeline.prototype.play","playPaths","Timeline.prototype.rewind","Timeline.prototype.playPaths","curPaths","nextPaths","pathsEnded","playPath","nextPath","fadeOutTime","Timeline.prototype.pause","Timeline.prototype.resetCursor","Timeline.prototype.resetCursorEnd","Timeline.prototype.setCursor","Timeline.prototype.getCursor","getCurrentPlayingPaths","atStart","Timeline.prototype.atStart","Timeline.prototype.getCurrentPlayingPaths","TimelineClasses","Series","extend","Chart","resumeSonify","rewindSonify","getCurrentSonifyPoints","setSonifyCursor","resetSonifyCursorEnd"]}
|
@@ -0,0 +1,3341 @@
|
|
1
|
+
/**
|
2
|
+
* @license Highcharts JS v7.0.3 (2019-02-06)
|
3
|
+
* Sonification module
|
4
|
+
*
|
5
|
+
* (c) 2012-2019 Øystein Moseng
|
6
|
+
*
|
7
|
+
* License: www.highcharts.com/license
|
8
|
+
*/
|
9
|
+
'use strict';
|
10
|
+
(function (factory) {
|
11
|
+
if (typeof module === 'object' && module.exports) {
|
12
|
+
factory['default'] = factory;
|
13
|
+
module.exports = factory;
|
14
|
+
} else if (typeof define === 'function' && define.amd) {
|
15
|
+
define(function () {
|
16
|
+
return factory;
|
17
|
+
});
|
18
|
+
} else {
|
19
|
+
factory(typeof Highcharts !== 'undefined' ? Highcharts : undefined);
|
20
|
+
}
|
21
|
+
}(function (Highcharts) {
|
22
|
+
var Instrument = (function (H) {
|
23
|
+
/* *
|
24
|
+
*
|
25
|
+
* (c) 2009-2019 Øystein Moseng
|
26
|
+
*
|
27
|
+
* Instrument class for sonification module.
|
28
|
+
*
|
29
|
+
* License: www.highcharts.com/license
|
30
|
+
*
|
31
|
+
* */
|
32
|
+
|
33
|
+
|
34
|
+
/**
|
35
|
+
* A set of options for the Instrument class.
|
36
|
+
*
|
37
|
+
* @requires module:modules/sonification
|
38
|
+
*
|
39
|
+
* @interface Highcharts.InstrumentOptionsObject
|
40
|
+
*//**
|
41
|
+
* The type of instrument. Currently only `oscillator` is supported. Defaults
|
42
|
+
* to `oscillator`.
|
43
|
+
* @name Highcharts.InstrumentOptionsObject#type
|
44
|
+
* @type {string|undefined}
|
45
|
+
*//**
|
46
|
+
* The unique ID of the instrument. Generated if not supplied.
|
47
|
+
* @name Highcharts.InstrumentOptionsObject#id
|
48
|
+
* @type {string|undefined}
|
49
|
+
*//**
|
50
|
+
* When using functions to determine frequency or other parameters during
|
51
|
+
* playback, this options specifies how often to call the callback functions.
|
52
|
+
* Number given in milliseconds. Defaults to 20.
|
53
|
+
* @name Highcharts.InstrumentOptionsObject#playCallbackInterval
|
54
|
+
* @type {number|undefined}
|
55
|
+
*//**
|
56
|
+
* A list of allowed frequencies for this instrument. If trying to play a
|
57
|
+
* frequency not on this list, the closest frequency will be used. Set to `null`
|
58
|
+
* to allow all frequencies to be used. Defaults to `null`.
|
59
|
+
* @name Highcharts.InstrumentOptionsObject#allowedFrequencies
|
60
|
+
* @type {Array<number>|undefined}
|
61
|
+
*//**
|
62
|
+
* Options specific to oscillator instruments.
|
63
|
+
* @name Highcharts.InstrumentOptionsObject#oscillator
|
64
|
+
* @type {Highcharts.OscillatorOptionsObject|undefined}
|
65
|
+
*/
|
66
|
+
|
67
|
+
|
68
|
+
/**
|
69
|
+
* Options for playing an instrument.
|
70
|
+
*
|
71
|
+
* @requires module:modules/sonification
|
72
|
+
*
|
73
|
+
* @interface Highcharts.InstrumentPlayOptionsObject
|
74
|
+
*//**
|
75
|
+
* The frequency of the note to play. Can be a fixed number, or a function. The
|
76
|
+
* function receives one argument: the relative time of the note playing (0
|
77
|
+
* being the start, and 1 being the end of the note). It should return the
|
78
|
+
* frequency number for each point in time. The poll interval of this function
|
79
|
+
* is specified by the Instrument.playCallbackInterval option.
|
80
|
+
* @name Highcharts.InstrumentPlayOptionsObject#frequency
|
81
|
+
* @type {number|Function}
|
82
|
+
*//**
|
83
|
+
* The duration of the note in milliseconds.
|
84
|
+
* @name Highcharts.InstrumentPlayOptionsObject#duration
|
85
|
+
* @type {number}
|
86
|
+
*//**
|
87
|
+
* The minimum frequency to allow. If the instrument has a set of allowed
|
88
|
+
* frequencies, the closest frequency is used by default. Use this option to
|
89
|
+
* stop too low frequencies from being used.
|
90
|
+
* @name Highcharts.InstrumentPlayOptionsObject#minFrequency
|
91
|
+
* @type {number|undefined}
|
92
|
+
*//**
|
93
|
+
* The maximum frequency to allow. If the instrument has a set of allowed
|
94
|
+
* frequencies, the closest frequency is used by default. Use this option to
|
95
|
+
* stop too high frequencies from being used.
|
96
|
+
* @name Highcharts.InstrumentPlayOptionsObject#maxFrequency
|
97
|
+
* @type {number|undefined}
|
98
|
+
*//**
|
99
|
+
* The volume of the instrument. Can be a fixed number between 0 and 1, or a
|
100
|
+
* function. The function receives one argument: the relative time of the note
|
101
|
+
* playing (0 being the start, and 1 being the end of the note). It should
|
102
|
+
* return the volume for each point in time. The poll interval of this function
|
103
|
+
* is specified by the Instrument.playCallbackInterval option. Defaults to 1.
|
104
|
+
* @name Highcharts.InstrumentPlayOptionsObject#volume
|
105
|
+
* @type {number|Function|undefined}
|
106
|
+
*//**
|
107
|
+
* The panning of the instrument. Can be a fixed number between -1 and 1, or a
|
108
|
+
* function. The function receives one argument: the relative time of the note
|
109
|
+
* playing (0 being the start, and 1 being the end of the note). It should
|
110
|
+
* return the panning value for each point in time. The poll interval of this
|
111
|
+
* function is specified by the Instrument.playCallbackInterval option.
|
112
|
+
* Defaults to 0.
|
113
|
+
* @name Highcharts.InstrumentPlayOptionsObject#pan
|
114
|
+
* @type {number|Function|undefined}
|
115
|
+
*//**
|
116
|
+
* Callback function to be called when the play is completed.
|
117
|
+
* @name Highcharts.InstrumentPlayOptionsObject#onEnd
|
118
|
+
* @type {Function|undefined}
|
119
|
+
*/
|
120
|
+
|
121
|
+
|
122
|
+
/**
|
123
|
+
* @requires module:modules/sonification
|
124
|
+
*
|
125
|
+
* @interface Highcharts.OscillatorOptionsObject
|
126
|
+
*//**
|
127
|
+
* The waveform shape to use for oscillator instruments. Defaults to `sine`.
|
128
|
+
* @name Highcharts.OscillatorOptionsObject#waveformShape
|
129
|
+
* @type {string|undefined}
|
130
|
+
*/
|
131
|
+
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
// Default options for Instrument constructor
|
136
|
+
var defaultOptions = {
|
137
|
+
type: 'oscillator',
|
138
|
+
playCallbackInterval: 20,
|
139
|
+
oscillator: {
|
140
|
+
waveformShape: 'sine'
|
141
|
+
}
|
142
|
+
};
|
143
|
+
|
144
|
+
|
145
|
+
/**
|
146
|
+
* The Instrument class. Instrument objects represent an instrument capable of
|
147
|
+
* playing a certain pitch for a specified duration.
|
148
|
+
*
|
149
|
+
* @sample highcharts/sonification/instrument/
|
150
|
+
* Using Instruments directly
|
151
|
+
* @sample highcharts/sonification/instrument-advanced/
|
152
|
+
* Using callbacks for instrument parameters
|
153
|
+
*
|
154
|
+
* @requires module:modules/sonification
|
155
|
+
*
|
156
|
+
* @class
|
157
|
+
* @name Highcharts.Instrument
|
158
|
+
*
|
159
|
+
* @param {Highcharts.InstrumentOptionsObject} options
|
160
|
+
* Options for the instrument instance.
|
161
|
+
*/
|
162
|
+
function Instrument(options) {
|
163
|
+
this.init(options);
|
164
|
+
}
|
165
|
+
Instrument.prototype.init = function (options) {
|
166
|
+
if (!this.initAudioContext()) {
|
167
|
+
H.error(29);
|
168
|
+
return;
|
169
|
+
}
|
170
|
+
this.options = H.merge(defaultOptions, options);
|
171
|
+
this.id = this.options.id = options && options.id || H.uniqueKey();
|
172
|
+
|
173
|
+
// Init the audio nodes
|
174
|
+
var ctx = H.audioContext;
|
175
|
+
|
176
|
+
this.gainNode = ctx.createGain();
|
177
|
+
this.setGain(0);
|
178
|
+
this.panNode = ctx.createStereoPanner && ctx.createStereoPanner();
|
179
|
+
if (this.panNode) {
|
180
|
+
this.setPan(0);
|
181
|
+
this.gainNode.connect(this.panNode);
|
182
|
+
this.panNode.connect(ctx.destination);
|
183
|
+
} else {
|
184
|
+
this.gainNode.connect(ctx.destination);
|
185
|
+
}
|
186
|
+
|
187
|
+
// Oscillator initialization
|
188
|
+
if (this.options.type === 'oscillator') {
|
189
|
+
this.initOscillator(this.options.oscillator);
|
190
|
+
}
|
191
|
+
|
192
|
+
// Init timer list
|
193
|
+
this.playCallbackTimers = [];
|
194
|
+
};
|
195
|
+
|
196
|
+
|
197
|
+
/**
|
198
|
+
* Return a copy of an instrument. Only one instrument instance can play at a
|
199
|
+
* time, so use this to get a new copy of the instrument that can play alongside
|
200
|
+
* it. The new instrument copy will receive a new ID unless one is supplied in
|
201
|
+
* options.
|
202
|
+
*
|
203
|
+
* @function Highcharts.Instrument#copy
|
204
|
+
*
|
205
|
+
* @param {Highcharts.InstrumentOptionsObject} [options]
|
206
|
+
* Options to merge in for the copy.
|
207
|
+
*
|
208
|
+
* @return {Highcharts.Instrument}
|
209
|
+
* A new Instrument instance with the same options.
|
210
|
+
*/
|
211
|
+
Instrument.prototype.copy = function (options) {
|
212
|
+
return new Instrument(H.merge(this.options, { id: null }, options));
|
213
|
+
};
|
214
|
+
|
215
|
+
|
216
|
+
/**
|
217
|
+
* Init the audio context, if we do not have one.
|
218
|
+
* @private
|
219
|
+
* @return {boolean} True if successful, false if not.
|
220
|
+
*/
|
221
|
+
Instrument.prototype.initAudioContext = function () {
|
222
|
+
var Context = H.win.AudioContext || H.win.webkitAudioContext,
|
223
|
+
hasOldContext = !!H.audioContext;
|
224
|
+
|
225
|
+
if (Context) {
|
226
|
+
H.audioContext = H.audioContext || new Context();
|
227
|
+
if (
|
228
|
+
!hasOldContext &&
|
229
|
+
H.audioContext &&
|
230
|
+
H.audioContext.state === 'running'
|
231
|
+
) {
|
232
|
+
H.audioContext.suspend(); // Pause until we need it
|
233
|
+
}
|
234
|
+
return !!(
|
235
|
+
H.audioContext &&
|
236
|
+
H.audioContext.createOscillator &&
|
237
|
+
H.audioContext.createGain
|
238
|
+
);
|
239
|
+
}
|
240
|
+
return false;
|
241
|
+
};
|
242
|
+
|
243
|
+
|
244
|
+
/**
|
245
|
+
* Init an oscillator instrument.
|
246
|
+
* @private
|
247
|
+
* @param {object} oscillatorOptions - The oscillator options passed to
|
248
|
+
* Highcharts.Instrument#init.
|
249
|
+
*/
|
250
|
+
Instrument.prototype.initOscillator = function (options) {
|
251
|
+
var ctx = H.audioContext;
|
252
|
+
|
253
|
+
this.oscillator = ctx.createOscillator();
|
254
|
+
this.oscillator.type = options.waveformShape;
|
255
|
+
this.oscillator.connect(this.gainNode);
|
256
|
+
this.oscillatorStarted = false;
|
257
|
+
};
|
258
|
+
|
259
|
+
|
260
|
+
/**
|
261
|
+
* Set pan position.
|
262
|
+
* @private
|
263
|
+
* @param {number} panValue - The pan position to set for the instrument.
|
264
|
+
*/
|
265
|
+
Instrument.prototype.setPan = function (panValue) {
|
266
|
+
if (this.panNode) {
|
267
|
+
this.panNode.pan.setValueAtTime(panValue, H.audioContext.currentTime);
|
268
|
+
}
|
269
|
+
};
|
270
|
+
|
271
|
+
|
272
|
+
/**
|
273
|
+
* Set gain level. A maximum of 1.2 is allowed before we emit a warning. The
|
274
|
+
* actual volume is not set above this level regardless of input.
|
275
|
+
* @private
|
276
|
+
* @param {number} gainValue - The gain level to set for the instrument.
|
277
|
+
* @param {number} [rampTime=0] - Gradually change the gain level, time given in
|
278
|
+
* milliseconds.
|
279
|
+
*/
|
280
|
+
Instrument.prototype.setGain = function (gainValue, rampTime) {
|
281
|
+
if (this.gainNode) {
|
282
|
+
if (gainValue > 1.2) {
|
283
|
+
console.warn( // eslint-disable-line
|
284
|
+
'Highcharts sonification warning: ' +
|
285
|
+
'Volume of instrument set too high.'
|
286
|
+
);
|
287
|
+
gainValue = 1.2;
|
288
|
+
}
|
289
|
+
if (rampTime) {
|
290
|
+
this.gainNode.gain.setValueAtTime(
|
291
|
+
this.gainNode.gain.value, H.audioContext.currentTime
|
292
|
+
);
|
293
|
+
this.gainNode.gain.linearRampToValueAtTime(
|
294
|
+
gainValue,
|
295
|
+
H.audioContext.currentTime + rampTime / 1000
|
296
|
+
);
|
297
|
+
} else {
|
298
|
+
this.gainNode.gain.setValueAtTime(
|
299
|
+
gainValue, H.audioContext.currentTime
|
300
|
+
);
|
301
|
+
}
|
302
|
+
}
|
303
|
+
};
|
304
|
+
|
305
|
+
|
306
|
+
/**
|
307
|
+
* Cancel ongoing gain ramps.
|
308
|
+
* @private
|
309
|
+
*/
|
310
|
+
Instrument.prototype.cancelGainRamp = function () {
|
311
|
+
if (this.gainNode) {
|
312
|
+
this.gainNode.gain.cancelScheduledValues(0);
|
313
|
+
}
|
314
|
+
};
|
315
|
+
|
316
|
+
|
317
|
+
/**
|
318
|
+
* Get the closest valid frequency for this instrument.
|
319
|
+
* @private
|
320
|
+
* @param {number} frequency - The target frequency.
|
321
|
+
* @param {number} [min] - Minimum frequency to return.
|
322
|
+
* @param {number} [max] - Maximum frequency to return.
|
323
|
+
* @return {number} The closest valid frequency to the input frequency.
|
324
|
+
*/
|
325
|
+
Instrument.prototype.getValidFrequency = function (frequency, min, max) {
|
326
|
+
var validFrequencies = this.options.allowedFrequencies,
|
327
|
+
maximum = H.pick(max, Infinity),
|
328
|
+
minimum = H.pick(min, -Infinity);
|
329
|
+
|
330
|
+
return !validFrequencies || !validFrequencies.length ?
|
331
|
+
// No valid frequencies for this instrument, return the target
|
332
|
+
frequency :
|
333
|
+
// Use the valid frequencies and return the closest match
|
334
|
+
validFrequencies.reduce(function (acc, cur) {
|
335
|
+
// Find the closest allowed value
|
336
|
+
return Math.abs(cur - frequency) < Math.abs(acc - frequency) &&
|
337
|
+
cur < maximum && cur > minimum ?
|
338
|
+
cur : acc;
|
339
|
+
}, Infinity);
|
340
|
+
};
|
341
|
+
|
342
|
+
|
343
|
+
/**
|
344
|
+
* Clear existing play callback timers.
|
345
|
+
* @private
|
346
|
+
*/
|
347
|
+
Instrument.prototype.clearPlayCallbackTimers = function () {
|
348
|
+
this.playCallbackTimers.forEach(function (timer) {
|
349
|
+
clearInterval(timer);
|
350
|
+
});
|
351
|
+
this.playCallbackTimers = [];
|
352
|
+
};
|
353
|
+
|
354
|
+
|
355
|
+
/**
|
356
|
+
* Set the current frequency being played by the instrument. The closest valid
|
357
|
+
* frequency between the frequency limits is used.
|
358
|
+
* @param {number} frequency - The frequency to set.
|
359
|
+
* @param {object} [frequencyLimits] - Object with maxFrequency and minFrequency
|
360
|
+
*/
|
361
|
+
Instrument.prototype.setFrequency = function (frequency, frequencyLimits) {
|
362
|
+
var limits = frequencyLimits || {},
|
363
|
+
validFrequency = this.getValidFrequency(
|
364
|
+
frequency, limits.min, limits.max
|
365
|
+
);
|
366
|
+
|
367
|
+
if (this.options.type === 'oscillator') {
|
368
|
+
this.oscillatorPlay(validFrequency);
|
369
|
+
}
|
370
|
+
};
|
371
|
+
|
372
|
+
|
373
|
+
/**
|
374
|
+
* Play oscillator instrument.
|
375
|
+
* @private
|
376
|
+
* @param {number} frequency - The frequency to play.
|
377
|
+
*/
|
378
|
+
Instrument.prototype.oscillatorPlay = function (frequency) {
|
379
|
+
if (!this.oscillatorStarted) {
|
380
|
+
this.oscillator.start();
|
381
|
+
this.oscillatorStarted = true;
|
382
|
+
}
|
383
|
+
|
384
|
+
this.oscillator.frequency.setValueAtTime(
|
385
|
+
frequency, H.audioContext.currentTime
|
386
|
+
);
|
387
|
+
};
|
388
|
+
|
389
|
+
|
390
|
+
/**
|
391
|
+
* Prepare instrument before playing. Resumes the audio context and starts the
|
392
|
+
* oscillator.
|
393
|
+
* @private
|
394
|
+
*/
|
395
|
+
Instrument.prototype.preparePlay = function () {
|
396
|
+
this.setGain(0.001);
|
397
|
+
if (H.audioContext.state === 'suspended') {
|
398
|
+
H.audioContext.resume();
|
399
|
+
}
|
400
|
+
if (this.oscillator && !this.oscillatorStarted) {
|
401
|
+
this.oscillator.start();
|
402
|
+
this.oscillatorStarted = true;
|
403
|
+
}
|
404
|
+
};
|
405
|
+
|
406
|
+
|
407
|
+
/**
|
408
|
+
* Play the instrument according to options.
|
409
|
+
*
|
410
|
+
* @sample highcharts/sonification/instrument/
|
411
|
+
* Using Instruments directly
|
412
|
+
* @sample highcharts/sonification/instrument-advanced/
|
413
|
+
* Using callbacks for instrument parameters
|
414
|
+
*
|
415
|
+
* @function Highcharts.Instrument#play
|
416
|
+
*
|
417
|
+
* @param {Highcharts.InstrumentPlayOptionsObject} options
|
418
|
+
* Options for the playback of the instrument.
|
419
|
+
*/
|
420
|
+
Instrument.prototype.play = function (options) {
|
421
|
+
var instrument = this,
|
422
|
+
duration = options.duration || 0,
|
423
|
+
// Set a value, or if it is a function, set it continously as a timer.
|
424
|
+
// Pass in the value/function to set, the setter function, and any
|
425
|
+
// additional data to pass through to the setter function.
|
426
|
+
setOrStartTimer = function (value, setter, setterData) {
|
427
|
+
var target = options.duration,
|
428
|
+
currentDurationIx = 0,
|
429
|
+
callbackInterval = instrument.options.playCallbackInterval;
|
430
|
+
|
431
|
+
if (typeof value === 'function') {
|
432
|
+
var timer = setInterval(function () {
|
433
|
+
currentDurationIx++;
|
434
|
+
var curTime = currentDurationIx * callbackInterval / target;
|
435
|
+
|
436
|
+
if (curTime >= 1) {
|
437
|
+
instrument[setter](value(1), setterData);
|
438
|
+
clearInterval(timer);
|
439
|
+
} else {
|
440
|
+
instrument[setter](value(curTime), setterData);
|
441
|
+
}
|
442
|
+
}, callbackInterval);
|
443
|
+
|
444
|
+
instrument.playCallbackTimers.push(timer);
|
445
|
+
} else {
|
446
|
+
instrument[setter](value, setterData);
|
447
|
+
}
|
448
|
+
};
|
449
|
+
|
450
|
+
if (!instrument.id) {
|
451
|
+
// No audio support - do nothing
|
452
|
+
return;
|
453
|
+
}
|
454
|
+
|
455
|
+
// If the AudioContext is suspended we have to resume it before playing
|
456
|
+
if (
|
457
|
+
H.audioContext.state === 'suspended' ||
|
458
|
+
this.oscillator && !this.oscillatorStarted
|
459
|
+
) {
|
460
|
+
instrument.preparePlay();
|
461
|
+
// Try again in 10ms
|
462
|
+
setTimeout(function () {
|
463
|
+
instrument.play(options);
|
464
|
+
}, 10);
|
465
|
+
return;
|
466
|
+
}
|
467
|
+
|
468
|
+
// Clear any existing play timers
|
469
|
+
if (instrument.playCallbackTimers.length) {
|
470
|
+
instrument.clearPlayCallbackTimers();
|
471
|
+
}
|
472
|
+
|
473
|
+
// Clear any gain ramps
|
474
|
+
instrument.cancelGainRamp();
|
475
|
+
|
476
|
+
// Clear stop oscillator timer
|
477
|
+
if (instrument.stopOscillatorTimeout) {
|
478
|
+
clearTimeout(instrument.stopOscillatorTimeout);
|
479
|
+
delete instrument.stopOscillatorTimeout;
|
480
|
+
}
|
481
|
+
|
482
|
+
// If a note is playing right now, clear the stop timeout, and call the
|
483
|
+
// callback.
|
484
|
+
if (instrument.stopTimeout) {
|
485
|
+
clearTimeout(instrument.stopTimeout);
|
486
|
+
delete instrument.stopTimeout;
|
487
|
+
if (instrument.stopCallback) {
|
488
|
+
// We have a callback for the play we are interrupting. We do not
|
489
|
+
// allow this callback to start a new play, because that leads to
|
490
|
+
// chaos. We pass in 'cancelled' to indicate that this note did not
|
491
|
+
// finish, but still stopped.
|
492
|
+
instrument._play = instrument.play;
|
493
|
+
instrument.play = function () { };
|
494
|
+
instrument.stopCallback('cancelled');
|
495
|
+
instrument.play = instrument._play;
|
496
|
+
}
|
497
|
+
}
|
498
|
+
|
499
|
+
// Stop the note without fadeOut if the duration is too short to hear the
|
500
|
+
// note otherwise.
|
501
|
+
var immediate = duration < H.sonification.fadeOutDuration + 20;
|
502
|
+
|
503
|
+
// Stop the instrument after the duration of the note
|
504
|
+
instrument.stopCallback = options.onEnd;
|
505
|
+
var onStop = function () {
|
506
|
+
delete instrument.stopTimeout;
|
507
|
+
instrument.stop(immediate);
|
508
|
+
};
|
509
|
+
|
510
|
+
if (duration) {
|
511
|
+
instrument.stopTimeout = setTimeout(
|
512
|
+
onStop,
|
513
|
+
immediate ? duration :
|
514
|
+
duration - H.sonification.fadeOutDuration
|
515
|
+
);
|
516
|
+
|
517
|
+
// Play the note
|
518
|
+
setOrStartTimer(options.frequency, 'setFrequency', null, {
|
519
|
+
minFrequency: options.minFrequency,
|
520
|
+
maxFrequency: options.maxFrequency
|
521
|
+
});
|
522
|
+
|
523
|
+
// Set the volume and panning
|
524
|
+
setOrStartTimer(H.pick(options.volume, 1), 'setGain', 4); // Slight ramp
|
525
|
+
setOrStartTimer(H.pick(options.pan, 0), 'setPan');
|
526
|
+
} else {
|
527
|
+
// No note duration, so just stop immediately
|
528
|
+
onStop();
|
529
|
+
}
|
530
|
+
};
|
531
|
+
|
532
|
+
|
533
|
+
/**
|
534
|
+
* Mute an instrument that is playing. If the instrument is not currently
|
535
|
+
* playing, this function does nothing.
|
536
|
+
*
|
537
|
+
* @function Highcharts.Instrument#mute
|
538
|
+
*/
|
539
|
+
Instrument.prototype.mute = function () {
|
540
|
+
this.setGain(0.0001, H.sonification.fadeOutDuration * 0.8);
|
541
|
+
};
|
542
|
+
|
543
|
+
|
544
|
+
/**
|
545
|
+
* Stop the instrument playing.
|
546
|
+
*
|
547
|
+
* @function Highcharts.Instrument#stop
|
548
|
+
*
|
549
|
+
* @param {boolean} immediately
|
550
|
+
* Whether to do the stop immediately or fade out.
|
551
|
+
*
|
552
|
+
* @param {Function} onStopped
|
553
|
+
* Callback function to be called when the stop is completed.
|
554
|
+
*
|
555
|
+
* @param {*} callbackData
|
556
|
+
* Data to send to the onEnd callback functions.
|
557
|
+
*/
|
558
|
+
Instrument.prototype.stop = function (immediately, onStopped, callbackData) {
|
559
|
+
var instr = this,
|
560
|
+
reset = function () {
|
561
|
+
// Remove timeout reference
|
562
|
+
if (instr.stopOscillatorTimeout) {
|
563
|
+
delete instr.stopOscillatorTimeout;
|
564
|
+
}
|
565
|
+
// The oscillator may have stopped in the meantime here, so allow
|
566
|
+
// this function to fail if so.
|
567
|
+
try {
|
568
|
+
instr.oscillator.stop();
|
569
|
+
} catch (e) {}
|
570
|
+
instr.oscillator.disconnect(instr.gainNode);
|
571
|
+
// We need a new oscillator in order to restart it
|
572
|
+
instr.initOscillator(instr.options.oscillator);
|
573
|
+
// Done stopping, call the callback from the stop
|
574
|
+
if (onStopped) {
|
575
|
+
onStopped(callbackData);
|
576
|
+
}
|
577
|
+
// Call the callback for the play we finished
|
578
|
+
if (instr.stopCallback) {
|
579
|
+
instr.stopCallback(callbackData);
|
580
|
+
}
|
581
|
+
};
|
582
|
+
|
583
|
+
// Clear any existing timers
|
584
|
+
if (instr.playCallbackTimers.length) {
|
585
|
+
instr.clearPlayCallbackTimers();
|
586
|
+
}
|
587
|
+
if (instr.stopTimeout) {
|
588
|
+
clearTimeout(instr.stopTimeout);
|
589
|
+
}
|
590
|
+
if (immediately) {
|
591
|
+
instr.setGain(0);
|
592
|
+
reset();
|
593
|
+
} else {
|
594
|
+
instr.mute();
|
595
|
+
// Stop the oscillator after the mute fade-out has finished
|
596
|
+
instr.stopOscillatorTimeout =
|
597
|
+
setTimeout(reset, H.sonification.fadeOutDuration + 100);
|
598
|
+
}
|
599
|
+
};
|
600
|
+
|
601
|
+
|
602
|
+
|
603
|
+
return Instrument;
|
604
|
+
}(Highcharts));
|
605
|
+
var frequencies = (function () {
|
606
|
+
/* *
|
607
|
+
*
|
608
|
+
* (c) 2009-2019 Øystein Moseng
|
609
|
+
*
|
610
|
+
* List of musical frequencies from C0 to C8.
|
611
|
+
*
|
612
|
+
* License: www.highcharts.com/license
|
613
|
+
*
|
614
|
+
* */
|
615
|
+
|
616
|
+
|
617
|
+
var frequencies = [
|
618
|
+
16.351597831287414, // C0
|
619
|
+
17.323914436054505,
|
620
|
+
18.354047994837977,
|
621
|
+
19.445436482630058,
|
622
|
+
20.601722307054366,
|
623
|
+
21.826764464562746,
|
624
|
+
23.12465141947715,
|
625
|
+
24.499714748859326,
|
626
|
+
25.956543598746574,
|
627
|
+
27.5, // A0
|
628
|
+
29.13523509488062,
|
629
|
+
30.86770632850775,
|
630
|
+
32.70319566257483, // C1
|
631
|
+
34.64782887210901,
|
632
|
+
36.70809598967594,
|
633
|
+
38.890872965260115,
|
634
|
+
41.20344461410875,
|
635
|
+
43.653528929125486,
|
636
|
+
46.2493028389543,
|
637
|
+
48.999429497718666,
|
638
|
+
51.91308719749314,
|
639
|
+
55, // A1
|
640
|
+
58.27047018976124,
|
641
|
+
61.7354126570155,
|
642
|
+
65.40639132514966, // C2
|
643
|
+
69.29565774421802,
|
644
|
+
73.41619197935188,
|
645
|
+
77.78174593052023,
|
646
|
+
82.4068892282175,
|
647
|
+
87.30705785825097,
|
648
|
+
92.4986056779086,
|
649
|
+
97.99885899543733,
|
650
|
+
103.82617439498628,
|
651
|
+
110, // A2
|
652
|
+
116.54094037952248,
|
653
|
+
123.47082531403103,
|
654
|
+
130.8127826502993, // C3
|
655
|
+
138.59131548843604,
|
656
|
+
146.8323839587038,
|
657
|
+
155.56349186104046,
|
658
|
+
164.81377845643496,
|
659
|
+
174.61411571650194,
|
660
|
+
184.9972113558172,
|
661
|
+
195.99771799087463,
|
662
|
+
207.65234878997256,
|
663
|
+
220, // A3
|
664
|
+
233.08188075904496,
|
665
|
+
246.94165062806206,
|
666
|
+
261.6255653005986, // C4
|
667
|
+
277.1826309768721,
|
668
|
+
293.6647679174076,
|
669
|
+
311.1269837220809,
|
670
|
+
329.6275569128699,
|
671
|
+
349.2282314330039,
|
672
|
+
369.9944227116344,
|
673
|
+
391.99543598174927,
|
674
|
+
415.3046975799451,
|
675
|
+
440, // A4
|
676
|
+
466.1637615180899,
|
677
|
+
493.8833012561241,
|
678
|
+
523.2511306011972, // C5
|
679
|
+
554.3652619537442,
|
680
|
+
587.3295358348151,
|
681
|
+
622.2539674441618,
|
682
|
+
659.2551138257398,
|
683
|
+
698.4564628660078,
|
684
|
+
739.9888454232688,
|
685
|
+
783.9908719634985,
|
686
|
+
830.6093951598903,
|
687
|
+
880, // A5
|
688
|
+
932.3275230361799,
|
689
|
+
987.7666025122483,
|
690
|
+
1046.5022612023945, // C6
|
691
|
+
1108.7305239074883,
|
692
|
+
1174.6590716696303,
|
693
|
+
1244.5079348883237,
|
694
|
+
1318.5102276514797,
|
695
|
+
1396.9129257320155,
|
696
|
+
1479.9776908465376,
|
697
|
+
1567.981743926997,
|
698
|
+
1661.2187903197805,
|
699
|
+
1760, // A6
|
700
|
+
1864.6550460723597,
|
701
|
+
1975.533205024496,
|
702
|
+
2093.004522404789, // C7
|
703
|
+
2217.4610478149766,
|
704
|
+
2349.31814333926,
|
705
|
+
2489.0158697766474,
|
706
|
+
2637.02045530296,
|
707
|
+
2793.825851464031,
|
708
|
+
2959.955381693075,
|
709
|
+
3135.9634878539946,
|
710
|
+
3322.437580639561,
|
711
|
+
3520, // A7
|
712
|
+
3729.3100921447194,
|
713
|
+
3951.066410048992,
|
714
|
+
4186.009044809578 // C8
|
715
|
+
];
|
716
|
+
|
717
|
+
|
718
|
+
return frequencies;
|
719
|
+
}());
|
720
|
+
var utilities = (function (musicalFrequencies) {
|
721
|
+
/* *
|
722
|
+
*
|
723
|
+
* (c) 2009-2019 Øystein Moseng
|
724
|
+
*
|
725
|
+
* Utility functions for sonification.
|
726
|
+
*
|
727
|
+
* License: www.highcharts.com/license
|
728
|
+
*
|
729
|
+
* */
|
730
|
+
|
731
|
+
|
732
|
+
|
733
|
+
|
734
|
+
/**
|
735
|
+
* The SignalHandler class. Stores signal callbacks (event handlers), and
|
736
|
+
* provides an interface to register them, and emit signals. The word "event" is
|
737
|
+
* not used to avoid confusion with TimelineEvents.
|
738
|
+
*
|
739
|
+
* @requires module:modules/sonification
|
740
|
+
*
|
741
|
+
* @private
|
742
|
+
* @class
|
743
|
+
* @name Highcharts.SignalHandler
|
744
|
+
*
|
745
|
+
* @param {Array<string>} supportedSignals
|
746
|
+
* List of supported signal names.
|
747
|
+
*/
|
748
|
+
function SignalHandler(supportedSignals) {
|
749
|
+
this.init(supportedSignals || []);
|
750
|
+
}
|
751
|
+
SignalHandler.prototype.init = function (supportedSignals) {
|
752
|
+
this.supportedSignals = supportedSignals;
|
753
|
+
this.signals = {};
|
754
|
+
};
|
755
|
+
|
756
|
+
|
757
|
+
/**
|
758
|
+
* Register a set of signal callbacks with this SignalHandler.
|
759
|
+
* Multiple signal callbacks can be registered for the same signal.
|
760
|
+
* @private
|
761
|
+
* @param {object} signals - An object that contains a mapping from the signal
|
762
|
+
* name to the callbacks. Only supported events are considered.
|
763
|
+
*/
|
764
|
+
SignalHandler.prototype.registerSignalCallbacks = function (signals) {
|
765
|
+
var signalHandler = this;
|
766
|
+
|
767
|
+
signalHandler.supportedSignals.forEach(function (supportedSignal) {
|
768
|
+
if (signals[supportedSignal]) {
|
769
|
+
(
|
770
|
+
signalHandler.signals[supportedSignal] =
|
771
|
+
signalHandler.signals[supportedSignal] || []
|
772
|
+
).push(
|
773
|
+
signals[supportedSignal]
|
774
|
+
);
|
775
|
+
}
|
776
|
+
});
|
777
|
+
};
|
778
|
+
|
779
|
+
|
780
|
+
/**
|
781
|
+
* Clear signal callbacks, optionally by name.
|
782
|
+
* @private
|
783
|
+
* @param {Array<string>} [signalNames] - A list of signal names to clear. If
|
784
|
+
* not supplied, all signal callbacks are removed.
|
785
|
+
*/
|
786
|
+
SignalHandler.prototype.clearSignalCallbacks = function (signalNames) {
|
787
|
+
var signalHandler = this;
|
788
|
+
|
789
|
+
if (signalNames) {
|
790
|
+
signalNames.forEach(function (signalName) {
|
791
|
+
if (signalHandler.signals[signalName]) {
|
792
|
+
delete signalHandler.signals[signalName];
|
793
|
+
}
|
794
|
+
});
|
795
|
+
} else {
|
796
|
+
signalHandler.signals = {};
|
797
|
+
}
|
798
|
+
};
|
799
|
+
|
800
|
+
|
801
|
+
/**
|
802
|
+
* Emit a signal. Does nothing if the signal does not exist, or has no
|
803
|
+
* registered callbacks.
|
804
|
+
* @private
|
805
|
+
* @param {string} signalNames - Name of signal to emit.
|
806
|
+
* @param {*} data - Data to pass to the callback.
|
807
|
+
*/
|
808
|
+
SignalHandler.prototype.emitSignal = function (signalName, data) {
|
809
|
+
var retval;
|
810
|
+
|
811
|
+
if (this.signals[signalName]) {
|
812
|
+
this.signals[signalName].forEach(function (handler) {
|
813
|
+
var result = handler(data);
|
814
|
+
|
815
|
+
retval = result !== undefined ? result : retval;
|
816
|
+
});
|
817
|
+
}
|
818
|
+
return retval;
|
819
|
+
};
|
820
|
+
|
821
|
+
|
822
|
+
var utilities = {
|
823
|
+
|
824
|
+
// List of musical frequencies from C0 to C8
|
825
|
+
musicalFrequencies: musicalFrequencies,
|
826
|
+
|
827
|
+
// SignalHandler class
|
828
|
+
SignalHandler: SignalHandler,
|
829
|
+
|
830
|
+
/**
|
831
|
+
* Get a musical scale by specifying the semitones from 1-12 to include.
|
832
|
+
* 1: C, 2: C#, 3: D, 4: D#, 5: E, 6: F,
|
833
|
+
* 7: F#, 8: G, 9: G#, 10: A, 11: Bb, 12: B
|
834
|
+
* @private
|
835
|
+
* @param {Array<number>} semitones - Array of semitones from 1-12 to
|
836
|
+
* include in the scale. Duplicate entries are ignored.
|
837
|
+
* @return {Array<number>} Array of frequencies from C0 to C8 that are
|
838
|
+
* included in this scale.
|
839
|
+
*/
|
840
|
+
getMusicalScale: function (semitones) {
|
841
|
+
return musicalFrequencies.filter(function (freq, i) {
|
842
|
+
var interval = i % 12 + 1;
|
843
|
+
|
844
|
+
return semitones.some(function (allowedInterval) {
|
845
|
+
return allowedInterval === interval;
|
846
|
+
});
|
847
|
+
});
|
848
|
+
},
|
849
|
+
|
850
|
+
/**
|
851
|
+
* Calculate the extreme values in a chart for a data prop.
|
852
|
+
* @private
|
853
|
+
* @param {Highcharts.Chart} chart - The chart
|
854
|
+
* @param {string} prop - The data prop to find extremes for
|
855
|
+
* @return {object} Object with min and max properties
|
856
|
+
*/
|
857
|
+
calculateDataExtremes: function (chart, prop) {
|
858
|
+
return chart.series.reduce(function (extremes, series) {
|
859
|
+
// We use cropped points rather than series.data here, to allow
|
860
|
+
// users to zoom in for better fidelity.
|
861
|
+
series.points.forEach(function (point) {
|
862
|
+
var val = point[prop] !== undefined ?
|
863
|
+
point[prop] : point.options[prop];
|
864
|
+
|
865
|
+
extremes.min = Math.min(extremes.min, val);
|
866
|
+
extremes.max = Math.max(extremes.max, val);
|
867
|
+
});
|
868
|
+
return extremes;
|
869
|
+
}, {
|
870
|
+
min: Infinity,
|
871
|
+
max: -Infinity
|
872
|
+
});
|
873
|
+
},
|
874
|
+
|
875
|
+
/**
|
876
|
+
* Translate a value on a virtual axis. Creates a new, virtual, axis with a
|
877
|
+
* min and max, and maps the relative value onto this axis.
|
878
|
+
* @private
|
879
|
+
* @param {number} value - The relative data value to translate.
|
880
|
+
* @param {object} dataExtremes - The possible extremes for this value.
|
881
|
+
* @param {object} limits - Limits for the virtual axis.
|
882
|
+
* @return {number} The value mapped to the virtual axis.
|
883
|
+
*/
|
884
|
+
virtualAxisTranslate: function (value, dataExtremes, limits) {
|
885
|
+
var lenValueAxis = dataExtremes.max - dataExtremes.min,
|
886
|
+
lenVirtualAxis = limits.max - limits.min,
|
887
|
+
virtualAxisValue = limits.min +
|
888
|
+
lenVirtualAxis * (value - dataExtremes.min) / lenValueAxis;
|
889
|
+
|
890
|
+
return lenValueAxis > 0 ?
|
891
|
+
Math.max(Math.min(virtualAxisValue, limits.max), limits.min) :
|
892
|
+
limits.min;
|
893
|
+
}
|
894
|
+
};
|
895
|
+
|
896
|
+
|
897
|
+
return utilities;
|
898
|
+
}(frequencies));
|
899
|
+
var instruments = (function (Instrument, utilities) {
|
900
|
+
/* *
|
901
|
+
*
|
902
|
+
* (c) 2009-2019 Øystein Moseng
|
903
|
+
*
|
904
|
+
* Instrument definitions for sonification module.
|
905
|
+
*
|
906
|
+
* License: www.highcharts.com/license
|
907
|
+
*
|
908
|
+
* */
|
909
|
+
|
910
|
+
|
911
|
+
|
912
|
+
var instruments = {};
|
913
|
+
|
914
|
+
['sine', 'square', 'triangle', 'sawtooth'].forEach(function (waveform) {
|
915
|
+
// Add basic instruments
|
916
|
+
instruments[waveform] = new Instrument({
|
917
|
+
oscillator: { waveformShape: waveform }
|
918
|
+
});
|
919
|
+
|
920
|
+
// Add musical instruments
|
921
|
+
instruments[waveform + 'Musical'] = new Instrument({
|
922
|
+
allowedFrequencies: utilities.musicalFrequencies,
|
923
|
+
oscillator: { waveformShape: waveform }
|
924
|
+
});
|
925
|
+
|
926
|
+
// Add scaled instruments
|
927
|
+
instruments[waveform + 'Major'] = new Instrument({
|
928
|
+
allowedFrequencies: utilities.getMusicalScale([1, 3, 5, 6, 8, 10, 12]),
|
929
|
+
oscillator: { waveformShape: waveform }
|
930
|
+
});
|
931
|
+
});
|
932
|
+
|
933
|
+
|
934
|
+
return instruments;
|
935
|
+
}(Instrument, utilities));
|
936
|
+
var Earcon = (function (H) {
|
937
|
+
/* *
|
938
|
+
*
|
939
|
+
* (c) 2009-2019 Øystein Moseng
|
940
|
+
*
|
941
|
+
* Earcons for the sonification module in Highcharts.
|
942
|
+
*
|
943
|
+
* License: www.highcharts.com/license
|
944
|
+
*
|
945
|
+
* */
|
946
|
+
|
947
|
+
|
948
|
+
|
949
|
+
/**
|
950
|
+
* Define an Instrument and the options for playing it.
|
951
|
+
*
|
952
|
+
* @requires module:modules/sonification
|
953
|
+
*
|
954
|
+
* @interface Highcharts.EarconInstrument
|
955
|
+
*//**
|
956
|
+
* An instrument instance or the name of the instrument in the
|
957
|
+
* Highcharts.sonification.instruments map.
|
958
|
+
* @name Highcharts.EarconInstrument#instrument
|
959
|
+
* @type {Highcharts.Instrument|String}
|
960
|
+
*//**
|
961
|
+
* The options to pass to Instrument.play.
|
962
|
+
* @name Highcharts.EarconInstrument#playOptions
|
963
|
+
* @type {object}
|
964
|
+
*/
|
965
|
+
|
966
|
+
|
967
|
+
/**
|
968
|
+
* Options for an Earcon.
|
969
|
+
*
|
970
|
+
* @requires module:modules/sonification
|
971
|
+
*
|
972
|
+
* @interface Highcharts.EarconOptionsObject
|
973
|
+
*//**
|
974
|
+
* The instruments and their options defining this earcon.
|
975
|
+
* @name Highcharts.EarconOptionsObject#instruments
|
976
|
+
* @type {Array<Highcharts.EarconInstrument>}
|
977
|
+
*//**
|
978
|
+
* The unique ID of the Earcon. Generated if not supplied.
|
979
|
+
* @name Highcharts.EarconOptionsObject#id
|
980
|
+
* @type {string|undefined}
|
981
|
+
*//**
|
982
|
+
* Global panning of all instruments. Overrides all panning on individual
|
983
|
+
* instruments. Can be a number between -1 and 1.
|
984
|
+
* @name Highcharts.EarconOptionsObject#pan
|
985
|
+
* @type {number|undefined}
|
986
|
+
*//**
|
987
|
+
* Master volume for all instruments. Volume settings on individual instruments
|
988
|
+
* can still be used for relative volume between the instruments. This setting
|
989
|
+
* does not affect volumes set by functions in individual instruments. Can be a
|
990
|
+
* number between 0 and 1. Defaults to 1.
|
991
|
+
* @name Highcharts.EarconOptionsObject#volume
|
992
|
+
* @type {number|undefined}
|
993
|
+
*//**
|
994
|
+
* Callback function to call when earcon has finished playing.
|
995
|
+
* @name Highcharts.EarconOptionsObject#onEnd
|
996
|
+
* @type {Function|undefined}
|
997
|
+
*/
|
998
|
+
|
999
|
+
/**
|
1000
|
+
* The Earcon class. Earcon objects represent a certain sound consisting of
|
1001
|
+
* one or more instruments playing a predefined sound.
|
1002
|
+
*
|
1003
|
+
* @sample highcharts/sonification/earcon/
|
1004
|
+
* Using earcons directly
|
1005
|
+
*
|
1006
|
+
* @requires module:modules/sonification
|
1007
|
+
*
|
1008
|
+
* @class
|
1009
|
+
* @name Highcharts.Earcon
|
1010
|
+
*
|
1011
|
+
* @param {Highcharts.EarconOptionsObject} options
|
1012
|
+
* Options for the Earcon instance.
|
1013
|
+
*/
|
1014
|
+
function Earcon(options) {
|
1015
|
+
this.init(options || {});
|
1016
|
+
}
|
1017
|
+
Earcon.prototype.init = function (options) {
|
1018
|
+
this.options = options;
|
1019
|
+
if (!this.options.id) {
|
1020
|
+
this.options.id = this.id = H.uniqueKey();
|
1021
|
+
}
|
1022
|
+
this.instrumentsPlaying = {};
|
1023
|
+
};
|
1024
|
+
|
1025
|
+
|
1026
|
+
/**
|
1027
|
+
* Play the earcon, optionally overriding init options.
|
1028
|
+
*
|
1029
|
+
* @sample highcharts/sonification/earcon/
|
1030
|
+
* Using earcons directly
|
1031
|
+
*
|
1032
|
+
* @function Highcharts.Earcon#sonify
|
1033
|
+
*
|
1034
|
+
* @param {Highcharts.EarconOptionsObject} options
|
1035
|
+
* Override existing options.
|
1036
|
+
*/
|
1037
|
+
Earcon.prototype.sonify = function (options) {
|
1038
|
+
var playOptions = H.merge(this.options, options);
|
1039
|
+
|
1040
|
+
// Find master volume/pan settings
|
1041
|
+
var masterVolume = H.pick(playOptions.volume, 1),
|
1042
|
+
masterPan = playOptions.pan,
|
1043
|
+
earcon = this,
|
1044
|
+
playOnEnd = options && options.onEnd,
|
1045
|
+
masterOnEnd = earcon.options.onEnd;
|
1046
|
+
|
1047
|
+
// Go through the instruments and play them
|
1048
|
+
playOptions.instruments.forEach(function (opts) {
|
1049
|
+
var instrument = typeof opts.instrument === 'string' ?
|
1050
|
+
H.sonification.instruments[opts.instrument] : opts.instrument,
|
1051
|
+
instrumentOpts = H.merge(opts.playOptions),
|
1052
|
+
instrOnEnd,
|
1053
|
+
instrumentCopy,
|
1054
|
+
copyId;
|
1055
|
+
|
1056
|
+
if (instrument && instrument.play) {
|
1057
|
+
if (opts.playOptions) {
|
1058
|
+
// Handle master pan/volume
|
1059
|
+
if (typeof opts.playOptions.volume !== 'function') {
|
1060
|
+
instrumentOpts.volume = H.pick(masterVolume, 1) *
|
1061
|
+
H.pick(opts.playOptions.volume, 1);
|
1062
|
+
}
|
1063
|
+
instrumentOpts.pan = H.pick(masterPan, instrumentOpts.pan);
|
1064
|
+
|
1065
|
+
// Handle onEnd
|
1066
|
+
instrOnEnd = instrumentOpts.onEnd;
|
1067
|
+
instrumentOpts.onEnd = function () {
|
1068
|
+
delete earcon.instrumentsPlaying[copyId];
|
1069
|
+
if (instrOnEnd) {
|
1070
|
+
instrOnEnd.apply(this, arguments);
|
1071
|
+
}
|
1072
|
+
if (!Object.keys(earcon.instrumentsPlaying).length) {
|
1073
|
+
if (playOnEnd) {
|
1074
|
+
playOnEnd.apply(this, arguments);
|
1075
|
+
}
|
1076
|
+
if (masterOnEnd) {
|
1077
|
+
masterOnEnd.apply(this, arguments);
|
1078
|
+
}
|
1079
|
+
}
|
1080
|
+
};
|
1081
|
+
|
1082
|
+
// Play the instrument. Use a copy so we can play multiple at
|
1083
|
+
// the same time.
|
1084
|
+
instrumentCopy = instrument.copy();
|
1085
|
+
copyId = instrumentCopy.id;
|
1086
|
+
earcon.instrumentsPlaying[copyId] = instrumentCopy;
|
1087
|
+
instrumentCopy.play(instrumentOpts);
|
1088
|
+
}
|
1089
|
+
} else {
|
1090
|
+
H.error(30);
|
1091
|
+
}
|
1092
|
+
});
|
1093
|
+
};
|
1094
|
+
|
1095
|
+
|
1096
|
+
/**
|
1097
|
+
* Cancel any current sonification of the Earcon. Calls onEnd functions.
|
1098
|
+
*
|
1099
|
+
* @function Highcharts.Earcon#cancelSonify
|
1100
|
+
*
|
1101
|
+
* @param {boolean} [fadeOut=false]
|
1102
|
+
* Whether or not to fade out as we stop. If false, the earcon is
|
1103
|
+
* cancelled synchronously.
|
1104
|
+
*/
|
1105
|
+
Earcon.prototype.cancelSonify = function (fadeOut) {
|
1106
|
+
var playing = this.instrumentsPlaying,
|
1107
|
+
instrIds = playing && Object.keys(playing);
|
1108
|
+
|
1109
|
+
if (instrIds && instrIds.length) {
|
1110
|
+
instrIds.forEach(function (instr) {
|
1111
|
+
playing[instr].stop(!fadeOut, null, 'cancelled');
|
1112
|
+
});
|
1113
|
+
this.instrumentsPlaying = {};
|
1114
|
+
}
|
1115
|
+
};
|
1116
|
+
|
1117
|
+
|
1118
|
+
|
1119
|
+
return Earcon;
|
1120
|
+
}(Highcharts));
|
1121
|
+
var pointSonifyFunctions = (function (H, utilities) {
|
1122
|
+
/* *
|
1123
|
+
*
|
1124
|
+
* (c) 2009-2019 Øystein Moseng
|
1125
|
+
*
|
1126
|
+
* Code for sonifying single points.
|
1127
|
+
*
|
1128
|
+
* License: www.highcharts.com/license
|
1129
|
+
*
|
1130
|
+
* */
|
1131
|
+
|
1132
|
+
|
1133
|
+
/**
|
1134
|
+
* Define the parameter mapping for an instrument.
|
1135
|
+
*
|
1136
|
+
* @requires module:modules/sonification
|
1137
|
+
*
|
1138
|
+
* @interface Highcharts.PointInstrumentMappingObject
|
1139
|
+
*//**
|
1140
|
+
* Define the volume of the instrument. This can be a string with a data
|
1141
|
+
* property name, e.g. `'y'`, in which case this data property is used to define
|
1142
|
+
* the volume relative to the `y`-values of the other points. A higher `y` value
|
1143
|
+
* would then result in a higher volume. This option can also be a fixed number
|
1144
|
+
* or a function. If it is a function, this function is called in regular
|
1145
|
+
* intervals while the note is playing. It receives three arguments: The point,
|
1146
|
+
* the dataExtremes, and the current relative time - where 0 is the beginning of
|
1147
|
+
* the note and 1 is the end. The function should return the volume of the note
|
1148
|
+
* as a number between 0 and 1.
|
1149
|
+
* @name Highcharts.PointInstrumentMappingObject#volume
|
1150
|
+
* @type {string|number|Function}
|
1151
|
+
*//**
|
1152
|
+
* Define the duration of the notes for this instrument. This can be a string
|
1153
|
+
* with a data property name, e.g. `'y'`, in which case this data property is
|
1154
|
+
* used to define the duration relative to the `y`-values of the other points. A
|
1155
|
+
* higher `y` value would then result in a longer duration. This option can also
|
1156
|
+
* be a fixed number or a function. If it is a function, this function is called
|
1157
|
+
* once before the note starts playing, and should return the duration in
|
1158
|
+
* milliseconds. It receives two arguments: The point, and the dataExtremes.
|
1159
|
+
* @name Highcharts.PointInstrumentMappingObject#duration
|
1160
|
+
* @type {string|number|Function}
|
1161
|
+
*//**
|
1162
|
+
* Define the panning of the instrument. This can be a string with a data
|
1163
|
+
* property name, e.g. `'x'`, in which case this data property is used to define
|
1164
|
+
* the panning relative to the `x`-values of the other points. A higher `x`
|
1165
|
+
* value would then result in a higher panning value (panned further to the
|
1166
|
+
* right). This option can also be a fixed number or a function. If it is a
|
1167
|
+
* function, this function is called in regular intervals while the note is
|
1168
|
+
* playing. It receives three arguments: The point, the dataExtremes, and the
|
1169
|
+
* current relative time - where 0 is the beginning of the note and 1 is the
|
1170
|
+
* end. The function should return the panning of the note as a number between
|
1171
|
+
* -1 and 1.
|
1172
|
+
* @name Highcharts.PointInstrumentMappingObject#pan
|
1173
|
+
* @type {string|number|Function|undefined}
|
1174
|
+
*//**
|
1175
|
+
* Define the frequency of the instrument. This can be a string with a data
|
1176
|
+
* property name, e.g. `'y'`, in which case this data property is used to define
|
1177
|
+
* the frequency relative to the `y`-values of the other points. A higher `y`
|
1178
|
+
* value would then result in a higher frequency. This option can also be a
|
1179
|
+
* fixed number or a function. If it is a function, this function is called in
|
1180
|
+
* regular intervals while the note is playing. It receives three arguments:
|
1181
|
+
* The point, the dataExtremes, and the current relative time - where 0 is the
|
1182
|
+
* beginning of the note and 1 is the end. The function should return the
|
1183
|
+
* frequency of the note as a number (in Hz).
|
1184
|
+
* @name Highcharts.PointInstrumentMappingObject#frequency
|
1185
|
+
* @type {string|number|Function}
|
1186
|
+
*/
|
1187
|
+
|
1188
|
+
|
1189
|
+
/**
|
1190
|
+
* @requires module:modules/sonification
|
1191
|
+
*
|
1192
|
+
* @interface Highcharts.PointInstrumentOptionsObject
|
1193
|
+
*//**
|
1194
|
+
* The minimum duration for a note when using a data property for duration. Can
|
1195
|
+
* be overridden by using either a fixed number or a function for
|
1196
|
+
* instrumentMapping.duration. Defaults to 20.
|
1197
|
+
* @name Highcharts.PointInstrumentOptionsObject#minDuration
|
1198
|
+
* @type {number|undefined}
|
1199
|
+
*//**
|
1200
|
+
* The maximum duration for a note when using a data property for duration. Can
|
1201
|
+
* be overridden by using either a fixed number or a function for
|
1202
|
+
* instrumentMapping.duration. Defaults to 2000.
|
1203
|
+
* @name Highcharts.PointInstrumentOptionsObject#maxDuration
|
1204
|
+
* @type {number|undefined}
|
1205
|
+
*//**
|
1206
|
+
* The minimum pan value for a note when using a data property for panning. Can
|
1207
|
+
* be overridden by using either a fixed number or a function for
|
1208
|
+
* instrumentMapping.pan. Defaults to -1 (fully left).
|
1209
|
+
* @name Highcharts.PointInstrumentOptionsObject#minPan
|
1210
|
+
* @type {number|undefined}
|
1211
|
+
*//**
|
1212
|
+
* The maximum pan value for a note when using a data property for panning. Can
|
1213
|
+
* be overridden by using either a fixed number or a function for
|
1214
|
+
* instrumentMapping.pan. Defaults to 1 (fully right).
|
1215
|
+
* @name Highcharts.PointInstrumentOptionsObject#maxPan
|
1216
|
+
* @type {number|undefined}
|
1217
|
+
*//**
|
1218
|
+
* The minimum volume for a note when using a data property for volume. Can be
|
1219
|
+
* overridden by using either a fixed number or a function for
|
1220
|
+
* instrumentMapping.volume. Defaults to 0.1.
|
1221
|
+
* @name Highcharts.PointInstrumentOptionsObject#minVolume
|
1222
|
+
* @type {number|undefined}
|
1223
|
+
*//**
|
1224
|
+
* The maximum volume for a note when using a data property for volume. Can be
|
1225
|
+
* overridden by using either a fixed number or a function for
|
1226
|
+
* instrumentMapping.volume. Defaults to 1.
|
1227
|
+
* @name Highcharts.PointInstrumentOptionsObject#maxVolume
|
1228
|
+
* @type {number|undefined}
|
1229
|
+
*//**
|
1230
|
+
* The minimum frequency for a note when using a data property for frequency.
|
1231
|
+
* Can be overridden by using either a fixed number or a function for
|
1232
|
+
* instrumentMapping.frequency. Defaults to 220.
|
1233
|
+
* @name Highcharts.PointInstrumentOptionsObject#minFrequency
|
1234
|
+
* @type {number|undefined}
|
1235
|
+
*//**
|
1236
|
+
* The maximum frequency for a note when using a data property for frequency.
|
1237
|
+
* Can be overridden by using either a fixed number or a function for
|
1238
|
+
* instrumentMapping.frequency. Defaults to 2200.
|
1239
|
+
* @name Highcharts.PointInstrumentOptionsObject#maxFrequency
|
1240
|
+
* @type {number|undefined}
|
1241
|
+
*/
|
1242
|
+
|
1243
|
+
|
1244
|
+
/**
|
1245
|
+
* An instrument definition for a point, specifying the instrument to play and
|
1246
|
+
* how to play it.
|
1247
|
+
*
|
1248
|
+
* @interface Highcharts.PointInstrumentObject
|
1249
|
+
*//**
|
1250
|
+
* An Instrument instance or the name of the instrument in the
|
1251
|
+
* Highcharts.sonification.instruments map.
|
1252
|
+
* @name Highcharts.PointInstrumentObject#instrument
|
1253
|
+
* @type {Highcharts.Instrument|string}
|
1254
|
+
*//**
|
1255
|
+
* Mapping of instrument parameters for this instrument.
|
1256
|
+
* @name Highcharts.PointInstrumentObject#instrumentMapping
|
1257
|
+
* @type {Highcharts.PointInstrumentMappingObject}
|
1258
|
+
*//**
|
1259
|
+
* Options for this instrument.
|
1260
|
+
* @name Highcharts.PointInstrumentObject#instrumentOptions
|
1261
|
+
* @type {Highcharts.PointInstrumentOptionsObject|undefined}
|
1262
|
+
*//**
|
1263
|
+
* Callback to call when the instrument has stopped playing.
|
1264
|
+
* @name Highcharts.PointInstrumentObject#onEnd
|
1265
|
+
* @type {Function|undefined}
|
1266
|
+
*/
|
1267
|
+
|
1268
|
+
|
1269
|
+
/**
|
1270
|
+
* Options for sonifying a point.
|
1271
|
+
* @interface Highcharts.PointSonifyOptionsObject
|
1272
|
+
*//**
|
1273
|
+
* The instrument definitions for this point.
|
1274
|
+
* @name Highcharts.PointSonifyOptionsObject#instruments
|
1275
|
+
* @type {Array<Highcharts.PointInstrumentObject>}
|
1276
|
+
*//**
|
1277
|
+
* Optionally provide the minimum/maximum values for the points. If this is not
|
1278
|
+
* supplied, it is calculated from the points in the chart on demand. This
|
1279
|
+
* option is supplied in the following format, as a map of point data properties
|
1280
|
+
* to objects with min/max values:
|
1281
|
+
* ```js
|
1282
|
+
* dataExtremes: {
|
1283
|
+
* y: {
|
1284
|
+
* min: 0,
|
1285
|
+
* max: 100
|
1286
|
+
* },
|
1287
|
+
* z: {
|
1288
|
+
* min: -10,
|
1289
|
+
* max: 10
|
1290
|
+
* }
|
1291
|
+
* // Properties used and not provided are calculated on demand
|
1292
|
+
* }
|
1293
|
+
* ```
|
1294
|
+
* @name Highcharts.PointSonifyOptionsObject#dataExtremes
|
1295
|
+
* @type {object|undefined}
|
1296
|
+
*//**
|
1297
|
+
* Callback called when the sonification has finished.
|
1298
|
+
* @name Highcharts.PointSonifyOptionsObject#onEnd
|
1299
|
+
* @type {Function|undefined}
|
1300
|
+
*/
|
1301
|
+
|
1302
|
+
|
1303
|
+
|
1304
|
+
|
1305
|
+
// Defaults for the instrument options
|
1306
|
+
// NOTE: Also change defaults in Highcharts.PointInstrumentOptionsObject if
|
1307
|
+
// making changes here.
|
1308
|
+
var defaultInstrumentOptions = {
|
1309
|
+
minDuration: 20,
|
1310
|
+
maxDuration: 2000,
|
1311
|
+
minVolume: 0.1,
|
1312
|
+
maxVolume: 1,
|
1313
|
+
minPan: -1,
|
1314
|
+
maxPan: 1,
|
1315
|
+
minFrequency: 220,
|
1316
|
+
maxFrequency: 2200
|
1317
|
+
};
|
1318
|
+
|
1319
|
+
|
1320
|
+
/**
|
1321
|
+
* Sonify a single point.
|
1322
|
+
*
|
1323
|
+
* @sample highcharts/sonification/point-basic/
|
1324
|
+
* Click on points to sonify
|
1325
|
+
* @sample highcharts/sonification/point-advanced/
|
1326
|
+
* Sonify bubbles
|
1327
|
+
*
|
1328
|
+
* @requires module:modules/sonification
|
1329
|
+
*
|
1330
|
+
* @function Highcharts.Point#sonify
|
1331
|
+
*
|
1332
|
+
* @param {Highcharts.PointSonifyOptionsObject} options
|
1333
|
+
* Options for the sonification of the point.
|
1334
|
+
*/
|
1335
|
+
function pointSonify(options) {
|
1336
|
+
var point = this,
|
1337
|
+
chart = point.series.chart,
|
1338
|
+
dataExtremes = options.dataExtremes || {},
|
1339
|
+
// Get the value to pass to instrument.play from the mapping value
|
1340
|
+
// passed in.
|
1341
|
+
getMappingValue = function (
|
1342
|
+
value, makeFunction, allowedExtremes, allowedValues
|
1343
|
+
) {
|
1344
|
+
// Fixed number, just use that
|
1345
|
+
if (typeof value === 'number' || value === undefined) {
|
1346
|
+
return value;
|
1347
|
+
}
|
1348
|
+
// Function. Return new function if we try to use callback,
|
1349
|
+
// otherwise call it now and return result.
|
1350
|
+
if (typeof value === 'function') {
|
1351
|
+
return makeFunction ?
|
1352
|
+
function (time) {
|
1353
|
+
return value(point, dataExtremes, time);
|
1354
|
+
} :
|
1355
|
+
value(point, dataExtremes);
|
1356
|
+
}
|
1357
|
+
// String, this is a data prop.
|
1358
|
+
if (typeof value === 'string') {
|
1359
|
+
// Find data extremes if we don't have them
|
1360
|
+
dataExtremes[value] = dataExtremes[value] ||
|
1361
|
+
utilities.calculateDataExtremes(
|
1362
|
+
point.series.chart, value
|
1363
|
+
);
|
1364
|
+
// Find the value
|
1365
|
+
return utilities.virtualAxisTranslate(
|
1366
|
+
H.pick(point[value], point.options[value]),
|
1367
|
+
dataExtremes[value],
|
1368
|
+
allowedExtremes,
|
1369
|
+
allowedValues
|
1370
|
+
);
|
1371
|
+
}
|
1372
|
+
};
|
1373
|
+
|
1374
|
+
// Register playing point on chart
|
1375
|
+
chart.sonification.currentlyPlayingPoint = point;
|
1376
|
+
|
1377
|
+
// Keep track of instruments playing
|
1378
|
+
point.sonification = point.sonification || {};
|
1379
|
+
point.sonification.instrumentsPlaying =
|
1380
|
+
point.sonification.instrumentsPlaying || {};
|
1381
|
+
|
1382
|
+
// Register signal handler for the point
|
1383
|
+
var signalHandler = point.sonification.signalHandler =
|
1384
|
+
point.sonification.signalHandler ||
|
1385
|
+
new utilities.SignalHandler(['onEnd']);
|
1386
|
+
|
1387
|
+
signalHandler.clearSignalCallbacks();
|
1388
|
+
signalHandler.registerSignalCallbacks({ onEnd: options.onEnd });
|
1389
|
+
|
1390
|
+
// If we have a null point or invisible point, just return
|
1391
|
+
if (point.isNull || !point.visible || !point.series.visible) {
|
1392
|
+
signalHandler.emitSignal('onEnd');
|
1393
|
+
return;
|
1394
|
+
}
|
1395
|
+
|
1396
|
+
// Go through instruments and play them
|
1397
|
+
options.instruments.forEach(function (instrumentDefinition) {
|
1398
|
+
var instrument = typeof instrumentDefinition.instrument === 'string' ?
|
1399
|
+
H.sonification.instruments[instrumentDefinition.instrument] :
|
1400
|
+
instrumentDefinition.instrument,
|
1401
|
+
mapping = instrumentDefinition.instrumentMapping || {},
|
1402
|
+
extremes = H.merge(
|
1403
|
+
defaultInstrumentOptions,
|
1404
|
+
instrumentDefinition.instrumentOptions
|
1405
|
+
),
|
1406
|
+
id = instrument.id,
|
1407
|
+
onEnd = function (cancelled) {
|
1408
|
+
// Instrument on end
|
1409
|
+
if (instrumentDefinition.onEnd) {
|
1410
|
+
instrumentDefinition.onEnd.apply(this, arguments);
|
1411
|
+
}
|
1412
|
+
|
1413
|
+
// Remove currently playing point reference on chart
|
1414
|
+
if (
|
1415
|
+
chart.sonification &&
|
1416
|
+
chart.sonification.currentlyPlayingPoint
|
1417
|
+
) {
|
1418
|
+
delete chart.sonification.currentlyPlayingPoint;
|
1419
|
+
}
|
1420
|
+
|
1421
|
+
// Remove reference from instruments playing
|
1422
|
+
if (
|
1423
|
+
point.sonification && point.sonification.instrumentsPlaying
|
1424
|
+
) {
|
1425
|
+
delete point.sonification.instrumentsPlaying[id];
|
1426
|
+
|
1427
|
+
// This was the last instrument?
|
1428
|
+
if (
|
1429
|
+
!Object.keys(
|
1430
|
+
point.sonification.instrumentsPlaying
|
1431
|
+
).length
|
1432
|
+
) {
|
1433
|
+
signalHandler.emitSignal('onEnd', cancelled);
|
1434
|
+
}
|
1435
|
+
}
|
1436
|
+
};
|
1437
|
+
|
1438
|
+
// Play the note on the instrument
|
1439
|
+
if (instrument && instrument.play) {
|
1440
|
+
point.sonification.instrumentsPlaying[instrument.id] = instrument;
|
1441
|
+
instrument.play({
|
1442
|
+
frequency: getMappingValue(
|
1443
|
+
mapping.frequency,
|
1444
|
+
true,
|
1445
|
+
{ min: extremes.minFrequency, max: extremes.maxFrequency }
|
1446
|
+
),
|
1447
|
+
duration: getMappingValue(
|
1448
|
+
mapping.duration,
|
1449
|
+
false,
|
1450
|
+
{ min: extremes.minDuration, max: extremes.maxDuration }
|
1451
|
+
),
|
1452
|
+
pan: getMappingValue(
|
1453
|
+
mapping.pan,
|
1454
|
+
true,
|
1455
|
+
{ min: extremes.minPan, max: extremes.maxPan }
|
1456
|
+
),
|
1457
|
+
volume: getMappingValue(
|
1458
|
+
mapping.volume,
|
1459
|
+
true,
|
1460
|
+
{ min: extremes.minVolume, max: extremes.maxVolume }
|
1461
|
+
),
|
1462
|
+
onEnd: onEnd,
|
1463
|
+
minFrequency: extremes.minFrequency,
|
1464
|
+
maxFrequency: extremes.maxFrequency
|
1465
|
+
});
|
1466
|
+
} else {
|
1467
|
+
H.error(30);
|
1468
|
+
}
|
1469
|
+
});
|
1470
|
+
}
|
1471
|
+
|
1472
|
+
|
1473
|
+
/**
|
1474
|
+
* Cancel sonification of a point. Calls onEnd functions.
|
1475
|
+
*
|
1476
|
+
* @requires module:modules/sonification
|
1477
|
+
*
|
1478
|
+
* @function Highcharts.Point#cancelSonify
|
1479
|
+
*
|
1480
|
+
* @param {boolean} [fadeOut=false]
|
1481
|
+
* Whether or not to fade out as we stop. If false, the points are
|
1482
|
+
* cancelled synchronously.
|
1483
|
+
*/
|
1484
|
+
function pointCancelSonify(fadeOut) {
|
1485
|
+
var playing = this.sonification && this.sonification.instrumentsPlaying,
|
1486
|
+
instrIds = playing && Object.keys(playing);
|
1487
|
+
|
1488
|
+
if (instrIds && instrIds.length) {
|
1489
|
+
instrIds.forEach(function (instr) {
|
1490
|
+
playing[instr].stop(!fadeOut, null, 'cancelled');
|
1491
|
+
});
|
1492
|
+
this.sonification.instrumentsPlaying = {};
|
1493
|
+
this.sonification.signalHandler.emitSignal('onEnd', 'cancelled');
|
1494
|
+
}
|
1495
|
+
}
|
1496
|
+
|
1497
|
+
|
1498
|
+
var pointSonifyFunctions = {
|
1499
|
+
pointSonify: pointSonify,
|
1500
|
+
pointCancelSonify: pointCancelSonify
|
1501
|
+
};
|
1502
|
+
|
1503
|
+
|
1504
|
+
return pointSonifyFunctions;
|
1505
|
+
}(Highcharts, utilities));
|
1506
|
+
var chartSonifyFunctions = (function (H, utilities) {
|
1507
|
+
/* *
|
1508
|
+
*
|
1509
|
+
* (c) 2009-2019 Øystein Moseng
|
1510
|
+
*
|
1511
|
+
* Sonification functions for chart/series.
|
1512
|
+
*
|
1513
|
+
* License: www.highcharts.com/license
|
1514
|
+
*
|
1515
|
+
* */
|
1516
|
+
|
1517
|
+
|
1518
|
+
/**
|
1519
|
+
* An Earcon configuration, specifying an Earcon and when to play it.
|
1520
|
+
*
|
1521
|
+
* @requires module:modules/sonification
|
1522
|
+
*
|
1523
|
+
* @interface Highcharts.EarconConfiguration
|
1524
|
+
*//**
|
1525
|
+
* An Earcon instance.
|
1526
|
+
* @name Highcharts.EarconConfiguration#earcon
|
1527
|
+
* @type {Highcharts.Earcon}
|
1528
|
+
*//**
|
1529
|
+
* The ID of the point to play the Earcon on.
|
1530
|
+
* @name Highcharts.EarconConfiguration#onPoint
|
1531
|
+
* @type {string|undefined}
|
1532
|
+
*//**
|
1533
|
+
* A function to determine whether or not to play this earcon on a point. The
|
1534
|
+
* function is called for every point, receiving that point as parameter. It
|
1535
|
+
* should return either a boolean indicating whether or not to play the earcon,
|
1536
|
+
* or a new Earcon instance - in which case the new Earcon will be played.
|
1537
|
+
* @name Highcharts.EarconConfiguration#condition
|
1538
|
+
* @type {Function|undefined}
|
1539
|
+
*/
|
1540
|
+
|
1541
|
+
/**
|
1542
|
+
* Options for sonifying a series.
|
1543
|
+
*
|
1544
|
+
* @requires module:modules/sonification
|
1545
|
+
*
|
1546
|
+
* @interface Highcharts.SonifySeriesOptionsObject
|
1547
|
+
*//**
|
1548
|
+
* The duration for playing the points. Note that points might continue to play
|
1549
|
+
* after the duration has passed, but no new points will start playing.
|
1550
|
+
* @name Highcharts.SonifySeriesOptionsObject#duration
|
1551
|
+
* @type {number}
|
1552
|
+
*//**
|
1553
|
+
* The axis to use for when to play the points. Can be a string with a data
|
1554
|
+
* property (e.g. `x`), or a function. If it is a function, this function
|
1555
|
+
* receives the point as argument, and should return a numeric value. The points
|
1556
|
+
* with the lowest numeric values are then played first, and the time between
|
1557
|
+
* points will be proportional to the distance between the numeric values.
|
1558
|
+
* @name Highcharts.SonifySeriesOptionsObject#pointPlayTime
|
1559
|
+
* @type {string|Function}
|
1560
|
+
*//**
|
1561
|
+
* The instrument definitions for the points in this series.
|
1562
|
+
* @name Highcharts.SonifySeriesOptionsObject#instruments
|
1563
|
+
* @type {Array<Highcharts.PointInstrumentObject>}
|
1564
|
+
*//**
|
1565
|
+
* Earcons to add to the series.
|
1566
|
+
* @name Highcharts.SonifySeriesOptionsObject#earcons
|
1567
|
+
* @type {Array<Highcharts.EarconConfiguration>|undefined}
|
1568
|
+
*//**
|
1569
|
+
* Optionally provide the minimum/maximum data values for the points. If this is
|
1570
|
+
* not supplied, it is calculated from all points in the chart on demand. This
|
1571
|
+
* option is supplied in the following format, as a map of point data properties
|
1572
|
+
* to objects with min/max values:
|
1573
|
+
* ```js
|
1574
|
+
* dataExtremes: {
|
1575
|
+
* y: {
|
1576
|
+
* min: 0,
|
1577
|
+
* max: 100
|
1578
|
+
* },
|
1579
|
+
* z: {
|
1580
|
+
* min: -10,
|
1581
|
+
* max: 10
|
1582
|
+
* }
|
1583
|
+
* // Properties used and not provided are calculated on demand
|
1584
|
+
* }
|
1585
|
+
* ```
|
1586
|
+
* @name Highcharts.SonifySeriesOptionsObject#dataExtremes
|
1587
|
+
* @type {object|undefined}
|
1588
|
+
*//**
|
1589
|
+
* Callback before a point is played.
|
1590
|
+
* @name Highcharts.SonifySeriesOptionsObject#onPointStart
|
1591
|
+
* @type {Function|undefined}
|
1592
|
+
*//**
|
1593
|
+
* Callback after a point has finished playing.
|
1594
|
+
* @name Highcharts.SonifySeriesOptionsObject#onPointEnd
|
1595
|
+
* @type {Function|undefined}
|
1596
|
+
*//**
|
1597
|
+
* Callback after the series has played.
|
1598
|
+
* @name Highcharts.SonifySeriesOptionsObject#onEnd
|
1599
|
+
* @type {Function|undefined}
|
1600
|
+
*/
|
1601
|
+
|
1602
|
+
|
1603
|
+
|
1604
|
+
|
1605
|
+
/**
|
1606
|
+
* Get the relative time value of a point.
|
1607
|
+
* @private
|
1608
|
+
* @param {Highcharts.Point} point - The point.
|
1609
|
+
* @param {Function|string} timeProp - The time axis data prop or the time
|
1610
|
+
* function.
|
1611
|
+
* @return {number} The time value.
|
1612
|
+
*/
|
1613
|
+
function getPointTimeValue(point, timeProp) {
|
1614
|
+
return typeof timeProp === 'function' ?
|
1615
|
+
timeProp(point) :
|
1616
|
+
H.pick(point[timeProp], point.options[timeProp]);
|
1617
|
+
}
|
1618
|
+
|
1619
|
+
|
1620
|
+
/**
|
1621
|
+
* Get the time extremes of this series. This is handled outside of the
|
1622
|
+
* dataExtremes, as we always want to just sonify the visible points, and we
|
1623
|
+
* always want the extremes to be the extremes of the visible points.
|
1624
|
+
* @private
|
1625
|
+
* @param {Highcharts.Series} series - The series to compute on.
|
1626
|
+
* @param {Function|string} timeProp - The time axis data prop or the time
|
1627
|
+
* function.
|
1628
|
+
* @return {object} Object with min/max extremes for the time values.
|
1629
|
+
*/
|
1630
|
+
function getTimeExtremes(series, timeProp) {
|
1631
|
+
// Compute the extremes from the visible points.
|
1632
|
+
return series.points.reduce(function (acc, point) {
|
1633
|
+
var value = getPointTimeValue(point, timeProp);
|
1634
|
+
|
1635
|
+
acc.min = Math.min(acc.min, value);
|
1636
|
+
acc.max = Math.max(acc.max, value);
|
1637
|
+
return acc;
|
1638
|
+
}, {
|
1639
|
+
min: Infinity,
|
1640
|
+
max: -Infinity
|
1641
|
+
});
|
1642
|
+
}
|
1643
|
+
|
1644
|
+
|
1645
|
+
/**
|
1646
|
+
* Calculate value extremes for used instrument data properties.
|
1647
|
+
* @private
|
1648
|
+
* @param {Highcharts.Chart} chart - The chart to calculate extremes from.
|
1649
|
+
* @param {Array<Highcharts.PointInstrumentObject>} instruments - The instrument
|
1650
|
+
* definitions used.
|
1651
|
+
* @param {object} [dataExtremes] - Predefined extremes for each data prop.
|
1652
|
+
* @return {object} New extremes with data properties mapped to min/max objects.
|
1653
|
+
*/
|
1654
|
+
function getExtremesForInstrumentProps(chart, instruments, dataExtremes) {
|
1655
|
+
return (
|
1656
|
+
instruments || []
|
1657
|
+
).reduce(function (newExtremes, instrumentDefinition) {
|
1658
|
+
Object.keys(instrumentDefinition.instrumentMapping || {}).forEach(
|
1659
|
+
function (instrumentParameter) {
|
1660
|
+
var value = instrumentDefinition.instrumentMapping[
|
1661
|
+
instrumentParameter
|
1662
|
+
];
|
1663
|
+
|
1664
|
+
if (typeof value === 'string' && !newExtremes[value]) {
|
1665
|
+
// This instrument parameter is mapped to a data prop.
|
1666
|
+
// If we don't have predefined data extremes, find them.
|
1667
|
+
newExtremes[value] = utilities.calculateDataExtremes(
|
1668
|
+
chart, value
|
1669
|
+
);
|
1670
|
+
}
|
1671
|
+
}
|
1672
|
+
);
|
1673
|
+
return newExtremes;
|
1674
|
+
}, H.merge(dataExtremes));
|
1675
|
+
}
|
1676
|
+
|
1677
|
+
|
1678
|
+
/**
|
1679
|
+
* Get earcons for the point if there are any.
|
1680
|
+
* @private
|
1681
|
+
* @param {Highcharts.Point} point - The point to find earcons for.
|
1682
|
+
* @param {Array<Highcharts.EarconConfiguration>} earconDefinitions - Earcons to
|
1683
|
+
* check.
|
1684
|
+
* @return {Array<Highcharts.Earcon>} Array of earcons to be played with this
|
1685
|
+
* point.
|
1686
|
+
*/
|
1687
|
+
function getPointEarcons(point, earconDefinitions) {
|
1688
|
+
return earconDefinitions.reduce(
|
1689
|
+
function (earcons, earconDefinition) {
|
1690
|
+
var cond,
|
1691
|
+
earcon = earconDefinition.earcon;
|
1692
|
+
|
1693
|
+
if (earconDefinition.condition) {
|
1694
|
+
// We have a condition. This overrides onPoint
|
1695
|
+
cond = earconDefinition.condition(point);
|
1696
|
+
if (cond instanceof H.sonification.Earcon) {
|
1697
|
+
// Condition returned an earcon
|
1698
|
+
earcons.push(cond);
|
1699
|
+
} else if (cond) {
|
1700
|
+
// Condition returned true
|
1701
|
+
earcons.push(earcon);
|
1702
|
+
}
|
1703
|
+
} else if (
|
1704
|
+
earconDefinition.onPoint &&
|
1705
|
+
point.id === earconDefinition.onPoint
|
1706
|
+
) {
|
1707
|
+
// We have earcon onPoint
|
1708
|
+
earcons.push(earcon);
|
1709
|
+
}
|
1710
|
+
return earcons;
|
1711
|
+
}, []
|
1712
|
+
);
|
1713
|
+
}
|
1714
|
+
|
1715
|
+
|
1716
|
+
/**
|
1717
|
+
* Utility function to get a new list of instrument options where all the
|
1718
|
+
* instrument references are copies.
|
1719
|
+
* @private
|
1720
|
+
* @param {Array<Highcharts.PointInstrumentObject>} instruments - The instrument
|
1721
|
+
* options.
|
1722
|
+
* @return {Array<Highcharts.PointInstrumentObject>} Array of copied instrument
|
1723
|
+
* options.
|
1724
|
+
*/
|
1725
|
+
function makeInstrumentCopies(instruments) {
|
1726
|
+
return instruments.map(function (instrumentDef) {
|
1727
|
+
var instrument = instrumentDef.instrument,
|
1728
|
+
copy = (typeof instrument === 'string' ?
|
1729
|
+
H.sonification.instruments[instrument] :
|
1730
|
+
instrument).copy();
|
1731
|
+
|
1732
|
+
return H.merge(instrumentDef, { instrument: copy });
|
1733
|
+
});
|
1734
|
+
}
|
1735
|
+
|
1736
|
+
|
1737
|
+
/**
|
1738
|
+
* Create a TimelinePath from a series. Takes the same options as seriesSonify.
|
1739
|
+
* To intuitively allow multiple series to play simultaneously we make copies of
|
1740
|
+
* the instruments for each series.
|
1741
|
+
* @private
|
1742
|
+
* @param {Highcharts.Series} series - The series to build from.
|
1743
|
+
* @param {object} options - The options for building the TimelinePath.
|
1744
|
+
* @return {Highcharts.TimelinePath} A timeline path with events.
|
1745
|
+
*/
|
1746
|
+
function buildTimelinePathFromSeries(series, options) {
|
1747
|
+
// options.timeExtremes is internal and used so that the calculations from
|
1748
|
+
// chart.sonify can be reused.
|
1749
|
+
var timeExtremes = options.timeExtremes || getTimeExtremes(
|
1750
|
+
series, options.pointPlayTime, options.dataExtremes
|
1751
|
+
),
|
1752
|
+
// Get time offset for a point, relative to duration
|
1753
|
+
pointToTime = function (point) {
|
1754
|
+
return utilities.virtualAxisTranslate(
|
1755
|
+
getPointTimeValue(point, options.pointPlayTime),
|
1756
|
+
timeExtremes,
|
1757
|
+
{ min: 0, max: options.duration }
|
1758
|
+
);
|
1759
|
+
},
|
1760
|
+
// Compute any data extremes that aren't defined yet
|
1761
|
+
dataExtremes = getExtremesForInstrumentProps(
|
1762
|
+
series.chart, options.instruments, options.dataExtremes
|
1763
|
+
),
|
1764
|
+
// Make copies of the instruments used for this series, to allow
|
1765
|
+
// multiple series with the same instrument to play together
|
1766
|
+
instruments = makeInstrumentCopies(options.instruments),
|
1767
|
+
// Go through the points, convert to events, optionally add Earcons
|
1768
|
+
timelineEvents = series.points.reduce(function (events, point) {
|
1769
|
+
var earcons = getPointEarcons(point, options.earcons || []),
|
1770
|
+
time = pointToTime(point);
|
1771
|
+
|
1772
|
+
return events.concat(
|
1773
|
+
// Event object for point
|
1774
|
+
new H.sonification.TimelineEvent({
|
1775
|
+
eventObject: point,
|
1776
|
+
time: time,
|
1777
|
+
id: point.id,
|
1778
|
+
playOptions: {
|
1779
|
+
instruments: instruments,
|
1780
|
+
dataExtremes: dataExtremes
|
1781
|
+
}
|
1782
|
+
}),
|
1783
|
+
// Earcons
|
1784
|
+
earcons.map(function (earcon) {
|
1785
|
+
return new H.sonification.TimelineEvent({
|
1786
|
+
eventObject: earcon,
|
1787
|
+
time: time
|
1788
|
+
});
|
1789
|
+
})
|
1790
|
+
);
|
1791
|
+
}, []);
|
1792
|
+
|
1793
|
+
// Build the timeline path
|
1794
|
+
return new H.sonification.TimelinePath({
|
1795
|
+
events: timelineEvents,
|
1796
|
+
onStart: function () {
|
1797
|
+
if (options.onStart) {
|
1798
|
+
options.onStart(series);
|
1799
|
+
}
|
1800
|
+
},
|
1801
|
+
onEventStart: function (event) {
|
1802
|
+
var eventObject = event.options && event.options.eventObject;
|
1803
|
+
|
1804
|
+
if (eventObject instanceof H.Point) {
|
1805
|
+
// Check for hidden series
|
1806
|
+
if (
|
1807
|
+
!eventObject.series.visible &&
|
1808
|
+
!eventObject.series.chart.series.some(function (series) {
|
1809
|
+
return series.visible;
|
1810
|
+
})
|
1811
|
+
) {
|
1812
|
+
// We have no visible series, stop the path.
|
1813
|
+
event.timelinePath.timeline.pause();
|
1814
|
+
event.timelinePath.timeline.resetCursor();
|
1815
|
+
return false;
|
1816
|
+
}
|
1817
|
+
// Emit onPointStart
|
1818
|
+
if (options.onPointStart) {
|
1819
|
+
options.onPointStart(event, eventObject);
|
1820
|
+
}
|
1821
|
+
}
|
1822
|
+
},
|
1823
|
+
onEventEnd: function (eventData) {
|
1824
|
+
var eventObject = eventData.event && eventData.event.options &&
|
1825
|
+
eventData.event.options.eventObject;
|
1826
|
+
|
1827
|
+
if (eventObject instanceof H.Point && options.onPointEnd) {
|
1828
|
+
options.onPointEnd(eventData.event, eventObject);
|
1829
|
+
}
|
1830
|
+
},
|
1831
|
+
onEnd: function () {
|
1832
|
+
if (options.onEnd) {
|
1833
|
+
options.onEnd(series);
|
1834
|
+
}
|
1835
|
+
}
|
1836
|
+
});
|
1837
|
+
}
|
1838
|
+
|
1839
|
+
/**
|
1840
|
+
* Sonify a series.
|
1841
|
+
*
|
1842
|
+
* @sample highcharts/sonification/series-basic/
|
1843
|
+
* Click on series to sonify
|
1844
|
+
* @sample highcharts/sonification/series-earcon/
|
1845
|
+
* Series with earcon
|
1846
|
+
* @sample highcharts/sonification/point-play-time/
|
1847
|
+
* Play y-axis by time
|
1848
|
+
* @sample highcharts/sonification/earcon-on-point/
|
1849
|
+
* Earcon set on point
|
1850
|
+
*
|
1851
|
+
* @requires module:modules/sonification
|
1852
|
+
*
|
1853
|
+
* @function Highcharts.Series#sonify
|
1854
|
+
*
|
1855
|
+
* @param {Highcharts.SonifySeriesOptionsObject} options
|
1856
|
+
* The options for sonifying this series.
|
1857
|
+
*/
|
1858
|
+
function seriesSonify(options) {
|
1859
|
+
var timelinePath = buildTimelinePathFromSeries(this, options),
|
1860
|
+
chartSonification = this.chart.sonification;
|
1861
|
+
|
1862
|
+
// Only one timeline can play at a time. If we want multiple series playing
|
1863
|
+
// at the same time, use chart.sonify.
|
1864
|
+
if (chartSonification.timeline) {
|
1865
|
+
chartSonification.timeline.pause();
|
1866
|
+
}
|
1867
|
+
|
1868
|
+
// Create new timeline for this series, and play it.
|
1869
|
+
chartSonification.timeline = new H.sonification.Timeline({
|
1870
|
+
paths: [timelinePath]
|
1871
|
+
});
|
1872
|
+
|
1873
|
+
chartSonification.timeline.play();
|
1874
|
+
}
|
1875
|
+
|
1876
|
+
|
1877
|
+
/**
|
1878
|
+
* Utility function to assemble options for creating a TimelinePath from a
|
1879
|
+
* series when sonifying an entire chart.
|
1880
|
+
* @private
|
1881
|
+
* @param {Highcharts.Series} series - The series to return options for.
|
1882
|
+
* @param {object} dataExtremes - Pre-calculated data extremes for the chart.
|
1883
|
+
* @param {object} chartSonifyOptions - Options passed in to chart.sonify.
|
1884
|
+
* @return {object} Options for buildTimelinePathFromSeries.
|
1885
|
+
*/
|
1886
|
+
function buildSeriesOptions(series, dataExtremes, chartSonifyOptions) {
|
1887
|
+
var seriesOptions = chartSonifyOptions.seriesOptions || {};
|
1888
|
+
|
1889
|
+
return H.merge(
|
1890
|
+
{
|
1891
|
+
// Calculated dataExtremes for chart
|
1892
|
+
dataExtremes: dataExtremes,
|
1893
|
+
// We need to get timeExtremes for each series. We pass this
|
1894
|
+
// in when building the TimelinePath objects to avoid
|
1895
|
+
// calculating twice.
|
1896
|
+
timeExtremes: getTimeExtremes(
|
1897
|
+
series, chartSonifyOptions.pointPlayTime
|
1898
|
+
),
|
1899
|
+
// Some options we just pass on
|
1900
|
+
instruments: chartSonifyOptions.instruments,
|
1901
|
+
onStart: chartSonifyOptions.onSeriesStart,
|
1902
|
+
onEnd: chartSonifyOptions.onSeriesEnd,
|
1903
|
+
earcons: chartSonifyOptions.earcons
|
1904
|
+
},
|
1905
|
+
// Merge in the specific series options by ID
|
1906
|
+
H.isArray(seriesOptions) ? (
|
1907
|
+
H.find(seriesOptions, function (optEntry) {
|
1908
|
+
return optEntry.id === H.pick(series.id, series.options.id);
|
1909
|
+
}) || {}
|
1910
|
+
) : seriesOptions,
|
1911
|
+
{
|
1912
|
+
// Forced options
|
1913
|
+
pointPlayTime: chartSonifyOptions.pointPlayTime
|
1914
|
+
}
|
1915
|
+
);
|
1916
|
+
}
|
1917
|
+
|
1918
|
+
|
1919
|
+
/**
|
1920
|
+
* Utility function to normalize the ordering of timeline paths when sonifying
|
1921
|
+
* a chart.
|
1922
|
+
* @private
|
1923
|
+
* @param {string|Array<string|Highcharts.Earcon|Array<string|Highcharts.Earcon>>} orderOptions -
|
1924
|
+
* Order options for the sonification.
|
1925
|
+
* @param {Highcharts.Chart} chart - The chart we are sonifying.
|
1926
|
+
* @param {Function} seriesOptionsCallback - A function that takes a series as
|
1927
|
+
* argument, and returns the series options for that series to be used with
|
1928
|
+
* buildTimelinePathFromSeries.
|
1929
|
+
* @return {Array<object|Array<object|Highcharts.TimelinePath>>} If order is
|
1930
|
+
* sequential, we return an array of objects to create series paths from. If
|
1931
|
+
* order is simultaneous we return an array of an array with the same. If there
|
1932
|
+
* is a custom order, we return an array of arrays of either objects (for
|
1933
|
+
* series) or TimelinePaths (for earcons and delays).
|
1934
|
+
*/
|
1935
|
+
function buildPathOrder(orderOptions, chart, seriesOptionsCallback) {
|
1936
|
+
var order;
|
1937
|
+
|
1938
|
+
if (orderOptions === 'sequential' || orderOptions === 'simultaneous') {
|
1939
|
+
// Just add the series from the chart
|
1940
|
+
order = chart.series.reduce(function (seriesList, series) {
|
1941
|
+
if (series.visible) {
|
1942
|
+
seriesList.push({
|
1943
|
+
series: series,
|
1944
|
+
seriesOptions: seriesOptionsCallback(series)
|
1945
|
+
});
|
1946
|
+
}
|
1947
|
+
return seriesList;
|
1948
|
+
}, []);
|
1949
|
+
|
1950
|
+
// If order is simultaneous, group all series together
|
1951
|
+
if (orderOptions === 'simultaneous') {
|
1952
|
+
order = [order];
|
1953
|
+
}
|
1954
|
+
} else {
|
1955
|
+
// We have a specific order, and potentially custom items - like
|
1956
|
+
// earcons or silent waits.
|
1957
|
+
order = orderOptions.reduce(function (orderList, orderDef) {
|
1958
|
+
// Return set of items to play simultaneously. Could be only one.
|
1959
|
+
var simulItems = H.splat(orderDef).reduce(function (items, item) {
|
1960
|
+
var itemObject;
|
1961
|
+
|
1962
|
+
// Is this item a series ID?
|
1963
|
+
if (typeof item === 'string') {
|
1964
|
+
var series = chart.get(item);
|
1965
|
+
|
1966
|
+
if (series.visible) {
|
1967
|
+
itemObject = {
|
1968
|
+
series: series,
|
1969
|
+
seriesOptions: seriesOptionsCallback(series)
|
1970
|
+
};
|
1971
|
+
}
|
1972
|
+
|
1973
|
+
// Is it an earcon? If so, just create the path.
|
1974
|
+
} else if (item instanceof H.sonification.Earcon) {
|
1975
|
+
// Path with a single event
|
1976
|
+
itemObject = new H.sonification.TimelinePath({
|
1977
|
+
events: [new H.sonification.TimelineEvent({
|
1978
|
+
eventObject: item
|
1979
|
+
})]
|
1980
|
+
});
|
1981
|
+
|
1982
|
+
}
|
1983
|
+
|
1984
|
+
// Is this item a silent wait? If so, just create the path.
|
1985
|
+
if (item.silentWait) {
|
1986
|
+
itemObject = new H.sonification.TimelinePath({
|
1987
|
+
silentWait: item.silentWait
|
1988
|
+
});
|
1989
|
+
}
|
1990
|
+
|
1991
|
+
// Add to items to play simultaneously
|
1992
|
+
if (itemObject) {
|
1993
|
+
items.push(itemObject);
|
1994
|
+
}
|
1995
|
+
return items;
|
1996
|
+
}, []);
|
1997
|
+
|
1998
|
+
// Add to order list
|
1999
|
+
if (simulItems.length) {
|
2000
|
+
orderList.push(simulItems);
|
2001
|
+
}
|
2002
|
+
return orderList;
|
2003
|
+
}, []);
|
2004
|
+
}
|
2005
|
+
return order;
|
2006
|
+
}
|
2007
|
+
|
2008
|
+
|
2009
|
+
/**
|
2010
|
+
* Utility function to add a silent wait after all series.
|
2011
|
+
* @private
|
2012
|
+
* @param {Array<object|Array<object|TimelinePath>>} order - The order of items.
|
2013
|
+
* @param {number} wait - The wait in milliseconds to add.
|
2014
|
+
* @return {Array<object|Array<object|TimelinePath>>} The order with waits inserted.
|
2015
|
+
*/
|
2016
|
+
function addAfterSeriesWaits(order, wait) {
|
2017
|
+
if (!wait) {
|
2018
|
+
return order;
|
2019
|
+
}
|
2020
|
+
|
2021
|
+
return order.reduce(function (newOrder, orderDef, i) {
|
2022
|
+
var simultaneousPaths = H.splat(orderDef);
|
2023
|
+
|
2024
|
+
newOrder.push(simultaneousPaths);
|
2025
|
+
|
2026
|
+
// Go through the simultaneous paths and see if there is a series there
|
2027
|
+
if (
|
2028
|
+
i < order.length - 1 && // Do not add wait after last series
|
2029
|
+
simultaneousPaths.some(function (item) {
|
2030
|
+
return item.series;
|
2031
|
+
})
|
2032
|
+
) {
|
2033
|
+
// We have a series, meaning we should add a wait after these
|
2034
|
+
// paths have finished.
|
2035
|
+
newOrder.push(new H.sonification.TimelinePath({
|
2036
|
+
silentWait: wait
|
2037
|
+
}));
|
2038
|
+
}
|
2039
|
+
|
2040
|
+
return newOrder;
|
2041
|
+
}, []);
|
2042
|
+
}
|
2043
|
+
|
2044
|
+
|
2045
|
+
/**
|
2046
|
+
* Utility function to find the total amout of wait time in the TimelinePaths.
|
2047
|
+
* @private
|
2048
|
+
* @param {Array<object|Array<object|TimelinePath>>} order - The order of
|
2049
|
+
* TimelinePaths/items.
|
2050
|
+
* @return {number} The total time in ms spent on wait paths between playing.
|
2051
|
+
*/
|
2052
|
+
function getWaitTime(order) {
|
2053
|
+
return order.reduce(function (waitTime, orderDef) {
|
2054
|
+
var def = H.splat(orderDef);
|
2055
|
+
|
2056
|
+
return waitTime + (
|
2057
|
+
def.length === 1 && def[0].options && def[0].options.silentWait || 0
|
2058
|
+
);
|
2059
|
+
}, 0);
|
2060
|
+
}
|
2061
|
+
|
2062
|
+
|
2063
|
+
/**
|
2064
|
+
* Utility function to ensure simultaneous paths have start/end events at the
|
2065
|
+
* same time, to sync them.
|
2066
|
+
* @private
|
2067
|
+
* @param {Array<Highcharts.TimelinePath>} paths - The paths to sync.
|
2068
|
+
*/
|
2069
|
+
function syncSimultaneousPaths(paths) {
|
2070
|
+
// Find the extremes for these paths
|
2071
|
+
var extremes = paths.reduce(function (extremes, path) {
|
2072
|
+
var events = path.events;
|
2073
|
+
|
2074
|
+
if (events && events.length) {
|
2075
|
+
extremes.min = Math.min(events[0].time, extremes.min);
|
2076
|
+
extremes.max = Math.max(
|
2077
|
+
events[events.length - 1].time, extremes.max
|
2078
|
+
);
|
2079
|
+
}
|
2080
|
+
return extremes;
|
2081
|
+
}, {
|
2082
|
+
min: Infinity,
|
2083
|
+
max: -Infinity
|
2084
|
+
});
|
2085
|
+
|
2086
|
+
// Go through the paths and add events to make them fit the same timespan
|
2087
|
+
paths.forEach(function (path) {
|
2088
|
+
var events = path.events,
|
2089
|
+
hasEvents = events && events.length,
|
2090
|
+
eventsToAdd = [];
|
2091
|
+
|
2092
|
+
if (!(hasEvents && events[0].time <= extremes.min)) {
|
2093
|
+
eventsToAdd.push(new H.sonification.TimelineEvent({
|
2094
|
+
time: extremes.min
|
2095
|
+
}));
|
2096
|
+
}
|
2097
|
+
if (!(hasEvents && events[events.length - 1].time >= extremes.max)) {
|
2098
|
+
eventsToAdd.push(new H.sonification.TimelineEvent({
|
2099
|
+
time: extremes.max
|
2100
|
+
}));
|
2101
|
+
}
|
2102
|
+
if (eventsToAdd.length) {
|
2103
|
+
path.addTimelineEvents(eventsToAdd);
|
2104
|
+
}
|
2105
|
+
});
|
2106
|
+
}
|
2107
|
+
|
2108
|
+
|
2109
|
+
/**
|
2110
|
+
* Utility function to find the total duration span for all simul path sets
|
2111
|
+
* that include series.
|
2112
|
+
* @private
|
2113
|
+
* @param {Array<object|Array<object|Highcharts.TimelinePath>>} order - The
|
2114
|
+
* order of TimelinePaths/items.
|
2115
|
+
* @return {number} The total time value span difference for all series.
|
2116
|
+
*/
|
2117
|
+
function getSimulPathDurationTotal(order) {
|
2118
|
+
return order.reduce(function (durationTotal, orderDef) {
|
2119
|
+
return durationTotal + H.splat(orderDef).reduce(
|
2120
|
+
function (maxPathDuration, item) {
|
2121
|
+
var timeExtremes = item.series && item.seriesOptions &&
|
2122
|
+
item.seriesOptions.timeExtremes;
|
2123
|
+
|
2124
|
+
return timeExtremes ?
|
2125
|
+
Math.max(
|
2126
|
+
maxPathDuration, timeExtremes.max - timeExtremes.min
|
2127
|
+
) : maxPathDuration;
|
2128
|
+
},
|
2129
|
+
0
|
2130
|
+
);
|
2131
|
+
}, 0);
|
2132
|
+
}
|
2133
|
+
|
2134
|
+
|
2135
|
+
/**
|
2136
|
+
* Function to calculate the duration in ms for a series.
|
2137
|
+
* @private
|
2138
|
+
* @param {number} seriesValueDuration - The duration of the series in value
|
2139
|
+
* difference.
|
2140
|
+
* @param {number} totalValueDuration - The total duration of all (non
|
2141
|
+
* simultaneous) series in value difference.
|
2142
|
+
* @param {number} totalDurationMs - The desired total duration for all series
|
2143
|
+
* in milliseconds.
|
2144
|
+
* @return {number} The duration for the series in milliseconds.
|
2145
|
+
*/
|
2146
|
+
function getSeriesDurationMs(
|
2147
|
+
seriesValueDuration, totalValueDuration, totalDurationMs
|
2148
|
+
) {
|
2149
|
+
// A series spanning the whole chart would get the full duration.
|
2150
|
+
return utilities.virtualAxisTranslate(
|
2151
|
+
seriesValueDuration,
|
2152
|
+
{ min: 0, max: totalValueDuration },
|
2153
|
+
{ min: 0, max: totalDurationMs }
|
2154
|
+
);
|
2155
|
+
}
|
2156
|
+
|
2157
|
+
|
2158
|
+
/**
|
2159
|
+
* Convert series building objects into paths and return a new list of
|
2160
|
+
* TimelinePaths.
|
2161
|
+
* @private
|
2162
|
+
* @param {Array<object|Array<object|Highcharts.TimelinePath>>} order - The
|
2163
|
+
* order list.
|
2164
|
+
* @param {number} duration - Total duration to aim for in milliseconds.
|
2165
|
+
* @return {Array<Array<Highcharts.TimelinePath>>} Array of TimelinePath objects
|
2166
|
+
* to play.
|
2167
|
+
*/
|
2168
|
+
function buildPathsFromOrder(order, duration) {
|
2169
|
+
// Find time used for waits (custom or after series), and subtract it from
|
2170
|
+
// available duration.
|
2171
|
+
var totalAvailableDurationMs = Math.max(
|
2172
|
+
duration - getWaitTime(order), 0
|
2173
|
+
),
|
2174
|
+
// Add up simultaneous path durations to find total value span duration
|
2175
|
+
// of everything
|
2176
|
+
totalUsedDuration = getSimulPathDurationTotal(order);
|
2177
|
+
|
2178
|
+
// Go through the order list and convert the items
|
2179
|
+
return order.reduce(function (allPaths, orderDef) {
|
2180
|
+
var simultaneousPaths = H.splat(orderDef).reduce(
|
2181
|
+
function (simulPaths, item) {
|
2182
|
+
if (item instanceof H.sonification.TimelinePath) {
|
2183
|
+
// This item is already a path object
|
2184
|
+
simulPaths.push(item);
|
2185
|
+
} else if (item.series) {
|
2186
|
+
// We have a series.
|
2187
|
+
// We need to set the duration of the series
|
2188
|
+
item.seriesOptions.duration =
|
2189
|
+
item.seriesOptions.duration || getSeriesDurationMs(
|
2190
|
+
item.seriesOptions.timeExtremes.max -
|
2191
|
+
item.seriesOptions.timeExtremes.min,
|
2192
|
+
totalUsedDuration,
|
2193
|
+
totalAvailableDurationMs
|
2194
|
+
);
|
2195
|
+
|
2196
|
+
// Add the path
|
2197
|
+
simulPaths.push(buildTimelinePathFromSeries(
|
2198
|
+
item.series,
|
2199
|
+
item.seriesOptions
|
2200
|
+
));
|
2201
|
+
}
|
2202
|
+
return simulPaths;
|
2203
|
+
}, []
|
2204
|
+
);
|
2205
|
+
|
2206
|
+
// Add in the simultaneous paths
|
2207
|
+
allPaths.push(simultaneousPaths);
|
2208
|
+
return allPaths;
|
2209
|
+
}, []);
|
2210
|
+
}
|
2211
|
+
|
2212
|
+
|
2213
|
+
/**
|
2214
|
+
* Options for sonifying a chart.
|
2215
|
+
*
|
2216
|
+
* @requires module:modules/sonification
|
2217
|
+
*
|
2218
|
+
* @interface Highcharts.SonifyChartOptionsObject
|
2219
|
+
*//**
|
2220
|
+
* Duration for sonifying the entire chart. The duration is distributed across
|
2221
|
+
* the different series intelligently, but does not take earcons into account.
|
2222
|
+
* It is also possible to set the duration explicitly per series, using
|
2223
|
+
* `seriesOptions`. Note that points may continue to play after the duration has
|
2224
|
+
* passed, but no new points will start playing.
|
2225
|
+
* @name Highcharts.SonifyChartOptionsObject#duration
|
2226
|
+
* @type {number}
|
2227
|
+
*//**
|
2228
|
+
* Define the order to play the series in. This can be given as a string, or an
|
2229
|
+
* array specifying a custom ordering. If given as a string, valid values are
|
2230
|
+
* `sequential` - where each series is played in order - or `simultaneous`,
|
2231
|
+
* where all series are played at once. For custom ordering, supply an array as
|
2232
|
+
* the order. Each element in the array can be either a string with a series ID,
|
2233
|
+
* an Earcon object, or an object with a numeric `silentWait` property
|
2234
|
+
* designating a number of milliseconds to wait before continuing. Each element
|
2235
|
+
* of the array will be played in order. To play elements simultaneously, group
|
2236
|
+
* the elements in an array.
|
2237
|
+
* @name Highcharts.SonifyChartOptionsObject#order
|
2238
|
+
* @type {string|Array<string|Highcharts.Earcon|Array<string|Highcharts.Earcon>>}
|
2239
|
+
*//**
|
2240
|
+
* The axis to use for when to play the points. Can be a string with a data
|
2241
|
+
* property (e.g. `x`), or a function. If it is a function, this function
|
2242
|
+
* receives the point as argument, and should return a numeric value. The points
|
2243
|
+
* with the lowest numeric values are then played first, and the time between
|
2244
|
+
* points will be proportional to the distance between the numeric values. This
|
2245
|
+
* option can not be overridden per series.
|
2246
|
+
* @name Highcharts.SonifyChartOptionsObject#pointPlayTime
|
2247
|
+
* @type {string|Function}
|
2248
|
+
*//**
|
2249
|
+
* Milliseconds of silent waiting to add between series. Note that waiting time
|
2250
|
+
* is considered part of the sonify duration.
|
2251
|
+
* @name Highcharts.SonifyChartOptionsObject#afterSeriesWait
|
2252
|
+
* @type {number|undefined}
|
2253
|
+
*//**
|
2254
|
+
* Options as given to `series.sonify` to override options per series. If the
|
2255
|
+
* option is supplied as an array of options objects, the `id` property of the
|
2256
|
+
* object should correspond to the series' id. If the option is supplied as a
|
2257
|
+
* single object, the options apply to all series.
|
2258
|
+
* @name Highcharts.SonifyChartOptionsObject#seriesOptions
|
2259
|
+
* @type {Object|Array<object>|undefined}
|
2260
|
+
*//**
|
2261
|
+
* The instrument definitions for the points in this chart.
|
2262
|
+
* @name Highcharts.SonifyChartOptionsObject#instruments
|
2263
|
+
* @type {Array<Highcharts.PointInstrumentObject>|undefined}
|
2264
|
+
*//**
|
2265
|
+
* Earcons to add to the chart. Note that earcons can also be added per series
|
2266
|
+
* using `seriesOptions`.
|
2267
|
+
* @name Highcharts.SonifyChartOptionsObject#earcons
|
2268
|
+
* @type {Array<Highcharts.EarconConfiguration>|undefined}
|
2269
|
+
*//**
|
2270
|
+
* Optionally provide the minimum/maximum data values for the points. If this is
|
2271
|
+
* not supplied, it is calculated from all points in the chart on demand. This
|
2272
|
+
* option is supplied in the following format, as a map of point data properties
|
2273
|
+
* to objects with min/max values:
|
2274
|
+
* ```js
|
2275
|
+
* dataExtremes: {
|
2276
|
+
* y: {
|
2277
|
+
* min: 0,
|
2278
|
+
* max: 100
|
2279
|
+
* },
|
2280
|
+
* z: {
|
2281
|
+
* min: -10,
|
2282
|
+
* max: 10
|
2283
|
+
* }
|
2284
|
+
* // Properties used and not provided are calculated on demand
|
2285
|
+
* }
|
2286
|
+
* ```
|
2287
|
+
* @name Highcharts.SonifyChartOptionsObject#dataExtremes
|
2288
|
+
* @type {object|undefined}
|
2289
|
+
*//**
|
2290
|
+
* Callback before a series is played.
|
2291
|
+
* @name Highcharts.SonifyChartOptionsObject#onSeriesStart
|
2292
|
+
* @type {Function|undefined}
|
2293
|
+
*//**
|
2294
|
+
* Callback after a series has finished playing.
|
2295
|
+
* @name Highcharts.SonifyChartOptionsObject#onSeriesEnd
|
2296
|
+
* @type {Function|undefined}
|
2297
|
+
*//**
|
2298
|
+
* Callback after the chart has played.
|
2299
|
+
* @name Highcharts.SonifyChartOptionsObject#onEnd
|
2300
|
+
* @type {Function|undefined}
|
2301
|
+
*/
|
2302
|
+
|
2303
|
+
|
2304
|
+
/**
|
2305
|
+
* Sonify a chart.
|
2306
|
+
*
|
2307
|
+
* @sample highcharts/sonification/chart-sequential/
|
2308
|
+
* Sonify a basic chart
|
2309
|
+
* @sample highcharts/sonification/chart-simultaneous/
|
2310
|
+
* Sonify series simultaneously
|
2311
|
+
* @sample highcharts/sonification/chart-custom-order/
|
2312
|
+
* Custom defined order of series
|
2313
|
+
* @sample highcharts/sonification/chart-earcon/
|
2314
|
+
* Earcons on chart
|
2315
|
+
* @sample highcharts/sonification/chart-events/
|
2316
|
+
* Sonification events on chart
|
2317
|
+
*
|
2318
|
+
* @requires module:modules/sonification
|
2319
|
+
*
|
2320
|
+
* @function Highcharts.Chart#sonify
|
2321
|
+
*
|
2322
|
+
* @param {Highcharts.SonifyChartOptionsObject} options
|
2323
|
+
* The options for sonifying this chart.
|
2324
|
+
*/
|
2325
|
+
function chartSonify(options) {
|
2326
|
+
// Only one timeline can play at a time.
|
2327
|
+
if (this.sonification.timeline) {
|
2328
|
+
this.sonification.timeline.pause();
|
2329
|
+
}
|
2330
|
+
|
2331
|
+
// Calculate data extremes for the props used
|
2332
|
+
var dataExtremes = getExtremesForInstrumentProps(
|
2333
|
+
this, options.instruments, options.dataExtremes
|
2334
|
+
);
|
2335
|
+
|
2336
|
+
// Figure out ordering of series and custom paths
|
2337
|
+
var order = buildPathOrder(options.order, this, function (series) {
|
2338
|
+
return buildSeriesOptions(series, dataExtremes, options);
|
2339
|
+
});
|
2340
|
+
|
2341
|
+
// Add waits after simultaneous paths with series in them.
|
2342
|
+
order = addAfterSeriesWaits(order, options.afterSeriesWait || 0);
|
2343
|
+
|
2344
|
+
// We now have a list of either TimelinePath objects or series that need to
|
2345
|
+
// be converted to TimelinePath objects. Convert everything to paths.
|
2346
|
+
var paths = buildPathsFromOrder(order, options.duration);
|
2347
|
+
|
2348
|
+
// Sync simultaneous paths
|
2349
|
+
paths.forEach(function (simultaneousPaths) {
|
2350
|
+
syncSimultaneousPaths(simultaneousPaths);
|
2351
|
+
});
|
2352
|
+
|
2353
|
+
// We have a set of paths. Create the timeline, and play it.
|
2354
|
+
this.sonification.timeline = new H.sonification.Timeline({
|
2355
|
+
paths: paths,
|
2356
|
+
onEnd: options.onEnd
|
2357
|
+
});
|
2358
|
+
this.sonification.timeline.play();
|
2359
|
+
}
|
2360
|
+
|
2361
|
+
|
2362
|
+
/**
|
2363
|
+
* Get a list of the points currently under cursor.
|
2364
|
+
*
|
2365
|
+
* @requires module:modules/sonification
|
2366
|
+
*
|
2367
|
+
* @function Highcharts.Chart#getCurrentSonifyPoints
|
2368
|
+
*
|
2369
|
+
* @return {Array<Highcharts.Point>}
|
2370
|
+
* The points currently under the cursor.
|
2371
|
+
*/
|
2372
|
+
function getCurrentPoints() {
|
2373
|
+
var cursorObj;
|
2374
|
+
|
2375
|
+
if (this.sonification.timeline) {
|
2376
|
+
cursorObj = this.sonification.timeline.getCursor(); // Cursor per pathID
|
2377
|
+
return Object.keys(cursorObj).map(function (path) {
|
2378
|
+
// Get the event objects under cursor for each path
|
2379
|
+
return cursorObj[path].eventObject;
|
2380
|
+
}).filter(function (eventObj) {
|
2381
|
+
// Return the events that are points
|
2382
|
+
return eventObj instanceof H.Point;
|
2383
|
+
});
|
2384
|
+
}
|
2385
|
+
return [];
|
2386
|
+
}
|
2387
|
+
|
2388
|
+
|
2389
|
+
/**
|
2390
|
+
* Set the cursor to a point or set of points in different series.
|
2391
|
+
*
|
2392
|
+
* @requires module:modules/sonification
|
2393
|
+
*
|
2394
|
+
* @function Highcharts.Chart#setSonifyCursor
|
2395
|
+
*
|
2396
|
+
* @param {Highcharts.Point|Array<Highcharts.Point>} points
|
2397
|
+
* The point or points to set the cursor to. If setting multiple points
|
2398
|
+
* under the cursor, the points have to be in different series that are
|
2399
|
+
* being played simultaneously.
|
2400
|
+
*/
|
2401
|
+
function setCursor(points) {
|
2402
|
+
var timeline = this.sonification.timeline;
|
2403
|
+
|
2404
|
+
if (timeline) {
|
2405
|
+
H.splat(points).forEach(function (point) {
|
2406
|
+
// We created the events with the ID of the points, which makes
|
2407
|
+
// this easy. Just call setCursor for each ID.
|
2408
|
+
timeline.setCursor(point.id);
|
2409
|
+
});
|
2410
|
+
}
|
2411
|
+
}
|
2412
|
+
|
2413
|
+
|
2414
|
+
/**
|
2415
|
+
* Pause the running sonification.
|
2416
|
+
*
|
2417
|
+
* @requires module:modules/sonification
|
2418
|
+
*
|
2419
|
+
* @function Highcharts.Chart#pauseSonify
|
2420
|
+
*
|
2421
|
+
* @param {boolean} [fadeOut=true]
|
2422
|
+
* Fade out as we pause to avoid clicks.
|
2423
|
+
*/
|
2424
|
+
function pause(fadeOut) {
|
2425
|
+
if (this.sonification.timeline) {
|
2426
|
+
this.sonification.timeline.pause(H.pick(fadeOut, true));
|
2427
|
+
} else if (this.sonification.currentlyPlayingPoint) {
|
2428
|
+
this.sonification.currentlyPlayingPoint.cancelSonify(fadeOut);
|
2429
|
+
}
|
2430
|
+
}
|
2431
|
+
|
2432
|
+
|
2433
|
+
/**
|
2434
|
+
* Resume the currently running sonification. Requires series.sonify or
|
2435
|
+
* chart.sonify to have been played at some point earlier.
|
2436
|
+
*
|
2437
|
+
* @requires module:modules/sonification
|
2438
|
+
*
|
2439
|
+
* @function Highcharts.Chart#resumeSonify
|
2440
|
+
*
|
2441
|
+
* @param {Function} onEnd
|
2442
|
+
* Callback to call when play finished.
|
2443
|
+
*/
|
2444
|
+
function resume(onEnd) {
|
2445
|
+
if (this.sonification.timeline) {
|
2446
|
+
this.sonification.timeline.play(onEnd);
|
2447
|
+
}
|
2448
|
+
}
|
2449
|
+
|
2450
|
+
|
2451
|
+
/**
|
2452
|
+
* Play backwards from cursor. Requires series.sonify or chart.sonify to have
|
2453
|
+
* been played at some point earlier.
|
2454
|
+
*
|
2455
|
+
* @requires module:modules/sonification
|
2456
|
+
*
|
2457
|
+
* @function Highcharts.Chart#rewindSonify
|
2458
|
+
*
|
2459
|
+
* @param {Function} onEnd
|
2460
|
+
* Callback to call when play finished.
|
2461
|
+
*/
|
2462
|
+
function rewind(onEnd) {
|
2463
|
+
if (this.sonification.timeline) {
|
2464
|
+
this.sonification.timeline.rewind(onEnd);
|
2465
|
+
}
|
2466
|
+
}
|
2467
|
+
|
2468
|
+
|
2469
|
+
/**
|
2470
|
+
* Cancel current sonification and reset cursor.
|
2471
|
+
*
|
2472
|
+
* @requires module:modules/sonification
|
2473
|
+
*
|
2474
|
+
* @function Highcharts.Chart#cancelSonify
|
2475
|
+
*
|
2476
|
+
* @param {boolean} [fadeOut=true]
|
2477
|
+
* Fade out as we pause to avoid clicks.
|
2478
|
+
*/
|
2479
|
+
function cancel(fadeOut) {
|
2480
|
+
this.pauseSonify(fadeOut);
|
2481
|
+
this.resetSonifyCursor();
|
2482
|
+
}
|
2483
|
+
|
2484
|
+
|
2485
|
+
/**
|
2486
|
+
* Reset cursor to start. Requires series.sonify or chart.sonify to have been
|
2487
|
+
* played at some point earlier.
|
2488
|
+
*
|
2489
|
+
* @requires module:modules/sonification
|
2490
|
+
*
|
2491
|
+
* @function Highcharts.Chart#resetSonifyCursor
|
2492
|
+
*/
|
2493
|
+
function resetCursor() {
|
2494
|
+
if (this.sonification.timeline) {
|
2495
|
+
this.sonification.timeline.resetCursor();
|
2496
|
+
}
|
2497
|
+
}
|
2498
|
+
|
2499
|
+
|
2500
|
+
/**
|
2501
|
+
* Reset cursor to end. Requires series.sonify or chart.sonify to have been
|
2502
|
+
* played at some point earlier.
|
2503
|
+
*
|
2504
|
+
* @requires module:modules/sonification
|
2505
|
+
*
|
2506
|
+
* @function Highcharts.Chart#resetSonifyCursorEnd
|
2507
|
+
*/
|
2508
|
+
function resetCursorEnd() {
|
2509
|
+
if (this.sonification.timeline) {
|
2510
|
+
this.sonification.timeline.resetCursorEnd();
|
2511
|
+
}
|
2512
|
+
}
|
2513
|
+
|
2514
|
+
|
2515
|
+
// Export functions
|
2516
|
+
var chartSonifyFunctions = {
|
2517
|
+
chartSonify: chartSonify,
|
2518
|
+
seriesSonify: seriesSonify,
|
2519
|
+
pause: pause,
|
2520
|
+
resume: resume,
|
2521
|
+
rewind: rewind,
|
2522
|
+
cancel: cancel,
|
2523
|
+
getCurrentPoints: getCurrentPoints,
|
2524
|
+
setCursor: setCursor,
|
2525
|
+
resetCursor: resetCursor,
|
2526
|
+
resetCursorEnd: resetCursorEnd
|
2527
|
+
};
|
2528
|
+
|
2529
|
+
|
2530
|
+
return chartSonifyFunctions;
|
2531
|
+
}(Highcharts, utilities));
|
2532
|
+
var timelineClasses = (function (H, utilities) {
|
2533
|
+
/* *
|
2534
|
+
*
|
2535
|
+
* (c) 2009-2019 Øystein Moseng
|
2536
|
+
*
|
2537
|
+
* TimelineEvent class definition.
|
2538
|
+
*
|
2539
|
+
* License: www.highcharts.com/license
|
2540
|
+
*
|
2541
|
+
* */
|
2542
|
+
|
2543
|
+
/**
|
2544
|
+
* A set of options for the TimelineEvent class.
|
2545
|
+
*
|
2546
|
+
* @requires module:modules/sonification
|
2547
|
+
*
|
2548
|
+
* @private
|
2549
|
+
* @interface Highcharts.TimelineEventOptionsObject
|
2550
|
+
*//**
|
2551
|
+
* The object we want to sonify when playing the TimelineEvent. Can be any
|
2552
|
+
* object that implements the `sonify` and `cancelSonify` functions. If this is
|
2553
|
+
* not supplied, the TimelineEvent is considered a silent event, and the onEnd
|
2554
|
+
* event is immediately called.
|
2555
|
+
* @name Highcharts.TimelineEventOptionsObject#eventObject
|
2556
|
+
* @type {*}
|
2557
|
+
*//**
|
2558
|
+
* Options to pass on to the eventObject when playing it.
|
2559
|
+
* @name Highcharts.TimelineEventOptionsObject#playOptions
|
2560
|
+
* @type {object|undefined}
|
2561
|
+
*//**
|
2562
|
+
* The time at which we want this event to play (in milliseconds offset). This
|
2563
|
+
* is not used for the TimelineEvent.play function, but rather intended as a
|
2564
|
+
* property to decide when to call TimelineEvent.play. Defaults to 0.
|
2565
|
+
* @name Highcharts.TimelineEventOptionsObject#time
|
2566
|
+
* @type {number|undefined}
|
2567
|
+
*//**
|
2568
|
+
* Unique ID for the event. Generated automatically if not supplied.
|
2569
|
+
* @name Highcharts.TimelineEventOptionsObject#id
|
2570
|
+
* @type {string|undefined}
|
2571
|
+
*//**
|
2572
|
+
* Callback called when the play has finished.
|
2573
|
+
* @name Highcharts.TimelineEventOptionsObject#onEnd
|
2574
|
+
* @type {Function|undefined}
|
2575
|
+
*/
|
2576
|
+
|
2577
|
+
|
2578
|
+
|
2579
|
+
|
2580
|
+
|
2581
|
+
/**
|
2582
|
+
* The TimelineEvent class. Represents a sound event on a timeline.
|
2583
|
+
*
|
2584
|
+
* @requires module:modules/sonification
|
2585
|
+
*
|
2586
|
+
* @private
|
2587
|
+
* @class
|
2588
|
+
* @name Highcharts.TimelineEvent
|
2589
|
+
*
|
2590
|
+
* @param {Highcharts.TimelineEventOptionsObject} options
|
2591
|
+
* Options for the TimelineEvent.
|
2592
|
+
*/
|
2593
|
+
function TimelineEvent(options) {
|
2594
|
+
this.init(options || {});
|
2595
|
+
}
|
2596
|
+
TimelineEvent.prototype.init = function (options) {
|
2597
|
+
this.options = options;
|
2598
|
+
this.time = options.time || 0;
|
2599
|
+
this.id = this.options.id = options.id || H.uniqueKey();
|
2600
|
+
};
|
2601
|
+
|
2602
|
+
|
2603
|
+
/**
|
2604
|
+
* Play the event. Does not take the TimelineEvent.time option into account,
|
2605
|
+
* and plays the event immediately.
|
2606
|
+
*
|
2607
|
+
* @function Highcharts.TimelineEvent#play
|
2608
|
+
*
|
2609
|
+
* @param {Highcharts.TimelineEventOptionsObject} [options]
|
2610
|
+
* Options to pass in to the eventObject when playing it.
|
2611
|
+
*/
|
2612
|
+
TimelineEvent.prototype.play = function (options) {
|
2613
|
+
var eventObject = this.options.eventObject,
|
2614
|
+
masterOnEnd = this.options.onEnd,
|
2615
|
+
playOnEnd = options && options.onEnd,
|
2616
|
+
playOptionsOnEnd = this.options.playOptions &&
|
2617
|
+
this.options.playOptions.onEnd,
|
2618
|
+
playOptions = H.merge(this.options.playOptions, options);
|
2619
|
+
|
2620
|
+
if (eventObject && eventObject.sonify) {
|
2621
|
+
// If we have multiple onEnds defined, use all
|
2622
|
+
playOptions.onEnd = masterOnEnd || playOnEnd || playOptionsOnEnd ?
|
2623
|
+
function () {
|
2624
|
+
var args = arguments;
|
2625
|
+
|
2626
|
+
[masterOnEnd, playOnEnd, playOptionsOnEnd].forEach(
|
2627
|
+
function (onEnd) {
|
2628
|
+
if (onEnd) {
|
2629
|
+
onEnd.apply(this, args);
|
2630
|
+
}
|
2631
|
+
}
|
2632
|
+
);
|
2633
|
+
} : undefined;
|
2634
|
+
|
2635
|
+
eventObject.sonify(playOptions);
|
2636
|
+
} else {
|
2637
|
+
if (playOnEnd) {
|
2638
|
+
playOnEnd();
|
2639
|
+
}
|
2640
|
+
if (masterOnEnd) {
|
2641
|
+
masterOnEnd();
|
2642
|
+
}
|
2643
|
+
}
|
2644
|
+
};
|
2645
|
+
|
2646
|
+
|
2647
|
+
/**
|
2648
|
+
* Cancel the sonification of this event. Does nothing if the event is not
|
2649
|
+
* currently sonifying.
|
2650
|
+
*
|
2651
|
+
* @function Highcharts.TimelineEvent#cancel
|
2652
|
+
*
|
2653
|
+
* @param {boolean} [fadeOut=false]
|
2654
|
+
* Whether or not to fade out as we stop. If false, the event is
|
2655
|
+
* cancelled synchronously.
|
2656
|
+
*/
|
2657
|
+
TimelineEvent.prototype.cancel = function (fadeOut) {
|
2658
|
+
this.options.eventObject.cancelSonify(fadeOut);
|
2659
|
+
};
|
2660
|
+
|
2661
|
+
|
2662
|
+
/**
|
2663
|
+
* A set of options for the TimelinePath class.
|
2664
|
+
*
|
2665
|
+
* @requires module:modules/
|
2666
|
+
*
|
2667
|
+
* @private
|
2668
|
+
* @interface Highcharts.TimelinePathOptionsObject
|
2669
|
+
*//**
|
2670
|
+
* List of TimelineEvents to play on this track.
|
2671
|
+
* @name Highcharts.TimelinePathOptionsObject#events
|
2672
|
+
* @type {Array<Highcharts.TimelineEvent>}
|
2673
|
+
*//**
|
2674
|
+
* If this option is supplied, this path ignores all events and just waits for
|
2675
|
+
* the specified number of milliseconds before calling onEnd.
|
2676
|
+
* @name Highcharts.TimelinePathOptionsObject#silentWait
|
2677
|
+
* @type {number|undefined}
|
2678
|
+
*//**
|
2679
|
+
* Unique ID for this timeline path. Automatically generated if not supplied.
|
2680
|
+
* @name Highcharts.TimelinePathOptionsObject#id
|
2681
|
+
* @type {string|undefined}
|
2682
|
+
*//**
|
2683
|
+
* Callback called before the path starts playing.
|
2684
|
+
* @name Highcharts.TimelinePathOptionsObject#onStart
|
2685
|
+
* @type {Function|undefined}
|
2686
|
+
*//**
|
2687
|
+
* Callback function to call before an event plays.
|
2688
|
+
* @name Highcharts.TimelinePathOptionsObject#onEventStart
|
2689
|
+
* @type {Function|undefined}
|
2690
|
+
*//**
|
2691
|
+
* Callback function to call after an event has stopped playing.
|
2692
|
+
* @name Highcharts.TimelinePathOptionsObject#onEventEnd
|
2693
|
+
* @type {Function|undefined}
|
2694
|
+
*//**
|
2695
|
+
* Callback called when the whole path is finished.
|
2696
|
+
* @name Highcharts.TimelinePathOptionsObject#onEnd
|
2697
|
+
* @type {Function|undefined}
|
2698
|
+
*/
|
2699
|
+
|
2700
|
+
|
2701
|
+
/**
|
2702
|
+
* The TimelinePath class. Represents a track on a timeline with a list of
|
2703
|
+
* sound events to play at certain times relative to each other.
|
2704
|
+
*
|
2705
|
+
* @requires module:modules/sonification
|
2706
|
+
*
|
2707
|
+
* @private
|
2708
|
+
* @class
|
2709
|
+
* @name Highcharts.TimelinePath
|
2710
|
+
*
|
2711
|
+
* @param {Highcharts.TimelinePathOptionsObject} options
|
2712
|
+
* Options for the TimelinePath.
|
2713
|
+
*/
|
2714
|
+
function TimelinePath(options) {
|
2715
|
+
this.init(options);
|
2716
|
+
}
|
2717
|
+
TimelinePath.prototype.init = function (options) {
|
2718
|
+
this.options = options;
|
2719
|
+
this.id = this.options.id = options.id || H.uniqueKey();
|
2720
|
+
this.cursor = 0;
|
2721
|
+
this.eventsPlaying = {};
|
2722
|
+
|
2723
|
+
// Handle silent wait, otherwise use events from options
|
2724
|
+
this.events = options.silentWait ?
|
2725
|
+
[
|
2726
|
+
new TimelineEvent({ time: 0 }),
|
2727
|
+
new TimelineEvent({ time: options.silentWait })
|
2728
|
+
] :
|
2729
|
+
this.options.events;
|
2730
|
+
|
2731
|
+
// We need to sort our events by time
|
2732
|
+
this.sortEvents();
|
2733
|
+
|
2734
|
+
// Get map from event ID to index
|
2735
|
+
this.updateEventIdMap();
|
2736
|
+
|
2737
|
+
// Signal events to fire
|
2738
|
+
this.signalHandler = new utilities.SignalHandler(
|
2739
|
+
['playOnEnd', 'masterOnEnd', 'onStart', 'onEventStart', 'onEventEnd']
|
2740
|
+
);
|
2741
|
+
this.signalHandler.registerSignalCallbacks(
|
2742
|
+
H.merge(options, { masterOnEnd: options.onEnd })
|
2743
|
+
);
|
2744
|
+
};
|
2745
|
+
|
2746
|
+
|
2747
|
+
/**
|
2748
|
+
* Sort the internal event list by time.
|
2749
|
+
* @private
|
2750
|
+
*/
|
2751
|
+
TimelinePath.prototype.sortEvents = function () {
|
2752
|
+
this.events = this.events.sort(function (a, b) {
|
2753
|
+
return a.time - b.time;
|
2754
|
+
});
|
2755
|
+
};
|
2756
|
+
|
2757
|
+
|
2758
|
+
/**
|
2759
|
+
* Update the internal eventId to index map.
|
2760
|
+
* @private
|
2761
|
+
*/
|
2762
|
+
TimelinePath.prototype.updateEventIdMap = function () {
|
2763
|
+
this.eventIdMap = this.events.reduce(function (acc, cur, i) {
|
2764
|
+
acc[cur.id] = i;
|
2765
|
+
return acc;
|
2766
|
+
}, {});
|
2767
|
+
};
|
2768
|
+
|
2769
|
+
|
2770
|
+
/**
|
2771
|
+
* Add events to the path. Should not be done while the path is playing.
|
2772
|
+
* The new events are inserted according to their time property.
|
2773
|
+
* @private
|
2774
|
+
* @param {Array<Highcharts.TimelineEvent>} newEvents - The new timeline events
|
2775
|
+
* to add.
|
2776
|
+
*/
|
2777
|
+
TimelinePath.prototype.addTimelineEvents = function (newEvents) {
|
2778
|
+
this.events = this.events.concat(newEvents);
|
2779
|
+
this.sortEvents(); // Sort events by time
|
2780
|
+
this.updateEventIdMap(); // Update the event ID to index map
|
2781
|
+
};
|
2782
|
+
|
2783
|
+
|
2784
|
+
/**
|
2785
|
+
* Get the current TimelineEvent under the cursor.
|
2786
|
+
* @private
|
2787
|
+
* @return {Highcharts.TimelineEvent} The current timeline event.
|
2788
|
+
*/
|
2789
|
+
TimelinePath.prototype.getCursor = function () {
|
2790
|
+
return this.events[this.cursor];
|
2791
|
+
};
|
2792
|
+
|
2793
|
+
|
2794
|
+
/**
|
2795
|
+
* Set the current TimelineEvent under the cursor.
|
2796
|
+
* @private
|
2797
|
+
* @param {string} eventId - The ID of the timeline event to set as current.
|
2798
|
+
* @return {boolean} True if there is an event with this ID in the path. False
|
2799
|
+
* otherwise.
|
2800
|
+
*/
|
2801
|
+
TimelinePath.prototype.setCursor = function (eventId) {
|
2802
|
+
var ix = this.eventIdMap[eventId];
|
2803
|
+
|
2804
|
+
if (ix !== undefined) {
|
2805
|
+
this.cursor = ix;
|
2806
|
+
return true;
|
2807
|
+
}
|
2808
|
+
return false;
|
2809
|
+
};
|
2810
|
+
|
2811
|
+
|
2812
|
+
/**
|
2813
|
+
* Play the timeline from the current cursor.
|
2814
|
+
* @private
|
2815
|
+
* @param {Function} onEnd - Callback to call when play finished. Does not
|
2816
|
+
* override other onEnd callbacks.
|
2817
|
+
*/
|
2818
|
+
TimelinePath.prototype.play = function (onEnd) {
|
2819
|
+
this.pause();
|
2820
|
+
this.signalHandler.emitSignal('onStart');
|
2821
|
+
this.signalHandler.clearSignalCallbacks(['playOnEnd']);
|
2822
|
+
this.signalHandler.registerSignalCallbacks({ playOnEnd: onEnd });
|
2823
|
+
this.playEvents(1);
|
2824
|
+
};
|
2825
|
+
|
2826
|
+
|
2827
|
+
/**
|
2828
|
+
* Play the timeline backwards from the current cursor.
|
2829
|
+
* @private
|
2830
|
+
* @param {Function} onEnd - Callback to call when play finished. Does not
|
2831
|
+
* override other onEnd callbacks.
|
2832
|
+
*/
|
2833
|
+
TimelinePath.prototype.rewind = function (onEnd) {
|
2834
|
+
this.pause();
|
2835
|
+
this.signalHandler.emitSignal('onStart');
|
2836
|
+
this.signalHandler.clearSignalCallbacks(['playOnEnd']);
|
2837
|
+
this.signalHandler.registerSignalCallbacks({ playOnEnd: onEnd });
|
2838
|
+
this.playEvents(-1);
|
2839
|
+
};
|
2840
|
+
|
2841
|
+
|
2842
|
+
/**
|
2843
|
+
* Reset the cursor to the beginning.
|
2844
|
+
* @private
|
2845
|
+
*/
|
2846
|
+
TimelinePath.prototype.resetCursor = function () {
|
2847
|
+
this.cursor = 0;
|
2848
|
+
};
|
2849
|
+
|
2850
|
+
|
2851
|
+
/**
|
2852
|
+
* Reset the cursor to the end.
|
2853
|
+
* @private
|
2854
|
+
*/
|
2855
|
+
TimelinePath.prototype.resetCursorEnd = function () {
|
2856
|
+
this.cursor = this.events.length - 1;
|
2857
|
+
};
|
2858
|
+
|
2859
|
+
|
2860
|
+
/**
|
2861
|
+
* Cancel current playing. Leaves the cursor intact.
|
2862
|
+
* @private
|
2863
|
+
* @param {boolean} [fadeOut=false] - Whether or not to fade out as we stop. If
|
2864
|
+
* false, the path is cancelled synchronously.
|
2865
|
+
*/
|
2866
|
+
TimelinePath.prototype.pause = function (fadeOut) {
|
2867
|
+
var timelinePath = this;
|
2868
|
+
|
2869
|
+
// Cancel next scheduled play
|
2870
|
+
clearTimeout(timelinePath.nextScheduledPlay);
|
2871
|
+
|
2872
|
+
// Cancel currently playing events
|
2873
|
+
Object.keys(timelinePath.eventsPlaying).forEach(function (id) {
|
2874
|
+
if (timelinePath.eventsPlaying[id]) {
|
2875
|
+
timelinePath.eventsPlaying[id].cancel(fadeOut);
|
2876
|
+
}
|
2877
|
+
});
|
2878
|
+
timelinePath.eventsPlaying = {};
|
2879
|
+
};
|
2880
|
+
|
2881
|
+
|
2882
|
+
/**
|
2883
|
+
* Play the events, starting from current cursor, and going in specified
|
2884
|
+
* direction.
|
2885
|
+
* @private
|
2886
|
+
* @param {number} direction - The direction to play, 1 for forwards and -1 for
|
2887
|
+
* backwards.
|
2888
|
+
*/
|
2889
|
+
TimelinePath.prototype.playEvents = function (direction) {
|
2890
|
+
var timelinePath = this,
|
2891
|
+
curEvent = timelinePath.events[this.cursor],
|
2892
|
+
nextEvent = timelinePath.events[this.cursor + direction],
|
2893
|
+
timeDiff,
|
2894
|
+
onEnd = function (signalData) {
|
2895
|
+
timelinePath.signalHandler.emitSignal(
|
2896
|
+
'masterOnEnd', signalData
|
2897
|
+
);
|
2898
|
+
timelinePath.signalHandler.emitSignal(
|
2899
|
+
'playOnEnd', signalData
|
2900
|
+
);
|
2901
|
+
};
|
2902
|
+
|
2903
|
+
// Store reference to path on event
|
2904
|
+
curEvent.timelinePath = timelinePath;
|
2905
|
+
|
2906
|
+
// Emit event, cancel if returns false
|
2907
|
+
if (
|
2908
|
+
timelinePath.signalHandler.emitSignal(
|
2909
|
+
'onEventStart', curEvent
|
2910
|
+
) === false
|
2911
|
+
) {
|
2912
|
+
onEnd({
|
2913
|
+
event: curEvent,
|
2914
|
+
cancelled: true
|
2915
|
+
});
|
2916
|
+
return;
|
2917
|
+
}
|
2918
|
+
|
2919
|
+
// Play the current event
|
2920
|
+
timelinePath.eventsPlaying[curEvent.id] = curEvent;
|
2921
|
+
curEvent.play({
|
2922
|
+
onEnd: function (cancelled) {
|
2923
|
+
var signalData = {
|
2924
|
+
event: curEvent,
|
2925
|
+
cancelled: !!cancelled
|
2926
|
+
};
|
2927
|
+
|
2928
|
+
// Keep track of currently playing events for cancelling
|
2929
|
+
delete timelinePath.eventsPlaying[curEvent.id];
|
2930
|
+
|
2931
|
+
// Handle onEventEnd
|
2932
|
+
timelinePath.signalHandler.emitSignal('onEventEnd', signalData);
|
2933
|
+
|
2934
|
+
// Reached end of path?
|
2935
|
+
if (!nextEvent) {
|
2936
|
+
onEnd(signalData);
|
2937
|
+
}
|
2938
|
+
}
|
2939
|
+
});
|
2940
|
+
|
2941
|
+
// Schedule next
|
2942
|
+
if (nextEvent) {
|
2943
|
+
timeDiff = Math.abs(nextEvent.time - curEvent.time);
|
2944
|
+
if (timeDiff < 1) {
|
2945
|
+
// Play immediately
|
2946
|
+
timelinePath.cursor += direction;
|
2947
|
+
timelinePath.playEvents(direction);
|
2948
|
+
} else {
|
2949
|
+
// Schedule after the difference in ms
|
2950
|
+
this.nextScheduledPlay = setTimeout(function () {
|
2951
|
+
timelinePath.cursor += direction;
|
2952
|
+
timelinePath.playEvents(direction);
|
2953
|
+
}, timeDiff);
|
2954
|
+
}
|
2955
|
+
}
|
2956
|
+
};
|
2957
|
+
|
2958
|
+
|
2959
|
+
/* ************************************************************************** *
|
2960
|
+
* TIMELINE *
|
2961
|
+
* ************************************************************************** */
|
2962
|
+
|
2963
|
+
|
2964
|
+
/**
|
2965
|
+
* A set of options for the Timeline class.
|
2966
|
+
*
|
2967
|
+
* @requires module:modules/sonification
|
2968
|
+
*
|
2969
|
+
* @private
|
2970
|
+
* @interface Highcharts.TimelineOptionsObject
|
2971
|
+
*//**
|
2972
|
+
* List of TimelinePaths to play. Multiple paths can be grouped together and
|
2973
|
+
* played simultaneously by supplying an array of paths in place of a single
|
2974
|
+
* path.
|
2975
|
+
* @name Highcharts.TimelineOptionsObject#paths
|
2976
|
+
* @type {Array<Highcharts.TimelinePath|Array<Highcharts.TimelinePath>>}
|
2977
|
+
*//**
|
2978
|
+
* Callback function to call before a path plays.
|
2979
|
+
* @name Highcharts.TimelineOptionsObject#onPathStart
|
2980
|
+
* @type {Function|undefined}
|
2981
|
+
*//**
|
2982
|
+
* Callback function to call after a path has stopped playing.
|
2983
|
+
* @name Highcharts.TimelineOptionsObject#onPathEnd
|
2984
|
+
* @type {Function|undefined}
|
2985
|
+
*//**
|
2986
|
+
* Callback called when the whole path is finished.
|
2987
|
+
* @name Highcharts.TimelineOptionsObject#onEnd
|
2988
|
+
* @type {Function|undefined}
|
2989
|
+
*/
|
2990
|
+
|
2991
|
+
|
2992
|
+
/**
|
2993
|
+
* The Timeline class. Represents a sonification timeline with a list of
|
2994
|
+
* timeline paths with events to play at certain times relative to each other.
|
2995
|
+
*
|
2996
|
+
* @requires module:modules/sonification
|
2997
|
+
*
|
2998
|
+
* @private
|
2999
|
+
* @class
|
3000
|
+
* @name Highcharts.Timeline
|
3001
|
+
*
|
3002
|
+
* @param {Highcharts.TimelineOptionsObject} options
|
3003
|
+
* Options for the Timeline.
|
3004
|
+
*/
|
3005
|
+
function Timeline(options) {
|
3006
|
+
this.init(options || {});
|
3007
|
+
}
|
3008
|
+
Timeline.prototype.init = function (options) {
|
3009
|
+
this.options = options;
|
3010
|
+
this.cursor = 0;
|
3011
|
+
this.paths = options.paths;
|
3012
|
+
this.pathsPlaying = {};
|
3013
|
+
this.signalHandler = new utilities.SignalHandler(
|
3014
|
+
['playOnEnd', 'masterOnEnd', 'onPathStart', 'onPathEnd']
|
3015
|
+
);
|
3016
|
+
this.signalHandler.registerSignalCallbacks(
|
3017
|
+
H.merge(options, { masterOnEnd: options.onEnd })
|
3018
|
+
);
|
3019
|
+
};
|
3020
|
+
|
3021
|
+
|
3022
|
+
/**
|
3023
|
+
* Play the timeline forwards from cursor.
|
3024
|
+
* @private
|
3025
|
+
* @param {Function} onEnd - Callback to call when play finished. Does not
|
3026
|
+
* override other onEnd callbacks.
|
3027
|
+
*/
|
3028
|
+
Timeline.prototype.play = function (onEnd) {
|
3029
|
+
this.pause();
|
3030
|
+
this.signalHandler.clearSignalCallbacks(['playOnEnd']);
|
3031
|
+
this.signalHandler.registerSignalCallbacks({ playOnEnd: onEnd });
|
3032
|
+
this.playPaths(1);
|
3033
|
+
};
|
3034
|
+
|
3035
|
+
|
3036
|
+
/**
|
3037
|
+
* Play the timeline backwards from cursor.
|
3038
|
+
* @private
|
3039
|
+
* @param {Function} onEnd - Callback to call when play finished. Does not
|
3040
|
+
* override other onEnd callbacks.
|
3041
|
+
*/
|
3042
|
+
Timeline.prototype.rewind = function (onEnd) {
|
3043
|
+
this.pause();
|
3044
|
+
this.signalHandler.clearSignalCallbacks(['playOnEnd']);
|
3045
|
+
this.signalHandler.registerSignalCallbacks({ playOnEnd: onEnd });
|
3046
|
+
this.playPaths(-1);
|
3047
|
+
};
|
3048
|
+
|
3049
|
+
|
3050
|
+
/**
|
3051
|
+
* Play the timeline in the specified direction.
|
3052
|
+
* @private
|
3053
|
+
* @param {number} direction - Direction to play in. 1 for forwards, -1 for
|
3054
|
+
* backwards.
|
3055
|
+
*/
|
3056
|
+
Timeline.prototype.playPaths = function (direction) {
|
3057
|
+
var curPaths = H.splat(this.paths[this.cursor]),
|
3058
|
+
nextPaths = this.paths[this.cursor + direction],
|
3059
|
+
timeline = this,
|
3060
|
+
signalHandler = this.signalHandler,
|
3061
|
+
pathsEnded = 0,
|
3062
|
+
// Play a path
|
3063
|
+
playPath = function (path) {
|
3064
|
+
// Emit signal and set playing state
|
3065
|
+
signalHandler.emitSignal('onPathStart', path);
|
3066
|
+
timeline.pathsPlaying[path.id] = path;
|
3067
|
+
// Do the play
|
3068
|
+
path[direction > 0 ? 'play' : 'rewind'](function (callbackData) {
|
3069
|
+
// Play ended callback
|
3070
|
+
// Data to pass to signal callbacks
|
3071
|
+
var cancelled = callbackData && callbackData.cancelled,
|
3072
|
+
signalData = {
|
3073
|
+
path: path,
|
3074
|
+
cancelled: cancelled
|
3075
|
+
};
|
3076
|
+
|
3077
|
+
// Clear state and send signal
|
3078
|
+
delete timeline.pathsPlaying[path.id];
|
3079
|
+
signalHandler.emitSignal('onPathEnd', signalData);
|
3080
|
+
|
3081
|
+
// Handle next paths
|
3082
|
+
pathsEnded++;
|
3083
|
+
if (pathsEnded >= curPaths.length) {
|
3084
|
+
// We finished all of the current paths for cursor.
|
3085
|
+
if (nextPaths && !cancelled) {
|
3086
|
+
// We have more paths, move cursor along
|
3087
|
+
timeline.cursor += direction;
|
3088
|
+
// Reset upcoming path cursors before playing
|
3089
|
+
H.splat(nextPaths).forEach(function (nextPath) {
|
3090
|
+
nextPath[
|
3091
|
+
direction > 0 ? 'resetCursor' : 'resetCursorEnd'
|
3092
|
+
]();
|
3093
|
+
});
|
3094
|
+
// Play next
|
3095
|
+
timeline.playPaths(direction);
|
3096
|
+
} else {
|
3097
|
+
// If it is the last path in this direction, call onEnd
|
3098
|
+
signalHandler.emitSignal('playOnEnd', signalData);
|
3099
|
+
signalHandler.emitSignal('masterOnEnd', signalData);
|
3100
|
+
}
|
3101
|
+
}
|
3102
|
+
});
|
3103
|
+
};
|
3104
|
+
|
3105
|
+
// Go through the paths under cursor and play them
|
3106
|
+
curPaths.forEach(function (path) {
|
3107
|
+
if (path) {
|
3108
|
+
// Store reference to timeline
|
3109
|
+
path.timeline = timeline;
|
3110
|
+
|
3111
|
+
// Leave a timeout to let notes fade out before next play
|
3112
|
+
setTimeout(function () {
|
3113
|
+
playPath(path);
|
3114
|
+
}, H.sonification.fadeOutTime);
|
3115
|
+
}
|
3116
|
+
});
|
3117
|
+
};
|
3118
|
+
|
3119
|
+
|
3120
|
+
/**
|
3121
|
+
* Stop the playing of the timeline. Cancels all current sounds, but does not
|
3122
|
+
* affect the cursor.
|
3123
|
+
* @private
|
3124
|
+
* @param {boolean} [fadeOut=false] - Whether or not to fade out as we stop. If
|
3125
|
+
* false, the timeline is cancelled synchronously.
|
3126
|
+
*/
|
3127
|
+
Timeline.prototype.pause = function (fadeOut) {
|
3128
|
+
var timeline = this;
|
3129
|
+
|
3130
|
+
// Cancel currently playing events
|
3131
|
+
Object.keys(timeline.pathsPlaying).forEach(function (id) {
|
3132
|
+
if (timeline.pathsPlaying[id]) {
|
3133
|
+
timeline.pathsPlaying[id].pause(fadeOut);
|
3134
|
+
}
|
3135
|
+
});
|
3136
|
+
timeline.pathsPlaying = {};
|
3137
|
+
};
|
3138
|
+
|
3139
|
+
|
3140
|
+
/**
|
3141
|
+
* Reset the cursor to the beginning of the timeline.
|
3142
|
+
* @private
|
3143
|
+
*/
|
3144
|
+
Timeline.prototype.resetCursor = function () {
|
3145
|
+
this.paths.forEach(function (paths) {
|
3146
|
+
H.splat(paths).forEach(function (path) {
|
3147
|
+
path.resetCursor();
|
3148
|
+
});
|
3149
|
+
});
|
3150
|
+
this.cursor = 0;
|
3151
|
+
};
|
3152
|
+
|
3153
|
+
|
3154
|
+
/**
|
3155
|
+
* Reset the cursor to the end of the timeline.
|
3156
|
+
* @private
|
3157
|
+
*/
|
3158
|
+
Timeline.prototype.resetCursorEnd = function () {
|
3159
|
+
this.paths.forEach(function (paths) {
|
3160
|
+
H.splat(paths).forEach(function (path) {
|
3161
|
+
path.resetCursorEnd();
|
3162
|
+
});
|
3163
|
+
});
|
3164
|
+
this.cursor = this.paths.length - 1;
|
3165
|
+
};
|
3166
|
+
|
3167
|
+
|
3168
|
+
/**
|
3169
|
+
* Set the current TimelineEvent under the cursor. If multiple paths are being
|
3170
|
+
* played at the same time, this function only affects a single path (the one
|
3171
|
+
* that contains the eventId that is passed in).
|
3172
|
+
* @private
|
3173
|
+
* @param {string} eventId - The ID of the timeline event to set as current.
|
3174
|
+
* @return {boolean} True if the cursor was set, false if no TimelineEvent was
|
3175
|
+
* found for this ID.
|
3176
|
+
*/
|
3177
|
+
Timeline.prototype.setCursor = function (eventId) {
|
3178
|
+
return this.paths.some(function (paths) {
|
3179
|
+
return H.splat(paths).some(function (path) {
|
3180
|
+
return path.setCursor(eventId);
|
3181
|
+
});
|
3182
|
+
});
|
3183
|
+
};
|
3184
|
+
|
3185
|
+
|
3186
|
+
/**
|
3187
|
+
* Get the current TimelineEvents under the cursors. This function will return
|
3188
|
+
* the event under the cursor for each currently playing path, as an object
|
3189
|
+
* where the path ID is mapped to the TimelineEvent under that path's cursor.
|
3190
|
+
* @private
|
3191
|
+
* @return {object} The TimelineEvents under each path's cursors.
|
3192
|
+
*/
|
3193
|
+
Timeline.prototype.getCursor = function () {
|
3194
|
+
return this.getCurrentPlayingPaths().reduce(function (acc, cur) {
|
3195
|
+
acc[cur.id] = cur.getCursor();
|
3196
|
+
return acc;
|
3197
|
+
}, {});
|
3198
|
+
};
|
3199
|
+
|
3200
|
+
|
3201
|
+
/**
|
3202
|
+
* Check if timeline is reset or at start.
|
3203
|
+
* @private
|
3204
|
+
* @return {boolean} True if timeline is at the beginning.
|
3205
|
+
*/
|
3206
|
+
Timeline.prototype.atStart = function () {
|
3207
|
+
return !this.getCurrentPlayingPaths().some(function (path) {
|
3208
|
+
return path.cursor;
|
3209
|
+
});
|
3210
|
+
};
|
3211
|
+
|
3212
|
+
|
3213
|
+
/**
|
3214
|
+
* Get the current TimelinePaths being played.
|
3215
|
+
* @private
|
3216
|
+
* @return {Array<Highcharts.TimelinePath>} The TimelinePaths currently being
|
3217
|
+
* played.
|
3218
|
+
*/
|
3219
|
+
Timeline.prototype.getCurrentPlayingPaths = function () {
|
3220
|
+
return H.splat(this.paths[this.cursor]);
|
3221
|
+
};
|
3222
|
+
|
3223
|
+
|
3224
|
+
// Export the classes
|
3225
|
+
var timelineClasses = {
|
3226
|
+
TimelineEvent: TimelineEvent,
|
3227
|
+
TimelinePath: TimelinePath,
|
3228
|
+
Timeline: Timeline
|
3229
|
+
};
|
3230
|
+
|
3231
|
+
|
3232
|
+
return timelineClasses;
|
3233
|
+
}(Highcharts, utilities));
|
3234
|
+
(function (H, Instrument, instruments, Earcon, pointSonifyFunctions, chartSonifyFunctions, utilities, TimelineClasses) {
|
3235
|
+
/* *
|
3236
|
+
*
|
3237
|
+
* (c) 2009-2019 Øystein Moseng
|
3238
|
+
*
|
3239
|
+
* Sonification module for Highcharts
|
3240
|
+
*
|
3241
|
+
* License: www.highcharts.com/license
|
3242
|
+
*
|
3243
|
+
* */
|
3244
|
+
|
3245
|
+
|
3246
|
+
|
3247
|
+
// Expose on the Highcharts object
|
3248
|
+
|
3249
|
+
/**
|
3250
|
+
* Global classes and objects related to sonification.
|
3251
|
+
*
|
3252
|
+
* @requires module:modules/sonification
|
3253
|
+
*
|
3254
|
+
* @name Highcharts.sonification
|
3255
|
+
* @type {Highcharts.SonificationObject}
|
3256
|
+
*/
|
3257
|
+
|
3258
|
+
/**
|
3259
|
+
* Global classes and objects related to sonification.
|
3260
|
+
*
|
3261
|
+
* @requires module:modules/sonification
|
3262
|
+
*
|
3263
|
+
* @interface Highcharts.SonificationObject
|
3264
|
+
*//**
|
3265
|
+
* Note fade-out-time in milliseconds. Most notes are faded out quickly by
|
3266
|
+
* default if there is time. This is to avoid abrupt stops which will cause
|
3267
|
+
* perceived clicks.
|
3268
|
+
* @name Highcharts.SonificationObject#fadeOutDuration
|
3269
|
+
* @type {number}
|
3270
|
+
*//**
|
3271
|
+
* Utility functions.
|
3272
|
+
* @name Highcharts.SonificationObject#utilities
|
3273
|
+
* @private
|
3274
|
+
* @type {object}
|
3275
|
+
*//**
|
3276
|
+
* The Instrument class.
|
3277
|
+
* @name Highcharts.SonificationObject#Instrument
|
3278
|
+
* @type {Function}
|
3279
|
+
*//**
|
3280
|
+
* Predefined instruments, given as an object with a map between the instrument
|
3281
|
+
* name and the Highcharts.Instrument object.
|
3282
|
+
* @name Highcharts.SonificationObject#instruments
|
3283
|
+
* @type {Object}
|
3284
|
+
*//**
|
3285
|
+
* The Earcon class.
|
3286
|
+
* @name Highcharts.SonificationObject#Earcon
|
3287
|
+
* @type {Function}
|
3288
|
+
*//**
|
3289
|
+
* The TimelineEvent class.
|
3290
|
+
* @private
|
3291
|
+
* @name Highcharts.SonificationObject#TimelineEvent
|
3292
|
+
* @type {Function}
|
3293
|
+
*//**
|
3294
|
+
* The TimelinePath class.
|
3295
|
+
* @private
|
3296
|
+
* @name Highcharts.SonificationObject#TimelinePath
|
3297
|
+
* @type {Function}
|
3298
|
+
*//**
|
3299
|
+
* The Timeline class.
|
3300
|
+
* @private
|
3301
|
+
* @name Highcharts.SonificationObject#Timeline
|
3302
|
+
* @type {Function}
|
3303
|
+
*/
|
3304
|
+
H.sonification = {
|
3305
|
+
fadeOutDuration: 20,
|
3306
|
+
|
3307
|
+
// Classes and functions
|
3308
|
+
utilities: utilities,
|
3309
|
+
Instrument: Instrument,
|
3310
|
+
instruments: instruments,
|
3311
|
+
Earcon: Earcon,
|
3312
|
+
TimelineEvent: TimelineClasses.TimelineEvent,
|
3313
|
+
TimelinePath: TimelineClasses.TimelinePath,
|
3314
|
+
Timeline: TimelineClasses.Timeline
|
3315
|
+
};
|
3316
|
+
|
3317
|
+
// Chart specific
|
3318
|
+
H.Point.prototype.sonify = pointSonifyFunctions.pointSonify;
|
3319
|
+
H.Point.prototype.cancelSonify = pointSonifyFunctions.pointCancelSonify;
|
3320
|
+
H.Series.prototype.sonify = chartSonifyFunctions.seriesSonify;
|
3321
|
+
H.extend(H.Chart.prototype, {
|
3322
|
+
sonify: chartSonifyFunctions.chartSonify,
|
3323
|
+
pauseSonify: chartSonifyFunctions.pause,
|
3324
|
+
resumeSonify: chartSonifyFunctions.resume,
|
3325
|
+
rewindSonify: chartSonifyFunctions.rewind,
|
3326
|
+
cancelSonify: chartSonifyFunctions.cancel,
|
3327
|
+
getCurrentSonifyPoints: chartSonifyFunctions.getCurrentPoints,
|
3328
|
+
setSonifyCursor: chartSonifyFunctions.setCursor,
|
3329
|
+
resetSonifyCursor: chartSonifyFunctions.resetCursor,
|
3330
|
+
resetSonifyCursorEnd: chartSonifyFunctions.resetCursorEnd,
|
3331
|
+
sonification: {}
|
3332
|
+
});
|
3333
|
+
|
3334
|
+
}(Highcharts, Instrument, instruments, Earcon, pointSonifyFunctions, chartSonifyFunctions, utilities, timelineClasses));
|
3335
|
+
return (function () {
|
3336
|
+
|
3337
|
+
|
3338
|
+
|
3339
|
+
|
3340
|
+
}());
|
3341
|
+
}));
|