refactor: format code
This commit is contained in:
@@ -10,39 +10,70 @@ let attackMs = 100.
|
|||||||
|
|
||||||
let getHzBySemitones semi =
|
let getHzBySemitones semi =
|
||||||
pitchStandard * (2. ** (1. / 12.)) ** semi
|
pitchStandard * (2. ** (1. / 12.)) ** semi
|
||||||
|
|
||||||
let getSemitonesByNote (str: string) =
|
let getSemitonesByNote (str: string) =
|
||||||
let defaultOctave = 4
|
let defaultOctave = 4
|
||||||
let notes = ["A"; "A#"; "B"; "C"; "C#"; "D"; "D#"; "E"; "F"; "F#"; "G"; "G#" ] |> List.toArray
|
|
||||||
let octave = str.Substring(str.Length - 1) |> int
|
let notes =
|
||||||
let noteShift = Array.findIndex (fun e -> e = str.Substring(0, str.Length - 1)) notes
|
[ "A"
|
||||||
|
"A#"
|
||||||
|
"B"
|
||||||
|
"C"
|
||||||
|
"C#"
|
||||||
|
"D"
|
||||||
|
"D#"
|
||||||
|
"E"
|
||||||
|
"F"
|
||||||
|
"F#"
|
||||||
|
"G"
|
||||||
|
"G#" ]
|
||||||
|
|> List.toArray
|
||||||
|
|
||||||
|
let octave =
|
||||||
|
str.Substring(str.Length - 1) |> int
|
||||||
|
|
||||||
|
let noteShift =
|
||||||
|
Array.findIndex (fun e -> e = str.Substring(0, str.Length - 1)) notes
|
||||||
|
|
||||||
(octave - defaultOctave - 1) * 12 + noteShift
|
(octave - defaultOctave - 1) * 12 + noteShift
|
||||||
|
|
||||||
let toInt16Sample sample = sample |> (*) 32767. |> int16
|
let toInt16Sample sample = sample |> (*) 32767. |> int16
|
||||||
|
|
||||||
let freq hz duration =
|
let freq hz duration =
|
||||||
let samples = seq { 0.0..(duration * sampleRate) }
|
let samples =
|
||||||
|
seq { 0.0 .. (duration * sampleRate) }
|
||||||
|
|
||||||
let attack =
|
let attack =
|
||||||
let samplesToRise = (sampleRate * (0.001 * attackMs));
|
let samplesToRise =
|
||||||
|
(sampleRate * (0.001 * attackMs))
|
||||||
|
|
||||||
let risingDelta = 1. / samplesToRise
|
let risingDelta = 1. / samplesToRise
|
||||||
let mutable i = 0.
|
let mutable i = 0.
|
||||||
seq { while true do
|
|
||||||
|
seq {
|
||||||
|
while true do
|
||||||
i <- i + risingDelta
|
i <- i + risingDelta
|
||||||
yield min i 1.
|
yield min i 1.
|
||||||
}
|
}
|
||||||
|
|
||||||
let output = Seq.map
|
let output =
|
||||||
(fun x -> x
|
Seq.map
|
||||||
|
(fun x ->
|
||||||
|
x
|
||||||
|> (*) (2. * System.Math.PI * hz / sampleRate)
|
|> (*) (2. * System.Math.PI * hz / sampleRate)
|
||||||
|> sin
|
|> sin
|
||||||
|> (*) volume
|
|> (*) volume)
|
||||||
)
|
|
||||||
samples
|
samples
|
||||||
|
|
||||||
let adsrLength = Seq.length output
|
let adsrLength = Seq.length output
|
||||||
let attackArray = attack |> Seq.take adsrLength
|
|
||||||
|
let attackArray =
|
||||||
|
attack |> Seq.take adsrLength
|
||||||
|
|
||||||
let release = Seq.rev attackArray
|
let release = Seq.rev attackArray
|
||||||
|
|
||||||
Seq.zip3 release attackArray output
|
Seq.zip3 release attackArray output
|
||||||
|> Seq.map (fun (x, y, z) -> (x * y * z) |> toInt16Sample)
|
|> Seq.map (fun (x, y, z) -> (x * y * z))
|
||||||
|
|
||||||
|
|
||||||
let note semitone beats =
|
let note semitone beats =
|
||||||
@@ -50,9 +81,7 @@ let note semitone beats =
|
|||||||
freq hz (beats * beatDuration)
|
freq hz (beats * beatDuration)
|
||||||
|
|
||||||
let song =
|
let song =
|
||||||
[
|
[ note 3 0.5
|
||||||
//
|
|
||||||
note 3 0.5
|
|
||||||
note 3 0.5
|
note 3 0.5
|
||||||
note 15 0.5
|
note 15 0.5
|
||||||
note 15 0.5
|
note 15 0.5
|
||||||
@@ -90,13 +119,15 @@ let song =
|
|||||||
note (-2) 0.5
|
note (-2) 0.5
|
||||||
note (-2) 0.5
|
note (-2) 0.5
|
||||||
note 10 0.5
|
note 10 0.5
|
||||||
note 15 0.5
|
note 15 0.5 ]
|
||||||
//
|
|> Seq.concat
|
||||||
] |> Seq.concat
|
|
||||||
|
|
||||||
let pack (d: int16 []) =
|
let pack (d: int16 []) =
|
||||||
let stream = new MemoryStream();
|
let stream = new MemoryStream()
|
||||||
let writer = new BinaryWriter(stream, System.Text.Encoding.ASCII);
|
|
||||||
|
let writer =
|
||||||
|
new BinaryWriter(stream, System.Text.Encoding.ASCII)
|
||||||
|
|
||||||
let dataLength = Array.length d * 2
|
let dataLength = Array.length d * 2
|
||||||
|
|
||||||
// RIFF
|
// RIFF
|
||||||
@@ -118,24 +149,20 @@ let pack (d:int16[]) =
|
|||||||
// data
|
// data
|
||||||
writer.Write(System.Text.Encoding.ASCII.GetBytes("data"))
|
writer.Write(System.Text.Encoding.ASCII.GetBytes("data"))
|
||||||
writer.Write(dataLength)
|
writer.Write(dataLength)
|
||||||
let data:byte[] = Array.zeroCreate dataLength
|
|
||||||
|
let data: byte [] =
|
||||||
|
Array.zeroCreate dataLength
|
||||||
|
|
||||||
System.Buffer.BlockCopy(d, 0, data, 0, dataLength)
|
System.Buffer.BlockCopy(d, 0, data, 0, dataLength)
|
||||||
writer.Write(data)
|
writer.Write(data)
|
||||||
stream
|
stream
|
||||||
|
|
||||||
let write (ms: MemoryStream) =
|
let write (ms: MemoryStream) =
|
||||||
use fs = new FileStream(Path.Combine(__SOURCE_DIRECTORY__,"test.wav"), FileMode.Create)
|
use fs =
|
||||||
|
new FileStream(Path.Combine(__SOURCE_DIRECTORY__, "test.wav"), FileMode.Create)
|
||||||
|
|
||||||
ms.WriteTo(fs)
|
ms.WriteTo(fs)
|
||||||
|
|
||||||
song |> Seq.toArray |> pack |> write
|
song |> Seq.map (fun x -> x |> toInt16Sample) |> Seq.toArray |> pack |> write
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// let drawWave(freq, duration) =
|
|
||||||
// Chart.Line(seq { 1. .. (duration * sampleRate) }, sound)
|
|
||||||
// |> Chart.saveHtml("chart.html")
|
|
||||||
// drawWave(440., 1.)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user