diff --git a/js/components/MilkdropWindow/PresetOverlay.js b/js/components/MilkdropWindow/PresetOverlay.js
index 87647017..e1a9aac4 100644
--- a/js/components/MilkdropWindow/PresetOverlay.js
+++ b/js/components/MilkdropWindow/PresetOverlay.js
@@ -28,7 +28,7 @@ class PresetOverlay extends React.Component {
this.setState({
presetIdx: Math.min(
this.state.presetIdx + 1,
- Object.keys(this.props.presets).length - 1
+ this.props.presetKeys.length - 1
)
});
e.stopPropagation();
@@ -44,7 +44,7 @@ class PresetOverlay extends React.Component {
}
}
render() {
- if (!this.props.presets) {
+ if (!this.props.presetKeys) {
return (
{
let color;
if (i + startIdx === this.props.currentPreset) {
diff --git a/js/components/MilkdropWindow/index.js b/js/components/MilkdropWindow/index.js
index e1951bd3..333372b5 100644
--- a/js/components/MilkdropWindow/index.js
+++ b/js/components/MilkdropWindow/index.js
@@ -22,14 +22,22 @@ class MilkdropWindow extends React.Component {
}
componentDidMount() {
require.ensure(
- ["butterchurn", "butterchurn-presets/lib/butterchurnPresetsMinimal.min"],
+ [
+ "butterchurn",
+ "butterchurn-presets/lib/butterchurnPresetsMinimal.min",
+ "butterchurn-presets/lib/butterchurnPresetPackMeta.min"
+ ],
require => {
const analyserNode = this.props.analyser;
const butterchurn = require("butterchurn");
- const butterchurnPresets = require("butterchurn-presets/lib/butterchurnPresetsMinimal.min");
- this.presets = butterchurnPresets.getPresets();
- this.presetKeys = Object.keys(this.presets);
- const presetIdx = Math.floor(Math.random() * this.presetKeys.length);
+ const butterchurnMinimalPresets = require("butterchurn-presets/lib/butterchurnPresetsMinimal.min");
+ const presetPackMeta = require("butterchurn-presets/lib/butterchurnPresetPackMeta.min");
+ this.presets = butterchurnMinimalPresets.getPresets();
+ this.minmalPresetKeys = Object.keys(this.presets);
+ this.presetKeys = presetPackMeta.getMainPresetMeta().presets;
+ const presetKey = this.minmalPresetKeys[
+ Math.floor(Math.random() * this.minmalPresetKeys.length)
+ ];
this.visualizer = butterchurn.createVisualizer(
analyserNode.context,
@@ -43,7 +51,7 @@ class MilkdropWindow extends React.Component {
this._canvasNode.width = this.props.width;
this._canvasNode.height = this.props.height;
this.visualizer.connectAudio(analyserNode);
- this.visualizer.loadPreset(this.presets[this.presetKeys[presetIdx]], 0);
+ this.visualizer.loadPreset(this.presets[presetKey], 0);
// Kick off the animation loop
const loop = () => {
if (this.props.status === "PLAYING") {
@@ -53,7 +61,7 @@ class MilkdropWindow extends React.Component {
};
loop();
- this.presetHistory = [presetIdx];
+ this.presetHistory = [this.presetKeys.indexOf(presetKey)];
this.presetRandomize = true;
this.presetCycle = true;
this._restartCycling();
@@ -154,7 +162,23 @@ class MilkdropWindow extends React.Component {
break;
}
}
- _nextPreset(blendTime) {
+ async _loadMainPresetPack() {
+ return require.ensure(
+ ["butterchurn-presets"],
+ require => {
+ const butterchurnPresets = require("butterchurn-presets");
+ this.presets = Object.assign(
+ this.presets,
+ butterchurnPresets.getPresets()
+ );
+ },
+ e => {
+ console.error("Error loading Butterchurn Presets", e);
+ },
+ "butterchurn-presets"
+ );
+ }
+ async _nextPreset(blendTime) {
// The visualizer may not have initialized yet.
if (this.visualizer != null) {
let presetIdx;
@@ -164,7 +188,12 @@ class MilkdropWindow extends React.Component {
const prevPresetIdx = this.presetHistory[this.presetHistory.length - 1];
presetIdx = (prevPresetIdx + 1) % this.presetKeys.length;
}
- const preset = this.presets[this.presetKeys[presetIdx]];
+ let preset = this.presets[this.presetKeys[presetIdx]];
+ if (!preset) {
+ await this._loadMainPresetPack();
+ preset = this.presets[this.presetKeys[presetIdx]];
+ }
+
this.presetHistory.push(presetIdx);
this.visualizer.loadPreset(preset, blendTime);
this._restartCycling();
@@ -183,8 +212,12 @@ class MilkdropWindow extends React.Component {
this.setState({ currentPreset: prevPreset });
}
}
- selectPreset(presetIdx) {
- const preset = this.presets[this.presetKeys[presetIdx]];
+ async selectPreset(presetIdx) {
+ let preset = this.presets[this.presetKeys[presetIdx]];
+ if (!preset) {
+ await this._loadMainPresetPack();
+ preset = this.presets[this.presetKeys[presetIdx]];
+ }
this.presetHistory.push(presetIdx);
this.visualizer.loadPreset(preset, 0);
this._restartCycling();
@@ -222,7 +255,7 @@ class MilkdropWindow extends React.Component {
this.props.onFocusedKeyDown(listener)}
selectPreset={idx => this.selectPreset(idx)}
diff --git a/package.json b/package.json
index 58f56f42..42ecf132 100644
--- a/package.json
+++ b/package.json
@@ -55,7 +55,7 @@
"babel-preset-react": "^6.24.1",
"babel-runtime": "^6.26.0",
"butterchurn": "^2.4.3",
- "butterchurn-presets": "^2.4.4",
+ "butterchurn-presets": "^2.4.5",
"canvas-mock": "0.0.0",
"cardinal-spline-js": "^2.3.6",
"classnames": "^2.2.5",
diff --git a/yarn.lock b/yarn.lock
index 4dace8b6..40e2c41b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1269,9 +1269,9 @@ builtin-status-codes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
-butterchurn-presets@^2.4.4:
- version "2.4.4"
- resolved "https://registry.yarnpkg.com/butterchurn-presets/-/butterchurn-presets-2.4.4.tgz#23764b47e9d30c29caf95d974a92002f6f29c057"
+butterchurn-presets@^2.4.5:
+ version "2.4.5"
+ resolved "https://registry.yarnpkg.com/butterchurn-presets/-/butterchurn-presets-2.4.5.tgz#5e05f2c57e941ff2d24f655b0ea842ca1ff4787a"
dependencies:
babel-runtime "^6.26.0"
ecma-proposal-math-extensions "0.0.2"