Files
soundgen/SoundGen/PCMWave.fs
2022-11-01 11:19:46 +04:00

44 lines
1.2 KiB
Forth

module SoundGen.PCMWave
open Settings
open System.IO
let private toInt16Sample sample = sample |> (*) 32767. |> int16
let private pack (d: int16 []) =
let stream = new MemoryStream()
let writer =
new BinaryWriter(stream, System.Text.Encoding.ASCII)
let dataLength = Array.length d * 2
// RIFF
writer.Write(System.Text.Encoding.ASCII.GetBytes("RIFF"))
writer.Write(Array.length d)
writer.Write(System.Text.Encoding.ASCII.GetBytes("WAVE"))
// fmt
let sr = sampleRate |> int
writer.Write(System.Text.Encoding.ASCII.GetBytes("fmt "))
writer.Write(16)
writer.Write(1s) // PCM
writer.Write(1s) // mono
writer.Write(sr) // sample rate
writer.Write(sr * 16 / 8) // byte rate
writer.Write(2s) // bytes per sample
writer.Write(16s) // bits per sample
// data
writer.Write(System.Text.Encoding.ASCII.GetBytes("data"))
writer.Write(dataLength)
let data: byte [] =
Array.zeroCreate dataLength
System.Buffer.BlockCopy(d, 0, data, 0, dataLength)
writer.Write(data)
stream
let createWAV(wave: float seq) =
wave |> Seq.map (fun x -> x |> toInt16Sample) |> Seq.toArray |> pack