Horizontal rhythm notation in Csound

By Ludo Smissaert

Seeking for a different way of using the text based Csound score, I wanted to create an orchestra that allows you to type the rhythm of the piece in independently wrapping ftables, in stead of using one i-statement for every note. The duration of notes and also of overlapping notes can be specified completely independently from the table holding the onsets of the notes.

Based on Hans Mikelsons drummach I started with a simple instrument that uses its ftables for storing notes instead of in the vertical oriented Csound score:

reinit.csd or listen: (mp3)

Finally I came to a logic short horizontal notation "language".

In stead of writing start times and durations in the vertical oriented Csound score, you can write successive note durations in one ftable (say f100). When a note overlaps another note the duration of the overlapping note (the first note) will be in a second ftable (say f200), but the first ftable still holds the time between the start of the overlapping note (first note) and the start of the next note. For both tables are independent you can elaborate first your rhythm and elaborate independently "the rhythm of the overlaps", like accents with percussion. This is different from p2/p3 notation in csound score. Both the tables should not necessarily be filled up until the next power of two. They wrap automatically as soon as they detect the wrap sign, which is just an unusual value.

In the first durations table a rest can be written as a duration with a minus. -100 is the wrap sign.

Example 1:

first example

This can be translated as:

f100 0 64 2     1 1 2 -2    -100

Example 2:

2nd example

This can be written as:

f100 0 64 2    1  1  2  -2   -100 
f200 0 64 2    0  5  0       -200

Now the second note has a total duration of a whole note, plus a half note and a half rest (to stop at the end of the rest). But the rhythm has not changed: the notes start still at the same time.

Note the difference in meaning of the two tables:
In f100: a 2 == 1/2, in f200: 5 == 1 + 2 + |-2|

Also note the zero's in f200. They are there for making the two tables equal in length. A rest (-2 in this case) don't need a zero to line up.

Example 3:

3rd example

Can be written as:

f100 0 64 2    1  1  2  -2         -100
f200 0 64 2    0  5  0      0 3 0  -200

Example 4:

4rd example

Can simply be written like this:

f100 0 64 2   1  1  2  -2   -100
f200 0 64 2   6  3          -200

All the notes will overlap, but first with the duration of two whole notes and two halves, then with the duration of whole note and a half. Then it wraps. This is because there are no zero's in f200.

The table need not be filled at equal length. This is interesting because you can make many patterns in this way, if you fill tables at unequal length.

After you got the rhythm right you can start filling your pitch table:

f300 0 64 2 400 709 -300

This will repeat cpspch(4.00), cpspch(7.09) constantly over the notes given in the rhythm table. You can also give more pitches then you have notes in the rhythm table. In that case the first note of your rhythm table will start with a different value at the first wrap.

Example 5:

5th example

Can be translated like this:

f100 0 64 2  1    0    0    0    -100
f300 0 64 2  800  807  900  907  -300

Example 6:

6th example

Can be translated like:

f100 0 64 2  1    0    0    0    -100
f200 0 64 2  0    4    2    3    -200
f300 0 64 2  800  807  900  907  -300

Now only the first note of the chord does not overlap, all other notes overlap, all with different values.

Below is the instrument. In the score I have written the first 30 bars of Piano Sonata Opus 7 "Der Graefin Babette von Keglevics gewidmet" from Beethoven, using the system described above.

opus7.orc
opus7.sco

Note: this only works on WinCsound and Canonical Csound for Macintosh

Conclusion

I am quite satisfied with this style of notation and I am planning of transferring these ideas to a separate C program.