Compare commits
No commits in common. "main" and "removing-lock" have entirely different histories.
main
...
removing-l
1740
ModEnum.maxhelp
1740
ModEnum.maxhelp
File diff suppressed because it is too large
Load Diff
3345
ModEnum.maxpat
3345
ModEnum.maxpat
File diff suppressed because one or more lines are too long
14
common.js
14
common.js
@ -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}`);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
24
enums.js
24
enums.js
@ -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
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
420
lfogui.css
420
lfogui.css
@ -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);
|
||||||
}
|
}
|
22
lfogui.html
22
lfogui.html
@ -7,20 +7,22 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
|
75
lfogui.js
75
lfogui.js
@ -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 };
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user