Creating Rhythms
Software
Below are the C programs that accompany the book, Creating Rhythms. You can download each as you need it, or all of them bundled into a zip file.
Thanks to Gene Boggs, there is also a perl version of this software.
This software is free and distributed under the terms of the GNU General Public License. It is written in ANSI C and should compile with any C compiler. If you have questions or comments contact: Stefan (stefan at exstrom dot com) or Richard (richard at exstrom dot com).
- comp.c
Generates all compositions of n.
Usage: comp n
- compm.c
Generates all compositions of n into m parts.
Usage: compm n m
- compa.c
Generates all compositions of n with parts in
the set (p1 p2 ... pk).
Usage: compa n p1 p2 ... pk
- compam.c
Generates all compositions of n with m parts
in the set (p1 p2 ... pk).
Usage: compam n m p1 p2 ... pk
- comprnd.c
Generates a random composition of n.
Usage: comprnd n
- compmrnd.c
Generates a random composition of n into m
parts.
Usage: compmrnd n m
- neck.c
Generates all binary necklaces of length n.
Usage: neck n
- neckm.c
Generates all binary necklaces of length n
with m ones.
Usage: neckm n m
- necka.c
Generates all binary necklaces of length n
with parts in (p1 p2 ... pk). A part is the
length of a substring 10...0 composing the
necklace. For example the necklace 10100 has
parts of size 2 and 3.
Usage: necka n p1 p2 ... pk
- neckam.c
Generates all binary necklaces of length n
with m ones and parts in (p1 p2 ... pk). For
a definition of parts see necka description.
Usage: neckam n m p1 p2 ... pk
- part.c
Generates all partitions of n.
Usage: part n
- partm.c
Generates all partitions of n into m parts.
Usage: partm n m
- parta.c
Generates all partitions of n with parts in
the set (p1 p2 ... pk).
Usage: parta n p1 p2 ... pk
- partam.c
Generates all partitions of n with m parts in
the set (p1 p2 ... pk).
Usage: partam n p1 p2 ... pk
- permi.c
Generates all permutations of the non-negative
integers in the set (a1 a2 ... an). To
generate all permutations the integers must
be ordered: a1 < a2 < ... < an. Any other
order will only generate permutations larger
in lexicographic order.
Usage: permi a1 a2 ... an
- debruijn.c
Generates the largest de Bruijn sequence of
order n.
Usage: debruijn n
- b2int.c
Reads binary strings from stdin and converts
them to interval notation.
Usage: b2int Example: echo "1010010001001000" | b2int -> 2 3 4 3 4
- int2b.c
Reads intervals from stdin and converts them
to binary string notation.
Usage: int2b Example: echo "2 3 4 3 4" | int2b -> 1010010001001000
- chsequl.c
Generates the upper or lower Christoffel word
for p/q.
Usage: chsequl t p q n t = type of word u = upper l = lower p = numerator q = denominator n = number of terms to generate, default=p+q
- cfsqrt.c
Calculates the continued fraction for the
square root of an integer.
Usage: cfsqrt n n = integer
- cfcv.c
Calculates a continued fraction convergent.
Usage: cfcv a0 a1 a2 ... an ai = simple continued fraction term
- pfold.c
Generates fold sequences.
Usage: pfold n m f n = number of terms, 1,3,7,15,31,63,127,... m = number of bits f = function number 0 -> 2^m-1
- rndint.c
Generates random numbers with specified
correlation.
Usage: rndint m s c n m = range of numbers, 0 to m s = starting number, 0 to m c = degree of correlation 0 = total correlation (all numbers = s) m = no correlation (each number is independent) n = how many random numbers to generate
- markovgen.c
Generates random numbers using a Markov chain.
Usage: markovgen mfile s n mfile = transition matrix file name s = starting state n = how many random numbers to generate
Converting Binary Rhythms to MIDI
Here is a quick way to make a midi file, given rhythms in binary notation.
Let's say you want to hear the following two instrument binary rhythm set:
1111010110010000 Low Bongo 1000011110101100 High Bongo
Our procedure is to first convert the binary rhythm set to abc notation, then convert the resulting abc file to MIDI. To go from the binary rhythm set to abc notation we use our program bdrum.c which reads a binary rhythm definition file and sends the equivalent abc notation to standard output. In our example above, the input binary rhythm definition file would look like the following:
480 16 2 61 1111010110010000 60 1000011110101100
where 480 is the tempo (notes/minute), 16 is the number of notes per rhythm, 2 is the number of rhythms, 61 is the MIDI percussion instrument number for low bongo, and 60 is high bongo. So if our binary rhythm definition file is called b1.bdf then we run bdrum as follows:
./bdrum b1.bdf 4
where the number 4 specifies that the rhythm set is repeated 4 times. The result is an abc notation file that can be converted to MIDI with the program abc2midi (part of the abcMIDI package). The resulting MIDI file can be played by a program like TiMidity. You can listen to the above example here. All this can be done in one command line as follows:
./bdrum b1.bdf 4 > b1.abc;abc2midi b1.abc -o b1.mid;timidity -in b1.mid
Note the above command line works in the bash shell. In Linux and Mac OS X it should work with no problem (bash is the default shell in most Linux distros and OS X). On windows, you can get the bash shell by installing MinGW or Cygwin.
Send comments to: Richard Hollos (richard[AT]exstrom DOT com)
Copyright 2023 by Exstrom Laboratories LLC