From 07cb8f800379f6ce8d12747edbc80b7f08b53745 Mon Sep 17 00:00:00 2001 From: HiveBeats Date: Mon, 5 Jun 2023 01:27:44 +0400 Subject: [PATCH] feat: note transcription convention --- SoundGen/Program.fs | 151 ++++++++------------------------------------ SoundGen/Synth.fs | 4 +- 2 files changed, 29 insertions(+), 126 deletions(-) diff --git a/SoundGen/Program.fs b/SoundGen/Program.fs index 630b407..b0fbb00 100644 --- a/SoundGen/Program.fs +++ b/SoundGen/Program.fs @@ -4,135 +4,36 @@ 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 = - [ // - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.5 - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25 - note 0 0.25; - note 0 0.5; - - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25 - note 5 0.25; - note 5 0.5; - - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25 - note 3 0.25; - note 3 0.5 - note (-2) 0.5 - // - // - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.5 - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25 - note 0 0.25; - note 0 0.5; - - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25 - note 5 0.25; - note 5 0.5; - - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25 - note 3 0.25; - note 3 0.5 - note (-2) 0.5 - // - // - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.5 - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25 - note 0 0.25; - note 0 0.5; - - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25 - note 5 0.25; - note 5 0.5; - - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25 - note 3 0.25; - note 3 0.5 - note (-2) 0.5 - // - // - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.5 - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25; - note 0 0.25 - note 0 0.25; - note 0 0.5; - - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25; - note 5 0.25 - note 5 0.25; - note 5 0.5; - - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25; - note 3 0.25 - note 3 0.25; - note 3 0.5 - note (-2) 0.5 - ] + notes + |> Seq.map getNoteSound |> Seq.concat - let writeToFile (ms: MemoryStream) = use fs = new FileStream(Path.Combine(__SOURCE_DIRECTORY__, "test.wav"), FileMode.Create) diff --git a/SoundGen/Synth.fs b/SoundGen/Synth.fs index 5c5be3f..c4fec43 100644 --- a/SoundGen/Synth.fs +++ b/SoundGen/Synth.fs @@ -7,7 +7,7 @@ open SoundGen.Oscillator let private getHzBySemitones semi = pitchStandard * (2. ** (1. / 12.)) ** semi -let private getSemitoneShift (rootNote : string) (targetNote : string) : int = +let getSemitoneShift (rootNote : string) (targetNote : string) : int = // Define arrays to map pitch classes to numeric values and vice versa let pitchClasses = [| "C"; "C#"; "D"; "D#"; "E"; "F"; "F#"; "G"; "G#"; "A"; "A#"; "B" |] let pitchClassValues = [| 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11 |] @@ -25,6 +25,8 @@ let private getSemitoneShift (rootNote : string) (targetNote : string) : int = + + let private freq hz duration (osc: OscillatorParameter list) = let samples = seq { 0.0 .. (duration * sampleRate) }