Compare commits

..

No commits in common. "main" and "removing-lock" have entirely different histories.

11 changed files with 2921 additions and 5517 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -43,19 +43,15 @@ function Switch(props){
e('span', {className: 'slider round'}, null)) e('span', {className: 'slider round'}, null))
} }
function SendSaveEvent(){
setTimeout(() => {
window.dispatchEvent(new CustomEvent('saveDict', {'detail' : "localStorage"}));
}, 50)
}
function CreateParamChanger(arr, setArr, index, postCB=() => {}, preCB=(val) => val){ function CreateParamChanger(arr, setArr, index, postCB=() => {}, preCB=(val) => val){
return (event) => { return (event) => {
let newArr = arr.slice(); let newArr = arr.slice();
newArr[index] = preCB(event.target.value); newArr[index] = preCB(event.target.value);
setArr(newArr); setArr(newArr);
postCB(); postCB();
SendSaveEvent(); setTimeout(() => {
window.dispatchEvent(new CustomEvent('saveDict', {'detail' : "localStorage"}));
}, 50)
log(`${index} ${event.target.value}`); log(`${index} ${event.target.value}`);
} }
@ -68,7 +64,9 @@ function CreateMatrixParamChanger(matrix, setMatrix, i, j){
}); });
newMatrix[i][j] = event.target.value; newMatrix[i][j] = event.target.value;
setMatrix(newMatrix); setMatrix(newMatrix);
SendSaveEvent(); setTimeout(() => {
window.dispatchEvent(new CustomEvent('saveDict', {'detail' : "localStorage"}));
}, 50)
log(`${i}, ${j} ${event.target.value}`); log(`${i}, ${j} ${event.target.value}`);
} }

View File

@ -4,18 +4,14 @@
function DataCell(element) {
return e('td', null, element);
}
// NOT A REACT FUNCTIONAL COMPONENT. MERELY RETURNS AN ARRAY WHICH IS UNPACKED // NOT A REACT FUNCTIONAL COMPONENT. MERELY RETURNS AN ARRAY WHICH IS UNPACKED
function EnumeratorItems(index, enumBreakPoints, setEnumBreakPoints, enumNames, setEnumNames, djParam, locked){ function EnumeratorItems(index, enumBreakPoints, setEnumBreakPoints, enumNames, setEnumNames, djParam, locked){
let items = []; let items = [];
for (let i = 0; i < MAXENUMPOINTS; i++){ for (let i = 0; i < MAXENUMPOINTS; i++){
items.push(DataCell(e(TextBox, {locked, onChange: CreateMatrixParamChanger(enumNames, setEnumNames, index, i), value: enumNames[index][i], id:`text-${djParam}-${enumNames[index][i]}`}, null))); items.push(ListItem(e(TextBox, {locked, onChange: CreateMatrixParamChanger(enumNames, setEnumNames, index, i), value: enumNames[index][i], id:`text-${djParam}-${enumNames[index][i]}`}, null)));
// Add 1 to make up for the lower enum bound // Add 1 to make up for the lower enum bound
items.push(DataCell(e(NumberBox, {locked, onChange: CreateMatrixParamChanger(enumBreakPoints, setEnumBreakPoints, index, i + 1), value:enumBreakPoints[index][i + 1]}, null))); items.push(ListItem(e(NumberBox, {locked, onChange: CreateMatrixParamChanger(enumBreakPoints, setEnumBreakPoints, index, i + 1), value:enumBreakPoints[index][i + 1]}, null)));
} }
return items; return items;
} }
@ -23,15 +19,15 @@ function EnumeratorItems(index, enumBreakPoints, setEnumBreakPoints, enumNames,
function EnumeratorRow(props){ function EnumeratorRow(props){
let linkedText = props.linked ? "<- mods" : ""; let linkedText = props.linked ? "<- mods" : "";
let content = e('tr', {className: 'lfo-item', id: `${props.djParam}-enum-row`}, let content = e('ul', {className: 'lfo-item', id: `${props.djParam}-enum-row`},
DataCell(DropDown({locked:props.locked, onChange: props.setInstanceNum, value:props.instanceNum, options: INSTANCEOPTIONS})), ListItem(DropDown({locked:props.locked, onChange: props.setInstanceNum, value:props.instanceNum, options: INSTANCEOPTIONS})),
DataCell(DropDown({locked:props.locked, onChange: props.setDjParam, value: props.djParam, options: MODPARAMOPTIONS})), ListItem(DropDown({locked:props.locked, onChange: props.setDjParam, value: props.djParam, options: MODPARAMOPTIONS})),
DataCell(e(NumberBox, {locked:props.locked, onChange: props.setEnumItemCounts, step:1, value:props.enumItems, className: 'enum-count'}, null)), ListItem(e(NumberBox, {locked:props.locked, onChange: props.setEnumItemCounts, step:1, value:props.enumItems, className: 'enum-count'}, null)),
DataCell(e(NumberBox, {locked:props.locked, onChange: CreateMatrixParamChanger(props.enumBreakPoints, props.setEnumBreakPoints, props.index, 0), value:props.enumBreakPoints[props.index][0], step:0.1}, null)), ListItem(e(NumberBox, {locked:props.locked, onChange: CreateMatrixParamChanger(props.enumBreakPoints, props.setEnumBreakPoints, props.index, 0), value:props.enumBreakPoints[props.index][0], step:0.1}, null)),
...(EnumeratorItems(props.index, props.enumBreakPoints, props.setEnumBreakPoints, props.enumNames, props.setEnumNames, props.djParam, props.locked).slice(0, props.enumItems * 2)), ...(EnumeratorItems(props.index, props.enumBreakPoints, props.setEnumBreakPoints, props.enumNames, props.setEnumNames, props.djParam, props.locked).slice(0, props.enumItems * 2)),
DataCell(e(Button, {locked:props.locked, text:'+', onClick: props.addEnum}, null)), ListItem(e(Button, {locked:props.locked, text:'+', onClick: props.addEnum}, null)),
DataCell(e(Button, {locked:props.locked, text:'-', onClick: props.removeEnum}, null)), ListItem(e(Button, {locked:props.locked, text:'-', onClick: props.removeEnum}, null)),
DataCell(e("div", {className:"linked"}, linkedText)) ListItem(e("div", {className:"linked"}, linkedText))
); );
if (props.visible){ if (props.visible){
return content; return content;

2680
example-with-dj.maxpat Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -1,14 +1,14 @@
* { * {
--locked-color: #5fadbf; --locked-color: #5fadbf;
--unlocked-color: #ff5153; --unlocked-color: #ff5153;
} }
:root { :root {
--background: white; --background: ivory;
--active: royalblue; --active: royalblue;
--nonactive: rgb(205, 205, 205); --nonactive: lightsteelblue;
--alert: red; --alert: red;
--textcolor: black; --textcolor: #737373;
} }
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
@ -21,143 +21,49 @@ body {
font-family: "Poppins", sans-serif; font-family: "Poppins", sans-serif;
} }
html, html, body {
body { width: 100%;
width: 100%; height: 100%;
height: 100%; margin: 0px;
margin: 0px; border: 0;
border: 0; overflow-x: hidden; /* no horizontal scrollbar*/
overflow-x: scroll; overflow-y: scroll;
overflow-y: scroll; display: block; /* No floating content on sides */
display: block;
/* No floating content on sides */
} }
/*navigation*/ ul {
.header { list-style-type: none;
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
margin: 1em;
border-bottom: 1px solid var(--active);
}
.header button {
border: 1px solid var(--active);
color: var(--active);
background-color: white;
padding: 4px;
text-align: center;
display: inline-block;
padding: 0.5em;
margin: 4px;
font-size: 0.9em;
min-width: 4.5em;
}
td button {
background-color: white;
color: var(--active);
border: 1px solid var(--active);
}
/* :::::::::::::: SELECTING MODULATORS/ENUMERATORS */
.header button.highlighted-button {
color: var(--active);
border: 1px solid var(--active);
}
.header button.unhighlighted-button {
color: var(--nonactive);
border: 1px solid var(--nonactive);
}
/* table */
table {
margin: 1em;
padding: 0em;
border-collapse: collapse;
background-color: lightsteelblue;
}
/* points datacells should have a min-width*/
.enum-count {
min-width: 5.6em;
}
th {
padding: 0.4em 0.3em;
text-align: left;
}
thead {
color: white;
background-color: var(--active);
}
tr,
td {
margin: 0em;
}
td:last-child {
white-space: nowrap;
overflow: hidden;
padding: 0;
}
/* input types */
/* dropdown list */
select {
width: 100%;
}
/*
option, select>* {
font-size: 0.8em !important;
padding: 0em !important;
margin: 0em !important;
min-height: 0em !important;
}
*/
option {
background-color: var(--active);
}
option:not(:checked) {
background-color: white;
}
/* input */
input,
select {
border: 1px solid var(--active);
color: var(--active);
margin: 0; margin: 0;
padding: 0; padding: 0;
line-height: 1.5em; overflow: hidden;
height: 1.5em; background-color: #333333;
box-sizing: border-box;
} }
input { li {
padding-left: 5px; float: left;
/*slight padding on left*/ }
table {
overflow: scroll;
} }
input[type=number] { input[type=number] {
width: 50px; width: 50px;
margin: 0;
padding: 0;
} }
input[type=text] { input[type=text] {
width: 60px; width: 60px;
margin: 0;
padding: 0;
font-weight: bold; font-weight: bold;
} }
.timeInput { .timeInput {
width: 80px; width: 80px;
margin: 0;
padding: 0;
} }
#matrix { #matrix {
@ -174,205 +80,215 @@ input[type=text] {
.numbox-clicked { .numbox-clicked {
user-select: none; user-select: none;
border: solid; border : solid;
font-size: 12vw; font-size: 12vw;
} }
.param-input-label { .param-input-label {
width: 93%; width: 93%;
font-size: 5vw; font-size: 5vw;
} }
.lfo-input-label { .lfo-input-label {
width: 40%; width: 40%;
font-size: 5vw; font-size: 5vw;
} }
/* The switch - the box around the slider */ /* The switch - the box around the slider */
.switch { .switch {
position: relative; position: relative;
display: inline-block; display: inline-block;
width: 30px; width: 30px;
height: 17px; height: 17px;
} }
/* Hide default HTML checkbox */ /* Hide default HTML checkbox */
.switch input { .switch input {
opacity: 0; opacity: 0;
width: 0; width: 0;
height: 0; height: 0;
} }
/* The slider */ /* The slider */
input[type="range"] { .slider {
appearance: none; position: absolute;
-webkit-appearance: none; cursor: pointer;
height: 8px; top: 0;
border-radius: 6px; left: 0;
background-color: white; right: 0;
outline: none; bottom: 0;
opacity: 0.7; background-color: #ccc;
-webkit-transition: .2s; -webkit-transition: .4s;
transition: opacity .2s; transition: .4s;
overflow: hidden;
} }
/*slider knob*/ .slider:before {
input[type="range"]::-webkit-slider-runnable-track { position: absolute;
-webkit-appearance: none; content: "";
color: var(--active); height: 13px;
margin-top: -1px; width: 13px;
left: 2px;
bottom: 2px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
} }
input[type="range"]::-webkit-slider-thumb { input:checked + .slider {
-webkit-appearance: none; background-color: #2196F3;
appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--active);
box-shadow: -80px 0 0 80px var(--active);
} }
input[type="range"]::-moz-range-progress { input:focus + .slider {
background-color: var(--active); box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(13px);
-ms-transform: translateX(13px);
transform: translateX(13px);
}
/* Rounded sliders */
.slider.round {
border-radius: 17px;
}
.slider.round:before {
border-radius: 50%;
} }
h5 { h5 {
margin: 0; margin: 0;
padding: 0; padding: 0;
}
.enum-count {
background-color: aquamarine;
} }
.label { .label {
background-color: aliceblue; background-color: aliceblue;
padding: 0 4px 0 4px; padding: 0 4px 0 4px;
margin: 0 2px 0 2px; margin: 0 2px 0 2px;
border-color: #333333; border-color: #333333;
border-width: 1px; border-width: 1px;
} }
.base-val { .base-val {
border: none; background-color: lightgray;
color: white; border-color: #333333;
text-align: center; border-width: 1px;
font-size: 0.9em; width: 50px;
width: 50px; margin-left: 2px;
margin: 0; margin-top: 1px;
padding: 0;
} }
.linked { .linked {
color: red; color: red;
border-width: 1px; border-width: 1px;
width: 50px; width: 50px;
font-size: small; font-size: small;
margin-left: 2px; margin-left: 2px;
margin-top: 5px; margin-top: 5px;
display: none;
/*hide*/
} }
@keyframes pulse-animation { @keyframes pulse-animation {
0% { 0% {
color: black; color: black;
} }
100% {
100% { color: red;
color: red; }
}
} }
#pulse { #pulse {
animation: pulse-animation 0.2s normal; animation: pulse-animation 0.2s normal;
} }
/* :::::::::::::: LOCK CSS */ /* :::::::::::::: LOCK CSS */
.locked-component { .locked-component {
pointer-events: none; pointer-events: none;
background-color: #333333; background-color: #333333;
color: white; color : white;
}
.header {
display: flex;
width: 100%;
justify-content: space-between;
} }
/* Locked */ /* Locked */
.lock { .lock {
margin-top: 14px; margin-top: 14px;
width: 24px; width: 24px;
height: 21px; height: 21px;
border: 3px solid var(--locked-color); border: 3px solid var(--locked-color);
border-radius: 5px; border-radius: 5px;
position: relative; position: relative;
cursor: pointer; cursor: pointer;
-webkit-transition: all 0.1s ease-in-out; -webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out; transition: all 0.1s ease-in-out;
} }
.lock:after { .lock:after {
content: ""; content: "";
display: block; display: block;
background: var(--locked-color); background: var(--locked-color);
width: 3px; width: 3px;
height: 7px; height: 7px;
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
margin: -3.5px 0 0 -2px; margin: -3.5px 0 0 -2px;
-webkit-transition: all 0.1s ease-in-out; -webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out; transition: all 0.1s ease-in-out;
} }
.lock:before { .lock:before {
content: ""; content: "";
display: block; display: block;
width: 10px; width: 10px;
height: 10px; height: 10px;
bottom: 100%; bottom: 100%;
position: absolute; position: absolute;
left: 50%; left: 50%;
margin-left: -8px; margin-left: -8px;
border: 3px solid var(--locked-color); border: 3px solid var(--locked-color);
border-top-right-radius: 50%; border-top-right-radius: 50%;
border-top-left-radius: 50%; border-top-left-radius: 50%;
border-bottom: 0; border-bottom: 0;
-webkit-transition: all 0.1s ease-in-out; -webkit-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out; transition: all 0.1s ease-in-out;
} }
/* Locked Hover */ /* Locked Hover */
.lock:hover:before { .lock:hover:before {
height: 12px; height: 12px;
} }
/* Unlocked */ /* Unlocked */
.unlocked { .unlocked {
transform: rotate(10deg); transform: rotate(10deg);
} }
.unlocked:before { .unlocked:before {
bottom: 130%; bottom: 130%;
left: 31%; left: 31%;
margin-left: -11.5px; margin-left: -11.5px;
transform: rotate(-45deg); transform: rotate(-45deg);
} }
.unlocked, .unlocked,
.unlocked:before { .unlocked:before {
border-color: var(--unlocked-color); border-color: var(--unlocked-color);
} }
.unlocked:after { .unlocked:after {
background: var(--unlocked-color); background: var(--unlocked-color);
} }
/* Unlocked Hover */ /* Unlocked Hover */
.unlocked:hover { .unlocked:hover {
transform: rotate(3deg); transform: rotate(3deg);
} }
.unlocked:hover:before { .unlocked:hover:before {
height: 10px; height: 10px;
left: 40%; left: 40%;
bottom: 124%; bottom: 124%;
transform: rotate(-30deg); transform: rotate(-30deg);
} }

View File

@ -7,21 +7,23 @@
--> -->
<head> <head>
<meta charset="utf-8"> <link rel="stylesheet" href="./lfogui.css">
<link rel="stylesheet" href="./lfogui.css">
</head> </head>
<body> <body>
<div id="lfo-container"></div> <div id="lfo-container"></div>
<script src="./react.js"></script> <script src="./react.js"></script>
<script src="./react-dom.js"></script> <script src="./react-dom.js"></script>
<script src="./moment.js"></script> <script src="./moment.js"></script>
<script src="./common.js"></script> <script src="./common.js"></script>
<script src="./enums.js"></script> <script src="./enums.js"></script>
<script src="./modulators.js"></script> <script src="./modulators.js"></script>
<script src="./lfogui.js"></script> <script src="./lfogui.js">
</script>
</body> </body>
</html> </html>

View File

@ -9,8 +9,8 @@ else
const e = React.createElement; const e = React.createElement;
let lfos = []; let lfos = [];
const MAXLFOS = 200; const MAXLFOS = 20;
const MAXENUMS = 200; const MAXENUMS = 20;
const MAXENUMPOINTS = 10; const MAXENUMPOINTS = 10;
const MAXUSERDEFINED = 4; const MAXUSERDEFINED = 4;
@ -30,7 +30,7 @@ const LockModes = Object.freeze({
var modPhases = Array(MAXLFOS).fill(0); var modPhases = Array(MAXLFOS).fill(0);
var firstUpdateTime = Date.now(); var firstUpdateTime = Date.now();
const MODULATORLABELS = ["inst", "type", "shape", "param", "timebase", "min", "max", "phase", "center", "result", "", ""]; const MODULATORLABELS = ["inst", "type", "shape", "param", "timebase", "min", "max", "phase", "center"];
const ENUMERATORLABELS = ["inst", "parameter", "# points"]; const ENUMERATORLABELS = ["inst", "parameter", "# points"];
@ -65,6 +65,12 @@ function MasterLfoHandler() {
initVisArr[0] = true; initVisArr[0] = true;
const [viewMode, setViewMode] = React.useState(ViewModes.MOD); const [viewMode, setViewMode] = React.useState(ViewModes.MOD);
const toggleViewMode = () => {
if (viewMode === ViewModes.MOD)
setViewMode(ViewModes.ENUM);
else
setViewMode(ViewModes.MOD);
};
const [lockMode, setLockMode] = React.useState(LockModes.UNLOCK); const [lockMode, setLockMode] = React.useState(LockModes.UNLOCK);
const toggleLockMode = () => { const toggleLockMode = () => {
@ -74,18 +80,6 @@ function MasterLfoHandler() {
setLockMode(LockModes.UNLOCK); setLockMode(LockModes.UNLOCK);
}; };
const [enabled, setEnabled] = React.useState(false);
const toggleEnabled = () => {
setEnabled(!enabled);
};
const displayIfEnabled = (content) => {
if (enabled)
return content
}
let toggleEnabledText = enabled ? `Hide \u{25BE}` : `Show \u{25B8}`;
/// MODULATOR ARRAYS /// MODULATOR ARRAYS
let userDefinedWavesBase = []; let userDefinedWavesBase = [];
let userDefinedFunctionsBase = []; let userDefinedFunctionsBase = [];
@ -102,7 +96,7 @@ function MasterLfoHandler() {
const [modTypeArr, setModTypeArr] = React.useState(Array(MAXLFOS).fill('LFO')); const [modTypeArr, setModTypeArr] = React.useState(Array(MAXLFOS).fill('LFO'));
const [modInstanceNumArr, setModInstanceNumArr] = React.useState(Array(MAXLFOS).fill('1')); const [modInstanceNumArr, setModInstanceNumArr] = React.useState(Array(MAXLFOS).fill('1'));
const [modCenterVals, setModCenterVals] = React.useState({ '1': {}, '2': {}, '3': {}, '4': {}, '5': {}, '6': {}}); const [modCenterVals, setModCenterVals] = React.useState({ '1': {}, '2': {}, '3': {}, '4': {} });
const [ticks, setTicks] = React.useState(0); const [ticks, setTicks] = React.useState(0);
const [beatsInMeasure, setBeatsInMeasure] = React.useState(4); const [beatsInMeasure, setBeatsInMeasure] = React.useState(4);
@ -282,11 +276,6 @@ function MasterLfoHandler() {
setTicks(event.detail); setTicks(event.detail);
} }
function handleChangeViewMode(event){
setEnabled(true);
setViewMode(event.detail);
}
function setNN(event) { function setNN(event) {
for (let i = 0; i < MAXLFOS; i++) { for (let i = 0; i < MAXLFOS; i++) {
@ -357,7 +346,6 @@ function MasterLfoHandler() {
window.addEventListener('userFunction', handleChangeUserFunction); window.addEventListener('userFunction', handleChangeUserFunction);
window.addEventListener('userDefinedType', handleChangeUserDefinedType); window.addEventListener('userDefinedType', handleChangeUserDefinedType);
window.addEventListener('maxTicks', handleMaxTicks); window.addEventListener('maxTicks', handleMaxTicks);
window.addEventListener('viewMode', handleChangeViewMode);
return () => { return () => {
window.removeEventListener('loadDict', handleLoad); window.removeEventListener('loadDict', handleLoad);
@ -372,7 +360,6 @@ function MasterLfoHandler() {
window.removeEventListener('userFunction', handleChangeUserFunction); window.removeEventListener('userFunction', handleChangeUserFunction);
window.removeEventListener('userDefinedType', handleChangeUserDefinedType); window.removeEventListener('userDefinedType', handleChangeUserDefinedType);
window.removeEventListener('maxTicks', handleMaxTicks); window.removeEventListener('maxTicks', handleMaxTicks);
window.removeEventListener('viewMode', handleChangeViewMode);
}; };
}, [...allModArrays, ...allEnumArrays, ...allEnumMats, userDefinedWaves, userDefinedFunctions, userDefinedTypes, modCenterVals, render, beatsInMeasure, ticks]); }, [...allModArrays, ...allEnumArrays, ...allEnumMats, userDefinedWaves, userDefinedFunctions, userDefinedTypes, modCenterVals, render, beatsInMeasure, ticks]);
@ -452,7 +439,6 @@ function MasterLfoHandler() {
allModSetters[j](array); allModSetters[j](array);
} }
} }
SendSaveEvent();
rerender(!render); rerender(!render);
} }
@ -462,7 +448,6 @@ function MasterLfoHandler() {
let newArr = modVisibleArr.slice(); let newArr = modVisibleArr.slice();
newArr[id] = false; newArr[id] = false;
setModVisibleArr(newArr); setModVisibleArr(newArr);
SendSaveEvent();
} }
} }
@ -486,15 +471,9 @@ function MasterLfoHandler() {
enumItems: enumItemCounts[i], enumItems: enumItemCounts[i],
setEnumItemCounts: CreateParamChanger(enumItemCounts, setEnumItemCounts, i), setEnumItemCounts: CreateParamChanger(enumItemCounts, setEnumItemCounts, i),
enumBreakPoints: enumBreakPoints, enumBreakPoints: enumBreakPoints,
setEnumBreakPoints: (val) => { setEnumBreakPoints: setEnumBreakPoints,
setEnumBreakPoints(val);
SendSaveEvent
},
enumNames: enumNames, enumNames: enumNames,
setEnumNames: (val) => { setEnumNames: setEnumNames,
setEnumNames(val);
SendSaveEvent
},
visible: enumVisibleArr[i], visible: enumVisibleArr[i],
djParam: enumDjParamArr[i], djParam: enumDjParamArr[i],
setDjParam: CreateParamChanger(enumDjParamArr, setEnumDjParamArr, i), setDjParam: CreateParamChanger(enumDjParamArr, setEnumDjParamArr, i),
@ -540,7 +519,6 @@ function MasterLfoHandler() {
} }
} }
rerender(!render); rerender(!render);
SendSaveEvent();
} }
}, },
removeEnum: () => { removeEnum: () => {
@ -548,7 +526,6 @@ function MasterLfoHandler() {
let newArr = enumVisibleArr.slice(); let newArr = enumVisibleArr.slice();
newArr[id] = false; newArr[id] = false;
setEnumVisibleArr(newArr); setEnumVisibleArr(newArr);
SendSaveEvent();
} }
} }
}, null) }, null)
@ -557,19 +534,16 @@ function MasterLfoHandler() {
var grid; var grid;
var modButtonClass; var title;
var enumButtonClass;
var labels; var labels;
if (viewMode === ViewModes.MOD) { if (viewMode === ViewModes.MOD) {
grid = modContents; grid = modContents;
modButtonClass = "highlighted-button"; title = "MODULATORS";
enumButtonClass = "unhighlighted-button";
labels = MODULATORLABELS; labels = MODULATORLABELS;
} }
else { else {
grid = enumContents; grid = enumContents;
modButtonClass = "unhighlighted-button"; title = "ENUMERATORS";
enumButtonClass = "highlighted-button";
labels = ENUMERATORLABELS; labels = ENUMERATORLABELS;
} }
@ -583,21 +557,16 @@ function MasterLfoHandler() {
return e('div', null, return e('div', null,
e('div', { className: 'header' }, e('div', { className: 'header' },
e('div', {className: 'nav'}, e(Switch, { ontoggle: toggleViewMode }, null),
displayIfEnabled(e('button', { onClick: () => setViewMode(ViewModes.MOD), className: modButtonClass}, 'Modulators')),
displayIfEnabled(e('button', { onClick: () => setViewMode(ViewModes.ENUM), className: enumButtonClass }, 'Enumerators'))
),
e('button', { onClick: toggleEnabled, id: 'hide-button'}, toggleEnabledText),
//allows lock mode //allows lock mode
//e('span', { className: lockClass, onClick: toggleLockMode }, null) //e('span', { className: lockClass, onClick: toggleLockMode }, null)
), ),
displayIfEnabled( //e('h5', null, title),
e('table', { id: 'table' }, e('table', { id: 'table' },
e('thead', null, e('tr', { id: 'headers' }, ...labels.map(x => e('th', {id: x == '# points' ? 'points' : x}, x)))), e('thead', null, e('tr', { id: 'headers' }, ...labels.map(x => e('th', null, x)))),
e('tbody', null, ...grid) e('tbody', null, ...grid)
)) )
); );
} }
@ -635,10 +604,6 @@ if (!DEBUG) {
window.dispatchEvent(new CustomEvent('userWave', { 'detail': data })); window.dispatchEvent(new CustomEvent('userWave', { 'detail': data }));
}); });
window.max.bindInlet("viewMode", (mode) => {
window.dispatchEvent(new CustomEvent('viewMode', { 'detail': parseInt(mode) }));
});
window.max.bindInlet("userFunction", (index, ...points) => { window.max.bindInlet("userFunction", (index, ...points) => {
//list of 101 points between 0-100 //list of 101 points between 0-100
let data = { points, index }; let data = { points, index };

View File

@ -7,7 +7,7 @@ var TYPEOPTIONS = ["LFO", "Noise"];
var SHAPETYPES = ["Sine", "SawUp", "SawDown", "Tri", "Square", "Custom_1", "Custom_2", "Custom_3", "Custom_4"]; var SHAPETYPES = ["Sine", "SawUp", "SawDown", "Tri", "Square", "Custom_1", "Custom_2", "Custom_3", "Custom_4"];
var NOISETYPES = ["Rand", "Line Int.", "Sine Int."] var NOISETYPES = ["Rand", "Line Int.", "Sine Int."]
var INSTANCEOPTIONS = ["1", "2", "3", "4", "5", "6"]; var INSTANCEOPTIONS = ["1", "2", "3", "4"];
const MODPARAMOPTIONS = ["NONE", "stream", "pulse_length", "eventfulness", "event_length", "metriclarity", const MODPARAMOPTIONS = ["NONE", "stream", "pulse_length", "eventfulness", "event_length", "metriclarity",
"harmoniclarity", "melodic_cohesion", "melody_scope", "tonic_pitch", "pitch_center", "pitch_range", "dynamics", "harmoniclarity", "melodic_cohesion", "melody_scope", "tonic_pitch", "pitch_center", "pitch_range", "dynamics",

File diff suppressed because one or more lines are too long