SndObj [Lazzarini, 2000b] is an OO sound synthesis and processing programming library released under the GPL designed for the development of music applications as well as research and implementation of DSP algorithms. SndObj is written in C++ and it can be deployed in music software applications as a toolkit or as a framework for developing and implemented new sound processing algorithms. In the first releases SndObj processed on a sample by sample basis but as this proved not efficient, from version 2.0 on it processes vectors (see the following references for an overview of the library's evolution: [Lazzarini, 1998,Lazzarini and Accorsi, 1998,Lazzarini, 2000b,Lazzarini, 2000a,Lazzarini, 2001,www-SndObj, ]).
SndObj has three important characteristics: (1) Encapsulation: it encapsulates all the processes involved with production, control, manipulation, storage and performance of audio data. (2) Modularity: processing objects can be freely associated as modules in an analogue synthesizer or unit generators in a computer music system. (3) Portability: the core is portable to any platform with a POSIX compliant C++ compiler. Some classes as real-time IO are platform specific. It has been developed on different platforms: Sun Sparc under Solaris, IBM RISC 2000 under AIX, SGI O2 under IRIX, and Intel PC under Linux and Windows (using Cygwin and gnu g++). The latest beta version has been released for Windows, Linux and IRIX.
There are four base classes in the framework: SndObj for signal processing related objects, SndIO for signal input/output objects, Table for mathematical functions and SndThread for thread management.
Objects of the SndObj class share some properties such as the sampling rate, output vector size, an output buffer, a SndObj input object and an on/off switch. They also share methods for the basic operations such as addition, subtraction and multiplication as well as methods for setting and retrieving their basic attributes, this includes retrieving samples from the output buffer. The SndObj classes also include a main processing method, DoProcess() which is overridable. This is where each derived class implements a particular algorithm. The SndObj object will typically access the output signal of an input object and perform the processing that will eventually fill the output buffer. The default DoProcess() implemented in the base class just copies from the input object to the output buffer. The SndObj base class has a single input but derived classes can have any number (even none as is the case of some generators).
Objects of the SndIO class tree are designed to deal with input and output of audio. They implement five basic tasks: standard IO, soundfile IO, digital-to-analog and analog-to-digital IO, buffer memory (RAM) IO and MIDI input. The base SndIO class implements a very simple standard IO. The most important methods are the Read and Write operations. They operate on vectors just like the SndObj classes. SndIO classes can receive input from SndObj objects and can send signal to special SndObj classes such as MidiIn and Bend. Some SndIO classes are platform dependent and even have different interface depending on the platform. SndRTIO and SndMidi/SndMidiIn are only implemented in three platforms (Linux/OSS, SGI and Windows)
Finally, the SndThread class encapsulates the main process loop as a separate POSIX thread. Apart from that it offers very small functionality as it is still ongoing work.
The library is distributed with a number of examples that present in a simple way the use of SndObj. Cvoc, for instance, is a simple phase vocoder based on Butterworth filters. There are also some examples of MIDI usage such as Pluck, a Karplus-Strong based plucked-string synthesizer. SndObj can be integrated into GUI frameworks such as MFC and V and there some examples of such functionality.
2004-10-18