-
Notifications
You must be signed in to change notification settings - Fork 0
/
PuredataMiddleware.pde
133 lines (100 loc) · 3.8 KB
/
PuredataMiddleware.pde
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
public class PureDataMiddleware {
PApplet parent;
PureData pd;
String patchfilename = "";
float lowestFrequency;
int nOctaves;
int intervalsInOctave;
float intervalRatio;
public PureDataMiddleware (PApplet parent, float lowestFrequency, int nOctaves, int intervalsInOctave) {
this.parent = parent;
this.lowestFrequency = lowestFrequency;
this.nOctaves = nOctaves;
this.intervalsInOctave = intervalsInOctave;
this.intervalRatio = (float) nthroot(intervalsInOctave, 2);
}
public PureDataMiddleware (PApplet parent, Config config) {
this(parent, config.lowestFrequency(), config.octaves(), config.intervalsInOctave());
}
public PureDataMiddleware patchfilename(String patchfilename) {
this.patchfilename = patchfilename;
return this;
}
private String generatePatchfilename() {
return "modulant-"+nOctaves+"x"+intervalsInOctave+".pd";
}
public PureDataMiddleware start() {
if ("".equals(patchfilename))
patchfilename = generatePatchfilename();
generatePatch();
startPureData();
return this;
}
PureDataMiddleware startPureData() {
//initialize pd with audio rate of 44100, no inputs, and two
//outputs, load the patch and start the object
pd = new PureData(parent, 44100, 0, 2);
pd.openPatch(patchfilename);
pd.start();
return this;
}
PureDataMiddleware generatePatch() {
if (createAndAssertDir("data")) {
generatePatchfile("data/"+patchfilename, lowestFrequency, nOctaves*intervalsInOctave, intervalRatio);
}
else {
System.out.println("Couldn't create data directory");
exit();
}
return this;
}
void generatePatchfile(String patchfileName, float freq0, int nUnits, float intervalRatio) {
float amplitudeScaleDown = 1.0 / nUnits;
PrintWriter patch = createWriter(patchfileName);
patch.println("#N canvas 1000 70 762 624 10;");
patch.println("#X obj 78 116 dac~;"); // 0
float freq = freq0;
for (int unit = 0; unit < nUnits; unit++) {
freq = freq * intervalRatio;
patch.println("#X obj 121 -86 r unit" + unit + ";"); // 1
patch.println("#X obj 23 -27 osc~ " + freq + ";"); // 2
patch.println("#X obj 78 63 *~;"); // 3
patch.println("#X obj 100 100 sig~;"); // 4
patch.println("#X obj 200 200 lop~ 3;"); // 5
patch.println("#X obj 300 300 *~ " + amplitudeScaleDown + ";"); // 6
}
int elem = 0;
for (int unit=0; unit < nUnits; unit++) {
elem = unit*6; //patch.println("elem: " + elem);
patch.println("#X connect " + (elem+1) + " 0 " + (elem+4) + " 0;");
patch.println("#X connect " + (elem+4) + " 0 " + (elem+5) + " 0;");
patch.println("#X connect " + (elem+5) + " 0 " + (elem+3) + " 1;");
// TODO: this connection was made by accident - but it doesn't seem to effect
// things negatively either. keeping it to investigate later.
// patch.println("#X connect " + (elem+1) + " 0 " + (elem+3) + " 1;");
patch.println("#X connect " + (elem+2) + " 0 " + (elem+3) + " 0;");
patch.println("#X connect " + (elem+3) + " 0 " + (elem+6) + " 0;");
patch.println("#X connect " + (elem+6) + " 0 " + " 0 " + " 0;");
patch.println("#X connect " + (elem+6) + " 0 " + " 0 " + " 1;");
}
patch.flush();
patch.close();
}
public void sendFloat(String receiver, float message) {
pd.sendFloat(receiver, message);
}
public void send(int unitNo, float message) {
pd.sendFloat("unit"+unitNo, message);
}
public void send(float[] message) {
for (int unitNo = 0; unitNo<message.length; unitNo++){
pd.sendFloat("unit"+unitNo, message[unitNo]);
}
}
public void silenceAll() {
int nAllUnits = nOctaves*intervalsInOctave;
for (int unit=0; unit<nAllUnits; unit++) {
send(unit, 0.0);
}
}
}