wip: reverb

This commit is contained in:
HiveBeats
2022-10-31 22:09:31 +04:00
parent fdc5c2f112
commit 2129b73fcb
3 changed files with 27 additions and 15 deletions

View File

@@ -9,14 +9,21 @@ type Saturator = { Gain: float }
let saturate (param: Saturator, x: float) = tanh (param.Gain * x)
let sineWaveShape x =
x + 2.8 * sin (2. * x)
let sineWaveShape gain factor x =
x + gain * sin (factor * x)
let reverb (buffer:float seq) =
let delayMilliseconds = 50.; // 500 is half a second
let delaySamples = (delayMilliseconds * 48.0) |> int; // assumes 44100 Hz sample rate
let decay = 0.5
let mutable newBuffer = Array.ofSeq buffer
for i in 0..Seq.length buffer do
let smpl = newBuffer.[i] * decay
if Array.length newBuffer > (i + delaySamples) then
newBuffer.[i + delaySamples] <- smpl
else newBuffer <- Array.append newBuffer (smpl |> Array.singleton)
newBuffer
//
// let process(effects:Effect list, sound:float seq) =
// let mutable output = sound
// effects
// |> List.iter((fun eff ->
// match eff with
// |Saturator -> output <- (output |> Seq.map saturate eff)))
//

View File

@@ -1,4 +1,5 @@
module SoundGen.Oscillator
open System
open Settings
@@ -10,6 +11,9 @@ let sineosc hz x =
let squareosc hz x =
let sign v : float = if v > 0.0 then 1. else -1.
x |> sineosc hz |> sign
let triangleosc (hz:float) (x:float) = 1. - Math.Abs((pos hz x) - 0.5) * 4.
let triangleosc (hz: float) (x: float) = 1. - Math.Abs((pos hz x) - 0.5) * 4.
let sawosc hz x = (pos hz x) * 2. - 1.
let sinesquareosc hz x = sawosc (hz / 4.) x + squareosc (hz/2.) x
let sinesquareosc hz x =
sawosc (hz / 4.) x + squareosc (hz / 2.) x

View File

@@ -55,8 +55,9 @@ let writeToFile (ms: MemoryStream) =
ms.WriteTo(fs)
song
|> Seq.map (fun x ->
let x1 = sineWaveShape x
saturate ({ Gain = 1.0 }, x1))
// |> Seq.map (fun x ->
// let x1 = sineWaveShape 2.8 2. x
// saturate ({ Gain = 1.0 }, x1))
//|> reverb
|> createWAV
|> writeToFile