Introduction to the Threnoscope

General outline of the system and its design ideas

The Threnoscope has an aesthetic and ideological grounding in drone music and the interest in exploring alternative tuning systems and scales. We find different types of tunings and scales in various musical cultures and one of the aims with the software is to create a platform for studying and comparing these, and their effects on our musical perception. There are two views available in the threnoscope: the harmonics view and the scale view.

The harmonics view

In the harmonics view, we see concentric circles in the middle of the score representation. These are the harmonics of the fundamental frequency, for example 55Hz (the note A in the Western convention). The second circle would then be 110Hz, the third 165Hz, fourth 200Hz, and so on. There are lines crossing the circles and these are the sound outputs of the system. In this case we have 8 channels that cross the circle around the performer/listener (who are in the centre).

The scale view

In the scale view we have the same "pitch space" as in the harmonics view, a drone in the same location would not change pitch by switching between the views. It is only the representation that has changed from showing the harmonics of the fundamental frequency to displaying the selected scale in its tuning. On this picture we see a major scale (two whole steps, one half step, three whole and a half) where the red circles represent the octaves (55Hz, 110, 220, 440, etc.)

The drones

On this image we also see four "drones" with different waveforms. We can see one sine wave (only one harmonic, thus thin) and the other waves with varying widths. The width of the drone is the number of harmonics it has until it is cut off with a lowpass filter. The purple drone, for instance, has 5 harmonics before it is attenuated. The cross-hairs on this picture are the sound channels (the speakers) and when a drone overlaps a line, it sounds from that channel.

Getting started

Placing drones in multichannel space

To start the system from a code editor, you will need to run one line of code:


This will start the Threnoscope in an 8-channel view, as we see in the images above. Obviously, you would need a sound device with eight channels for this. For a stereo setup, simply replace 8 with 2. The "s.boot" is just to boot the SuperCollider sound server. Having started the system, there is now a global access to the system through the "~drones" variable that contains the key interaction Threnoscope class.

~drones.drawHarmonics = false
~drones.drawScale = true

~drones.scale = \chromatic
~drones.tuning = \just
~drones.scale =\minor
~drones.tuning = \et12  // 12-tome equal temperament

Here we have removed the harmonics view and are now drawing the chosen scale. We then choose the "chromatic" scale (every halfnote in the octave, 12 notes) and then set the tuning to "just" intonation. We change the scale to a minor scale and set the tuning back to equal tempered 12-tone tuning.

Making sounds

Creating drones, chords and satellites

The most basic operation of the Threnoscope is to create a new drone:

~drones.createDrone(\saw, 2, harmonics: 3);
This will create a saw wave drone on the 2nd harmonic, with 3 harmonics before the cutoff filter kicks in (so if the system is tuned to a fundamental of 55 Hz, then this drone's frequency will be 110Hz, and the cutoff frequency 330 Hz).

~drones.createDrone(\saw, 2, harmonics: 3, degree: 3, length: 120, speed: 4);
Here we have added more arguments, so the drone will appear on the 3rd degree of the selected scale, so if it was a minor scale it would be a half-tone lower than if it was a major scale, in this case the note of Cb (the lowered third in the scale of A). The length of the drone is in degrees (360 is a full circle) and the speed is self-explanatory.

The drone is a prolongued note that does not end until you kill it. You will see that when you created it, a name is given to the drone and that is the reference you use to control it (you can set the name of the drone when you create it, with a "name: \myName" argument). There are various parameters that can be done to control the drone:

~oxo.harmonics = 9;
~oxo.length = 330;
~oxo.speed = 15;
~oxo.type = \gendy;
~oxo.resonance = 3;
~oxo.kill; // if you want to kill it now
The same can also be done with a time lag, so the drone might, for example, move from one tonic harmonic to another slowly, and the harmonics might be changed over time too:

~oxo.tonic_(1, 20); // moving from the 2nd harmonic to the 1st in 20 seconds
~oxo.harmonics_(1, 10); // moving the cutoff frequency of the lowpass filter to the first harmonic in 10 seconds

Here we use underscore ("_") to indicate two arguments and the 2nd argument is the time it takes (in seconds) for reaching the first argument.
Stopping Sounds

How to turn the sound off!

The most important, and too often neglected, part of sound software documentation is the information on how to turn the sound off. In the Threnoscope you kill the drone, the chord or the satellite with a .kill method, or you can stop everything with a .killAll command.

~oxo.kill(10) // here it takes 10 seconds to fade out
~drones.killAll // kill all the drones 
~drones.killAll(3) // kill all the drones in three seconds.

Creating Chords

Creating a cluster of drones

Sometimes you might want to create more than one drone at the same time. For this you can use "chords" (like piano or guitar chords) and the most typical well-known chords are available in the Threnoscope. Here is the list of chords: "| 5 | minorMajor7th | sus4 | 6 | minor13 | minor7add13 | minorAdd9 | 7s5 | major13 | dominant7th | m7b5 | minorMajor9 | 7s9 | minor6 | major7add13 | 9s11 | 7sus4 | major9sus4 | m7b9 | minor7add11 | minorMajor7thAdd13 | minor9 | add9 | minor11 | 9 | minorMajor7add11 | minorMajor13 | dominant7add11 | minor6add9 | 7b9 | 9b13 | 13 | 7b5 | major7sus4 | 7s5b9 | minor7th | sus2 | 11 | major | minor | m7s5 | dominant7add13 | major7add11 | minorMajor11 | 6sus4 | major9 | major11 | major7th | 9sus4 | 6add9 |"

~drones.createChord(\saw, \minor, 2)
~drones.createChord(\saw, \dominant7add11, 4, name:\dom7)

~dom7.tonic_(1, 4)
~dom7.harmonics_(10, 4)
~drones.chords // see all the available chords

The chords have all the methods of the drone, so "harmonics", "tonic", "type" etc. are all available methods. You can also create your own chord by passing in an array with the notes of the scale (the array starts with the index of 1). You can also create a chord out of existing drones.

~drones.scale = \chromatic
~drones.createChord(\tri, [1, 3, 5, 11], tonic: 4, name: \ixi)
~drones.createDrone(\sine, 2, degree: 1, name:\tonic)
~drones.createDrone(\sine, 2, degree: 3, name:\third)
~drones.createDrone(\sine, 2, degree: 5, name:\fifth)
~drones.defineChord(\dog, \tonic, \third, \fifth)
~dog.tonic = 4 // move the new chord up to the 4rth octave

Creating Satellites

A larger cluster of drones moving in space

Like the chords, the satellites share all the methods of the drone

~drones.createSatellites(\saw, \minor, 8, name: \ooo)
~ooo.num = 40
~ooo.speed={rrand(-20, 30)} // pass a function so each satellite gets a different speed

Tunings and Scales

The inbuilt tunings and scales and the Scala tuning library support

The Threnoscope supports over 3800 musical scales and tunings through inbuilt scales and tunings and through supporting the Scala library. Users can also create their own scales and tunings with the Threnoscope's TuningTheory software.

// let's look at the scale view for tunings
~drones.drawHarmonics = false
~drones.drawScale = true
// we move to the chromactic scale (all 12 notes) to see the different tunings
~drones.scale = \chromatic
~drones.tuning = \just
~drones.tuning = \mean6
~drones.tuning = \et12 // the standard western equal tempered tuning
~drones.tuning = \wcSJ // Wendy Carlos' Super Just Tuning
~drones.scale = \minor
~drones.tuning = \et12

// let's try some Scala scales/tunings
~drones.scale = \mean19
~drones.scale = \safi_arabic
~drones.scale = \safi_rahevi
~drones.scale = \solar
~drones.scale = 'bohlen-p' // because of the hyphen we need quotation marks
~drones.scale = 'bohlen-p_9'

Threnoscope Scores

The score system for automatic play or augmented performance

The Thenoscope has a very simple scores system that allows users to compose full pieces (deterministic or generative), or simple "licks" that can be called during a performance. These scores can play on their own or during a performance where the live coder is working on their own composition. The score is a simple two-dimensional array, where the first index is the time (in seconds) the code will be executed at, and the second is the SuperCollider code itself. Example:

[ 123.rand, [
	[ 0, {~drones.env_([24,5])} ],
	[ 1, {~drones.createDrone(\eliane, 2, amp:0.2, name:\eli2, harmonics: 4, speed:0, length:220, angle: 20)} ],
	[ 20, {~drones.createDrone(\eliane, 1, amp:0.1, name:\eli1, speed: 0, length:320, angle: 100)} ],
	[ 30, {~eli1.harmonics_(10, 20)} ],
	[ 40, {~eli1.resonance = true} ],
	[ 50, {~eli2.harmonics_(2, 20)} ],
	[ 70, {~eli1.resonance_(20, 30)} ],
	[ 70, {~eli1.resonance_(20, 30)} ],
	[ 110, {~drones.createDrone(\eliane, 3, amp:0.2, name:\eli3a, speed: 5, length:120, angle: 230)} ],
	[ 140, {~drones.createDrone(\eliane, 3, amp:0.2, name:\eli3b, speed: -5, length:120, angle: 230)} ],
	[ 220, {~eli1.resonance_(2, 30)} ],
	[ 330, {~eli2.kill} ],
	[ 340, {~eli1.resonance_(1, 15)} ],
	[ 350, {~eli3a.kill} ],
	[ 360, {~eli3b.kill} ],
	[ 400, {~eli1.kill} ]

GUI and Automation

Controlling the Interface via mouse and keyboard

The drones in the Threnoscope can be controlled in various ways:
* the drone can be rotated around the circle by clicking on it and moving it
* the drone can be "played" where the keys 1..9 represent the degrees of the chosen scale
* by clicking on the drone, its information appears in the post window (and can be changed there)
* using the arrow buttons, one can scroll through the drones and select them
* any parameter of the drone can be set or recorded by moving the mouse on a slider

~drones.createDrone(\eliane, 2, degree: 5, name: \oxo)
~oxo.setParam(\tonic, 1, 10) // the argument and its low and high values
~oxo.recParam(\harmonics, 1, 10) // move the mouse around to record. On release it will play

MIDI support

The Threnscope has various MIDI functionality

Drones can be controlled by MIDI controllers and the system can play MIDI files. However, this is in early stages, and users will need to explore the source code themselves to make the code specific to their own MIDI controller. This code is in the source code file.


Automation of drone states through machines

Machines can be created to change the state of the existing drones (or selected part of them). These can control parameters that can be set through the other interface channels (e.g., tonic, degree, ratio, harmonics, amp, resonance, etc.). Like the MIDI support, this is in early stages.