import "github.com/bake/wave"
Package wave offers a simplified API to read and write WAVE files by only allowing to work with samples directly.
format.go reader.go wave.go writer.go
type Format struct { AudioFormat uint16 // 1 if PCM is used. NumChans uint16 // Number of channels (1 = mono, 2 = stereo, ...) SampleRate uint32 // Samples per second (44100, ...). ByteRate uint32 // Average bytes per second. BlockAlign uint16 // Bytes per sample. BitsPerSample uint16 // Bits per sample. }
Format holds configuration about the WAVE.
Reader reads samples from a WAVE file.
Code:
r := bytes.NewReader([]byte{ // R, I, F, F, 76, W, A, V, E, 0x52, 0x49, 0x46, 0x46, 0x50, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45, // f, m, t, ␣, 16, 1, 2, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, // 44100, 176400, 4, 16, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04, 0x00, 0x10, 0x00, // d, a, t, a, 44, 0, 0, 0x64, 0x61, 0x74, 0x61, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 5924, -3298, 4924, 5180, -1770, -1768, 0x24, 0x17, 0x1e, 0xf3, 0x3c, 0x13, 0x3c, 0x14, 0x16, 0xf9, 0x18, 0xf9, // -6348, -23005, -3524, -3548, -12783, 3354, 0x34, 0xe7, 0x23, 0xa6, 0x3c, 0xf2, 0x24, 0xf2, 0x11, 0xce, 0x1a, 0x0d, // 0, 0, 5924, -3298, 4924, 5180, 0x00, 0x00, 0x00, 0x00, 0x24, 0x17, 0x1e, 0xf3, 0x3c, 0x13, 0x3c, 0x14, // -1770, -1768, 0x16, 0xf9, 0x18, 0xf9, }) wavr, err := wave.NewReader(r) if err != nil { log.Fatalf("could not create new wave reader: %v", err) } fmt.Printf("SampleRate: %d\n", wavr.Format.SampleRate) samples, err := wavr.Samples() if err != nil { log.Fatalf("could not read samples: %v", err) } fmt.Printf("Samples: %v\n", samples[:10])
Output:
SampleRate: 44100 Samples: [0 0 5924 -3298 4924 5180 -1770 -1768 -6348 -23005]
NewReader reads the initial chunks from a WAVE file and returns a new reader.
Sample returns the next sample from the wave file. Chunks that don't contain samples are skipped.
Samples reads the whole file and returns all samples.
type Writer struct {
// contains filtered or unexported fields
}
Writer writes samples to an io.WriteSeeker.
Code:
format := wave.Format{ AudioFormat: 1, NumChans: 2, SampleRate: 44100, ByteRate: 176400, BlockAlign: 4, BitsPerSample: 16, } samples := []int{ 0, 0, 5924, -3298, 4924, 5180, -1770, -1768, -6348, -23005, -3524, -3548, -12783, 3354, 0, 0, 5924, -3298, 4924, 5180, -1770, -1768, } ws := &writerseeker.WriterSeeker{} wavw, err := wave.NewWriter(ws, format) if err != nil { log.Fatalf("could not create wave writer: %v", err) } defer wavw.Close() for _, s := range samples { if err := wavw.Sample(s); err != nil { log.Fatalf("could not write sample %d: %v", s, err) } }
NewWriter creates a new WAVE Writer.
Close the underlying RIFF writers. The file writer needs to be closed separately.
Sample writes a sample.
Samples writes a slice of samples.
Path | Synopsis |
---|---|
riff | Package riff contains implementations for a reader and a writer for RIFF files. |
Package wave imports 5 packages (graph). Updated 2019-09-09. Refresh now. Tools for package owners.