Programming

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

Max is the primary tool I use for composition. I work actively in nearly every facet of Max programming, including building my own external objects in C, using Java and JavaScript within Max, developing audio/visual manipulation devices in Jitter, and working with Max within Ableton Live using MaxForLive.

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.

Download Stochastic Distribution Toolkit

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.

Download Indeterminate Concrete Sound Generator Max Code

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.

Download Combined Structure No. 3 Max Code

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).

Download Transient Extractor and Player Max Code

7 Responses to Programming

  1. hadakahidaka says:

    hey, it seems the link to the toolkit actually links to the Indeterminate Concrete Sound Generator.

  2. lynyrdskynerd says:

    As you said requires the most recent version of Max: number 7. Any plans on making a version for Max 6 users? I don’t have the money yet to upgrade and this toolkit was just what I needed.

  3. lynyrdskynerd says:

    As you said requires the most recent version of Max: number 7. Any plans on making a version for Max 6 users? I don’t have the money yet to upgrade and this toolkit was just what I needed.

    (dummy post so I can get email notification, sorry)

    • thouldcroft says:

      Hello! I actually wrote this part of the website prior to the arrival of Max 7. Though most of the Max coding was written in Max 5 or using the Max 5 SDK, I can assure you that all of the above software/code will run in Max 6. (I too am not in the position to purchase 7 yet myself, so it will be some time before there is any updates of the above code for Max 7 if any updates are required!)

      • lynyrdskynerd says:

        Hi, thanks for replying. Now I’m aware that this toolkit was a work-in-progress left unfinished since 2011. Too bad, since it really appears to be very useful.
        Anyways, this is the error message printed by the Max window. If I open it with Max 6 the object will remain pink as unrecognised; it will be recognised by Max 7 though.

        cgaussiandist: unable to load object bundle executable
        2014-12-05 18:56:52.394 Max[80834:707] Error loading /Users/XXX/Downloads/stochastic.distribution.toolkit.v.1.0/sdtk.externals/cgaussiandist.mxo/Contents/MacOS/cgaussiandist: dlopen(/Users/XXX/Downloads/stochastic.distribution.toolkit.v.1.0/sdtk.extern
        als/cgaussiandist.mxo/Contents/MacOS/cgaussiandist, 262): no suitable image found. Did find:
        /Users/XXX/Downloads/stochastic.distribution.toolkit.v.1.0/sdtk.externals/cgaussiandist.mxo/Contents/MacOS/cgaussiandist: mach-o, but wrong architecture

        So, now that I read this (sorry, my brain is melting right now since I’ve been sick for days), I come to guess that this toolkit is only for 32-bit.

      • thouldcroft says:

        Yes, I should have mentioned on the site that these objects are 32-bit only. At the time of writing them Max was only 32-bit, and I haven’t had the time to update them 64-bit.

        I would love to hear about any projects you develop with the toolkit, please keep me informed!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s