Generating music with F#

March 22, 2015

Read time 1 min

For a long time I have been fascinated with the idea of generating music programmatically. I decided to give it a go using F# and this is what I came up with. I wrote a program that generates a short melody in the key of C major. Not exactly Mozart, but it’s a start.

I created a type for notes and a Map of notes to their frequencies:

type note = C | Cis | D | Dis | E | F | Fis | G | Gis | A | Ais | B

let frequency = Map.ofList [(C, 261.63); (Cis, 277.18); (D, 293.66); 
(Dis, 311.13); (E, 329.63);(F, 349.23); (Fis, 369.99); (G, 392.00); 
(Gis, 415.30);(A, 440.00); (Ais, 466.16); (B, 493.88)]

A scale of C major can be modelled as a list consisting of the notes of the scale:

let cMajor = [C; D; E; F; G; A; B]

Creation of a melody is only picking wanted amount of notes from the scale randomly

let randomMelody () = 
    let r = System.Random()
    let length = cMajor.Length
    seq {0 .. 7} |> Seq.map (fun x -> cMajor.[r.Next(0, length)])

Frequencies for the notes can be extracted and then written to wave file

randomMelody() 
        |> Seq.map (fun x -> frequency.[x])
        |> Synth.writeMelody

I took code to create wav-files from Liam McClennan’s blog. All I did was wrap it in a module called Synth and created an public function that takes a list of frequencies. Here is an example output:

That’s it so far. Nothing fancy but hopefully something to build on in the future. The full source can be found on Github

Sign up for our newsletter

Get the latest from us in tech, business, design – and why not life.