open System.IO open SoundGen open PCMWave open Fx open SoundGen.Fx open Synth open System type Note = { Name: string; Length: int } let parseNotes (input: string) = let gluedString = input.Replace ('\n', ' ') gluedString.Split([| ' ' |], StringSplitOptions.RemoveEmptyEntries) |> Seq.map (fun noteStr -> let noteSigns = noteStr.Split([| '-' |]) let name = noteSigns[0].Trim() let length = noteSigns[1].Trim() |> int { Name = name.Trim(); Length = length }) |> List.ofSeq let getNoteSound (input: Note) = let length = 1.0 / float input.Length let semitoneShift = getSemitoneShift "A4" input.Name note semitoneShift length let input = "A4-4 A4-4 A4-4 A4-4 A4-2 A4-4 A4-4 A4-4 A4-4 A4-4 A4-2 D5-4 D5-4 D5-4 D5-4 D5-4 D5-4 D5-2 C5-4 C5-4 C5-4 C5-4 C5-4 C5-4 C5-2 G4-2 " let notes = String.replicate 2 input |> parseNotes let song = notes |> Seq.map getNoteSound |> Seq.concat let writeToFile (ms: MemoryStream) = use fs = new FileStream(Path.Combine(__SOURCE_DIRECTORY__, "test.wav"), FileMode.Create) ms.WriteTo(fs) song //|> reverb |> Seq.map (waveshaper {Gain=1.5; Factor=2.5}) |> createWAV |> writeToFile