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
Software professional with a passion for quality. Likes TDD and working in agile teams. Has worked with wide-range of technologies, backend and frontend, from C++ to Javascript. Currently very interested in functional programming.