Sonic Visualiser: architectural notes

Sonic Visualiser is a substantial application written in C++ using the Qt user interface toolkit.

It is a cross-platform application that can be built on (at least) OS/X, Windows, Linux, and Solaris, but it has a substantial number of dependencies on third-party libraries which contribute to the complexity of the build process.

The Sonic Visualiser code is provided as a number of separate libraries, with varying dependencies. These are managed in separate projects on this code site, and are as follows:

  • svcore -- Non-interactive code, without user interface or audio device I/O. This code is used by batch applications such as Sonic Annotator as well as Sonic Visualiser. It contains a number of submodules:
    • system -- Some system-dependent code that Qt did not provide
    • base -- Miscellaneous handy classes
    • data/fft -- FFT code [depends on fftw]
    • data/fileio -- Audio file import and export and related classes [depends on libmad, liboggz, libfishsound, libsndfile]
    • data/midi -- MIDI-related code [using rtmidi]
    • data/model -- Data models used for Sonic Visualiser's internal representations. These include waveforms (including zoomed previews) as well as grids (spectrograms etc) and editable data (time/value plots, MIDI-style note tracks, text etc).
    • data/osc -- OSC control [depends on liblo]
    • plugin -- Interfaces for audio plugins such as LADSPA, DSSI, Vamp [depends on vamp-hostsdk]
    • transform -- A set of classes that use such plugins to transform the models found in data/model into one another (through audio analysis or effects transformations)
    • rdf -- Classes to carry out RDF queries and to import and export RDF data to models or transforms [depends on librdf]
  • svgui -- User interface widgets and helpers, with the following submodules:
    • widgets -- Custom Qt widgets
    • layer -- Classes that manage rendering of the data models found in svcore/data/model onto a widget surface, with limited interactive editing. These include the waveform renderer, line plots, grids, time ruler, etc. Layers rely on a lot of common code to carry out scaling and manage adjustable properties.
    • view -- Classes (in fact also widgets) which display layers on top of one another. The View class handles drawing, and the Pane subclass handles interaction.
  • svapp -- Higher-level code for use by applications that "look a bit like Sonic Visualiser". In practice, this code is largely specific to SV itself. It includes:
    • audioio -- Real-time callback-driven audio playback, including plugin application, time stretching, and sonification from data models. Despite the name, there is no recording code. [depends on rubberband and portaudio, pulseaudio, or jack]
    • framework -- Contains the Sonic Visualiser document class and file load/save, and a "generic" main window implementation (generic in the sense that it does not refer to SV explicitly and subclasses can pick and choose which aspects to include).
  • sonic-visualiser -- This project. Contains the concrete main window implementation, main entry point, and images and other resources.