create a 30 second composition that has the feeling of 'Sad music for painting dying flowers' - do the BEST ever possible.

the final composition need to be a direct expression (using ->>) rather than being stored in a variable. This ensures it gets evaluated and played after pressing the play button.

Documentation:
Synthesis

These functions are used to generate signals that can then be shaped or combined with other signals.
Description	Usage
sawtooth	A waveform with prominent harmonics	(sawtooth 440)
sine	A simple sine wave	(sawtooth 440)
square	A wave containing only odd harmonics	(square 440)
triangle	A wave with subtle harmonics	(triangle 440)
white-noise	Random noise	white-noise

These functions are used to shape other signals.
Description	Usage
gain	Multiply a signal by the given factor.	(gain 0.5)
high-pass	Cut out low frequencies.	(high-pass 500)
low-pass	Cut out high frequencies.	(low-pass 1000)

These functions define the shape of a note.
Description	Usage
adsr	An envelope with attack, decay, sustain and release.	(adsr 0.1 0.2 0.5 0.1)
percussive	A simple envelope with just attack and decay	(percussive 0.1 0.3)

These functions combine signals together.
Description	Usage
add	Add two or more signals together.	(add
(sine 440)
(sine 660))
connect->	Connect two or more signal processors together	(connect->
(sawtooth 440)
(low-pass 800))
Composition

These functions are used to build melodies.
Description	Usage
phrase	Turn a list of durations and a list of pitches into a melody.	(phrase
[1 1 2/3 1/3 1]
[0 0   0   2 3])

These functions are used to combine melodies.
Description	Usage
then	Sequence two melodies together.	(->> intro
(then verse))
times	Repeat a melody.	(->> chorus
(times 4))
with	Overlay two melodies.	(->> bass
(with drums))

These functions are used to put melodies into specific keys and tempos.
Description	Usage
A..G	The different musical keys.	(->> piece
(where :pitch
(comp C major)))
all	Set a property of every note in a melody.	(->> solo
(all :instrument horn))
bpm	Specify a beats-per-minute tempo.	(->> piece
(tempo (bpm 120)))
flat	Lower a scale by a semitone	(->> piece
(where :pitch
(comp B flat major)))
high	Raise a scale by an octave.	(->> piece
(where :pitch
(comp low C major)))
low	Lower a scale by an octave.	(->> piece
(where :pitch
(comp low C major)))
major	A happy-sounding scale.	(->> piece
(where :pitch
(comp C major)))
minor	A sad-sounding scale.	(->> piece
(where :pitch
(comp D minor)))
sharp	Raise a scale by a semitone	(->> piece
(where :pitch
(comp B flat major)))
tempo	Put a melody in a tempo at a particular beats-per-minute.	(->> piece
(tempo (bpm 120)))
where	Update a particular attribute of each note in a melody.	(->> piece
(where :pitch
(comp D minor)))

Sound is made up of pressure waves in the air. Here is the simplest possible synthesiser - a sine wave with a frequency of 440 hertz. When the button is pressed, the code in the box is evaluated to produce sound. Anything after a ";" is ignored, so we can include little notes alongside the code.

(sine 440) ; What happens if you raise the frequency?

That's a bit loud. To control the volume of a sound, we alter the amplitude of the wave. To do that, we need something called a gain. A gain multiplies the amplitude by a specified factor. We use it by connecting our sine wave to it.

(connect->

(sine 440)

(gain 0.1)) ; Try adjusting the gain.

To show that sound is made from sine waves, let's add together two waves that have slightly different frequencies. As they fall in and out of phase, they alternately reinforce and cancel each other out.

(connect->

(add

(sine 440)

(sine 442)) ; What happens if the two frequencies are further apart? Why?


(gain 0.1))

The sound cuts off too abruptly. In order to shape it into a real note, we need what's called an envelope. The simplest example of an envelope is a percussive envelope. A percussive envelope is defined by an attack (how long it takes the note to get to maximum loundness) and a decay (how long it takes the note to die away). We use the envelope by adding it to our chain of connected synthesis nodes.

(connect->

(add

(sine 440)

(sine 442))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(percussive 0.001 0.4) ; What does it sound like if you reverse attack and decay?

(gain 0.1))

Sine waves are the simplest oscillators, but there are other periodic waves that also produce sound. Examples include square waves and sawtooth waves.

(connect->

(square 440) ; Try a sawtooth wave.

(percussive 0.001 0.4)

(gain 0.1))

Non-sinusoidal waves like squares can be expressed as the sum of a series of sine waves. The mathematical details don't concern us at the moment, but we can take advantage of the fact by subtly shaping sounds by filtering out some frequencies. One kind of frequency filter is the high-pass filter, which removes frequencies below a cutoff. A low-pass filter does the opposite, and removes frequencies above a cutoff.

(connect->

(add

(square 440)

(sawtooth 442))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(low-pass 600) ; What changes if you raise the cutoff frequency to 2600?

(percussive 0.001 0.4)

(gain 0.1))

Many instruments can sustain a note over a period of time. To achieve that, we use an ADSR envelope instead of a percussive one. As well as an initial attack and decay (AD), an ADSR envelope holds the sound at a sustain level (S) before dying away over the release (R).

(connect->

(add

(square 440)

(sawtooth 442))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(low-pass 600)

(adsr 0.001 0.4 0.5 0.1) ; How does a longer attack sound?

(gain 0.1))

A melody is a sequence of notes. Each note occurs at a particular time and with a particular pitch. We can compose a melody out of a list of the durations of each note and a list of the pitches of each note.

(phrase [3/3 3/3 2/3 1/3 3/3] ; You can change both the durations and the pitches.

[ 72  72  72  74  76])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

We can combine two melodies to make a longer one.

(->>

(phrase [3/3 3/3 2/3 1/3 3/3] ; Can you recognise the tune yet?

[ 72  72  72  74  76])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(then

(phrase [2/3 1/3 2/3 1/3 3/3]

        [ 76  74  76  77  79])))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

Alternatively, we can play two melodies at the same time. If they're well-chosen, we'll get harmony. If not, we might still get something interesting.

(->> ; The arrow combines melodies like connect-> combines synthesiser nodes.

(phrase [3/3 3/3 2/3 1/3 3/3]

[ 72  72  72  74  76])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(with

(phrase [2/3 1/3 2/3 1/3 3/3]

        [ 76  74  76  77  79])))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

We can repeat melodies several times.

(->>

(phrase [3/3 3/3 2/3 1/3 3/3]

[ 72  72  72  74  76])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(with

(phrase [2/3 1/3 2/3 1/3 3/3]

        [ 76  74  76  77  79]))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(times 2)) ; What happens if the times is put before the with? Why?

So far every unit of time has been a second, in other words 60 beats per minute. If we want to speed up or slow down the music, we can define how many beats-per-minute there are. We use 'tempo' to update the time and duration of each note according to the chosen 'bpm'.

(->>

(phrase [3/3 3/3 2/3 1/3 3/3]

[ 72  72  72  74  76])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(with

(phrase [2/3 1/3 2/3 1/3 3/3]

        [ 76  74  76  77  79]))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(times 2)

(tempo (bpm 90))) ; Try making the music faster or slower.

We have to be careful which pitches we choose if we want the result to sound musical. A given piece of music focuses on certain pitches and ignores others, determined by the key of the piece. For example, 72 and 74 are in C major, but 73 is not. A convenient way to write songs in-key is to number the notes within the key and then later use code to translate those numbers into specific pitches. Here we use 'where' to put each note in C major.

(->>

(phrase [3/3 3/3 2/3 1/3 3/3]

[  0   0   0   1   2])
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(with

(phrase [2/3 1/3 2/3 1/3 3/3]

        [  2   1   2   3   4]))
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END

(times 2)

(tempo (bpm 90))

(where :pitch (comp high C major))) ; How does minor sound different to major?

Example:
; A synthesiser we can play our piece on.
(defn synth [note]
(connect->
(add (square (* 1.01 (:pitch note))) (sawtooth (:pitch note)))
(low-pass 600)
(adsr 0.001 0.4 0.5 0.1)
(gain 0.15)))

(def melody
; The durations and pitches of the notes. Try changing them.
(->> (phrase [1 1/2 1/2 1 1 2 2] [0 1 0 2 -3 1 -1])
(all :instrument synth))) ; Here we choose the instrument.

(def harmony
; The durations and pitches of the harmony's notes.
(->> (phrase [1 1/2 1/2 1 1 1/2 1/2 1/2 1/2 2] [4 4 5 4 7 6 7 6 5 4])
(all :instrument synth))) ; bell, wah, organ and marimba are also instruments.

(def bass
; The durations and pitches of the bass.
(->> (phrase (cycle [3 0.75 0.25]) [-14 -15 -16 -17 -16 -15])
(all :instrument wah)))

(def variation
; The durations and pitches of the bass.
(->> (phrase [3 1 3/2 5/2] [9 11 8 10])
(all :instrument marimba)))

(def beat
(->> (phrase [1 1/2 1/2 1 1] (repeat 0))
(having :instrument [kick closed-hat kick kick closed-hat])
(times 2)))

(->> melody
;(with harmony)   ; Uncomment to include the harmony.
;(with bass)      ; Uncomment to include the bass.
;(with variation) ; Uncomment to include the harmony.
;(with beat)      ; Uncomment to include the beat.
(tempo (bpm 90))  ; Try changing the number.
(where :pitch (comp C major))) ; Try D or minor.

Now we know how to make both instruments and melodies, we can create whole songs. To make the experience more interactive, lets graph the notes we're playing, and loop them over and over again as we edit the synthesiser and the composition.