chop
+ Associated example files
NB: An exercise relating to the material covered in this tutorial can be found on the Exercises page.
The chop method is one of the features of
slippery chicken that most embodies its structural marrying of
computer-generated and instrumental resources. It is essentially a DSP
technique applied to conventionally notated musical material, dividing
rhythmic content (and its associated pitch-curves and marks) into
multiple fragments for further use, much as cutting and splicing of
audio is used to create loops and other discontinuities.
The chop method can be used as part of the technique
of intra-phrasal looping, a process by which the resulting
fragments are assembled into new sequences using
the fibonacci-transitions
function, as described in the tutorial
on intra-phrasal looping.
+ Three levels of chop
The chop method exists for three levels of rhythmic
classes, namely rthm-seq-bar,
rthm-seq, and rthm-seq-palette. Most
users will only need to use and understand the
rthm-seq-palette version of the method.
At the lowest level, the method chops a rthm-seq-bar
object into fragments, returning a list of
new rthm-seq-bar objects, each containing one
fragment. At the rthm-seq level, the method returns a
list of rthm-seq objects, each of which consists of one
of the rthm-seq-bar objects created.
At the rthm-seq-palette level, the chop
method returns a new rthm-seq-palette with the same
structure as the original, but with a further level of nesting:
Each rthm-seq of the original is replaced by a
(sub-) rthm-seq-palette consisting
of rthm-seq objects, each of which again consists of
only one of the rthm-seq-bar objects created by
fragmenting the original rthm-seq-palette.
More detail on the various levels of chop can be found
in the documentation of the source code for
rthm-seq-bar,
rthm-seq, and
rthm-seq-palette.
+ The chopping unit and chop points
The chop method fragments the source material on the
basis of a chopping unit and a collection of chop
points. The chopping unit must be a duplet rhythmic value
(e.g. 32, 's, 'e etc.) and an even subdivision of the beat basis for
the material being chopped (a quarter can be evenly subdivided into
two 8ths, four 16ths etc.). It cannot be a tuplet value (e.g. 'te,
'fe, 12 etc.).
The chop points define the start and end points of segments within one beat, each segment being a multiple of the chopping unit. Thus, with a chopping unit of a sixteenth, a beat basis of a quarter can be segmented into durations of four sixteenths, three sixteenths, two sixteenths and one sixteenth. A segment with the duration of four sixteenths spans the entire beat. Segments with the duration of three sixteenths can be found from the first to the third sixteenth of the beat, and again from the second to the fourth, both inclusive. Segments with a duration of two sixteenths can be found from the first to the second sixteenth, the second to the third, and the third to the fourth, all inclusive. The final subdivision, one sixteenth, can be found from the first to the first sixteenth, the second to the second, the third to the third, and the fourth to the fourth inclusive.
![]() |
The chop points in the image above can be specified as such:
(chop object-to-chop
'((1 4)
(1 3) (2 4) ; chop points
(1 2) (2 3) (3 4)
(1 1) (2 2) (3 3) (4 4))
's)) ; chopping unit
+ Chopping the original material
The method then applies this chopping pattern to each beat of the original material. For this reason, the method can only be applied to material whose time signatures have a denominator that is equal to the beat defined by the chop points. For example, if the chop points have been defined to segment a quarter note, that instance of the method can be applied to any x/4 bar, but not to an x/8 bar. An attempt to do so will produce an error.
As the method passes through the original material, it extracts the
musical data from each successive segment of the given beat and uses
that data to create a new rthm-seq containing one
rthm-seq-bar object. Each of these new bars have the
same duration as the segment and are assigned a time signature to
reflect this duration. Thus, any rthm-seq-bar objects
created from segments with a duration of three sixteenths will have a
3/16 time signature, those made from segments of two sixteenths will
have a 1/8 time signature etc.
The method only creates sounding notes in the
new rthm-seq-bar objects from attacked notes in
the original segment. If the original segment contains the sustained
portions of notes whose attacks occurred in a previous segment, those
sustained portions are translated into rests in the
new rthm-seq.
Thus, when the above chop parameters are applied to this
original:
![]() |
…the following ten fragments are created as
individual rthm-seq-bar objects:
![]() |
The method assigns the newly created rthm-seq objects
sequential numerical IDs so that they can be easily accessed and
manipulated later, as described below.
+ Referencing rthm-seqs in a chopped rthm-seq-palette
The additional level of nesting created by chop when
applied to a rthm-seq-palette makes an additional ID
necessary in order to reference each rthm-seq object it
contains. The method creates consecutive numerical IDs automatically
for each of the new nested rthm-seq objects it
generates. The new rthm-seq objects can then be accessed
using a combination of the ID of the original rthm-seq
object from which the fragment objects were created and the new
object's own individual ID.
As an example, the first rthm-seq object created from
the first fragment of an original rthm-seq object with
the ID 1 is accessed using (1 1), the
second using (1 2), the third using (1 3),
etc. Correspondingly, the first rthm-seq object created
from the first fragment of an original rthm-seq object
with the ID 2 is accessed using (2 1), and
the reference (3 2) would get the
second rthm-seq object created from the second fragment
of an original rthm-seq object with the
ID 3, etc. It is important to note here that while the
IDs of the newly created objects are automatically given consecutive
numbers, the first ID of these pairs is the ID the user has assigned
to the original rthm-seq objects and therefore does not
necessarily need to be a number.
This code example uses the nested references described above:
(let* ((orig-palette (make-rsp 'orig
'((1 ((((1 4) - s e s - ))
:pitch-seq-palette ((1 2 3))))
(2 ((((1 4) - e. s - ))
:pitch-seq-palette ((1 2))))
(3 ((((1 4) - (e.) s - ))
:pitch-seq-palette ((1)))))))
(chopped-palette (chop orig-palette
'((1 4)
(1 3) (2 4)
(1 2) (2 3) (3 4)
(1 1) (2 2) (3 3) (4 4)) ; chop points
's)) ; chopping unit
(sc-chopped-example
(make-slippery-chicken
'+sc-chopped-example+
:title "sc chopped example"
:instrument-palette +slippery-chicken-standard-instrument-palette+
:ensemble '(((vn (violin :midi-channel 1))))
:tempo-map '((1 (q 60)))
:bars-per-system-map '((1 10))
:set-palette '((1 ((c4 d4 e4))))
:set-map '((1 (1 1 1 1 1)))
:rthm-seq-palette chopped-palette
:rthm-seq-map '((1 ((vn ((1 1) (1 2) (1 3) (2 1) (3 2)))))))))
(cmn-display sc-chopped-example :file "/tmp/sc-chopped-example.eps"))
…and produces the following output:
![]() |
+ re-bar
Since the results of the chop method are generally very
short bars with multiple, divergent time signatures, the use of
the slippery-chicken class's
re-bar
method can be very helpful. This method regroups the fragmented
musical material into new bars that are close as possible to a
specified length. An example of the usage of this method can be found
in the tutorial
on intra-phrasal
looping.
For an example of the chop method used within a piece,
see the tutorial
on intra-phrasal
looping.



