File: Rest.schelp

package info (click to toggle)
supercollider 1%3A3.13.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,292 kB
  • sloc: cpp: 476,363; lisp: 84,680; ansic: 77,685; sh: 25,509; python: 7,909; makefile: 3,440; perl: 1,964; javascript: 974; xml: 826; java: 677; yacc: 314; lex: 175; objc: 152; ruby: 136
file content (152 lines) | stat: -rw-r--r-- 4,446 bytes parent folder | download | duplicates (2)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
CLASS:: Rest
summary:: Represents a rest in event patterns
categories:: Streams-Patterns-Events
related:: Classes/Pbind, Classes/Event, Classes/AbstractFunction

DESCRIPTION::
A Rest may be used in event patterns to indicate that the resulting event should be a rest (i.e., silent). It should be used in one of the child patterns belonging to a Pbind, for instance.

code::
// do nothing for 2 seconds
(note:Rest(), dur:2).play;

// intersperse pauses in pattern
Pbind(\note, Pseq([0, 4, 7, 11], inf), \dur, Pseq([2, 1, Rest(1)], inf) / 5).play;
::

subsection:: Expressing rests in event patterns

The Rest class allows rests to be indicated in any stream, not only frequency or event type. Also, using the duration argument (see the link::#*new:: method below), rests may be embedded into a duration stream. That is, rests may be treated as part of the rhythmic specification, rather than the pitch specification.


note::
As of SuperCollider 3.9, code::Rest::'s behavior has changed to be more intuitive. Note that you have to now use code::Rest():: - the shortcut of code::Rest:: as class directly is strong::not supported:: anymore.
::


subsection:: Usage

list::
## link::Classes/Event#-isRest:: checks every item in the event to see if it meets the condition to be a rest: it may be a code::Rest:: instance, the code::Rest:: class, or either of the symbols code:: \ :: or code::\r::. If any item meets the condition, the event will be considered a rest and it will not take action when played.

## If a Pbind child pattern yields a Rest object, the Rest is placed directly into the event. This is a change of behavior from 3.8.

## If a Rest object has a value, it will respond to math operations: code::Rest(1) * 2 == Rest(2)::.
::


CLASSMETHODS::
All methods of Rest except *new are private, and should not be used directly.

private:: processRest
private:: embedInStream
private:: asStream

METHOD:: new
Create an instance of Rest, with a value to be used in the resulting rest event.

argument:: value
The Rest instance's numeric value, to be used in math operations. Note that a Rest's value is ignored for most Event keys (assuming the Event does nothing in response to code::.play::). If a Rest appears in a rhythm key (code::dur:: or code::delta::), then the number is the time until the next event. Consequently, numeric Rests are often used for duration -- but there is no requirement that a Rest's value must be a duration.

discussion::
code::
a = Rest(6);
b = a * 2; // returns Rest(12)
b = 2 * a; // the same
b.value; // returns 12
::

The rest of a rest is always a rest. This idempotence is implemented by Rest's superclass link::Classes/Operand::.
code::
Rest(Rest(1)) // returns Rest(1)
::


INSTANCEMETHODS::
private:: dur
private:: embedInStream
private:: asStream
private:: asControlInput
private:: playAndDelta

METHOD:: isRest
returns true

METHOD::unwrapBoolean
returns the value.
discussion::
This method implements the following behavior.
code::
Rest(6) + 1 // Rest(7)
Rest(true) // true
::
This makes comparisons work:
code::
Rest(6) < 7 // true, and not Rest(true)
a = Pseq([1, 2, 1, 3, Rest(1), 2, Rest(3)], inf); // e.g. as a duration pattern
b = a.collect { |x| if(x > 2) { x / 2 } { x } };
b.asStream.nextN(8)
::

EXAMPLES::


Using Rest instances in a pitch stream

code::
(
Pbind(
	\degree, Pif(
		0.1.loop.coin,
		Pseq([Rest(), 7], inf), // every second is a Rest
		Pseries(0, 1, inf).fold(-7, 7)
	),
	\dur, 0.125
).play
)
::

Using a Rest instance in a duration stream
code::
(
Pbind(
	\degree, Pseries(0, 1, inf).fold(-7, 7),
	\dur, Pseq([Pn(0.125, { rrand(3, 6) }), Rest(0.25)], inf)
).play
)
::


subsection:: Alternatives to Rest

In addition to Rest, in events, rests can be specified in two other ways (legacy usages).

list::
## A link::Classes/Symbol:: may be specified in any frequency stream (under the keys degree, note, midinote or freq). The exception to this rule is control bus mapping symbols, beginning with 'c' followed by a number. Typical symbols that have been used include strong::\rest::, strong::\r:: and the empty symbol strong:: \ ::.

code::
(
p = Pbind(
	\degree, Pseq([
		0, 1, 2, 0, 0, 1, 2, 0,
		2, 3, 4, \rest, 2, 3, 4, \rest
	]),
	\dur, 0.25
).play;
)
::

## The event's strong::\type:: may be set to strong::\rest::.

code::
(
p = Pbind(
	\degree, Pseries(0, 1, inf).fold(-7, 7),
	\dur, 0.125,
	\type, Pwrand([\note, \rest], [0.9, 0.1], inf)
).play;
)

p.stop;
::
::