Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jiro4989/wave
The wave is a tiny WAV sound module
https://github.com/jiro4989/wave
lib media nim sound wave
Last synced: about 1 month ago
JSON representation
The wave is a tiny WAV sound module
- Host: GitHub
- URL: https://github.com/jiro4989/wave
- Owner: jiro4989
- Created: 2020-01-22T22:45:59.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2023-10-11T10:30:22.000Z (about 1 year ago)
- Last Synced: 2024-08-04T03:06:49.572Z (5 months ago)
- Topics: lib, media, nim, sound, wave
- Language: Nim
- Homepage: https://jiro4989.github.io/wave/wave.html
- Size: 629 KB
- Stars: 22
- Watchers: 4
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.rst
Awesome Lists containing this project
- awesome-nim - wave - A tiny WAV sound module. (Multimedia / Audio)
README
====
wave
====|gh-actions|
The wave is a tiny `WAV `_ sound module.
It does not support compression/decompression, but it does support mono/stereo.
The wave is inspired by `Python wave `_.**Note:**
The wave is not supported some sub-chunks yet.
I will support sub-chunks (`fact`, `cue`, `plst`, `list`, `labl`, `note`, `ltxt`, `smpl`, `inst`) in the future... contents:: Table of contents
:depth: 3Installation
============.. code-block:: Bash
nimble install wave
Usage
=====Reading example
---------------.. code-block:: nim
import wave
var wav = openWaveReadFile("tests/testdata/sample1.wav")
doAssert wav.riffChunkDescriptorSize == 116
doAssert wav.numChannels == numChannelsMono
doAssert wav.sampleRate == 8000'u32
doAssert wav.byteRate == 8000'u32
doAssert wav.blockAlign == 1'u16
doAssert wav.bitsPerSample == 8'u16
doAssert wav.numFrames == 80
doAssert wav.dataSubChunkSize == 80'u16
echo wav
## Output:
## (riffChunkDescriptor: (id: "RIFF", size: 116, format: "WAVE"), formatSubChunk: (id: "fmt ", size: 16, format: 1, numChannels: 1, sampleRate: 8000, byteRate: 8000, blockAlign: 1, bitsPerSample: 8, extendedSize: 0, extended: @[]), dataSubChunk: (id: "data", size: 80, data: ...), audioStartPos: 44)wav.close()
Writing example
---------------Square wave
^^^^^^^^^^^.. code-block:: nim
import wave
var wav = openWaveWriteFile("tests/testdata/example_square.wav")
wav.numChannels = numChannelsMono
wav.sampleRate = 8000'u16wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])
wav.writeFrames([0xFF'u8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00])wav.close()
Sine wave
^^^^^^^^^.. code-block:: nim
import wave
import mathlet
width = 127'f
sampleRate = 44100'f
hz = 440'f
seconds = 3var wav = openWaveWriteFile("tests/testdata/example_sine.wav")
wav.numChannels = numChannelsMono
wav.sampleRate = sampleRate.uint16for _ in 0 ..< seconds:
var buf: seq[byte]
for i in 0 ..< sampleRate.int:
let f = float(i)
let b = byte(width * sin(2*PI*hz*f/sampleRate) + width)
buf.add(b)
wav.writeFrames(buf)wav.close()
API document
============* https://jiro4989.github.io/wave/wave.html
Pull request
============Welcome :heart:
LICENSE
=======MIT
See also
========English
-------* `WAVE PCM soundfile format `_
* `Wav file format -musicg-api `_Japanese
--------* `cpython/Lib/wave.py `_
* `WAVEファイル読み・書き込み `_
* `WAV (Waveform Audio File Format) `_
* `WAVE(WAV)ファイルフォーマット `_
* `その103「WAVの構造と現状」 `_.. |gh-actions| image:: https://github.com/jiro4989/wave/workflows/build/badge.svg
:target: https://github.com/jiro4989/wave/actions