# Generalized Algorithms: Source vs. Filter

December 31, 2009

Looking back on the creation and thorough usage of the XIAS algorithm library, it is clear that creating generalized algorithm engines provides a definite advantage to development, both in terms of time and content quality. Most XIAS algorithms, however, are similar in nature and unable to represent the entire compositional process.

In order to continue the success of generalized algorithm-building, I’d like to create a new library of algorithms, similar to XIAS, but consisting of a different category of algorithms: filter algorithms.

Upon inspection, it is clear that most XIAS engines have one thing in common: a chaotic, nondeterministic output. For these reasons, I have clumped them into a category of algorithms that I call “source.” Source algorithms, by my definition, take a simple input stream (for example, a time index) and convert it into a chaotic output stream. They are, effectively, “sources” of creative material for use in the process of composing. Of course, an ideal source algorithm generates output that, in some way or another, has a degree of coherence. For examples, the grammar engine draws coherence from repetition of small substructures, the Markov engine draws coherence from probability mappings, and the evolutionary engine draws coherence from the natural selection process. The simplest example of a source algorithm is a raw random function: rand(). Though it has no coherence, it fits the definition given above. This is an intuitive classification; programmers use the random function often as a “source” of chaos, so it is not difficult to see the logic classifying it as a source algorithm.

Filter algorithms, on the other hand, are deterministic and change the input stream in a predictable way. Filter algorithms have little representation in the XIAS library, though Fraccut partially qualifies due to some built-in features like automatic elimination of tri-tones. It is easy to think of a filter algorithm as a function of one or more variables that is called repeatedly on the input stream. A simple filter algorithm, for example, might take a pitch input stream and modify the stream to eliminate repeated pitches.

It is worth noting that both classes of algorithms may require an initial configuration that will affect the behavior of the algorithm – but this is not considered a direct input.

I see great potential in building a library of generalized filter algorithms. A source algorithm could be used to feed the input stream of a filter algorithm which, together, could essentially cover the entire composition process for a single part – from a creative source all the way to a constrained melody or harmony. Such intuitive flows of data have been integral to my past successes, and will no doubt contribute heavily to future ones.