Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 0.5.0 “Krennic” #86

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zapperment",
"version": "0.4.0",
"version": "0.5.0",
"description": "Smooth background music for coding, remixed with machine learning",
"main": "index.js",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/ableton-live/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/ableton-live",
"version": "0.4.0",
"version": "0.5.0",
"description": "MIDI remote script for controlling Ableton Live with Zapperment",
"main": "src/__init__.py",
"scripts": {
Expand Down
8 changes: 4 additions & 4 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/backend",
"version": "0.4.0",
"version": "0.5.0",
"description": "Zapperment backend (Express server)",
"main": "src/index.js",
"scripts": {
Expand All @@ -10,9 +10,9 @@
"author": "Patrick Hund",
"license": "MIT",
"dependencies": {
"@zapperment/midi": "^0.4.0",
"@zapperment/shared": "^0.4.0",
"@zapperment/storage": "^0.4.0",
"@zapperment/midi": "^0.5.0",
"@zapperment/shared": "^0.5.0",
"@zapperment/storage": "^0.5.0",
"brain.js": "^1.6.1",
"check-prop-types": "^1.1.2",
"dotenv": "^8.2.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/backend/src/composition/utils/processChannel.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,14 @@ module.exports = (track, context) => {
Object.keys(controllers[controlName]).length !== nodeKeys.length
) {
throw new Error(
"Expected all slice controllers to have same number of options"
"Expected all clip controllers to have same number of options"
);
}
nodeKeys.forEach(key => {
const setters = controllers[controlName][key];
if (!setters) {
throw new Error(
"Expected all slice controllers to have same options for the same MIDI values"
"Expected all clip controllers to have same options for the same MIDI values"
);
}
setters.push(() => setter(nodeValue[key]));
Expand Down
2 changes: 1 addition & 1 deletion packages/command-line-utils/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/command-line-utils",
"version": "0.4.0",
"version": "0.5.0",
"description": "Utility modules used by Zapperment command line tools",
"main": "src/index.js",
"author": "Patrick Hund",
Expand Down
4 changes: 2 additions & 2 deletions packages/frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "@zapperment/frontend",
"description": "Zapperment frontend (React app)",
"version": "0.4.0",
"version": "0.5.0",
"private": true,
"dependencies": {
"@zapperment/shared": "^0.4.0",
"@zapperment/shared": "^0.5.0",
"amplitudejs": "^5.0.2",
"classnames": "^2.2.6",
"howler": "^2.1.2",
Expand Down
6 changes: 3 additions & 3 deletions packages/midi-test-utils/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/midi-test-utils",
"version": "0.4.0",
"version": "0.5.0",
"description": "Scripts for testing Zapperment's MIDI commands",
"scripts": {
"send_midi_cc": "scripty",
Expand All @@ -15,8 +15,8 @@
"author": "Patrick Hund",
"license": "MIT",
"dependencies": {
"@zapperment/midi": "^0.4.0",
"@zapperment/command-line-utils": "^0.4.0",
"@zapperment/midi": "^0.5.0",
"@zapperment/command-line-utils": "^0.5.0",
"yargs": "^15.1.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/midi/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/midi",
"version": "0.4.0",
"version": "0.5.0",
"description": "Zapperment MIDI library",
"main": "src/index.js",
"author": "Patrick Hund",
Expand Down
6 changes: 3 additions & 3 deletions packages/model-test-utils/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zapperment/model-test-utils",
"version": "0.4.0",
"version": "0.5.0",
"description": "Scripts for testing Zapperment's machine learning algorithms",
"scripts": {
"set_partition_tags": "scripty",
Expand All @@ -14,8 +14,8 @@
"author": "Patrick Hund",
"license": "MIT",
"dependencies": {
"@zapperment/storage": "^0.4.0",
"@zapperment/command-line-utils": "^0.4.0",
"@zapperment/storage": "^0.5.0",
"@zapperment/command-line-utils": "^0.5.0",
"dotenv": "^8.2.0",
"yargs": "^15.1.0"
},
Expand Down
4 changes: 2 additions & 2 deletions packages/model/package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{
"name": "@zapperment/model",
"version": "0.4.0",
"version": "0.5.0",
"description": "Zapperment model library",
"main": "src/index.js",
"author": "Patrick Hund",
"license": "MIT",
"dependencies": {
"@zapperment/shared": "^0.4.0"
"@zapperment/shared": "^0.5.0"
}
}
44 changes: 44 additions & 0 deletions packages/model/src/analyze/average.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
const average = require("./average");
const data = require('./testData');

describe("Given data that is an array of objects, where each object contains a scene with tracks, with a volume property on each track", () => {
describe("average.value of scene.tracks.elements.volume", () => {
it("returns the average volume of all track of all scenes", () => {
// there are six tracks that have a volume set, the average of which is 89.6
// (total of 538 divided by 6)
expect(average.value(data, "scene.tracks.elements.volume")).toBe(89.666666666666667);
});
});

describe("average.total of scene.tracks.elements.volume", () => {
it("returns the highest sum of the volumes of all the tracks on scene", () => {
// if you sum up the volume of tracks per scene, there is one scene where the total volume is 222,
// which is the highest
expect(average.total(data, "scene.tracks.elements.volume")).toBe(222);
});
});

describe("average.count of scene.tracks", () => {
it("returns the average number of tracks of all scenes", () => {
// there are 6 scenes with an average of 1.5 tracks
// (total of 9 divided by 6)
expect(average.count(data, "scene.tracks")).toBe(1.5);
});
});

describe("average.count of scene.tracks.elements.volume", () => {
it("returns the average number of tracks that have a volume of all scenes", () => {
// there are 6 scenes with an average of 1 track that has a volume
// (total of 6 divided by 6)
expect(average.count(data, "scene.tracks.elements.volume")).toBe(1);
});
});

describe("average.countNull of scene.tracks.elements.volume", () => {
it("returns the average number of tracks where volume is set to null of all scenes", () => {
// there are 6 scenes with an average of 0.5 tracks that have null volume
// (total of 3 divided by 6)
expect(average.countNull(data, "scene.tracks.elements.volume")).toBe(0.5);
});
});
});
40 changes: 40 additions & 0 deletions packages/model/src/analyze/maximum.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const maximum = require("./maximum");
const data = require('./testData');

describe("Given data that is an array of objects, where each object contains a scene with tracks, with a volume property on each track", () => {
describe("maximum.value of scene.tracks.elements.volume", () => {
it("returns the highest volume of any track of any scene", () => {
// there are two tracks that have volume set to 127, which is the lowest
expect(maximum.value(data, "scene.tracks.elements.volume")).toBe(127);
});
});

describe("maximum.total of scene.tracks.elements.volume", () => {
it("returns the highest sum of the volumes of all the tracks on scene", () => {
// if you sum up the volume of tracks per scene, there is one scene where the total volume is 222,
// which is the highest
expect(maximum.total(data, "scene.tracks.elements.volume")).toBe(222);
});
});

describe("maximum.count of scene.tracks", () => {
it("returns the highest number of tracks of any scene", () => {
// there is one scene that has three tracks, which is the most tracks any scene has
expect(maximum.count(data, "scene.tracks")).toBe(3);
});
});

describe("maximum.count of scene.tracks.elements.volume", () => {
it("returns the highest number of tracks that have a volume of any scene", () => {
// there are two scenes that have two tracks each which have a volume
expect(maximum.count(data, "scene.tracks.elements.volume")).toBe(2);
});
});

describe("maximum.countNull of scene.tracks.elements.volume", () => {
it("returns the highest number of tracks where volume is set to null of any scene", () => {
// there is one scene that has three tracks with volume set to null
expect(maximum.countNull(data, "scene.tracks.elements.volume")).toBe(3);
});
});
});
40 changes: 40 additions & 0 deletions packages/model/src/analyze/minimum.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const minimum = require("./minimum");
const data = require("./testData");

describe("Given data that is an array of objects, where each object contains a scene with tracks, with a “volume” property on each track", () => {
describe("minimum.value of scene.tracks.elements.volume", () => {
it("returns the lowest volume of any track of any scene", () => {
// there is one track that has volume set to 31, which is the lowest
expect(minimum.value(data, "scene.tracks.elements.volume")).toBe(31);
});
});

describe("minimum.total of scene.tracks.elements.volume", () => {
it("returns the lowest sum of the volumes of all the tracks on scene", () => {
// if you sum up the volume of tracks per scene, there is one scene where the total volume is 94,
// which is the lowest
expect(minimum.total(data, "scene.tracks.elements.volume")).toBe(94);
});
});

describe("minimum.count of scene.tracks", () => {
it("returns the lowest number of tracks of any scene", () => {
// there is one scene that doesn't have any tracks at all
expect(minimum.count(data, "scene.tracks")).toBe(0);
});
});

describe("minimum.count of scene.tracks.elements.volume", () => {
it("returns the lowest number of tracks that have a volume of any scene", () => {
// there are two scenes that have only one track each which have a volume
expect(minimum.count(data, "scene.tracks.elements.volume")).toBe(1);
});
});

describe("minimum.countNull of scene.tracks.elements.volume", () => {
it("returns the lowest number of tracks where volume is set to null of any scene", () => {
// there is one scene that has three tracks with volume set to null
expect(minimum.countNull(data, "scene.tracks.elements.volume")).toBe(3);
});
});
});
37 changes: 37 additions & 0 deletions packages/model/src/analyze/reduceNested2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const { isObject } = require("@zapperment/shared");

module.exports = process => ({
reducer,
initialValue = 0,
defaultValue = 0
}) => (data, path) => {
const segments = path.split(".");
const values = [];
const walk = (remainingSegments, currentNode) => {
if (Array.isArray(currentNode)) {
currentNode.forEach(curr => walk(remainingSegments, curr));
}
if (remainingSegments.length === 1) {
const processedValue = process(currentNode[remainingSegments[0]]);
if (processedValue !== null) {
values.push(processedValue);
}
return;
}
const currentSegment = remainingSegments[0];
if (isObject(currentNode)) {
const nextNode = currentNode[currentSegment];
if (isObject(nextNode) || Array.isArray(nextNode)) {
walk(remainingSegments.slice(1), nextNode);
}
}
};
data.forEach(curr => walk(segments, curr));
const filteredValues = values.filter(value => typeof value === "number");
return filteredValues.length === 0
? defaultValue
: filteredValues.reduce(
(acc, curr, i, arr) => reducer(acc, curr, i, arr),
initialValue
);
};
2 changes: 1 addition & 1 deletion packages/model/src/analyze/reduceNestedSum.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const reduceNested = require("./reduceNested");
const reduceNested = require("./reduceNested2");
const { isNumber } = require("@zapperment/shared");

module.exports = reduceNested(value => {
Expand Down
28 changes: 15 additions & 13 deletions packages/model/src/analyze/standardDeviation.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
const createAnalyzers = require("./createAnalyzers");

module.exports = createAnalyzers((acc, curr, i, arr) => {
if (i < arr.length - 1) {
return acc + curr;
module.exports = createAnalyzers({
reducer: (acc, curr, i, arr) => {
if (i < arr.length - 1) {
return acc + curr;
}
const avg = (acc + curr) / arr.length;
return Math.sqrt(
arr.reduce(
(acc2, curr2, i2) =>
i2 < arr.length - 1
? acc2 + Math.pow(curr2 - avg, 2)
: (acc2 + Math.pow(curr2 - avg, 2)) / arr.length,
0
)
);
}
const avg = (acc + curr) / arr.length;
return Math.sqrt(
arr.reduce(
(acc2, curr2, i2) =>
i2 < arr.length - 1
? acc2 + Math.pow(curr2 - avg, 2)
: (acc2 + Math.pow(curr2 - avg, 2)) / arr.length,
0
)
);
});
55 changes: 55 additions & 0 deletions packages/model/src/analyze/testData.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
module.exports = [
// 2 tracks
// average volume: 47
// total volume: 94
{
scene: {
tracks: [{ elements: { volume: 31 } }, { elements: { volume: 63 } }]
}
},
// 2 tracks
// average volume: 111
// total volume: 222
{
scene: {
tracks: [{ elements: { volume: 95 } }, { elements: { volume: 127 } }]
}
},
// 1 track
// average volume: 95
// total volume: 95
{
scene: {
tracks: [{ elements: { volume: 95 } }]
}
},
// 1 track
// average volume: 127
// total volume: 127
{
scene: {
tracks: [{ elements: { volume: 127 } }]
}
},
// 3 tracks
// no average volume
// no total volume
{
scene: {
tracks: [
{ elements: { volume: null } },
{ elements: { volume: null } },
{ elements: { volume: null } },
{ elements: null }
]
}
},
// 0 tracks
// no average volume
// no total volume
{
scene: {
tracks: []
}
}
];
Loading