As a computer music composer I soon found that the freedom of programming my own compositional algorithms was the best match for my compositional style. I started programming with MaxMSP, which really unlocked doors compositionally for me. While in school I started to also get experience in text based coding, implementing basic DSP methods using MATLAB, and also synthesis using Csound. I soon saw the benefit of programming in text-based languages alongside MaxMSP, particularly in the cases where Max could be extended by text-based code. This led me to learn to program in C and C++, while still programming extensively in Max.
Max, MSP, Jitter, Gen
My primary programming language for composition is Max, the graphical language currently distributed by cycling74.
Although Max’s graphical interface does bring with it some computational overhead, I have found it to be the most conducive for my compositional process. I can quickly get ideas working and running, easily test algorithms and theories, and the nearly limitless potential of the environment can be augmented by the wealth of external Max objects created by the Max community.
Past and Present Max Work
The following are examples of my work. I am in the process of documenting and packaging many of my more advanced algorithms and projects for display, so visit soon for more examples.
The Stochastic Distribution Toolkit This is a set of external objects for Max written with the Max SDK. A lot of this work stemmed from studying algorithmic composition with Luke Dubois at NYU-Poly. Up until this point I had never delved into external development and had a great interest, and Luke helped me in the development of these objects.
Contained in this toolkit are objects which will yield a certain random distribution, many with both discrete (integer) and continuous (floating point) output, all responding to the “bang” message in Max similar to the stock [random] object. At the time I started developing these objects I had not come across any objects dealing with many of these distributions. Of course by now I have come across many of these distributions, and so I apologize for stepping on anyone’s toes in releasing this toolkit.
The following distributions are found in this toolkit:
- Uniform random distribution with range definition (discrete and continuous)
- Linear weighted random distribution (discrete and continuous)
- Triangular weighted random distribution (discrete and continuous)
- Poisson random distribution (discrete)
- Exponential weighted random distribution (continuous)
- Bilateral exponential weighted random distribution (continuous)
- Cauchy random distribution (continuous)
- Beta random distribution (continuous)
- Gaussian random distribution (continuous)
- Weibull random distribution (continuous)
- Random selection between two alternatives from supplied probability
- Random selection of a positive or negative value from a supplied probability
Also included is an overview patch which could be placed in the Cycling ’74 > Examples folder. This project isn’t fully complete yet, there are still some things I would like to implement in the toolkit (a better naming system is at the top of the list). I hope to post the source code soon, but it needs some cleaning up. Please let me know if you come across any problems.
The Stochastic Distribution Toolkit requires Max 5 (or above). Mac OSX universal binary, 32-bit only.
Indeterminate Concrete Sound Generator This is a sound generator that when loaded with sound files by the user, the user can then trigger four audio modules to generate a variety of random values for controlling a sound sample, including which sample to play, the delay time before the sound is actually output, the portion of the sound file to play, the speed in which to play the file, the amplitude envelope of the sample, and the spatial location of the sample. This patch can be set to Auto-Trigger, thus when each module finishes playing its current sample, it will re-trigger to generate a new set of parameters and output a new sound file (with actual audio dependent on the delay time before triggering). Performance controls provide quick access to overall gain, range of random times in milliseconds in which to delay audio output, and auto-trigger on/off, which can be controlled via MIDI as well. This device is fully documented, so each process should be very clear in the code. Requires the most recent version of MaxMSP.
Combined Structure No. 3 This patch is the patch used to compose my work Combined Structure No. 3, a work in a series of works I am composing which take two compositional structures and uses them both cooperatively. This work, No. 3, uses serial structuring through multiple rows to make compositional decisions. However, the rows themselves were developed through chance operations. In addition, chance operations are employed to create variation and also decisions when algorithmic constructs result in synthesis parameters which are inaudible. The most notable component in this work is the way in which timbre is selected. Relying on the notion of a sound event’s spectral typology to lie on a “note to noise continuum” as discussed in Denis Smalley’s writing on Spectromorphology, and in this work this continuum is divided into 12 levels and sequenced along a serial row. The levels range from a pure sine tone, to an event with a fundamental pitch and harmonic partials, to increasingly less harmonic partials until completely random partials are found, resulting in noise. The other serial decisions for each event includes duration, envelope, and ascending or descending interval of the fundamental pitch from the previous event.
Transient Extractor and Player This patch demonstrates the use of the two designed abstractions [transient.recorder.th~] and [transient.player.th~]. [transient.recorder.th~] takes an audio signal as an input into its leftmost inlet, and through the settings for input gain to the [xerox~] object and threshold for the number of zero-crossings in which to determine a transient was found, will extract the transients from the incoming audio stream, record them into a [buffer~], and record their indices into a [coll] file as indicated by object’s argument. The object then reports the total number of transients extracted. This serves as an input to the [transient.player.th~] abstraction, which when given a rate to output transients and toggled on through the [toggle] connected to its leftmost inlet, will output a sequence of the transients abiding by a sequence of amplitude values, both of which are created by random processes and both are formatted to fill [itable] objects to display the sequences. After a full sequence has been performed, a new sequence is created and performed. The result are percussive patterns with some of the timbral quality of the original input (while some of the timbral elements of the patterns are nearly indistinguishable as far as timbre is concerned).