mirror of
https://github.com/thestk/stk
synced 2026-01-11 20:11:52 +00:00
195 lines
9.4 KiB
Markdown
195 lines
9.4 KiB
Markdown
# The Synthesis ToolKit in C++ (STK)
|
|
By Perry R. Cook and Gary P. Scavone, 1995--2023.
|
|
|
|
This distribution of the Synthesis ToolKit in C++ (STK) contains the following:
|
|
|
|
* [`include`](include/): STK class header files
|
|
* [`src`](src/): STK class source files
|
|
* [`rawwaves`](rawwaves): STK audio files (1-channel, 16-bit, big-endian)
|
|
* [`doc`](doc): STK documentation
|
|
* [`projects`](projects): example STK projects and programs
|
|
|
|
Please read the [Legal and Ethical notes](#legal-and-ethical) near the bottom of this document and the [License](LICENSE).
|
|
|
|
For compiling and installing STK, see the [INSTALL.md](INSTALL.md) file in this directory.
|
|
|
|
## Contents
|
|
|
|
* [Overview](#overview)
|
|
* [System Requirements](#system-requirements)
|
|
* [What's New (and not so new)](#whats-new-and-not-so-new)
|
|
* [Disclaimer](#disclaimer)
|
|
* [Legal and Ethical](#legal-and-ethical)
|
|
* [Further Reading](#further-reading)
|
|
* [Perry's Notes From the Original Distribution](#perrys-notes-from-the-original-distribution)
|
|
|
|
# OVERVIEW
|
|
|
|
The Synthesis ToolKit in C++ (STK) is a set of open source audio
|
|
signal processing and algorithmic synthesis classes written in the C++
|
|
programming language. STK was designed to facilitate rapid
|
|
development of music synthesis and audio processing software, with an
|
|
emphasis on cross-platform functionality, realtime control, ease of
|
|
use, and educational example code. The Synthesis ToolKit is extremely
|
|
portable (most classes are platform-independent C++ code), and it's
|
|
completely user-extensible (all source included, no unusual libraries,
|
|
and no hidden drivers). We like to think that this increases the
|
|
chances that our programs will still work in another 5-10 years. STK
|
|
currently runs with "realtime" support (audio and MIDI) on Linux,
|
|
Macintosh OS X, and Windows computer platforms. Generic, non-realtime
|
|
support has been tested under NeXTStep, Sun, and other platforms and
|
|
should work with any standard C++ compiler.
|
|
|
|
The only classes of the Synthesis ToolKit that are platform-dependent
|
|
concern sockets, threads, mutexes, and real-time audio and MIDI input
|
|
and output. The interface for MIDI input and the simple Tcl/Tk
|
|
graphical user interfaces (GUIs) provided is the same, so it's easy to
|
|
experiment in real time using either the GUIs or MIDI. The Synthesis
|
|
ToolKit can generate simultaneous SND (AU), WAV, AIFF, and MAT-file
|
|
output soundfile formats (as well as realtime sound output), so you
|
|
can view your results using one of a large variety of sound/signal
|
|
analysis tools already available (e.g. Snd, Cool Edit, Matlab).
|
|
|
|
The Synthesis Toolkit is not one particular program. Rather, it is a
|
|
set of C++ classes that you can use to create your own programs. A
|
|
few example applications are provided to demonstrate some of the ways
|
|
to use the classes. If you have specific needs, you will probably
|
|
have to either modify the example programs or write a new program
|
|
altogether. Further, the example programs don't have a fancy GUI
|
|
wrapper. If you feel the need to have a "drag and drop" graphical
|
|
patching GUI, you probably don't want to use the ToolKit. Spending
|
|
hundreds of hours making platform-dependent graphics code would go
|
|
against one of the fundamental design goals of the ToolKit - platform
|
|
independence.
|
|
|
|
For those instances where a simple GUI with sliders and buttons is
|
|
helpful, we use Tcl/Tk (https://www.tcl.tk/) which is freely
|
|
distributed for all the supported ToolKit platforms. A number of
|
|
Tcl/Tk GUI scripts are distributed with the ToolKit release. For
|
|
control, the Synthesis Toolkit uses raw MIDI (on supported platforms),
|
|
and SKINI (Synthesis ToolKit Instrument Network Interface, a MIDI-like
|
|
text message synthesis control format).
|
|
|
|
|
|
# SYSTEM REQUIREMENTS
|
|
|
|
See the individual README's (e.g. README-linux) in the /doc directory
|
|
for platform specific information and system requirements. In
|
|
general, you will use the configure script to create Makefiles on unix
|
|
platforms (and MinGW) or the VS2017 workspace files to compile the
|
|
example programs. To use the Tcl/Tk GUIs, you will need Tcl/Tk
|
|
version 8.0 or higher.
|
|
|
|
|
|
# WHAT'S NEW (AND NOT SO NEW)
|
|
|
|
Despite being available in one form or another since 1996, we still
|
|
consider STK to be alpha software. We attempt to maintain backward
|
|
compatability but changes are sometimes made in an effort to improve
|
|
the overall design or performance of the software. Please read the
|
|
"Release Notes" in the /doc directory to see what has changed since
|
|
the last release.
|
|
|
|
A new StkFrames class has been created to facilitate the handling and
|
|
passing of multichannel, vectorized audio data. All STK classes have
|
|
been updated to include tick() functions that accept StkFrames
|
|
arguments.
|
|
|
|
The control message handling scheme has been simplified greatly
|
|
through the use of the Messager class. It is now possible to have
|
|
access to simultaneous piped, socketed, and/or MIDI input control
|
|
messages. In most cases, this should eliminate the use of the
|
|
Md2Skini program.
|
|
|
|
Realtime audio input capabilities were added to STK with release 3.0,
|
|
though the behavior of such is very hardware dependent. Under Linux
|
|
and Macintosh OS-X, audio input and output are possible with very low
|
|
latency. Using the Windows DirectSound API, minimum dependable output
|
|
sound latency seems to be around 20 milliseconds or so, while input
|
|
sound latency is generally higher. Performance with the ASIO audio
|
|
API on Windows provides much better performance.
|
|
|
|
As mentioned above, it is possible to record the audio ouput of an STK
|
|
program to .snd, .wav, .raw, .aif, and .mat (Matlab MAT-file) output
|
|
file types. Though somewhat obsolete, the program Md2Skini can be
|
|
used to write SKINI scorefiles from realtime MIDI input. Finally, STK
|
|
should compile with non-realtime functionality on any platform with a
|
|
generic C++ compiler.
|
|
|
|
For those who wish to make a library from the core STK classes, the
|
|
configure script generates a Makefile in the src directory that will
|
|
accomplish that.
|
|
|
|
|
|
# DISCLAIMER
|
|
|
|
You probably already guessed this, but just to be sure, we don't
|
|
guarantee anything works. :-) It's free ... what do you expect? If
|
|
you find a bug, please let us know and we'll try to correct it. You
|
|
can also make suggestions, but again, no guarantees. Send email to
|
|
the mail list.
|
|
|
|
|
|
# LEGAL AND ETHICAL
|
|
|
|
This software was designed and created to be made publicly available
|
|
for free, primarily for academic purposes, so if you use it, pass it
|
|
on with this documentation, and for free.
|
|
|
|
If you make a million dollars with it, it would be nice if you would
|
|
share. If you make compositions with it, put us in the program notes.
|
|
|
|
Some of the concepts are covered by various patents, some known to us
|
|
and likely others which are unknown. Many of the ones known to us are
|
|
administered by the Stanford Office of Technology and Licensing.
|
|
|
|
The good news is that large hunks of the techniques used here are
|
|
public domain. To avoid subtle legal issues, we'll not state what's
|
|
freely useable here, but we'll try to note within the various classes
|
|
where certain things are likely to be protected by patents.
|
|
|
|
|
|
# FURTHER READING
|
|
|
|
For complete documentation on this ToolKit, the classes, etc., see the
|
|
doc directory of the distribution or surf to
|
|
http://ccrma.stanford.edu/software/stk/. Also check the platform
|
|
specific README's for specific system requirements.
|
|
|
|
|
|
# PERRY'S NOTES FROM THE ORIGINAL DISTRIBUTION
|
|
|
|
This whole world was created with no particular hardware in mind.
|
|
These examples are intended to be tutorial in nature, as a platform
|
|
for the continuation of my research, and as a possible starting point
|
|
for a software synthesis system. The basic motivation was to create
|
|
the necessary unit generators to do the synthesis, processing, and
|
|
control that I want to do and teach about. Little thought for
|
|
optimization was given and therefore improvements, especially speed
|
|
enhancements, should be possible with these classes. It was written
|
|
with some basic concepts in mind about how to let compilers optimize.
|
|
|
|
Your question at this point might be, "But Perry, with CMix, CMusic,
|
|
CSound, CShells, CMonkeys, etc. already cluttering the landscape, why
|
|
a new set of stupid C functions for music synthesis and processing?"
|
|
The answers lie below.
|
|
|
|
1) I needed to port many of the things I've done into something which is generic enough to port further to different machines.
|
|
|
|
2) I really plan to document this stuff, so that you don't have to be me to figure out what's going on. (I'll probably be sorry I said this in a couple of years, when even I can't figure out what I was thinking.)
|
|
|
|
3) The classic difficulties most people have in trying to implement physical models are:
|
|
|
|
A) They have trouble understanding the papers, and/or in turning the theory into practice.
|
|
|
|
B) The Physical Model instruments are a pain to get to oscillate, and coming up with stable and meaningful parameter values is required to get the models to work at all.
|
|
|
|
This set of C++ unit generators and instruments might help to diminish the scores of emails I get asking what to do with those block diagrams I put in my papers.
|
|
|
|
4) I wanted to try some new stuff with modal synthesis, and implement some classic FM patches as well.
|
|
|
|
5) I wanted to reimplement, and newly implement more of the intelligent and physical performer models I've talked about in some of my papers. But I wanted to do it in a portable way, and in such a way that I can hook up modules quickly. I also wanted to make these instruments connectable to such player objects, so folks like Brad Garton who really think a lot about the players can connect them to my instruments, a lot about which I think.
|
|
|
|
6) More rationalizations to follow . . .
|
|
|