Looping with auxjad.WindowLooper
¶
In this next example, we will use some of auxjad
’s classes to generate
a container of randomly selected material, and then use this material as input
for the looping and shuffling classes.
First, we start by importing both abjad
and auxjad
.
>>> import abjad
>>> import auxjad
Let’s start by deciding what random selectors will be responsible for
generating each parameter of our basic material. Let’s use
auxjad.TenneySelector
for pitches, which is an implementation of
Tenney’s Dissonant Counterpoint Algorithm; at each call, this algorithm
prioritises elements that haven’t been select for the longest time. For the
durations, dynamics, and articulations, the example will use
auxjad.CartographySelector
. Each element input into this type of
selector has a probability of being selected which is dependent on its index.
By default, the probability of consecutive elements decay with a rate of
0.75
. For more information on both of these classes, check auxjad
’s API
page (link in the left panel).
>>> pitch_selector = auxjad.TenneySelector(["c'",
... ("fs'", "g'"),
... "ef''",
... "a''",
... ("b", "bf''"),
... ])
>>> duration_selector = auxjad.CartographySelector([(2, 8),
... (3, 8),
... (5, 8),
... ])
>>> dynamic_selector = auxjad.CartographySelector(['p', 'mp', 'mf', 'f'])
>>> articulation_selector = auxjad.CartographySelector([None, '-', '>'])
Let’s now create eight random notes, each with four parameters randomly selected by the classes above.
>>> pitches = [pitch_selector() for _ in range(8)]
>>> durations = [duration_selector() for _ in range(8)]
>>> dynamics = [dynamic_selector() for _ in range(8)]
>>> articulations = [articulation_selector() for _ in range(8)]
With these list
’s’ of pitches, durations, dynamics, and articulations,
we can now use auxjad.LeafDynMaker
to create the individual abjad
leaves for us. It’s important to note that there is no time signature being
imposed at this point, so LilyPond will fallback to a four by four when
displaying the container below. This is not a problem since this will be used
as the basic material for the looper, which will then automatically take care
of time signatures.
>>> leaf_dyn_maker = auxjad.LeafDynMaker()
>>> notes = leaf_dyn_maker(pitches, durations, dynamics, articulations)
>>> container = abjad.Container(notes)
>>> abjad.show(container)
Let’s now use auxjad.WindowLooper
to output loops of windows of the
material. Let’s initiate this class with a window size of a 4/4 measure, and a
step forward of a semiquaver. Setting
after_rest
to the duration (1, 4)
will add
crotchet rests in between consecutive outputs of this looper. Setting
after_rest_in_new_measure
to True
ensure that
these rests (which work as separators of consecutive windows) are in a new
measure by themselves.
>>> looper = auxjad.WindowLooper(container,
... window_size=(4, 4),
... step_size=(1, 16),
... after_rest=(1, 4),
... after_rest_in_new_measure=True,
... )
We can now use the output_n()
to output several
measures of the looping process for us. In this case, let’s output four
measures.
>>> staff = abjad.Staff()
>>> notes = looper.output_n(4)
>>> staff.append(notes)
>>> abjad.show(staff)
Let’s now change the values of step_size
from a
semiquaver into a crotchet and output four more measures.
>>> looper.step_size = (1, 4)
>>> notes = looper.output_n(4)
>>> staff.append(notes)
>>> abjad.show(staff)
Let’s now change both window_size
and
step_size
as well as remove the after rests, and
then output six more measures.
>>> looper.window_size = (7, 8)
>>> looper.step_size = (1, 16)
>>> looper.after_rest = 0
>>> notes = looper.output_n(6)
>>> staff.append(notes)
>>> abjad.show(staff)
Let’s now add this staff to an abjad.Score
and call the method
add_final_bar_line()
which Auxjad adds to abjad.Score
.
>>> score = abjad.Score([staff])
>>> score.add_final_bar_line()
The final result is shown below.
>>> abjad.show(score)