Music 220A - Fall '04

Greg's Final Project







I decided to return to assignment 1 and bird programming with my final project. In creating the first assignment, I'd spent a good deal of time trying to match the rhythym of the actual bird call. At one point, I'd considered writing my honor's thesis on simulating the acquisition of song in the bengalese finch, whose song is known for being radically more complex than the songs of other birds. It is a patterned, though never repeating, song—fragments of which can even be culturally transmitted to other conspecifics. Scientists who have studied the species have decided the birdsong is most aptly categorized as a grammatical system that needs to be learned.

While I did not have enough time to simulate a bird's acquisition of song for the final project, I decided that I could crudely model the syntax of the bird song using cellular automata. These (pictured below) are block-by-block update rules that are able to evolve great complexity from simple seeds.






This is known as the rule 30 cellular automaton. The rules are listed on the left, and the evolution starting from one black cell at the top is shown on the right. The rules say, if a cell is black and has two black neighbors, then on the next iteration (graphically represented below it), the cell occupying the same space will be white. If the cell is black and its right-hand neighbor is white while its left-hand neighbor is black, then on the next update it is white. And so on.

In service of modeling the syntax of the bird song, I iterated to a specifiable depth given initial conditions and a set rule. The final row produced became my control sequence. It determined whether or not the bird would sing or not. Time stepping through the row, if the cell were black, the bird would sing, and if the cell were white, it would remain silent. To spice up what were otherwise somewhat monotonous songs, I randomized the type of tweet every time the bird sang.

One of the exploratory-minded elements of the project was to find out what complexity of the automaton was sufficient to give a realistic bird call. Stephen Wolfram, who studied these rules, classified the possible automata four ways. Class I consisted of simple repetitions. For example, the automaton that always updates a cell to black is an example. Class II consisted of fractal-like or nested structures. Rule 90 is an example of this:





Class III (rule 30 is an example) looks unpredictable. That is, it does not conform to a simply perceptible structure. One ramification of this is that the middle column of rule 30 is sometimes used as a pseudo-random number generator.

Class IV (rule 110 below) has islands of unpredictability surrounded by eddies (to extend the metaphor) of structure. It looks both complex and ordered.






I hoped to gauge whether rule 110 or rule 30 approximated the bird calls more closely. I also threw in a few other rules (rules 45 and 73—both class III, and rule 90—class II) for the sake of comparison. I used the orchard-oriole and great-horned-owl calls from Bill Schottstaedt as the basis for the sound.

Contrary to what I had originally assumed, the bird calls controlled by rule 30 seemed more realistic than the calls by rule 110. Apparently, the bird calls that I am most accustomed to can be characterized largely by random temporal structure. I suppose that if I had grown up listening to Bengalese finches, I might prefer the sound of rule 110. On the other hand, some of what I am responding to is not temporal structure per se but the density of notes. Rule 110 tends to create calls that are run-ons of many chirps. Rule 30 is more sparse.

Below are the scheme code and a few example recordings.

/user/g/gwayne/Library/Web/220a/fproject/automata.scm

/user/g/gwayne/Library/Web/220a/fproject/rule110ex.wav

/user/g/gwayne/Library/Web/220a/fproject/rule30ex.wav

/user/g/gwayne/Library/Web/220a/fproject/rule90ex.wav