This example illustrates how the module MotifSequenceGenerator
works using
a simple struct
. For a more realistic, and much more complex example, see the
example using music notes.
Let's say that we want to create a random sequence of "shouts", which
are described by the struct
struct Shout
shout::String
start::Int
end
Let's now create a vector of shouts that will be used as the pool of possible motifs that will create the random sequence:
using Random
shouts = [Shout(uppercase(randstring(rand(3:5))), rand(1:100)) for k in 1:5]
Notice that at the moment the values of the .start
field of Shout
are irrelevant. MotifSequenceGenerator
will translate all motifs to start point 0 while operating.
Now, to create a random sequence, we need to define two concepts:
shoutlimits(s::Shout) = (s.start, s.start + length(s.shout) + 1);
shouttranslate(s::Shout, n) = Shout(s.shout, s.start + n);
This means that we accept that the temporal length of a Shout
is length(s.shout) + 1
(so that the dude that shouts can rest a bit...).
We can now create random sequences of shouts that have total length of
exactly q
:
using MotifSequenceGenerator
q = 30
random_sequence(shouts, q, shoutlimits, shouttranslate)
random_sequence(shouts, q, shoutlimits, shouttranslate)
Notice that it is impossible to create a sequence of length e.g. 7
with the above pool
random_sequence(shouts, 7, shoutlimits, shouttranslate)