{"id":16661063,"url":"https://github.com/mrkkrp/wave","last_synced_at":"2025-07-27T08:43:01.835Z","repository":{"id":13975143,"uuid":"75555838","full_name":"mrkkrp/wave","owner":"mrkkrp","description":"Work with WAVE and RF64 files in Haskell","archived":false,"fork":false,"pushed_at":"2023-10-25T15:57:16.000Z","size":185,"stargazers_count":8,"open_issues_count":1,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-05-08T20:24:44.539Z","etag":null,"topics":["haskell","rf64","wave"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mrkkrp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2016-12-04T18:28:39.000Z","updated_at":"2021-12-08T11:29:51.000Z","dependencies_parsed_at":"2023-09-26T23:08:42.900Z","dependency_job_id":null,"html_url":"https://github.com/mrkkrp/wave","commit_stats":{"total_commits":109,"total_committers":3,"mean_commits":"36.333333333333336","dds":0.4495412844036697,"last_synced_commit":"2731c5a664bfedc483b8fe824af3b9b612a0c328"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrkkrp%2Fwave","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrkkrp%2Fwave/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrkkrp%2Fwave/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mrkkrp%2Fwave/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mrkkrp","download_url":"https://codeload.github.com/mrkkrp/wave/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244838318,"owners_count":20518819,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["haskell","rf64","wave"],"created_at":"2024-10-12T10:33:21.675Z","updated_at":"2025-03-21T17:31:45.161Z","avatar_url":"https://github.com/mrkkrp.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Wave\n\n[![License BSD3](https://img.shields.io/badge/license-BSD3-brightgreen.svg)](http://opensource.org/licenses/BSD-3-Clause)\n[![Hackage](https://img.shields.io/hackage/v/wave.svg?style=flat)](https://hackage.haskell.org/package/wave)\n[![Stackage Nightly](http://stackage.org/package/wave/badge/nightly)](http://stackage.org/nightly/package/wave)\n[![Stackage LTS](http://stackage.org/package/wave/badge/lts)](http://stackage.org/lts/package/wave)\n[![CI](https://github.com/mrkkrp/wave/actions/workflows/ci.yaml/badge.svg)](https://github.com/mrkkrp/wave/actions/workflows/ci.yaml)\n\nThis library provides a safe interface that allows us to manipulate WAVE\nfiles in their “classic” form as well as files in the [RF64\nformat](https://tech.ebu.ch/docs/tech/tech3306-2009.pdf). RF64 adds the\nability to store files larger than 4 Gb.\n\nThe main feature of the API is that it does not allow the user to duplicate\ninformation and introduce errors in that way. For example, the block\nalignment can be calculated from other parameters of an audio stream, thus\nwe do not store it in the `Wave` record and do not allow the user to specify\nit. We provide, however, a way to calculate it given a `Wave` record, see\n`waveBlockAlign`. The same is true for the number of channels. The channel\nmask is a more general means of providing the information about the number\nof channels and the corresponding speaker positions, thus we only store the\nchannel mask.\n\nAnother feature of the library is that it does not dictate how to read or\nwrite the audio data. To write the audio data the user passes a callback\nthat receives a `Handle` as an argument. The size of the written data block\nis deduced automatically. This makes the library fast and open to different\nways of handling the audio data, including via foreign code.\n\n## Motivation\n\nI needed a way to work with WAVE files to finish the\n[`flac`](https://github.com/mrkkrp/flac) package and for analyzing input\ndata in WAVE format in general. The existing solutions\n([`WAVE`](https://hackage.haskell.org/package/WAVE),\n[`wavy`](https://hackage.haskell.org/package/wavy)) are not maintained and\npoorly designed. Suffice it to say that they read samples of audio stream\nand put them in a *linked list*, like `[[Sample]]` (the inner linked list is\nto store multi-channel data).\n\n## Limitations\n\nThe library only supports PCM format with samples represented as integers\nand floating point values.\n\n## Contribution\n\nIssues, bugs, and questions may be reported in [the GitHub issue tracker for\nthis project](https://github.com/mrkkrp/wave/issues).\n\nPull requests are also welcome.\n\n## License\n\nCopyright © 2016–present Mark Karpov\n\nDistributed under BSD 3 clause license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrkkrp%2Fwave","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmrkkrp%2Fwave","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmrkkrp%2Fwave/lists"}