Visit ddw's Intermediate Tutorials site.
Also see the supercollider forum at http://www.newscores.com/scforum.
SuperCollider is an object-oriented programming language designed by James McCartney for real-time audio synthesis and manipulation and algorithmic composition. It's also my preferred platform for making music on my computer. I have been interested in live electronic performance for some time, but it was not until I found SuperCollider that it became a viable option for me.
An excerpt from my very first live SuperCollider performance, which took place at a friend's party on August 16, 2003. I have applied some post-production compression and repaired a few unintended digital-distortion glitches, but other than that, everything you hear was synthesized 100% live on an unmodified 700 MHz iBook.
The great advantage--and the great disadvantage--of SuperCollider is that you have to build everything yourself. SuperCollider gives you the basic tools--over 200 unit generators, including basic oscillators, filters, envelopes, triggers, and frequency domain (FFT) operations, as well as powerful control mechanisms such as time or tempo-based scheduling and co-routines, patterns and streams for algorithmic composition, graphic-interface construction, and control from MIDI or a graphics tablet. Unlike many software synthesizers, however, it doesn't force you into preset arrangements of these tools. If you wanted to do something that's different from any other commercial package out there, you roll up your sleeves and write the code yourself. You design your own composition and performance environment. You have incredible flexibility, but also the responsibility to make it work.
I enjoy the challenge tremendously, and I'm happy to make my code available to other users to help them with their work. Since SuperCollider is object-oriented, all you have to do is drop my class files into your class library folder, and these devices will be available for use the next time you start the program or recompile the library. Those classes are described below.
SuperCollider runs on Mac OS 10.4 or higher and various Linux distributions. A Windows version is also available, but it has some (very minor) limitations not present in the Macintosh version.
For more information: James McCartney's SuperCollider home page :
SuperCollider at sourceforge.net
To get SuperCollider: A complete build for the Macintosh is available and updated regularly at the sourceforge website. Or, you can follow the instructions at jmc's website to download the source code from cvs, which can be compiled with Apple's developer tools (available free with Jaguar or from Apple's website).
Daily builds are maintained on an archive site at Wesleyan university.
Dewdrop's class library
This software is licensed under the CC-GNU GPL.
dewdrop_lib is no longer distributed through my website. You get it through the Quarks SVN interface in SuperCollider itself. Read the readme direct from SourceForge (where the current version is maintained).
This is the layout of my performance GUI. All components of this interface are available in the dewdrop_lib Quarks.
|2007 October 02:
- Dewdrop_lib is now part of the Quarks SVN repository. See Quarks helpfile in SuperCollider for details. The dewdrop_lib readme, with installation instructions, is available from sourceforge.
- Six months of bugfixes and other improvements. I can't remember them all!
|2007 April 24:
- Small fix in class initialization. This update will be required once some other changes are committed to the main class library.
|2007 April 07:
- Major update for compatibility with SwingOSC (thus, cross-platform GUI support). Complete announcement is in the list archives. If you have updated SC since April 7, you must get the updated dewdrop_lib or the library won't compile. The new dewdrop_lib might be backward compatible with older SC builds; I haven't tested it.
- MIDIRecBuf:++ now returns a new MIDIRecBuf instead of modifying the receiver.
- Mixer dependencies are easier to read: sourceMixer.sendsSignalTo(targetMixer), targetMixer.receivesSignalFrom(sourceMixer).
- TempoClockGui does not crash when closing the window now.
- chucklib: ProtoEvent.composite([\protoevent1, \protoevent2]) assists with building runtime-selectable events.
- chucklib: PR(\abstractProcess) implements override to temporarily bypass a BPStream's normal mapping. Usage: BP(\name).v.override(\bpstreamName, newPattern) -- newPattern should be finite; when it ends, the original BPStream takes over.
|2007 March 07:
- I broke Buffer:readAndQuery in the last update when I changed its supporting class to use OSCresponderNode instead of OSCresponder. Fixed now.
- Added new classes for alternate tuning: EqualTemperament, TuningOffset, TuningRatios.
- If you have been using ModalSpec, take note: I reversed the semantics of map and unmap in this class to be consistent with ControlSpec. In ControlSpec, you map a normalized value into the specified range; similarly, in ModalSpec, you now map a chromatic value into its modal representation, and unmap the modal representation onto the chromatic ("normalized") value. Check all your uses of the methods map / unmap and mapMode / unmapMode.
- There is now a help index -- type "dewdrop" into a text window and get help on it (cmd-shift-?).
|2006 October 29:
|2006 October 08:
- Bug fix to MonoPortaVoicer -- note releases were not handled correctly previously.
- Chucklib update: BP's may now be run on AppClock for background processing. They must use a NilTimeSpec for AppClock.
- Licensing change: Since it is not possible to use my library without the GPL'ed libraries of SuperCollider itself, any code written with my library can by definition be released under GPL only. I have made my library fully GPL accordingly.
|2006 August 17:
- Fixed a compilation bug due to a variable argSpecs not being defined.
- Implemented an easier syntax for chucklib changeable streams. See the chucklib intro for details.
|2006 August 03:
- Fixed crashing issue with circular MixerChannel routes (finally!!).
- Minor bug fixes (too many to recall).
- Chucklib update with some architectural reworking for better parameterization. (Documentation is still lacking.)
|2006 March 05:
- Fixed a memory leak in Voicer when using Patches (dependencies were not getting removed from the dependent table). Requires a modified OSCBundle.sc file.
|2006 February 06:
- Minor update; including some classes necessary for a chucklib update, posted concurrently.
- Chucklib update: bug fixes from the last several months. Also released more process prototypes for generative sequencing and algorithmic composition.
|2005 December 11:
- TimeSpecs now treat latency values in terms of beats, not seconds, for better support of changing tempi. Events should divide the latency value by thisThread.clock.tempo if you are using my TimeSpecs for scheduling. (The chucklib event prototypes automatically do this calculation.)
- Improved error handling for BufferQueryQueue.
- MIDIPort now includes a default mechanism for CCAllocators. Each MIDI source may have its own default, which may also be overridden per channel.
- The parametric EQ GUI now has a "bypass" button.
- Minor fixes for MixerChannel, ToggleTextField, and global controls.
|2005 November 13:
- Minor bug fixes:
- Bug with atTime in FxPatch-playToMixer
- MIDI controls now resync correctly after global control's spec changes, or after global control proxy's target changes
- Fixed PeakMonitor incompatibility with KrBusWatcher
- SynthDef sending for MixerChannels is more reliable
|2005 July 24:
- A bug when un-muting a MixerChannel is fixed.
- Another bug fix with global controls not updating their GUIs properly.
|2005 July 17:
- MixerChannel and MixerChannelGUI are now customizable to support whatever spatialization technique you want to use. Previously, mixer channel was realistically usable only for stereo applications, but now it can be adapted to any quad+ usage.
- MIDI controllers for numeric values (such as voicer MIDI controller and mixer MIDI control) now match up with the control's value before changing the control. This is to avoid sudden changes in controller values.
- The MIDI classes have changed to use the updated MIDI responders in the crucial library. My MIDI classes are now compatible with all other MIDI frameworks that use the crucial MIDI responders.
|2005 July 04:
- Minor changes for compatibility with recent crucial library updates.
|2005 June 05:
- PeakMonitor did not release MixerChannel postsend client on close window - fixed.
- Recovery mechanism for readAndQuery--prior to the update, if the server failed to read one of this soundfiles, all the subsequent read requests would never execute. Now, if the file fails to load, the next one will be tried in 1.5 seconds. This time is configurable using BufferQueryQueue.timeToFail = /* number of seconds */;
- EQ classes get the sample rate from the server instead of assuming 44100.
- GenericGlobalControls may now be used directly as Patch arguments. The only caveat is that you have to call releaseFromDependencies on the Patch after freeing it--or, use PatchNoDep, which does not create dependencies on arguments.
- MixerChannel record methods didn't update MixingBoard when called programmatically - fixed.
|2005 March 12:
- PeakMonitor now posts the highest clipping amplitude when you reset the OK/clip buttons.
- MixingBoard level sliders are now scaled by decibels rather than raw amplitude.
- A bug in StaticEQ's \loshelf filter has been fixed.
- miditest: there is now a separate argument for a MIDI channel to use for controllers.
- MixerChannels now use an asynchronous technique to create server resources. Creating a channel and immediately playing something on it is likely to fail, unless you use the completionFunc argument introduced in this version. See the mixer channel help file for details.
|2005 January 16:
- MIDI suite now supports aftertouch messages
- VoicerMIDISocket supports tunings other than equal temperament
- Minor bug fixes to GenericGlobalControl-watch, MixingBoard and VoicerMIDIController
|2004 December 31:
- Fixed some minor bugs relating to MixerChannels and GUIs
- KrBusWatcher now starts and stops its alive thread automatically
- Bug fixes for Voicer's multiple-node feature
|2004 December 06:
- Minor patch #1: Using a collection of MixerChannels as an argument to MixingBoard would break unless the collection is an Array. Now all collections (including Dictionaries) will work.
- Minor patch #2: New revisions by Scott Wilson to the core Buffer class do not work with the downloadable version of the library. As the new Buffer code is still somewhat experimental and in transition, I'm releasing a patch to a single file that resolves the issue. Download the file from Patch-playToMixer.sc and replace the existing file (in the MixingBoard directory). Let me know if you run into additional problems.
|2004 November 18:
- MixerChannel order of execution should be correct and consistent based on dependencies between channels. Warning: infinite feedback loops between channels were not supported before; now they will crash the client. If you need feedback, do it with an InFeedback synth on one of the channels.
- MixerChannel levelAuto and panAuto methods now accept all the objects accepted by MixerChannel-play: synthdef names, Instrs, Patches and functions. The objects should define kr synths.
- MixingBoard: now allows empty GUIs to be created, so you can make an array of reusable GUI slots.
- MixerChannels free themselves and their supporting objects when the server quits.
- The syntax for MixerChannel-play is changed to be consistent with Synth.new. Arguments have to be enclosed in an array.
- New superclass for VoicerGlobalControl: GenericGlobalControl. Compatible with voicer GUIs, but they don't need to be tied to a voicer. Generic global controls and all subclasses can play kr synthdefs by name, Instr, Patch, and functions using the play method.
- Voicer's handling of messaging latency is different: supply -1 in the lat argument to use the voicer's latency variable, nil for no latency, and a positive number to override the latency variable. Voicer-set did not implement latency before, and now it does.
- VoicerSequencer and LinkedVoicerSequencer are gone. The same thing can be done better with Pbind. If you really depend on these classes, you can grab the files from the older version of the library.
- KrBusWatcher: like NodeWatcher, but it calls dependents of the bus object with the current value of the bus. Multichannel buses are supported.
- BufSeq and its relatives now enjoy tighter synchronization with client-side processes. (Previously they could drift out of sync over a period of several minutes.)
- The level displayed by PeakMonitor is now consistent (previously there was a phasing issue between timing on the client and server).
- The maxAcross parameter in MixerSkin was not respected before (now implemented).
- A few others I don't remember off hand.
|2004 July 30:
- Various classes updated to work with the new changes to Node, Synth and Group.
|2004 July 25:
- Miscellaneous bug fixes (including updates to ensure that various methods function correctly with the new synthdef building code)
- I reduced the size of the voicer GUI, for more efficient use of screen space.
- On the voicer GUI, any MIDI controls assigned to voicer global controls can be reassigned via drag-and-drop. This required some changes to CControl, so if you're customizing the default set of controls, you should doublecheck your code.
- What I was formerly calling a "NeuralNode" is now an "AdhocClass."
- MixingBoard no longer requires you to supply all the mixers at creation time. You can supply nil mixers--the board will contain all the GUI objects but they will be inactive. You can drag mixers in, or assign them programmatically. You can also assign mixer MIDI controls to a mixer GUI (empty or not)--MIDI mappings assigned to a GUI will not change when the GUI receives a different mixer, so there is now an easy way to change the assignment of mixer MIDI controls on the fly.
- SequenceNotes now understand arithmetic messages. Also, there is a hierarchy to attach grace notes and chord notes to SequenceNotes. This code is still somewhat experimental, subject to change, and is not documented yet.
|2004 January 23:
- Bug fixes for the voicer proxy system.
- MixerChannels now reconstruct themselves on cmd-period.
- Miscellaneous bug fixes.
|2003 November 15:
- Voicer-gui now uses a proxy system to allow reuse of gui objects with different voicers.
- MixerChannel-scope has been implemented.
|2003 September 18:
- Voicers based on Instr/Patch now display a prettier name.
- Fixed a MixerChannel bug, in which routing a signal to a bus that doesn't belong to a MixerChannel caused an error.
- Fixed a bug in QuantTask where using .start would cause the task to be started, immediately reset, and started again.
|2003 August 23:
- Refactored MIDI sockets and controllers to make better use of inheritance. Some argument orders may have changed. Rewrote documentation for all MIDI classes.