rearranging things so that mixers are independent. need to send vals on piece switch and get the labels right

main
mwinter 1 year ago
parent 620b912d13
commit 3b93cfb665

@ -110,12 +110,12 @@ module.exports = {
var {host, port, address, args} = data
if (address === '/playing') {
receive("/measure", args[0].value)
receive("/beat", args[1].value)
receive("/visual_click", 1)
//receiveSync("/measure", args[0].value)
//receiveSync("/beat", args[1].value)
//receiveSync("/visual_click", 1)
//receive("/measure", args[0].value)
//receive("/beat", args[1].value)
//receive("/visual_click", 1)
receiveSync("/measure", args[0].value)
receiveSync("/beat", args[1].value)
receiveSync("/visual_click", 1)
}
return
@ -136,11 +136,16 @@ module.exports = {
if (address.substring(1, 6) == 'mixer') {
tokens = address.split('/')
ins = tokens[2]
//piece = tokens[2]
type = tokens[3]
index = tokens[4]
val = args[0].value
args = [{'type': 's', 'value': ins}, {'type': 's', 'value': type}, {'type': 's', 'value': index}, {'type': 'f', 'value': val}]
if(type != "volume_master") {
index = tokens[4]
args = [{'type': 's', 'value': type}, {'type': 's', 'value': index}, {'type': 'f', 'value': val}]
} else {
args = [{'type': 's', 'value': type}, {'type': 'f', 'value': val}]
}
//args = [{'type': 's', 'value': piece}, {'type': 's', 'value': type}, {'type': 's', 'value': index}, {'type': 'f', 'value': val}]
//console.log(data)
address = '/mixer'
return {host, port, address, args}

@ -1 +1 @@
{"send":["127.0.0.1:57120"],"custom-module":"/home/mwinter/Portfolio/a_history_of_the_domino_problem/a_history_of_the_domino_problem_source/openstagecontrol/custom_module_hdp.js","load":"/home/mwinter/Portfolio/a_history_of_the_domino_problem/a_history_of_the_domino_problem_source/openstagecontrol/mixer_transport.json"}
{"send":["127.0.0.1:57120"],"custom-module":"/home/mwinter/Portfolio/a_history_of_the_domino_problem/a_history_of_the_domino_problem_source/openstagecontrol/custom_module_hdp_sync.js","load":"/home/mwinter/Portfolio/a_history_of_the_domino_problem/a_history_of_the_domino_problem_source/openstagecontrol/mixer_transport.json","port":9080}

@ -0,0 +1,318 @@
{
"version": "1.24.0",
"createdWith": "Open Stage Control",
"type": "fragment",
"content": {
"type": "panel",
"top": 0,
"left": 0,
"lock": false,
"id": "@{parent.variables.piece}/mixer",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "matrix",
"top": 0,
"left": 0,
"lock": false,
"id": "mixer/@{parent.variables.piece}/volume",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "70%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "fader",
"quantity": "@{parent.variables.quantity}",
"props": {
"value": 0.75
},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "panel",
"top": 0,
"left": "90%",
"lock": false,
"id": "@{parent.variables.piece}/mixer/hdp/master_panel",
"visible": true,
"interaction": true,
"comments": "",
"width": "10%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "fader",
"top": 0,
"left": 0,
"lock": false,
"id": "mixer/@{parent.variables.piece}/volume_master",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"design": "default",
"knobSize": "auto",
"horizontal": false,
"pips": false,
"dashed": false,
"gradient": [],
"snap": false,
"spring": false,
"doubleTap": false,
"range": {
"min": 0,
"max": 1
},
"logScale": false,
"sensitivity": 1,
"steps": "",
"origin": "auto",
"value": 0.75,
"default": 1,
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"onTouch": ""
}
],
"tabs": []
},
{
"type": "matrix",
"top": "70%",
"left": 0,
"lock": false,
"id": "mixer/@{parent.variables.piece}/pan",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "knob",
"quantity": "@{parent.variables.quantity}",
"props": "JS{{\nvar props = {}\nvar labels = @{parent.variables.labels}\nif(@{parent.variables.piece} == \"jaendel\"){\n props.value = $ % 2\n} else {\n props.value = $/(@{parent.variables.quantity}-1)\n}\nprops.label = labels[$]\nreturn props\n}}",
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "matrix",
"top": "85%",
"left": 0,
"lock": false,
"id": "mixer/@{parent.variables.piece}/mute",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "button",
"quantity": "@{parent.variables.quantity}",
"props": "JS{{\nvar props = {}\nvar labels = @{parent.variables.labels}\nprops.value = 1\nprops.label = labels[$] \nreturn props\n}}",
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
}
],
"tabs": []
}
}

File diff suppressed because it is too large Load Diff

@ -0,0 +1,784 @@
{
"createdWith": "Open Stage Control",
"version": "1.24.0",
"type": "session",
"content": {
"type": "root",
"lock": false,
"id": "root",
"visible": true,
"interaction": true,
"comments": "",
"width": "auto",
"height": "auto",
"colorText": "auto",
"colorWidget": "auto",
"alphaFillOn": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"hideMenu": false,
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "panel",
"top": 0,
"left": 0,
"lock": false,
"id": "main_panel",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": [
{
"type": "tab",
"lock": false,
"id": "metronome_tab",
"visible": true,
"interaction": true,
"comments": "",
"colorText": "auto",
"colorWidget": "auto",
"colorFill": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"label": "metronome/transport",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "text",
"top": "20%",
"left": "40%",
"lock": false,
"id": "colon",
"visible": true,
"comments": "",
"width": 50,
"height": "40%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host {\n font-size: 120rem;\n}",
"vertical": false,
"wrap": false,
"align": "center",
"value": ":",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"decimals": 2,
"target": "",
"onCreate": "",
"onValue": ""
},
{
"type": "input",
"top": 0,
"left": 0,
"lock": false,
"id": "measure",
"visible": true,
"interaction": true,
"comments": "",
"width": "40%",
"height": "80%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": 0,
"html": "",
"css": "canvas {\n height: 150rem\n}\n:host {\n font-size: 150rem;\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": false,
"validation": "",
"maxLength": "",
"value": 1,
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "input",
"top": 0,
"left": "calc(40% + 50px)",
"lock": false,
"id": "beat",
"visible": true,
"interaction": true,
"comments": "",
"width": "15%",
"height": "80%",
"expand": false,
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "canvas {\n height: 150rem\n}\n:host {\n font-size: 150rem;\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": true,
"validation": "",
"maxLength": "",
"value": 1,
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "led",
"top": 0,
"left": "calc(55% + 50px)",
"lock": false,
"id": "visual_click",
"visible": true,
"comments": "",
"width": "25%",
"height": "80%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"mode": "intensity",
"range": {
"min": 0,
"max": 1
},
"alphaRange": {
"min": 0,
"max": 1
},
"logScale": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"target": "",
"onCreate": "",
"onValue": "var fallTime = 0.3,\nfps = 24,\nmaxValue = 1,\nstep = maxValue / fps / fallTime\n\nsetTimeout(()=>{\n if (value <= 0) clearTimeout()\n set(\"this\", value - step)\n}, 1000 / fps)"
},
{
"type": "switch",
"top": "85%",
"left": 0,
"lock": false,
"id": "piece",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 15rem\n}",
"colorTextOn": "auto",
"layout": "horizontal",
"gridTemplate": "",
"wrap": false,
"values": {
"Berger": "berger",
"Robinson": "robinson",
"Penrose": "penrose",
"Ammann": "ammann",
"Kari": "kari",
"Jaendel": "jaendel"
},
"mode": "tap",
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "var quantity = 6\nvar tempo = 60\nif(value === 'berger') {\n quantity = 6\n tempo = 60\n} else if(value === 'robinson') {\n quantity = 8\n tempo = 60\n} else if(value === 'penrose') {\n quantity = 6\n tempo = 120\n} else if(value === 'ammann') {\n quantity = 8\n tempo = 60\n} else if(value === 'kari') {\n quantity = 7\n tempo = 45\n} else if(value === 'jaendel') {\n quantity = 32\n tempo = 60\n}\n\nsetVar('mixer/hdp/volume', 'quantity', quantity)\nsetVar('mixer/hdp/pan', 'quantity', quantity)\nsetVar('mixer/hdp/mute', 'quantity', quantity)\nset('tempo', tempo)"
},
{
"type": "input",
"top": "10%",
"left": "calc(80% + 50px)",
"lock": false,
"id": "tempo",
"visible": true,
"interaction": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 20rem\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": true,
"validation": "",
"maxLength": "",
"value": "",
"default": 60,
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "text",
"top": 0,
"left": "calc(80% + 50px)",
"lock": false,
"id": "tempo_label",
"visible": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "10%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 15rem\n}",
"value": "tempo",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"target": "",
"onCreate": "",
"onValue": "",
"vertical": false,
"wrap": false,
"align": "center",
"decimals": 2
},
{
"type": "button",
"top": "30%",
"left": "calc(80% + 50px)",
"lock": false,
"id": "transport",
"visible": true,
"interaction": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "50%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 20rem\n}",
"colorTextOn": "auto",
"label": "#{@{this} == 0 ? \"play\" : \"stop\"}",
"vertical": false,
"wrap": false,
"on": 1,
"off": 0,
"mode": "toggle",
"doubleTap": false,
"decoupled": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": true,
"onCreate": "",
"onValue": "if(value === 1){\n send(false, \"/transport\", 1, get(\"piece\"), get(\"measure\"), get(\"beat\"), get(\"tempo\"));\n} else {\n send(false, \"/transport\", 0, get(\"piece\"), get(\"measure\"), get(\"beat\"), get(\"tempo\"));\n}"
}
],
"tabs": []
},
{
"type": "tab",
"lock": false,
"id": "mixer_tab",
"visible": true,
"interaction": true,
"comments": "",
"colorText": "auto",
"colorWidget": "auto",
"colorFill": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"label": "mixer",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "matrix",
"top": "70%",
"left": 0,
"lock": false,
"id": "mixer/hdp/pan",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "knob",
"quantity": "VAR{quantity, 6}",
"props": "{\"value\": #{$/(VAR{quantity, 6}-1)}}",
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "matrix",
"top": 0,
"left": 0,
"lock": false,
"id": "mixer/hdp/volume",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "70%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "fader",
"quantity": "VAR{quantity, 6}",
"props": {
"value": 1
},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "matrix",
"top": "85%",
"left": 0,
"lock": false,
"id": "mixer/hdp/mute",
"visible": true,
"interaction": true,
"comments": "",
"width": "90%",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "button",
"quantity": "VAR{quantity, 6}",
"props": {
"value": 1
},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "panel",
"top": 0,
"left": "90%",
"lock": false,
"id": "mixer/string/master_panel",
"visible": true,
"interaction": true,
"comments": "",
"width": "10%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "fader",
"top": 0,
"left": 0,
"lock": false,
"id": "mixer/hdp/volume/master",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"design": "default",
"knobSize": "auto",
"horizontal": false,
"pips": false,
"dashed": false,
"gradient": [],
"snap": false,
"spring": false,
"doubleTap": false,
"range": {
"min": 0,
"max": 1
},
"logScale": false,
"sensitivity": 1,
"steps": "",
"origin": "auto",
"value": 1,
"default": 1,
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"onTouch": ""
}
],
"tabs": []
}
],
"tabs": []
}
]
}
],
"tabs": []
}
}

@ -0,0 +1,344 @@
{
"version": "1.24.0",
"createdWith": "Open Stage Control",
"type": "fragment",
"content": {
"type": "panel",
"top": 0,
"left": 0,
"lock": false,
"id": "transport_panel",
"visible": true,
"interaction": true,
"comments": "",
"width": "100%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorBg": "auto",
"layout": "default",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [
{
"type": "text",
"top": "27%",
"left": "40%",
"lock": false,
"id": "colon",
"visible": true,
"comments": "",
"width": 50,
"height": "40%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host {\n font-size: 120rem;\n}",
"vertical": false,
"wrap": false,
"align": "center",
"value": ":",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"decimals": 2,
"target": "",
"onCreate": "",
"onValue": ""
},
{
"type": "input",
"top": 0,
"left": 0,
"lock": false,
"id": "measure",
"visible": true,
"interaction": true,
"comments": "",
"width": "40%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": 0,
"html": "",
"css": "canvas {\n height: 150rem\n}\n:host {\n font-size: 150rem;\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": false,
"validation": "",
"maxLength": "",
"value": 1,
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "input",
"top": 0,
"left": "calc(40% + 50px)",
"lock": false,
"id": "beat",
"visible": true,
"interaction": true,
"comments": "",
"width": "15%",
"height": "100%",
"expand": false,
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "canvas {\n height: 150rem\n}\n:host {\n font-size: 150rem;\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": true,
"validation": "",
"maxLength": "",
"value": 1,
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "led",
"top": 0,
"left": "calc(55% + 50px)",
"lock": false,
"id": "visual_click",
"visible": true,
"comments": "",
"width": "25%",
"height": "100%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"mode": "intensity",
"range": {
"min": 0,
"max": 1
},
"alphaRange": {
"min": 0,
"max": 1
},
"logScale": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"target": "",
"onCreate": "",
"onValue": "var fallTime = 0.3,\nfps = 24,\nmaxValue = 1,\nstep = maxValue / fps / fallTime\n\nsetTimeout(()=>{\n if (value <= 0) clearTimeout()\n set(\"this\", value - step)\n}, 1000 / fps)"
},
{
"type": "input",
"top": "10%",
"left": "calc(80% + 50px)",
"lock": false,
"id": "tempo/@{parent.variables.piece}",
"visible": true,
"interaction": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "15%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 20rem\n}",
"align": "center",
"unit": "",
"asYouType": false,
"numeric": true,
"validation": "",
"maxLength": "",
"value": "@{parent.variables.tempo}",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
},
{
"type": "text",
"top": 0,
"left": "calc(80% + 50px)",
"lock": false,
"id": "tempo_label",
"visible": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "10%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 15rem\n}",
"value": "tempo",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"target": "",
"onCreate": "",
"onValue": "",
"vertical": false,
"wrap": false,
"align": "center",
"decimals": 2
},
{
"type": "button",
"top": "30%",
"left": "calc(80% + 50px)",
"lock": false,
"id": "transport",
"visible": true,
"interaction": true,
"comments": "",
"width": "calc(20% - 50px)",
"height": "70%",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": ":host{\n font-size: 20rem\n}",
"colorTextOn": "auto",
"label": "#{@{this} == 0 ? \"play\" : \"stop\"}",
"vertical": false,
"wrap": false,
"on": 1,
"off": 0,
"mode": "toggle",
"doubleTap": false,
"decoupled": false,
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 0,
"target": "",
"ignoreDefaults": false,
"bypass": true,
"onCreate": "",
"onValue": "console.log(\"tempo/\" + getProp(\"parent\", \"variables\").piece)\nif(value === 1){\n send(false, \"/transport\", 1, getProp(\"parent\", \"variables\").piece, get(\"measure\"), get(\"beat\"), get(\"tempo/\" + getProp(\"parent\", \"variables\").piece));\n} else {\n send(false, \"/transport\", 0, getProp(\"parent\", \"variables\").piece, get(\"measure\"), get(\"beat\"), get(\"tempo/\" + getProp(\"parent\", \"variables\").piece));\n}"
}
],
"tabs": []
}
}

@ -1,362 +1,395 @@
(
var createTransportPattern;
~hdpBusArray = 16.collect({Bus.audio(s, 1)});
// MAIN LAUNCH (loads necessary files and definitions)
Event.addEventType(\osc, {
if (~addr.postln.notNil) {
~msg.postln;
//~addr.sendMsg(~path, *~msg);
~addr.sendBundle(1, [~path] ++ ~msg);
var appEnvironment;
//push new environment
appEnvironment = Environment.make;
appEnvironment.push;
s.waitForBoot({
var hdpBusArray,
bergerCreateSynthsForLive, robinsonCreateSynthsForLive, penroseCreateSynthsForLive, ammannCreateSynthsForLive, kariCreateSynthsForLive, jaendelCreateSynthsForLive,
bergerCreatePatternsForLive, robinsonCreatePatternsForLive, penroseCreatePatternsForLive, ammannCreatePatternsForLive, kariCreatePatternsForLive, jaendelCreatePatternsForLive,
createTransportData, createTransportPattern, dir, group, berger, mixer, measureLengths, seqs, transportData, playbackData, tempoClock, player;
c = Condition.new;
hdpBusArray = 32.collect({Bus.audio(s, 1)});
Event.addEventType(\osc, {
if (~addr.postln.notNil) {
~msg.postln;
//~addr.sendMsg(~path, *~msg);
~addr.sendBundle(1, [~path] ++ ~msg);
};
});
//create synth defs
bergerCreateSynthsForLive = {var b;
// this creates a different waveform for each sonification of each part
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
SynthDef(\berger, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(0.05, sustain, 0.25, 0.1), gate, 1, 0, 1, doneAction: 2));
}).add;
};
});
robinsonCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
//create synth defs
~bergerCreateSynthsForLive = {var b;
// this creates a different waveform for each sonification of each part
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
SynthDef(\robinson, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.sine(sustain + 0.01), gate, 1, 0, 1, doneAction: 2));
}).add;
};
SynthDef(\berger, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(0.05, sustain, 0.25, 0.1), gate, 1, 0, 1, doneAction: 2));
}).add;
};
penroseCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
~robinsonCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
SynthDef(\penrose_ins, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out /*10 + buf*/, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(1, sustain - 0.3, 0.7, 0.5), gate, 1, 0, 1, doneAction: 2));
}).add;
SynthDef(\robinson, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.sine(sustain + 0.01), gate, 1, 0, 1, doneAction: 2));
}).add;
};
SynthDef(\penrose_fades, {arg subSeqLength, gate = 1, ins = 0, out = 0;
Out.ar(out, In.ar(10 + ins) * EnvGen.kr(Env.new([0.4, 0.8, 0.8, 0.4, 0], [3, subSeqLength - 6, 3, 0.1], \sine), gate, 1, 0, 1, doneAction: 2));
}).add;
};
~penroseCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 8.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
ammannCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 6.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
SynthDef(\penrose_ins, {arg freq, amp = 0.2, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out /*10 + buf*/, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(1, sustain - 0.3, 0.7, 0.5), gate, 1, 0, 1, doneAction: 2));
}).add;
SynthDef(\ammann, {arg freq, amp, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(0.05, sustain, 0.5, 0.1), gate, 1, 0, 1, doneAction: 2));
}).add;
};
SynthDef(\penrose_fades, {arg subSeqLength, gate = 1, ins = 0, out = 0;
Out.ar(out, In.ar(10 + ins) * EnvGen.kr(Env.new([0.4, 0.8, 0.8, 0.4, 0], [3, subSeqLength - 6, 3, 0.1], \sine), gate, 1, 0, 1, doneAction: 2));
}).add;
};
kariCreateSynthsForLive = {
SynthDef(\kariEnsemble, {arg freq = 110, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, SinOsc.ar(freq, 0, 0.1) *
pow(EnvGen.kr(Env.sine(sustain, amp / 5), gate, 1, 0, 1, doneAction: 2), 0.5) * 0.25);
}).add;
SynthDef(\kariBass, {arg freq = 110, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, SinOsc.ar(freq, 0, 0.1) *
EnvGen.kr(Env.adsr(1, dur - 1.3, 0.25, 0.3, 1), gate, doneAction: 2) * 1);
}).add;
SynthDef(\kariNoise, {arg snd = 0, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, Select.ar(snd, [WhiteNoise.ar(0.5), DC.ar(0), BrownNoise.ar(0.7)]) *
EnvGen.kr(Env.asr(dur, amp / 5, 3), gate, doneAction: 2) * 0.3);
}).add;
};
~ammannCreateSynthsForLive = {var b;
Buffer.freeAll(s);
b = 6.collect({var buf = Buffer.alloc(s, 512, 1); buf.sine1(1.0 / 5.collect({arg i; pow(i + 1, 5.0.rand + 1)}), true, true, true)});
//sine tones for sonification
jaendelCreateSynthsForLive = {
SynthDef(\jaendel, {arg freq, col, attack, sustain, decay, del = 5, gate = 1, pan = 0, pIndex = 0;
var env;
env = EnvGen.kr(Env.new([0, 1, 1, 0], [attack, sustain, decay], \sin), 1, 1, 0, 1, doneAction: 2);
//color is mapped to panning similar to the score which maps to different ways of playing the same note
Out.ar(pIndex * 2, SinOsc.ar(freq, 0, (((col >= 1) * (col <= 1)) + (col >= 3)).lag(0.3) * env * 0.05));
Out.ar(pIndex * 2 + 1, SinOsc.ar(freq, 0, (col >= 2).lag(0.3) * env * 0.05));
}).add;
};
SynthDef(\ammann, {arg freq, amp, del = 5, gate = 1, sustain = 1, buf = 0, out = 0;
Out.ar(out, Osc.ar(Select.kr(buf, b), freq, 0, amp) * EnvGen.kr(Env.adsr(0.05, sustain, 0.5, 0.1), gate, 1, 0, 1, doneAction: 2));
}).add;
};
~kariCreateSynthsForLive = {
SynthDef(\kariEnsemble, {arg freq = 110, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, SinOsc.ar(freq, 0, 0.1) *
pow(EnvGen.kr(Env.sine(sustain, amp / 5), gate, 1, 0, 1, doneAction: 2), 0.5) * 0.25);
}).add;
//create patterns
bergerCreatePatternsForLive = {arg seqs, group;
var pBinds, cleanSeqs;
cleanSeqs = [seqs[5], seqs[6], seqs[7], seqs[0], seqs[1], seqs[2]];
pBinds = seqs.collect({arg r, i;
Pbind(\instrument, \berger,
//\buf, Pseq((i - ((0..(r.slice(nil, 2).flat.size - 1)) / 10).trunc.asInteger) % 8),
\group, group,
\buf, i,
\out, hdpBusArray[i],
//\freq, Pseq(55 * r[1]),
\freq, Pseq((55 * r[1]).cpsmidi.round(0.5).midicps),
\dur, Pseq(r[0]),
\sustain, Pseq(r[0]),
\amp, Pseq(r[2] / 1) //4)
)
});
};
SynthDef(\kariBass, {arg freq = 110, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, SinOsc.ar(freq, 0, 0.1) *
EnvGen.kr(Env.adsr(1, dur - 1.3, 0.25, 0.3, 1), gate, doneAction: 2) * 1);
}).add;
robinsonCreatePatternsForLive = {arg seqs, group;
var pBinds;
pBinds = seqs[0].collect({arg r, i;
Pbind(\instrument, \robinson,
\buf, i,
\group, group,
\out, hdpBusArray[i],
\freq, Pseq(12.midicps * r.slice(nil, 1)),
\dur, Pseq(r.slice(nil, 0) * 0.25 /* * (3/4)*/),
\sustain, Pseq(r.slice(nil, 0) * 0.25 /* * (3/4)*/),
\amp, Pseq(r.slice(nil, 2) * 2)
)
});
};
SynthDef(\kariNoise, {arg snd = 0, amp = 1, gate = 1, sustain = 1, dur = 1, out = 0;
Out.ar(out, Select.ar(snd, [WhiteNoise.ar(0.5), DC.ar(0), BrownNoise.ar(0.7)]) *
EnvGen.kr(Env.asr(dur, amp / 5, 3), gate, doneAction: 2) * 0.3);
}).add;
};
//sine tones for sonification
~jaendelCreateSynthsForLive = {
SynthDef(\jaendel, {arg freq, col, attack, sustain, decay, del = 5, gate = 1, pan = 0, pIndex = 0;
var env;
env = EnvGen.kr(Env.new([0, 1, 1, 0], [attack, sustain, decay], \sin), 1, 1, 0, 1, doneAction: 2);
//color is mapped to panning similar to the score which maps to different ways of playing the same note
Out.ar(pIndex * 2, SinOsc.ar(freq, 0, (((col >= 1) * (col <= 1)) + (col >= 3)).lag(0.3) * env * 0.05));
Out.ar(pIndex * 2 + 1, SinOsc.ar(freq, 0, (col >= 2).lag(0.3) * env * 0.05));
}).add;
};
//create patterns
~bergerCreatePatternsForLive = {arg seqs, group;
var pBinds, cleanSeqs;
cleanSeqs = [seqs[5], seqs[6], seqs[7], seqs[0], seqs[1], seqs[2]];
pBinds = seqs.collect({arg r, i;
Pbind(\instrument, \berger,
//\buf, Pseq((i - ((0..(r.slice(nil, 2).flat.size - 1)) / 10).trunc.asInteger) % 8),
\group, group,
\buf, i,
\out, ~hdpBusArray[i],
//\freq, Pseq(55 * r[1]),
\freq, Pseq((55 * r[1]).cpsmidi.round(0.5).midicps),
\dur, Pseq(r[0]),
\sustain, Pseq(r[0]),
\amp, Pseq(r[2] / 1) //4)
)
});
};
~robinsonCreatePatternsForLive = {arg seqs, group;
var pBinds;
seqs = File.readAllString((~dir +/+ "music_data" +/+ "robinson.txt").standardizePath).interpret;
pBinds = seqs[0].collect({arg r, i;
Pbind(\instrument, \robinson,
\buf, i,
\group, group,
\out, ~hdpBusArray[i],
\freq, Pseq(12.midicps * r.slice(nil, 1)),
\dur, Pseq(r.slice(nil, 0) * 0.25 /* * (3/4)*/),
\sustain, Pseq(r.slice(nil, 0) * 0.25 /* * (3/4)*/),
\amp, Pseq(r.slice(nil, 2) * 2)
)
});
};
~penroseCreatePatternsForLive = {arg seqs, group;
var finSeqs, finFades;
finSeqs = seqs[0].collect({arg r, i;
Pbind(\instrument, \penrose_ins,
\group, group,
\buf, i,
\out, ~hdpBusArray[i],
//\freq, Pseq((24.midicps * r[1]).cpsmidi.round(0.5).midicps),
\freq, Pseq((24.midicps * r[1])),
\dur, Pseq(r[0] * 0.25 /* * 0.125*/),
\sustain, Pseq(r[0] * 0.25 /* * 0.125*/),
\amp, Pseq(((r[2] * 0.25) / pow(1.5, ((i % 6) + 1))))
)
});
penroseCreatePatternsForLive = {arg seqs, group;
var finSeqs, finFades;
finSeqs = seqs[0].collect({arg r, i;
Pbind(\instrument, \penrose_ins,
\group, group,
\buf, i,
\out, hdpBusArray[i],
//\freq, Pseq((24.midicps * r[1]).cpsmidi.round(0.5).midicps),
\freq, Pseq((24.midicps * r[1])),
\dur, Pseq(r[0] * 0.25 /* * 0.125*/),
\sustain, Pseq(r[0] * 0.25 /* * 0.125*/),
\amp, Pseq(((r[2] * 0.25) / pow(1.5, ((i % 6) + 1))))
)
});
/*
finFades = seqs[2].collect({ arg r, i;
/*
finFades = seqs[2].collect({ arg r, i;
Pbind(\instrument, \penrose_fades,
\group, group,
\out, ~hdpBusArray[i],
\dur, Pseq(r * 0.125),
\subSeqLength, Pseq(r * 0.125),
\ins, i
\group, group,
\out, hdpBusArray[i],
\dur, Pseq(r * 0.125),
\subSeqLength, Pseq(r * 0.125),
\ins, i
)
});
*/
finSeqs /*++ finFades*/;
};
~ammannCreatePatternsForLive = {arg seqs, group;
var finSeqs;
finSeqs = seqs.reverse.collect({arg r, i;
Pbind(\instrument, \ammann,
//\buf, Pseq((i - ((0..(r.slice(nil, 2).flat.size - 1)) / 10).trunc.asInteger) % 8),
\group, group,
\buf, i,
\out, ~hdpBusArray[i],
\freq, Pseq((55 * r.slice(nil, 2).flatten).cpsmidi.round(0.5).midicps),
\dur, Pseq(r.slice(nil, 0).flat),
//this is a bit tricky it makes it so that each note goes to the next
//(ignoring the old sustain value)
//but the rests are kept to make it clear where the note falls in each measure
//for the transcriber
\sustain, Pseq(
[r.slice(nil, 0).flat.drop(1).clump(2).size.collect({Rest(1)}),
r.slice(nil, 0).flat.drop(1).clump(2).collect({arg item; item.sum})].flop.flat
),
//\sustain, Pseq(r.slice(nil, 1).flat ),
\amp, Pseq(r.slice(nil, 3).flat /** 0.5*/)
)
});
});
*/
finSeqs;
};
~kariCreatePatternsForLive = {arg dirs, group;
[
Pbind(\instrument, \kariNoise,
\group, group,
\out, 0,
\dur, Pseq(dirs[0].slice(nil, 1) /* * 1.2*/),
\snd, Pseq(dirs[0].slice(nil, 0))),
Pbind(\instrument, \kariBass,
\group, group,
\out, 1,
\dur, Pseq(dirs[1].slice(nil, 1) /* * 1.2*/),
\freq, Pseq((dirs[1].slice(nil, 0).collect({arg elem; [Rest(0), 36.midicps, 43.midicps][elem]})))),
] ++
dirs.drop(2).reverse.collect({arg row, i;
Pbind(\instrument, \kariEnsemble,
\group, group,
\out, i + 2,
\dur, Pseq(row.slice(nil, 1) /* * 1.2*/),
//\sustain, Pseq(row.slice(nil, 1) * 1.2),
\freq, Pseq(row.slice(nil, 0).collect({arg val; if(val == 5, {Rest(0)}, {(60 + (val.trunc * 7)).midicps})})),
\amp, 1)})
};
~jaendelCreatePatternsForLive = {arg colors, version = 0 /*0 is full; 1 is reduced*/, startHarm = 1 /*must be odd*/, fund = 55, group;
//generate patterns
colors.collect({arg row, r;
var durUnit, del, eDur, start, stop, harms, fade, pIndex;
durUnit = 1 / 6; // 90 bpm
// 2 measures for full version, 1 for reduced version
del = if(version == 0, {(32 * (r % 16)) + (512 * (r / 16).asInteger)}, {(32 * (r % 8)) + (512 * (r / 8).asInteger)});
pIndex = if(version == 0, {(r % 16)}, {(r % 8)});
eDur = if(version == 0, {512 - 64}, {512 - 16}); // 32 - 4 measures for full version, 16 - 1 for reduced version
start = del - r; // this skews the tiling
stop = (start + eDur) - 1;
harms = ((0..(if(version == 0, {15}, {7}))) * 2).reverse + startHarm;
fade = if(version == 0, {64}, {64});
Pmono(\jaendel,
\group, group,
\pIndex, pIndex,
\dur, Pseq([Rest(del * durUnit), Pseq([durUnit], inf)]),
\freq, fund * harms[r % if(version == 0, {16}, {8})],
\col, Pseq([0, Pseq(row[start..stop])]),
\attack, fade * durUnit,
\sustain, (eDur - (fade * 2)) * durUnit,
\decay, fade * durUnit,
)
});
};
finSeqs /*++ finFades*/;
};
ammannCreatePatternsForLive = {arg seqs, group;
var finSeqs;
finSeqs = seqs.reverse.collect({arg r, i;
Pbind(\instrument, \ammann,
//\buf, Pseq((i - ((0..(r.slice(nil, 2).flat.size - 1)) / 10).trunc.asInteger) % 8),
\group, group,
\buf, i,
\out, hdpBusArray[i],
\freq, Pseq((55 * r.slice(nil, 2).flatten).cpsmidi.round(0.5).midicps),
\dur, Pseq(r.slice(nil, 0).flat),
//this is a bit tricky it makes it so that each note goes to the next
//(ignoring the old sustain value)
//but the rests are kept to make it clear where the note falls in each measure
//for the transcriber
\sustain, Pseq(
[r.slice(nil, 0).flat.drop(1).clump(2).size.collect({Rest(1)}),
r.slice(nil, 0).flat.drop(1).clump(2).collect({arg item; item.sum})].flop.flat
),
//\sustain, Pseq(r.slice(nil, 1).flat ),
\amp, Pseq(r.slice(nil, 3).flat /** 0.5*/)
)
});
SynthDef(\mixer, {arg freq, gate = 1, sustain, amp, dur, out;
var nameSpaces, sigs;
finSeqs;
};
sigs = [~hdpBusArray].collect({arg busArray, i;
var nameSpace, sig;
nameSpace = ['hdp'][i];
sig = busArray.collect({arg bus, c; In.ar(bus, 1) * NamedControl.kr(\ ++ nameSpace ++ '_volume_' ++ c, 1, 0.1)});
sig = sig.collect({arg channel, c; Pan2.ar(channel, NamedControl.kr(\ ++ nameSpace ++ '_pan_' ++ c, i / (busArray.size - 1), 0.1) * 2 - 1)});
sig = sig.collect({arg channel, c; channel * NamedControl.kr(\ ++ nameSpace ++ '_mute_' ++ c, 1, 0.1)});
sig = Mix.ar(sig) * pow(NamedControl.kr(\ ++ nameSpace ++ '_volume_master', 1, 0.5), 2);
});
kariCreatePatternsForLive = {arg dirs, group;
[
Pbind(\instrument, \kariNoise,
\group, group,
\out, 0,
\dur, Pseq(dirs[0].slice(nil, 1) /* * 1.2*/),
\snd, Pseq(dirs[0].slice(nil, 0))),
Pbind(\instrument, \kariBass,
\group, group,
\out, 1,
\dur, Pseq(dirs[1].slice(nil, 1) /* * 1.2*/),
\freq, Pseq((dirs[1].slice(nil, 0).collect({arg elem; [Rest(0), 36.midicps, 43.midicps][elem]})))),
] ++
dirs.drop(2).reverse.collect({arg row, i;
Pbind(\instrument, \kariEnsemble,
\group, group,
\out, i + 2,
\dur, Pseq(row.slice(nil, 1) /* * 1.2*/),
//\sustain, Pseq(row.slice(nil, 1) * 1.2),
\freq, Pseq(row.slice(nil, 0).collect({arg val; if(val == 5, {Rest(0)}, {(60 + (val.trunc * 7)).midicps})})),
\amp, 1)})
};
sigs = Mix.ar(sigs / 6);
Out.ar(0, sigs)
}).add;
jaendelCreatePatternsForLive = {arg colors, version = 0 /*0 is full; 1 is reduced*/, startHarm = 1 /*must be odd*/, fund = 55, group;
//generate patterns
colors.collect({arg row, r;
var durUnit, del, eDur, start, stop, harms, fade, pIndex;
durUnit = 1 / 6; // 90 bpm
// 2 measures for full version, 1 for reduced version
del = if(version == 0, {(32 * (r % 16)) + (512 * (r / 16).asInteger)}, {(32 * (r % 8)) + (512 * (r / 8).asInteger)});
pIndex = if(version == 0, {(r % 16)}, {(r % 8)});
eDur = if(version == 0, {512 - 64}, {512 - 16}); // 32 - 4 measures for full version, 16 - 1 for reduced version
start = del - r; // this skews the tiling
stop = (start + eDur) - 1;
harms = ((0..(if(version == 0, {15}, {7}))) * 2).reverse + startHarm;
fade = if(version == 0, {64}, {64});
Pmono(\jaendel,
\group, group,
\pIndex, pIndex,
\dur, Pseq([Rest(del * durUnit), Pseq([durUnit], inf)]),
\freq, fund * harms[r % if(version == 0, {16}, {8})],
\col, Pseq([0, Pseq(row[start..stop])]),
\attack, fade * durUnit,
\sustain, (eDur - (fade * 2)) * durUnit,
\decay, fade * durUnit,
)
});
};
)
(
SynthDef(\mixer_old, {arg freq, gate = 1, sustain, amp, dur, out;
var nameSpaces, sigs;
sigs = [hdpBusArray].collect({arg busArray, i;
var nameSpace, sig;
nameSpace = ['hdp'][i];
sig = busArray.collect({arg bus, c; In.ar(bus, 1) * NamedControl.kr(\ ++ nameSpace ++ '_volume_' ++ c, 1, 0.1)});
sig = sig.collect({arg channel, c; Pan2.ar(channel, NamedControl.kr(\ ++ nameSpace ++ '_pan_' ++ c, i / (busArray.size - 1), 0.1) * 2 - 1)});
sig = sig.collect({arg channel, c; channel * NamedControl.kr(\ ++ nameSpace ++ '_mute_' ++ c, 1, 0.1)});
sig = Mix.ar(sig) * pow(NamedControl.kr(\ ++ nameSpace ++ '_volume_master', 1, 0.5), 2);
});
sigs = Mix.ar(sigs / 6);
Out.ar(0, sigs)
}).add;
SynthDef(\mixer, {
var sig;
sig = hdpBusArray.collect({arg bus, index; In.ar(bus, 1) * NamedControl.kr(\volume_ ++ index, 0.75, 0.1)});
sig = sig.collect({arg channel, index; Pan2.ar(channel, NamedControl.kr(\pan_ ++ index, 0.5, 0.1) * 2 - 1)});
sig = sig.collect({arg channel, index; channel * NamedControl.kr(\mute_ ++ index, 1, 0.1)});
sig = Mix.ar(sig) * pow(NamedControl.kr(\volume_master, 0.75, 0.5), 2);
Out.ar(0, sig)
}).add;
s.sync(c);
dir = thisProcess.nowExecutingPath.dirname;
createTransportData = {arg measureLengths;
measureLengths.collect({arg dur, measure;
var beats;
if(dur.round(0.5) % 1 == 0, {
dur.asInteger.collect({arg beat;
[measure + 1, beat + 1, 1]
})
}, {
var eigths, beatDurs;
eigths = (dur / 0.5).round(0.5).asInteger;
beatDurs = case
{eigths <= 3} {[dur]}
{eigths == 5} {[1, 1.5]}
{eigths == 7} {[1, 1, 1.5]}
{eigths == 9} {[1, 1, 1, 1.5]}
{eigths == 11} {[1, 1, 1, 1, 1.5]}
{eigths == 13} {[1, 1, 1, 1, 1, 1.5]}
{eigths == 15} {[1, 1, 1, 1, 1, 1, 1.5]};
beatDurs.collect({arg bDur, beat;
[measure + 1, beat + 1, bDur]
})
});
}).flatten;
};
var createTransportData, createTransportPattern, group, berger, mixer, measureLengths, seqs, transportData, playbackData, tempoClock, player;
createTransportPattern = {arg addr, transportData;
Pbind(
\type, \osc,
\addr, addr,
\path, "/playing",
\msg, Pseq(8.collect({arg i; ["-", (i % 4) + 1]}) ++ transportData.collect({arg item; [item[0], item[1]]}), 1),
\dur, Pseq(8.collect({arg i; 1}) ++ transportData.collect({arg item; item[2]}), 1),
);
};
bergerCreateSynthsForLive.value;
robinsonCreateSynthsForLive.value;
penroseCreateSynthsForLive.value;
ammannCreateSynthsForLive.value;
kariCreateSynthsForLive.value;
jaendelCreateSynthsForLive.value;
group = Group.new;
berger = Synth.tail(group, \berger);
mixer = Synth.tail(group, \mixer);
playbackData = Dictionary.new(n: 6);
seqs = File.readAllString((dir +/+ "music_data" +/+ "berger.txt").standardizePath).interpret;
measureLengths = seqs[0][6];
playbackData.add(\berger -> [bergerCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((dir +/+ "music_data" +/+ "robinson.txt").standardizePath).interpret;
measureLengths = seqs[1].sum.collect({4});
playbackData.add(\robinson -> [robinsonCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((dir +/+ "music_data" +/+ "penrose.txt").standardizePath).interpret;
measureLengths = seqs[1].sum.collect({4});
playbackData.add(\penrose -> [penroseCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((dir +/+ "music_data" +/+ "ammann.txt").standardizePath).interpret;
measureLengths = seqs[0].collect({arg item; item[0].sum});
playbackData.add(\ammann -> [ammannCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((dir +/+ "music_data" +/+ "kari.txt").standardizePath).interpret;
measureLengths = seqs[0].collect({arg item; item.last}).flatten;
playbackData.add(\kari -> [kariCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((dir +/+ "music_data" +/+ "jaendel.txt").standardizePath).interpret;
measureLengths = 284.collect({4});
playbackData.add(\jaendel -> [jaendelCreatePatternsForLive.value(seqs, 0, 1, 55, group), createTransportData.value(measureLengths), measureLengths]);
~dir = thisProcess.nowExecutingPath.dirname;
createTransportData = {arg measureLengths;
measureLengths.collect({arg dur, measure;
var beats;
if(dur.round(0.5) % 1 == 0, {
dur.asInteger.collect({arg beat;
[measure + 1, beat + 1, 1]
})
OSCdef(\mixer, {arg msg, time, addr, port;
[msg, time, addr, port].postln;
if(msg[1] != "volume_master", {
mixer.set((msg[1] ++ '_' ++ msg[2]), msg[3])
}, {
var eigths, beatDurs;
eigths = (dur / 0.5).round(0.5).asInteger;
beatDurs = case
{eigths <= 3} {[dur]}
{eigths == 5} {[1, 1.5]}
{eigths == 7} {[1, 1, 1.5]}
{eigths == 9} {[1, 1, 1, 1.5]}
{eigths == 11} {[1, 1, 1, 1, 1.5]}
{eigths == 13} {[1, 1, 1, 1, 1, 1.5]}
{eigths == 15} {[1, 1, 1, 1, 1, 1, 1.5]};
beatDurs.collect({arg bDur, beat;
[measure + 1, beat + 1, bDur]
})
mixer.set(msg[1], msg[2])
});
}).flatten;
};
createTransportPattern = {arg addr, transportData;
Pbind(
\type, \osc,
\addr, addr,
\path, "/playing",
\msg, Pseq(transportData.collect({arg item; [item[0], item[1]]}), 1),
\dur, Pseq(transportData.collect({arg item; item[2]}), 1),
);
};
~bergerCreateSynthsForLive.value;
~robinsonCreateSynthsForLive.value;
~penroseCreateSynthsForLive.value;
~ammannCreateSynthsForLive.value;
~kariCreateSynthsForLive.value;
~jaendelCreateSynthsForLive.value;
group = Group.new;
berger = Synth.tail(group, \berger);
mixer = Synth.tail(group, \mixer);
playbackData = Dictionary.new(n: 6);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "berger.txt").standardizePath).interpret;
measureLengths = seqs[0][6];
playbackData.add(\berger -> [~bergerCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "robinson.txt").standardizePath).interpret;
measureLengths = seqs[1].sum.collect({4});
playbackData.add(\robinson -> [~robinsonCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "penrose.txt").standardizePath).interpret;
measureLengths = seqs[1].sum.collect({4});
playbackData.add(\penrose -> [~penroseCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "ammann.txt").standardizePath).interpret;
measureLengths = seqs[0].collect({arg item; item[0].sum});
playbackData.add(\ammann -> [~ammannCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "kari.txt").standardizePath).interpret;
~seqs = seqs;
measureLengths = seqs[0].collect({arg item; item.last}).flatten;
playbackData.add(\kari -> [~kariCreatePatternsForLive.value(seqs, group), createTransportData.value(measureLengths), measureLengths]);
seqs = File.readAllString((~dir +/+ "music_data" +/+ "jaendel.txt").standardizePath).interpret;
measureLengths = 284.collect({4});
playbackData.add(\jaendel -> [~jaendelCreatePatternsForLive.value(seqs, 0, 1, 55, group), createTransportData.value(measureLengths), measureLengths]);
OSCdef(\mixer, {arg msg, time, addr, port;
[msg, time, addr, port].postln;
mixer.set((msg[1] ++ '_' ++ msg[2] ++ '_' ++ msg[3]), msg[4])
}, \mixer);
OSCdef(\transport, {arg msg, time, addr, port;
[msg, time, addr, port].postln;
if(msg[1] == 0, {
//need some work here to make sure all synths are getting cutoff correctly
group.set(\release, 2);
group.set(\gate, 0);
player.stop;
}, {
var pbinds, transportData, measureLengths, patterns, stream, offset, offsetStream, terminationStream;
# pbinds, transportData, measureLengths = playbackData[msg[2]];
patterns = Ppar(pbinds.postln.add(createTransportPattern.value(addr, transportData).postln));
stream = patterns.asStream;
offset = stream.fastForward(measureLengths.keep(msg[3].asInteger - 1).sum);
offsetStream = Routine({offset.wait});
terminationStream = Routine({addr.sendMsg("/transport", 0)});
player = EventStreamPlayer(offsetStream ++ stream ++ terminationStream);
tempoClock = TempoClock(msg[5]/60.0);
player.play(tempoClock);
//player.play(tempoClock, quant: Quant.new(0, 0, -2));
});
}, \transport);
}, \mixer);
OSCdef(\transport, {arg msg, time, addr, port;
[msg, time, addr, port].postln;
if(msg[1] == 0, {
//need some work here to make sure all synths are getting cutoff correctly
group.set(\release, 2);
group.set(\gate, 0);
player.stop;
}, {
var pbinds, transportData, measureLengths, patterns, stream, offset, offsetStream, terminationStream;
# pbinds, transportData, measureLengths = playbackData[msg[2]];
//patterns = Ppar(pbinds.postln.add(createTransportPattern.value(addr, transportData).postln));
patterns = Ptpar([0, createTransportPattern.value(addr, transportData), 9, Ppar(pbinds)]);
stream = patterns.asStream;
if(msg[3] == 1, {
offset = stream.fastForward(measureLengths.keep(msg[3].asInteger - 1).sum);
}, {
offset = stream.fastForward(measureLengths.keep(msg[3].asInteger - 1).sum + 8);
});
offsetStream = Routine({offset.wait});
terminationStream = Routine({addr.sendMsg("/transport", 0)});
player = EventStreamPlayer(offsetStream ++ stream ++ terminationStream);
tempoClock = TempoClock(msg[5]/60.0);
player.play(tempoClock);
//player.play(tempoClock, quant: Quant.new(0, 0, -2));
});
}, \transport);
"ready".postln;
});
appEnvironment.pop;
)
/*
@ -375,13 +408,3 @@ TODOs:
~bergerMusic[0][6].collect({arg beats, measure; beats.asInteger.collect({arg beat; [measure + 1, beat + 1]})}).flatten;
*/
~seqs[7]
[seqs[5], seqs[6], seqs[7], seqs[0], seqs[1], seqs[2]]
0.25 * (3/4) * 16
0.25 * 16
4/0.25
9 * 0.125
Loading…
Cancel
Save