53 lines
1.5 KiB
C#
53 lines
1.5 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Chip8.Core.Audio;
|
|
|
|
public static class WavFile
|
|
{
|
|
public const int bitsPerSample = 16;
|
|
public const int channels = 1;
|
|
|
|
public static byte[] write(short[] samples, int sampleRate)
|
|
{
|
|
if (sampleRate <= 0)
|
|
{
|
|
throw new ArgumentOutOfRangeException(nameof(sampleRate), "sample rate must be positive");
|
|
}
|
|
|
|
int dataBytes = samples.Length * sizeof(short);
|
|
int blockAlign = channels * (bitsPerSample / 8);
|
|
int byteRate = sampleRate * blockAlign;
|
|
|
|
using var stream = new MemoryStream(44 + dataBytes);
|
|
using var writer = new BinaryWriter(stream, Encoding.ASCII);
|
|
|
|
writer.Write(Encoding.ASCII.GetBytes("RIFF"));
|
|
writer.Write(36 + dataBytes);
|
|
writer.Write(Encoding.ASCII.GetBytes("WAVE"));
|
|
|
|
writer.Write(Encoding.ASCII.GetBytes("fmt "));
|
|
writer.Write(16);
|
|
writer.Write((short)1);
|
|
writer.Write((short)channels);
|
|
writer.Write(sampleRate);
|
|
writer.Write(byteRate);
|
|
writer.Write((short)blockAlign);
|
|
writer.Write((short)bitsPerSample);
|
|
|
|
writer.Write(Encoding.ASCII.GetBytes("data"));
|
|
writer.Write(dataBytes);
|
|
foreach (short sample in samples)
|
|
{
|
|
writer.Write(sample);
|
|
}
|
|
|
|
writer.Flush();
|
|
return stream.ToArray();
|
|
}
|
|
|
|
public static void writeFile(string path, short[] samples, int sampleRate) =>
|
|
File.WriteAllBytes(path, write(samples, sampleRate));
|
|
}
|