![]() | ![]() |
![]() |
The CREATE Signal Library (CSL, pron. "sizzle") is a cross-platform (Mac, Linux, MS-Windows, iOS, Android, etc.) software framework for sound synthesis and digital audio signal processing. It is implemented as a C++ class library to be used as a stand-alone synthesis server, or embedded as a library into other programs.
CSL is frequently used together with JUCE, a comprehensive C++ class library for multimedia and GUI programming, but it can also be used for stand-alone apps without JUCE, or with other GUI frameworks such as Qt.
This page describes CSL in more detail, gives examples of its usage, and provides instructions on how to download it.
To coincide with the release of JUCE 7.03, CSL 6 is now available on github. To download the full source tree, go to,
https://github.com/stpope/CSL7
and either grab the zipped archive file set or use the shell command,
git clone https://github.com/stpope/CSL7.git
As always, RTFM; there is a folder of papers and a complete doxygen cross-reference.
Show 1: A Tour of CSL (22 min)
"The CSL Show" Screencasts
System Requirements
Documentation
- ICMC 2006 CSL 4.0 Metamodel Paper
- CSL Presentation Slides (good quick intro and examples)
- ICMC 2003 CSL 3 Paper (the best general reference to CSL)
- CSL "Manual" (obsolete but still useful)
- Doxygen on-line API manual for CSL 5
- Get API doc (ZIP file of the Doxygen HTML pages)
- For more examples of CSL applications, see here
Source/Data/Doc ZIP files
- CSL 5.0x source ZIP file (really old)
- CSL Doc (9 MB PDF & Doxygen files)
- CSL Test Data (99 MB snd files, HRTF data, etc.)
- CSL "old" code (somewhat stale or unsupported apps)
Support Libraries
- CSL 5.0 extensions to JUCE 1.50 (added methods for sound file I/O; un-tar this file in the base JUCE folder)
- CSL support libraries (PortAudio, PortMIDI, LibSndFile, FFTW, etc.) ZIP file with binaries for Intel/Mac (not needed for CSL 5.0)
Related Packages
- Chandrasekhar Ramakrishnan's Occam (OSC-to-MIDI)
- Garry Kling's Macco (MIDI-to-OSC)
- GestureSensor drivers: EBeam, FlockOfBirds, P5 Glove, DataGlove, Matrix, etc. (C++ for MS-Windows)
CSL is a simple yet powerful library of sound synthesis and signal processing functions. It is packaged as an object-oriented class hierarchy for standard DSP and computer music techniques, and is suitable for integration into existing applications, or use as a stand-alone synthesis/processing server. CSL is similar to the JSyn (Burke), CommonLispMusic (Schottstaedt), STK (Cook), and Cmix (Lansky) frameworks in that it is integrated as a library into a general-purpose programming language, rather than being a separate “sound compiler” as in the Music-N family of languages (CMJ tutorial on sound compilers). CSL is designed from the ground up to be used in distributed systems, with several CSL programs running as servers on a local-area network. These CSL DSP servers receive control commands via the network and send their output sample blocks to other servers over the network.
CSL supports the following synthesis/interaction techniques
![]() |
In contrast to the traditional MusicN stand-alone sound compiler, CSL is packaged as a class library in a general-purpose programming language (C++). The simplest CSL program is a 5-line main() function in a simple C program, and it is intended that CSL can be used in several ways, including for the development of stand-alone interactive (MIDIor OSC-driven) sound synthesis programs, serving as a plugin library for other applications or plug-in hosts, or as a back-end DSP library for programs written in scripting languages. CSL is designed from the ground up to be used in distributed systems, where networks of CSL programs run as servers on a local-area network, streaming control commands (MIDI and OSC) and sample buffers (RTP) between them.
// This is a simple 2-envelope FM program -- paste this into a main() function
float frq = 440.0f; // float values for freq and dur
float dur = 0.25f;
IO theIO; // create an IO object
Sine car, mod(frq); // create 2 oscillators: carrier and modulator
// amplitude env = std ADSR
ADSR a_env(dur, 0.1, 0.1, (dur - 0.6), 1);
// index env = time/value breakpoints
Envelope i_env(dur, 0, 0, 0.1, 2, 0.2, 1, 2.2, 8, dur, 0);
a_env.setScale(0.2); // make ampl envelope quieter
i_env.setScale(frq * 3.0f); // multiply index envelope by mod freq * 3 (index depth)
mod.setScale(i_env); // scale the modulator by its envelope
mod.setOffset(frq); // add in the base freq
car.setFrequency(mod); // set the carrier's frequency
car.setScale(a_env); // scale the carrier's output by the amplitude envelope
logMsg("CSL playing FM..."); // print a message and play
theIO.setRoot(car); // set the IO's root to be the FM carrier
theIO.open(); // open the IO
theIO.start(); // start the driver callbacks and it plays!
a_env.trigger(); // reset the envelopes to time 0
i_env.trigger();
sleepSec(dur + 0.25); // sleep for dur plus a bit
logMsg("CSL done.");
theIO.stop(); // stop the driver and close down
theIO.close();
We assume CSL users are proficient C++ programmers and know the native development environment of their platform.
Down-load and unpack JUCE V 1.50 and compile its base library.
Down-load and unpack CSL 5.0 and read the documentation. CSL assumes it's installed in the folder ~/Code/CSL; there are some default settings in CSL/Kernel/CSL_Types.h that have to be changed if you put it somewhere else. The system assumes JUCE is in ~/Code/juce (../juce from the root of the CSL hierarchy).
The best way to get started is to look at the Doxygen-generated API documentation in
Doc/html.zip
You can untar this file to get the full HTML doc and to print out and study the files
CSL/Kernel/CSL_Types.h (note the system defaults here)
CSL/Kernel/CSL_Core.h (the kernel classes are here)
and
CSL/Sources/SimpleSines.{h,cpp} (this is a tutorial for writing unit generators)
To compile the sources, you may need to create the links in the CSL/Includes folder; to do this, open a UNIX shell (AKA terminal) and execute the commands,
### change to the Includes folder
cd CSL/CSL/Includes
### make symbolic links from the include files to this folder
ln -s ../*/*.h .
ln -s ../Spatializers/*/*.h .
Now, you should be able to use the Mac XCode project in JUCE, the premake script and makefile in Linux, or to build an Eclipse project on Windows. The supplied VisualStudio projects are known to produce errors because of CSL's non-Windows-compatible header and code.
Once you have the development environment set up, build the JUCE demo GUI (shown in the figures above). This app has 2 menus at the bottom of the pane to select a test suite and a specific test, and a play/stop button next to these menus. The source code for the tests is in the folder CSL/Tests; the list of tests is included below.
The source code for all these tests is in the CSL/Tests directory (and file group in the IDE); it's a good way to learn CSL to run the JUCE demo in an XCode/Eclipse debugger and set breakpoints in the test functions while using the GUI.
For more information, please join the discussion on the JUCE forum or contact Stephen Pope [stephen (at) FASTLabInc (dot) com].