diff --git a/live_utilities/openstagecontrol/mixer.json b/live_utilities/openstagecontrol/mixer.json index 7efd741..54271c7 100644 --- a/live_utilities/openstagecontrol/mixer.json +++ b/live_utilities/openstagecontrol/mixer.json @@ -58,7 +58,7 @@ "visible": true, "interaction": true, "comments": "", - "width": "90%", + "width": "86%", "height": "70%", "expand": "false", "colorText": "auto", @@ -106,13 +106,13 @@ { "type": "panel", "top": 0, - "left": "90%", + "left": "86%", "lock": false, "id": "@{parent.variables.piece}/mixer/hdp/master_panel", "visible": true, "interaction": true, "comments": "", - "width": "10%", + "width": "7%", "height": "100%", "expand": "false", "colorText": "auto", @@ -217,7 +217,7 @@ "visible": true, "interaction": true, "comments": "", - "width": "90%", + "width": "86%", "height": "15%", "expand": "false", "colorText": "auto", @@ -269,7 +269,7 @@ "visible": true, "interaction": true, "comments": "", - "width": "90%", + "width": "86%", "height": "15%", "expand": "false", "colorText": "auto", @@ -311,6 +311,111 @@ "onValue": "", "widgets": [], "tabs": [] + }, + { + "type": "panel", + "top": 0, + "left": "93%", + "lock": false, + "id": "@{parent.variables.piece}/mixer/hdp/click_panel", + "visible": true, + "interaction": true, + "comments": "", + "width": "7%", + "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_click", + "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": [] } ], "tabs": [] diff --git a/live_utilities/supercollider/live_utilities.scd b/live_utilities/supercollider/live_utilities.scd index 7b08a56..37d939e 100644 --- a/live_utilities/supercollider/live_utilities.scd +++ b/live_utilities/supercollider/live_utilities.scd @@ -10,14 +10,19 @@ appEnvironment.push; s.waitForBoot({ - var hdpBusArray, - bergerCreateSynthsForLive, robinsonCreateSynthsForLive, penroseCreateSynthsForLive, ammannCreateSynthsForLive, kariCreateSynthsForLive, jaendelCreateSynthsForLive, + var hdpBusArray, clickBus, clickBufPrimary, clickBufSecondary, + bergerCreateSynthsForLive, robinsonCreateSynthsForLive, penroseCreateSynthsForLive, ammannCreateSynthsForLive, kariCreateSynthsForLive, jaendelCreateSynthsForLive, clickCreateSynthForLive, bergerCreatePatternsForLive, robinsonCreatePatternsForLive, penroseCreatePatternsForLive, ammannCreatePatternsForLive, kariCreatePatternsForLive, jaendelCreatePatternsForLive, - createTransportData, createTransportPattern, dir, group, berger, mixer, measureLengths, seqs, transportData, playbackData, tempoClock, player; + createTransportData, createTransportPattern, createClickPattern, dir, group, berger, mixer, measureLengths, seqs, transportData, playbackData, tempoClock, player; + + Buffer.freeAll(s); c = Condition.new; + dir = thisProcess.nowExecutingPath.dirname; + hdpBusArray = 32.collect({Bus.audio(s, 1)}); + clickBus = Bus.audio(s, 1); Event.addEventType(\osc, { if (~addr.postln.notNil) { @@ -31,7 +36,7 @@ s.waitForBoot({ //create synth defs bergerCreateSynthsForLive = {var b; // this creates a different waveform for each sonification of each part - Buffer.freeAll(s); + //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; @@ -40,7 +45,7 @@ s.waitForBoot({ }; robinsonCreateSynthsForLive = {var b; - Buffer.freeAll(s); + //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; @@ -49,7 +54,7 @@ s.waitForBoot({ }; penroseCreateSynthsForLive = {var b; - Buffer.freeAll(s); + //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; @@ -62,7 +67,7 @@ s.waitForBoot({ }; ammannCreateSynthsForLive = {var b; - Buffer.freeAll(s); + //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(\ammann, {arg freq, amp, del = 5, gate = 1, sustain = 1, buf = 0, out = 0; @@ -98,6 +103,22 @@ s.waitForBoot({ }).add; }; + //sampler for click track + clickCreateSynthForLive = { + clickBufPrimary = Buffer.read(s, dir +/+ "music_data" +/+ "primary_click.wav"); + clickBufSecondary = Buffer.read(s, dir +/+ "music_data" +/+ "secondary_click.wav"); + + SynthDef(\click, {arg measure = 0, beat = 0, dur = 1, sustain = 1, gate = 1, out = 0, primaryBufNum = 0, secondaryBufNum = 1; + var primaryClick, secondaryClick, sig; + primaryClick = PlayBuf.ar(1, primaryBufNum, BufRateScale.kr(primaryBufNum), 1, SampleRate.ir * BufRateScale.kr(primaryBufNum) * (measure % 100)); + //primaryClick = PlayBuf.ar(1, primaryBufNum, BufRateScale.kr(primaryBufNum)); + secondaryClick = PlayBuf.ar(1, secondaryBufNum, BufRateScale.kr(secondaryBufNum), 1); + sig = Select.ar(beat > 0, [primaryClick, secondaryClick]);//* EnvGen.kr(Env.cutoff(0.001, 1), doneAction: 2); + EnvGen.kr(Env.sine(sustain), gate, doneAction: 2); + Out.ar(out, sig); + }).add; + }; + //create patterns bergerCreatePatternsForLive = {arg seqs, group; @@ -244,6 +265,20 @@ s.waitForBoot({ }); }; + createClickPattern = {arg transportData, group; + Pbind(\instrument, \click, + \group, group, + //\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), + \measure, Pseq(8.collect({arg i; 2}) ++ transportData.collect({arg item; item[0]}) - 1, 1), + \beat, Pseq(8.collect({arg i; 2}) ++ transportData.collect({arg item; item[1]}) - 1, 1), + \dur, Pseq(transportData.collect({arg item; item[2]}), 1), + \sustain, 1, + \primaryBufNum, clickBufPrimary, + \secondaryBufNum, clickBufSecondary, + \out, clickBus + ); + }; SynthDef(\mixer_old, {arg freq, gate = 1, sustain, amp, dur, out; var nameSpaces, sigs; @@ -262,19 +297,21 @@ s.waitForBoot({ }).add; SynthDef(\mixer, { - var sig; + var sig, click; 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) + click = In.ar(clickBus, 1);// * NamedControl.kr(\volume_click, 0.75, 0.1); + + Out.ar(0, sig); + Out.ar(2, click); }).add; - s.sync(c); - dir = thisProcess.nowExecutingPath.dirname; + s.sync(c); createTransportData = {arg measureLengths; measureLengths.collect({arg dur, measure; @@ -318,6 +355,7 @@ s.waitForBoot({ ammannCreateSynthsForLive.value; kariCreateSynthsForLive.value; jaendelCreateSynthsForLive.value; + clickCreateSynthForLive.value; group = Group.new; berger = Synth.tail(group, \berger); @@ -370,7 +408,7 @@ s.waitForBoot({ 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)]); + patterns = Ptpar([0, createTransportPattern.value(addr, transportData), 1 * msg[5]/60.0, createClickPattern.value(transportData, group), 9 * msg[5]/60.0, Ppar(pbinds)]); stream = patterns.asStream; if(msg[3] == 1, { diff --git a/live_utilities/supercollider/music_data/primary_click.wav b/live_utilities/supercollider/music_data/primary_click.wav new file mode 100644 index 0000000..bd5b776 Binary files /dev/null and b/live_utilities/supercollider/music_data/primary_click.wav differ diff --git a/live_utilities/supercollider/music_data/secondary_click.wav b/live_utilities/supercollider/music_data/secondary_click.wav new file mode 100644 index 0000000..6baff1a Binary files /dev/null and b/live_utilities/supercollider/music_data/secondary_click.wav differ