44 lines
1.2 KiB
Forth
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 |