added robinson and penrose

main
mwinter 1 year ago
parent d4d32d8610
commit 502a0423ee

@ -9,7 +9,6 @@ module.exports = {
var {host, port, address, args} = data
if (address === '/playing') {
console.log(args)
receive("/measure", args[0].value)
receive("/beat", args[1].value)
receive("/visual_click", 1)

@ -0,0 +1,612 @@
{
"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": "matrix",
"top": 240,
"left": 40,
"lock": false,
"id": "mixer/berger/pan",
"visible": true,
"interaction": true,
"comments": "",
"width": 570,
"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": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "knob",
"quantity": 6,
"props": {},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "matrix",
"top": 20,
"left": 40,
"lock": false,
"id": "mixer/berger/volume",
"visible": true,
"interaction": true,
"comments": "",
"width": 570,
"height": 220,
"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": 6,
"props": {},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "matrix",
"top": 290,
"left": 40,
"lock": false,
"id": "mixer/berger/mute",
"visible": true,
"interaction": true,
"comments": "",
"width": 570,
"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": "",
"colorBg": "auto",
"layout": "horizontal",
"justify": "start",
"gridTemplate": "",
"contain": true,
"scroll": true,
"innerPadding": true,
"tabsPosition": "top",
"variables": "@{parent.variables}",
"traversing": false,
"widgetType": "button",
"quantity": 6,
"props": {},
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"widgets": [],
"tabs": []
},
{
"type": "panel",
"top": 20,
"left": 610,
"lock": false,
"id": "mixer/string/master_panel",
"visible": true,
"interaction": true,
"comments": "",
"width": 60,
"height": 310,
"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/berger/volume/master",
"visible": true,
"interaction": true,
"comments": "",
"width": "auto",
"height": 300,
"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": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": "",
"onTouch": ""
}
],
"tabs": []
},
{
"type": "button",
"top": 520,
"left": 40,
"lock": false,
"id": "transport",
"visible": true,
"interaction": true,
"comments": "",
"width": 80,
"height": 30,
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"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(\"measure\"), get(\"beat\"));\n} else {\n send(false, \"/transport\", 0, get(\"measure\"), get(\"beat\"));\n}"
},
{
"type": "panel",
"top": 330,
"left": 40,
"lock": false,
"id": "metronome",
"visible": true,
"interaction": true,
"comments": "",
"width": 630,
"height": 190,
"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": "input",
"top": 0,
"left": 0,
"lock": false,
"id": "measure",
"visible": true,
"interaction": true,
"comments": "",
"width": 250,
"height": 180,
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": 0,
"html": "",
"css": ":host {\n font-size: 120rem;\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": "text",
"top": 10,
"left": 250,
"lock": false,
"id": "text_3",
"visible": true,
"comments": "",
"width": 50,
"height": 130,
"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": 300,
"lock": false,
"id": "beat",
"visible": true,
"interaction": true,
"comments": "",
"width": 120,
"height": 180,
"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}",
"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": 10,
"left": 430,
"lock": false,
"id": "visual_click",
"visible": true,
"comments": "",
"width": 180,
"height": 160,
"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)"
}
],
"tabs": []
},
{
"type": "switch",
"top": 50,
"left": 750,
"lock": false,
"id": "switch_1",
"visible": true,
"interaction": true,
"comments": "",
"width": "auto",
"height": "auto",
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorTextOn": "auto",
"layout": "vertical",
"gridTemplate": "",
"wrap": false,
"values": "{\n \"\n \"Value 2\": 2\n}",
"mode": "tap",
"value": "",
"default": "",
"linkId": "",
"address": "auto",
"preArgs": "",
"typeTags": "",
"decimals": 2,
"target": "",
"ignoreDefaults": false,
"bypass": false,
"onCreate": "",
"onValue": ""
}
],
"tabs": []
}
}

@ -347,7 +347,7 @@
"ignoreDefaults": false,
"bypass": true,
"onCreate": "",
"onValue": "if(value === 1){\n send(false, \"/transport\", 1, get(\"measure\"), get(\"beat\"));\n} else {\n send(false, \"/transport\", 0, get(\"measure\"), get(\"beat\"));\n}"
"onValue": "if(value === 1){\n send(false, \"/transport\", 1, get(\"piece\"), get(\"measure\"), get(\"beat\"));\n} else {\n send(false, \"/transport\", 0, get(\"piece\"), get(\"measure\"), get(\"beat\"));\n}"
},
{
"type": "panel",
@ -562,6 +562,56 @@
}
],
"tabs": []
},
{
"type": "switch",
"top": 20,
"left": 690,
"lock": false,
"id": "piece",
"visible": true,
"interaction": true,
"comments": "",
"width": "auto",
"height": 300,
"expand": "false",
"colorText": "auto",
"colorWidget": "auto",
"colorStroke": "auto",
"colorFill": "auto",
"alphaStroke": "auto",
"alphaFillOff": "auto",
"alphaFillOn": "auto",
"lineWidth": "auto",
"borderRadius": "auto",
"padding": "auto",
"html": "",
"css": "",
"colorTextOn": "auto",
"layout": "vertical",
"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": ""
}
],
"tabs": []

@ -1,4 +1,5 @@
(
var createTransportPattern;
~bergerBusArray = 6.collect({Bus.audio(s, 1)});
@ -9,6 +10,7 @@ Event.addEventType(\osc, {
};
});
//create synth defs
~bergerCreateSynthsForLive = {arg b;
// this creates a different waveform for each sonification of each part
@ -20,9 +22,32 @@ Event.addEventType(\osc, {
}).add;
};
//sonify musical data
~bergerCreatePatternsForLive = {arg seqs, group, addr;
var pBinds, transportPattern;
~robinsonCreateSynthsForLive = {arg 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(\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;
};
~penroseCreateSynthsForLive = {arg 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(\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;
};
//create patterns
~bergerCreatePatternsForLive = {arg seqs, group;
var pBinds;
pBinds = seqs.collect({arg r, i;
Pbind(\instrument, \berger,
//\buf, Pseq((i - ((0..(r.slice(nil, 2).flat.size - 1)) / 10).trunc.asInteger) % 8),
@ -36,19 +61,51 @@ Event.addEventType(\osc, {
\amp, Pseq(r[2] / 1) //4)
)
});
};
transportPattern = Pbind(
\type, \osc,
\addr, addr,
\path, "/playing",
\msg, Pseq(seqs[0][6].collect({arg beats, measure; beats.asInteger.collect({arg beat; [measure + 1, beat + 1]})}).flatten, 1),
\dur, 1
);
~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,
\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))
)
});
};
Ppar(pBinds.add(transportPattern));
~penroseCreatePatternsForLive = {arg seqs, group;
var finSeqs, finFades;
finSeqs = seqs[0].collect({arg r, i;
Pbind(\instrument, \penrose_ins,
\group, group,
\buf, i,
//\freq, Pseq((24.midicps * r[1]).cpsmidi.round(0.5).midicps),
\freq, Pseq((24.midicps * r[1])),
\dur, Pseq(r[0] * 0.125),
\sustain, Pseq(r[0] * 0.125),
\amp, Pseq(((r[2] * 0.25) / pow(1.5, ((i % 6) + 1))))
)
});
finFades = seqs[2].collect({ arg r, i;
Pbind(\instrument, \penrose_fades,
\group, group,
\dur, Pseq(r * 0.125),
\subSeqLength, Pseq(r * 0.125),
\ins, i
)
});
finSeqs /*++ finFades*/;
};
SynthDef(\mixer, {arg freq, gate = 1, sustain, amp, dur, out;
var nameSpaces, sigs;
@ -69,15 +126,44 @@ SynthDef(\mixer, {arg freq, gate = 1, sustain, amp, dur, out;
(
var group, berger, mixer, measureDurs, player;
var createTransportData, createTransportPattern, group, berger, mixer, measureLengths, seqs, transportData, playbackData, player;
createTransportData = {arg measureLengths;
measureLengths.collect({arg beats, measure; beats.asInteger.collect({arg beat; [measure + 1, beat + 1]})}).flatten;
};
createTransportPattern = {arg addr, transportData;
Pbind(
\type, \osc,
\addr, addr,
\path, "/playing",
\msg, Pseq(transportData, 1),
\dur, 1
);
};
~bergerCreateSynthsForLive.value;
~robinsonCreateSynthsForLive.value;
~penroseCreateSynthsForLive.value;
group = Group.new;
berger = Synth.tail(group, \berger);
mixer = Synth.tail(group, \mixer);
measureDurs = ~bergerMusic[0][6];
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]);
OSCdef(\mixer, {arg msg, time, addr, port;
msg.postln;
@ -91,11 +177,12 @@ OSCdef(\transport, {arg msg, time, addr, port;
group.set(\gate, 0);
player.stop;
}, {
var patterns, stream, offset, offsetStream, terminationStream;
patterns = ~bergerCreatePatternsForLive.value(~bergerMusic, group, addr);
var pbinds, transportData, measureLengths, patterns, stream, offset, offsetStream, terminationStream;
# pbinds, transportData, measureLengths = playbackData[msg[2]];
patterns = Ppar(pbinds.add(createTransportPattern.value(addr, transportData)));
stream = patterns.asStream;
offset = stream.fastForward(measureDurs.keep(msg[2].asInteger.postln - 1).sum.postln).postln;
offset = stream.fastForward(measureLengths.keep(msg[3].asInteger - 1).sum);
offsetStream = Routine({offset.wait});
terminationStream = Routine({addr.sendMsg("/transport", 0)});
@ -107,6 +194,8 @@ OSCdef(\transport, {arg msg, time, addr, port;
)
~penroseMusic[1]
/*
~bergerCreateSynthsForLive.value;
~patterns = ~bergerCreatePatternsForLive.value(~bergerMusic);

@ -14,6 +14,9 @@ PathName.new(~dir).files.do({arg path; if((path.fileName != "main.scd") && (path
~bergerTranscribe.value(~bergerMusic);
~visualize.value(~berger.value(100, 100), 0, 0, scale: 1, name: "berger")
s.record(~dir +/+ ".." +/+ "recs" +/+ "berger_knuth.wav", duration: (30 * 60));
~bergerMusicFile = File((~dir +/+ "music_data" +/+ "berger.txt").standardizePath, "w");
~bergerMusicFile.write(~bergerMusic.asCompileString);
~bergerMusicFile.close
~robinsonTiling = ~robinson.value(8);
@ -24,6 +27,9 @@ s.record(~dir +/+ ".." +/+ "recs" +/+ "berger_knuth.wav", duration: (30 * 60));
~robinsonTranscribe.value(~robinsonMusic);
~visualize.value(~robinsonTiling, 0, 0, 200, 200, scale: 1, name: "robinson");
s.record(~dir +/+ ".." +/+ "recs" +/+ "robinson.wav", duration: (30 * 60));
~robinsonMusicFile = File((~dir +/+ "music_data" +/+ "robinson.txt").standardizePath, "w");
~robinsonMusicFile.write(~robinsonMusic.asCompileString);
~robinsonMusicFile.close
~penroseTiling = ~penrose.value(120, 5, ~seed);
@ -34,6 +40,9 @@ s.record(~dir +/+ ".." +/+ "recs" +/+ "robinson.wav", duration: (30 * 60));
~penroseTranscribe.value(~penroseMusic);
~visualize.value(~penroseTiling, 0, 0, name: "penrose");
s.record(~dir +/+ ".." +/+ "recs" +/+ "penrose.wav", duration: (30 * 60));
~penroseMusicFile = File((~dir +/+ "music_data" +/+ "penrose.txt").standardizePath, "w");
~penroseMusicFile.write(~penroseMusic.asCompileString);
~penroseMusicFile.close
~ammannTiling = ~ammann.value(645, 105);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save