Random repetitions¶
In this example, we will use some of auxjad
’s classes to generate random
repeated measures.
First, we start by importing both abjad
and auxjad
.
>>> import abjad
>>> import auxjad
First, let’s create a container with an arbitrary rhythm. The pitches do not matter at this point since we will randomise them shortly.
>>> container = abjad.Container(
... r"c'4-- c'8.-- c'16( c'8)-. c'8-. c'8-. r8"
... )
>>> abjad.show(container)
Next, let’s initialise auxjad.PitchRandomiser
with this container as
well as a list
representing pitches. This will be the source for the
random pitches selected by this randomiser.
>>> pitch_list = ["c'", "cs'", "d'", "ef'", "e'"]
>>> randomiser = auxjad.PitchRandomiser(container,
... pitches=pitch_list,
... )
Let’s now output a first group of two measures with random pitches using the
method auxjad.PitchRandomiser.output_n()
.
>>> notes = randomiser.output_n(2)
>>> group_1 = abjad.Staff(notes)
>>> abjad.show(group_1)
Let’s now change the pitch list
using the property
pitches
of the randomiser and create another
group of measures.
>>> randomiser.pitches = ["a", "b", "bf'", "a''", "b''"]
>>> notes = randomiser.output_n(2)
>>> group_2 = abjad.Staff(notes)
>>> abjad.show(group_2)
Up to now, the pitches were being selected with equal weight (i.e. an uniform
distribution). Changing the weights
property to
a list
of int
’s or float
’s allow us to give more weight to
certain pitches. It’s important that this list
has the same length as
the number of pitches in pitches
.
>>> randomiser.weights = [6, 3, 2, 1, 1]
At this point, let’s also change the input container for the randomiser:
>>> container = abjad.Container(
... r"\time 3/4 c'4--( ~ "
... r"\times 4/5 {c'16 c'16-. c'16-. c'16-. c'16-.)} "
... r"r8 c'8->"
... )
>>> abjad.show(container)
Now, with the new contents of the randomiser, let’s output two more measures as the third and final group of measures.
>>> randomiser.contents = container
>>> notes = randomiser.output_n(2)
>>> group_3 = abjad.Staff(notes)
>>> abjad.show(group_3)
We can now use auxjad.Repeater
to create a staff made out of multiple
repetitions of these three groups. When the repeater type is set to to
'volta'
using the attribute repeat_type
, it will
output measures with repetition bar lines and with a written indication for the
number of repeats. Let’s start with the first group and repeat it 3x.
>>> staff = abjad.Staff()
>>> repeater = auxjad.Repeater(group_1,
... repeat_type='volta',
... )
>>> notes = repeater(3)
>>> staff.append(notes)
>>> abjad.show(staff)
Let’s now do the same with the second group, repeating it 5x and appending it to our staff.
>>> repeater.contents = group_2
>>> notes = repeater(5)
>>> staff.append(notes)
>>> abjad.show(staff)
Finally, let’s do the same with the third group and repeat it 4x. This will be our final score.
>>> repeater.contents = group_3
>>> notes = repeater(4)
>>> staff.append(notes)
>>> abjad.show(staff)