-
Notifications
You must be signed in to change notification settings - Fork 18
/
Engine_Dronecaster.sc
executable file
·128 lines (103 loc) · 2.7 KB
/
Engine_Dronecaster.sc
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
// "kernel" class, norns-agnostic
Dronecaster {
var <drones;
var <socket; // a Dronecaster_SynthSocket
var inJacks, recordBus, <recorder;
var amp=0.4, hz=55;
*new { arg server, baseDronePath;
^super.new.init(server, baseDronePath)
}
init { arg server, baseDronePath;
socket = DroneCaster_SynthSocket.new(server, 0, [\hz, \amp]);
if (baseDronePath == nil, {
baseDronePath = PathName(Document.current.path).pathOnly ++ "engine/drones";
});
postln("compiling drones in " ++ baseDronePath ++ "...");
drones = Dictionary.new;
PathName.new(baseDronePath).entries.do({|e|
var name = e.fileNameWithoutExtension;
var def = socket.wrapDef(e.fullPath.load, name, server);
if (def.notNil, { drones[name] = def; });
});
drones.postln;
recordBus = Bus.audio(server, 2);
inJacks = { Out.ar(recordBus, SoundIn.ar([0, 1])) }.play;
recorder = Recorder.new(server);
}
start { arg name;
postln("start requested for name: " ++ name);
if (drones.keys.includes(name), {
socket.setSource(drones[name]);
}, {
postln("dronecaster does not know this drone: " ++ name);
});
}
setAmp { arg value;
amp = value;
socket.setControl(\amp, amp);
}
setHz { arg value;
hz = value;
socket.setControl(\hz, hz);
}
stop {
socket.stop;
}
record { arg path;
recorder.record(path.asString, recordBus, 2);
}
free {
inJacks.free;
recorder.free;
socket.free;
}
}
// norns glue
Engine_Dronecaster : CroneEngine {
classvar luaOscPort = 10111;
classvar <>dronePath = "/home/we/dust/code/dronecaster/engine/drones" ;
var <caster; // a Dronecaster
*new { arg context, doneCallback;
^super.new(context, doneCallback);
}
alloc {
var luaOscAddr = NetAddr("localhost", luaOscPort);
this.addCommand("initialize", "ff", { arg msg;
if (caster==nil,{
// :/
caster = Dronecaster.new(context.server, dronePath);
// caster.drones.keys.do({ arg name;
// ("sending name: " ++ name).postln;
// luaOscAddr.sendMsg("/add_drone", name);
// });
caster.setHz(msg[1].asFloat);
caster.setAmp(msg[2].asFloat);
luaOscAddr.sendMsg("/drones_loaded",1);
});
});
this.addCommand("hz", "f", { arg msg;
caster.setHz(msg[1].asFloat);
});
this.addCommand("amp", "f", { arg msg;
caster.setAmp(msg[1].asFloat);
});
this.addCommand("fade", "f", { arg msg;
caster.socket.setFadeTime(msg[1].asFloat);
});
this.addCommand("stop", "i", { arg msg;
caster.stop(msg[1]);
});
this.addCommand("start", "s", { arg msg;
caster.start(msg[1].asString);
});
this.addCommand("record_start", "s", { arg msg;
caster.record(msg[1]);
});
this.addCommand("record_stop", "i", { arg msg;
caster.recorder.stopRecording;
});
}
free {
caster.free;
}
}