On Friday, I listed nine ways in which python methodologies could be used with the @ scheduler. How would they work in a real-world musical context? Today, I’m showcasing the List as a super convenient micro-sequencer.
When the @ scheduler is given a list of numbers, every value in the list is used to schedule an event; This saves keystrokes and increases legibility. Let’s see this applied to a simple four-beat rock groove with 8th note hats:
@[0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5] hat()
@[1, 3] snare()
@[0, 2] kick()
That plays hat() eight times, and snare() and kick() twice each. This beats having to type out 12 events.
Alternatively, an identifier can point to a predefined list, thus, a sequence can be reused multiple times. The following stores a complex hi-hat pattern in identifier p, and then plays it four times:
p = [0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75]
@0 @p hat()
@4 @p hat()
@8 @p hat()
@12 @p hat()
Here’s the shorthand equivalent:
p = [0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75]
@[0, 4, 8, 12] @p hat()
That’s 40 events in two lines of code, with improved legibility. If this was presented as 40 individual events, it would not be obvious that the same hat pattern is repeated four times.
Banks of Patterns
A list can be utilized as a bank of patterns, a list of lists. In the following example, an empty bank is created, filled with three patterns, and then used in a four measure sequence.
b = []
b.append([0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5]) # x.x. x.x. x.x. x.x.
b.append([0, 0.5, 1, 1.5, 2, 2.25, 2.5, 2.75, 3, 3.75]) # x.x. x.x. xxxx x..x
b.append([0, 0.5, 1, 1.5, 2, 2.5, 2.75, 3, 3.5, 3.75]) # x.x. x.x. x.xx x.xx
@0 @b[0] hat()
@4 @b[1] hat()
@8 @b[0] hat()
@12 @b[2] hat()
Bonus Round — Eight Ways to Notate 8th Note Hats
Some good, some bad, some ugly. All produce the same result.
1. @map(lambda x: x / 2.0, range(0, 8)) hat()
2. @[0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5] hat()
3. @[i / 2.0 for i in range(0, 8)] hat()
4. @[i / 2.0 for i in range(8)] hat()
5. @[0, 2] @[0, 1] @[0, 0.5] hat()
6. @[0, 1, 2, 3] @[0, 0.5] hat()
7. @range(0, 4) @[0, 0.5] hat()
8. @range(4) @[0, 0.5] hat()
Examples 2, 6 and 8 are my personal favorites.