feat: private functions && fix reverb

This commit is contained in:
HiveBeats
2022-11-01 11:19:46 +04:00
parent 9d37e057d7
commit 4edafbe664
5 changed files with 25 additions and 24 deletions

View File

@@ -1,5 +1,5 @@
module SoundGen.Fx
open Settings
type Effect =
| Saturator
| Reverb
@@ -9,21 +9,22 @@ type Saturator = { Gain: float }
let saturate (param: Saturator, x: float) = tanh (param.Gain * x)
let sineWaveShape gain factor x =
x + gain * sin (factor * 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 delayMilliseconds = 500.//((1./8.) * beatDuration) // 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
let smpl = newBuffer.[i] * decay
newBuffer.[i + delaySamples] <- smpl
else newBuffer <- Array.append newBuffer (smpl |> Array.singleton)
newBuffer
//else newBuffer <- Array.append newBuffer (smpl |> Array.singleton)
Seq.zip buffer newBuffer
|> Seq.map (fun (x, y) -> x + y * 0.8)

View File

@@ -18,7 +18,7 @@ type GenerationParameter =
let pos hz x = (hz * x / sampleRate) % 1.
let private pos hz x = (hz * x / sampleRate) % 1.
let sineosc hz x =
x |> (*) (2. * Math.PI * hz / sampleRate) |> sin

View File

@@ -2,10 +2,10 @@ module SoundGen.PCMWave
open Settings
open System.IO
let toInt16Sample sample = sample |> (*) 32767. |> int16
let private toInt16Sample sample = sample |> (*) 32767. |> int16
let pack (d: int16 []) =
let private pack (d: int16 []) =
let stream = new MemoryStream()
let writer =

View File

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

View File

@@ -4,10 +4,10 @@ open Settings
open Oscillator
open SoundGen.Oscillator
let getHzBySemitones semi =
let private getHzBySemitones semi =
pitchStandard * (2. ** (1. / 12.)) ** semi
let getSemitonesByNote (str: string) =
let private getSemitonesByNote (str: string) =
let defaultOctave = 4
let notes =
@@ -34,7 +34,7 @@ let getSemitonesByNote (str: string) =
(octave - defaultOctave - 1) * 12 + noteShift
let freq hz duration (osc: OscillatorParameter list) =
let private freq hz duration (osc: OscillatorParameter list) =
let samples =
seq { 0.0 .. (duration * sampleRate) }
@@ -70,11 +70,11 @@ let freq hz duration (osc: OscillatorParameter list) =
let note semitone beats =
let hz = getHzBySemitones (semitone - 12.)
let hz = getHzBySemitones (semitone)
freq
hz
(beats * beatDuration)
[ { Osc = Sine; Freq = hz / 4. }
{ Osc = Saw; Freq = (hz + 1.) }
[ { Osc = Sine; Freq = hz / 4. };
{ Osc = Saw; Freq = (hz + 1.) };
{ Osc = Saw; Freq = (hz - 1.3) } ]