feat: note transcription convention
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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) }
|
||||
|
||||
Reference in New Issue
Block a user