File: Pxfade.sc

package info (click to toggle)
supercollider 1%3A3.11.2%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 71,152 kB
  • sloc: cpp: 387,846; lisp: 80,328; ansic: 76,515; sh: 22,779; python: 7,932; makefile: 2,333; perl: 1,123; javascript: 915; java: 677; xml: 582; yacc: 314; lex: 175; objc: 152; ruby: 136
file content (82 lines) | stat: -rw-r--r-- 1,862 bytes parent folder | download | duplicates (6)
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
PfadeIn : FilterPattern {
	var <>fadeTime, <>holdTime=0, <>tolerance;

	*new { arg pattern, fadeTime=1.0, holdTime=0.0, tolerance=0.0001;
		^super.new(pattern).fadeTime_(fadeTime).holdTime_(holdTime).tolerance_(tolerance)
	}

	embedInStream { arg inval;
		var outval, elapsed=0, stream, c;

		stream = pattern.asStream;

		if(holdTime > 0.0) { Event.silent(holdTime, inval).yield };
		loop {
			outval = stream.next(inval);
			if(outval.isNil) { ^nil.yield };

			elapsed = elapsed + outval.delta;
			c = elapsed / fadeTime;
			if(c >= 1.0) {
				inval = outval.yield;
				^stream.embedInStream(inval);
			} {
				outval = outval.copy;
				outval[\amp] = c.max(0) * outval[\amp];
				//	outval[\amp] = (c.max(0) * pi * 0.25).sin * outval[\amp];

				inval = outval.yield;
			}
		}
	}

	storeArgs { ^[ pattern, fadeTime, holdTime, tolerance ] }
}

PfadeOut : PfadeIn {

	embedInStream { arg inval;
		var outval, elapsed=0, cleanup, stream, c;
		stream = pattern.asStream;
		cleanup = EventStreamCleanup.new;
		loop {
			inval = stream.next(inval) ?? { ^cleanup.exit(inval) };
			cleanup.update(inval);

			elapsed = elapsed + inval.delta;
			if(elapsed.round(tolerance) <= holdTime) {
				inval = inval.yield;
			} {
				c = elapsed - holdTime / fadeTime;
				if(c >= 1.0) {
					^cleanup.exit(inval);
				} {
					inval[\amp] = (1.0 - c.max(0)) * inval[\amp];

					inval = inval.yield;
				}
			}
		}
	}
}

PfinQuant : FilterPattern {
	var <>quant, <>clock;

	*new { arg pattern, quant, clock;
		^super.new(pattern).quant_(quant).clock_(clock)
	}

	embedInStream { arg inval;
		var value, stream = pattern.asStream;
		var referenceClock = clock ? thisThread.clock;
		var endAt = quant.nextTimeOnGrid(referenceClock);
		while {
			value = stream.next(inval);
			value.notNil and: { referenceClock.beats < endAt }
		} {
			inval = value.yield;
		};
		^inval
	}
}