File: ControlPatterns.sc

package info (click to toggle)
supercollider 1%3A3.4.5-1wheezy1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 26,972 kB
  • sloc: cpp: 116,645; lisp: 64,914; ansic: 10,725; python: 3,548; perl: 766; ruby: 487; sh: 152; makefile: 117; xml: 13
file content (43 lines) | stat: -rw-r--r-- 1,136 bytes parent folder | download
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

//human device interface pattern. pulls values from devices like gamepads etc.

Phid : Pattern {
	var <>element, <>locID, <>repeats;

	//element can be key or index
	*new { arg element, locID=0, repeats=inf;
		^super.newCopyArgs(element, locID, repeats)
	}
	storeArgs { ^[element,locID,repeats] }
	embedInStream { arg event;
		var all, device, spec, elements, deviceName, min, max;

		all = HIDDeviceService.devices;
		if(all.isNil, {
			HIDDeviceService.buildDeviceList;
			all = HIDDeviceService.devices;
		});
		device = all.at(locID);
		if(device.isNil, { "device not found".error; ^nil });
		if(element.isNumber.not, {
			element = HIDDeviceService.keyToIndex(element, locID);
			if(element.isNil, { "key not found".error; ^nil });
		});
		elements = device.elements;
		min = elements.at(element).min;
		max = elements.at(element).max;
		spec = ControlSpec.new(min, max, 'lin', 1);
		if((min === 0) and: {max === 1}, {
				repeats.value(event).do({
					event = device.value(element).yield
				});
				^event
		}, {
				repeats.value(event).do({
					event = spec.unmap(device.value(element)).yield
				});
				^event;
		})
	}
}