{"id":42844242,"url":"https://github.com/transcriptaze/wav2png","last_synced_at":"2026-01-30T11:55:19.982Z","repository":{"id":57573346,"uuid":"234984300","full_name":"transcriptaze/wav2png","owner":"transcriptaze","description":"Renders an audio WAV file as a PNG image.","archived":false,"fork":false,"pushed_at":"2024-06-26T19:56:19.000Z","size":82494,"stargazers_count":3,"open_issues_count":3,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-06-27T00:17:48.971Z","etag":null,"topics":["waveform","webgpu"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/transcriptaze.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-01-19T23:37:51.000Z","updated_at":"2024-06-26T19:55:53.000Z","dependencies_parsed_at":"2024-06-21T16:43:58.491Z","dependency_job_id":null,"html_url":"https://github.com/transcriptaze/wav2png","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/transcriptaze/wav2png","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fwav2png","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fwav2png/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fwav2png/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fwav2png/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/transcriptaze","download_url":"https://codeload.github.com/transcriptaze/wav2png/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fwav2png/sbom","scorecard":{"id":896899,"data":{"date":"2025-08-11","repo":{"name":"github.com/transcriptaze/wav2png","commit":"02623f61dfa95eb9c521034baaf5f73e5fde49c5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.1.0 not signed: https://api.github.com/repos/transcriptaze/wav2png/releases/46157740","Warn: release artifact v1.0.0 not signed: https://api.github.com/repos/transcriptaze/wav2png/releases/45264696","Warn: release artifact v1.1.0 does not have provenance: https://api.github.com/repos/transcriptaze/wav2png/releases/46157740","Warn: release artifact v1.0.0 does not have provenance: https://api.github.com/repos/transcriptaze/wav2png/releases/45264696"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/transcriptaze/wav2png/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/transcriptaze/wav2png/build.yml/main?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/build.yml:24","Warn: npmCommand not pinned by hash: .github/workflows/build.yml:30","Warn: npmCommand not pinned by hash: .github/workflows/build.yml:33","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":4,"reason":"6 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-24T14:04:30.529Z","repository_id":57573346,"created_at":"2025-08-24T14:04:30.534Z","updated_at":"2025-08-24T14:04:30.534Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28912152,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T08:15:08.179Z","status":"ssl_error","status_checked_at":"2026-01-30T08:14:31.507Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["waveform","webgpu"],"created_at":"2026-01-30T11:55:19.875Z","updated_at":"2026-01-30T11:55:19.974Z","avatar_url":"https://github.com/transcriptaze.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![build](https://github.com/transcriptaze/wav2png/workflows/build/badge.svg)\n\n# wav2png\n\nRenders a WAV file as a PNG image, with options to draw a grid, custom colouring and anti-aliasing. \n\nThere are three implementations:\n\n- A command line version (in the _go_ subdirectory), mostly intended for scripting and batch processing\n- An online version implemented by compiling this library to WASM, which can be found\n  [here](https://transcriptaze.github.io/W2P.html).\n- A WebGPU version in the _webgpu_ directory) for a faster interactive experience, \n  hosted on [CloudFlare Pages](https://wav2png.pages.dev).\n\n## Raison d'être\n\n_wav2png_ was originally created as a Go utility library to render an audio file as an anti-aliased waveform for\na WASM project - it just sseemed like a good idea to add a standalone command line version, and now a WebGPU \nimplementation for better interactivity.\n\n[\u003cimg width=\"256\" src=\"gallery/cli/acoustic.png\"\u003e](gallery/cli/acoustic.png)\n[\u003cimg width=\"256\" src=\"gallery/webgpu/line-bw.png\"\u003e](gallery/webgpu/line-bw.png)\n[\u003cimg width=\"256\" src=\"gallery/webgpu/gradient-yellow.png\"\u003e](gallery/webgpu/gradient-yellow.png)\n[\u003cimg width=\"256\" src=\"gallery/webgpu/gradient3E.png\"\u003e](gallery/webgpu/gradient3E.png)\n\n## Releases\n\n| *Version* | *Description*                                                                                            |\n| --------- | -------------------------------------------------------------------------------------------------------- |\n| v1.1.0    | Added `wav2mp4` command line utility                                                                     |\n| v1.0.0    | Initial release                                                                                          |\n\n\n## Installation\n\nPlatform specific executables can be downloaded from the [releases](https://github.com/transcriptaze/wav2png/releases) \npage. Installation is straightforward - download and extract the archive for your platform and place the executables in \na directory in your PATH. \n\n### Building from source\n\n#### Command line\nAssuming you have `Go` and `make` installed:\n\n```\ngit clone https://github.com/transcriptaze/wav2png.git\ncd wav2png/go\nmake build\n```\n\nIf you prefer not to use `make`:\n```\ngit clone https://github.com/transcriptaze/wav2png.git\ncd wav2png/go\nmkdir bin\ngo build -o bin ./...\n```\n\n#### WebGPU\n\n## Usage\n\n### wav2png\n\nCommand line:\n```\nwav2png [--debug] [options] [--out \u003cpath\u003e] \u003cwav\u003e\n\n  \u003cwav\u003e         WAV file to render.\n\n  --out \u003cpath\u003e  File path for PNG file - if \u003cpath\u003e is a directory, the WAV file name is\n                used. Defaults to the WAV file base path.\n\n  --debug       Displays occasionally useful diagnostic information.\n\nOptions:\n  --settings \u003cfile\u003e      JSON file with the default settings for the height, width, etc. Defaults to \n                         .settings.json if not specified, falling back to internal default values if \n                         .settings.json does not exist.\n\n  --width \u003cpixels\u003e       Width (in pixels) of the PNG image. Valid values are in the range 32 to 8192, \n                         defaults to 645px.\n\n  --height \u003cpixels\u003e      Height (in pixels) of the PNG image. Valid values are in the range 32 to 8192, \n                         defaults to 395px.\n  \n  --padding \u003cpixels\u003e     Padding (in pixels) between the border of the PNG and the extent of the rendered\n                         waveform. Valid values are -16 to +32, defaults to 2px.\n\n  --palette \u003cpalette\u003e    Palette used to colour the waveform. May be the name of one of the internal colour\n                         palettes or a user provided PNG file. Defaults to 'ice'\n  \n  --fill \u003cfillspec\u003e      Fill specification for the background colour, in the form type:colour \n                         e.g. solid:#0000ffff. Currently the only fill type supported is 'solid', defaults\n                         to solid:#000000ff.\n\n  --grid \u003cgridspec\u003e      Grid specification for an optional rectilinear grid, in the form \n                         type:colour:size:overlay, e.g.\n                         - none\n                         - square:#008000ff:~64\n                         - rectangle:#008000ff:~64x48:overlay\n                         \n                         The size may preceded by a 'fit':\n                         - ~  approximate\n                         - =  exact\n                         - ≥  at least\n                         - ≤  at most\n                         - \u003e  greater than\n                         - \u003c  less than\n\n                         If gridspec includes :overlay, the grid is rendered 'in front' of the waveform.\n\n                         The default gridspec is 'square:#008000ff:~64'\n\n  --antialias \u003ckernel\u003e   The antialising kernel applied to soften the rendered PNG. Valid values are:\n                         - none        no antialiasing\n                         - horizontal  blurs horizontal edges\n                         - vertical    blurs vertical edges\n                         - soft        blurs both horizontal and vertical edges\n\n                         The default kernel is 'vertical'.\n\n  --scale \u003cscale\u003e        A vertical scaling factor to size the height of the rendered waveform. The valid \n                         range is 0.2 to 5.0, defaults to 1.0.\n\n  --mix  \u003cmixspec\u003e       Specifies how to combine channels from a stereo WAV file. Valid values are:\n                         - 'L'    Renders the left channel only\n                         - 'R'    Renders the right channel only\n                         - 'L+R'  Combines the left and right channels\n                         \n                         Defaults to 'L+R'.\n\n  --start \u003ctime\u003e         The start time of the segment of audio to render, in Go time format (e.g. 10s or\n                         1m5s). Defaults to 0s.\n\n  --end \u003ctime\u003e           The end time of the segment of audio to render, in Go time format (e.g. 10s or\n                         1m5s). Defaults to the end of the audio.\n\n\nExample:\n\nwav2png --debug                                        \\\n          --settings 'settings.json'                     \\\n          --height 390                                   \\\n          --width 641                                    \\\n          --padding 0                                    \\\n          --palette 'amber.png'                          \\\n          --fill 'solid:#0000ffff'                       \\\n          --grid 'rectangular:#800000ff:~32x128:overlay' \\\n          --antialias 'soft'                             \\\n          --scale 0.5                                    \\\n          --start 0.5s                                   \\\n          --end 1.5s                                     \\\n          --mix 'L+R'                                    \\\n          --out example.png                              \\\n          example.wav\n```\n\n## wav2mp4\n\nCommand line:\n```\nwav2mp4 [--debug] [options] [--out \u003cpath\u003e] --window \u003cduration\u003e --fps \u003cframe rate\u003e --cursor \u003ccursor spec\u003e \u003cwav\u003e\n\n  \u003cwav\u003e                  WAV file to render.\n\n  --out \u003cpath\u003e           File path for MP4 file - if \u003cpath\u003e is a directory, the WAV file name is\n                         used and defaults to the WAV file base path. wav2mp4 generates a set of ffmpeg\n                         frames files in the 'frames' subdirectory of the out file directory. \n\n  --window \u003cduration\u003e    The interval allotted to a single frame, in Go time format e.g. --window 1s.\n                         The window interval must be less than the duration of the MP4.\n\n  --fps \u003cframe rate\u003e     Frame rate for the MP4 in frames per second e.g. --fps 30\n\n  --cursor \u003ccursorspec\u003e  Cursor to indicate for the current play position. A cursor is specified by the \n                         image source and dynamic:\n\n                         --cursor \u003cimage\u003e:\u003cdynamic\u003e\n\n                         where image may be:\n                         - none\n                         - red  (internal 'red' cursor)\n                         - blue (internal 'blue' cursor)\n                         - a PNG file with a custom cursor image\n\n                         The cursor 'dynamic' defaults to 'sweep' if not specified, but may be one of\n                         the following:\n                         - sweep  Moves linearly from left to right over the duration of the MP4\n                         - left   Fixed on left side\n                         - right  Fixed on right side\n                         - center Fixed in center of frame\n                         - ease   Migrates from the left to center of the frame, before moving to the\n                                  right side to finish\n                         - erf    Moves 'sigmoidally' from left to right over the duration of the MP4, \n                                  with the sigmoid defined by the inverse error function\n\n  --debug                Displays occasionally useful diagnostic information.\n\nOptions:\n  --settings \u003cfile\u003e      JSON file with the default settings for the height, width, etc. Defaults to \n                         .settings.json if not specified, falling back to internal default values if \n                         .settings.json does not exist.\n\n  --width \u003cpixels\u003e       Width (in pixels) of the PNG image. Valid values are in the range 32 to 8192, \n                         defaults to 645px.\n\n  --height \u003cpixels\u003e      Height (in pixels) of the PNG image. Valid values are in the range 32 to 8192, \n                         defaults to 395px.\n  \n  --padding \u003cpixels\u003e     Padding (in pixels) between the border of the PNG and the extent of the \n                         rendered waveform. Valid values are -16 to +32, defaults to 2px.\n\n  --palette \u003cpalette\u003e    Palette used to colour the waveform. May be the name of one of the internal \n                         colour palettes or a user provided PNG file. Defaults to 'ice'\n  \n  --fill \u003cfillspec\u003e      Fill specification for the background colour, in the form type:colour \n                         e.g. solid:#0000ffff. Currently the only fill type supported is 'solid', \n                         defaults to solid:#000000ff.\n\n  --grid \u003cgridspec\u003e      Grid specification for an optional rectilinear grid, in the form \n                         type:colour:size:overlay, e.g.\n                         - none\n                         - square:#008000ff:~64\n                         - rectangle:#008000ff:~64x48:overlay\n                         \n                         The size may preceded by a 'fit':\n                         - ~  approximate\n                         - =  exact\n                         - ≥  at least\n                         - ≤  at most\n                         - \u003e  greater than\n                         - \u003c  less than\n\n                         If gridspec includes :overlay, the grid is rendered 'in front' of the \n                         waveform.\n\n                         The default gridspec is 'square:#008000ff:~64'\n\n  --antialias \u003ckernel\u003e   The antialising kernel applied to soften the rendered PNG. Valid values are:\n                         - none        no antialiasing\n                         - horizontal  blurs horizontal edges\n                         - vertical    blurs vertical edges\n                         - soft        blurs both horizontal and vertical edges\n\n                         The default kernel is 'vertical'.\n\n  --scale \u003cscale\u003e        A vertical scaling factor to size the height of the rendered waveform. The \n                         valid range is 0.2 to 5.0, defaults to 1.0.\n\n  --mix  \u003cmixspec\u003e       Specifies how to combine channels from a stereo WAV file. Valid values are:\n                         - 'L'    Renders the left channel only\n                         - 'R'    Renders the right channel only\n                         - 'L+R'  Combines the left and right channels\n                         \n                         Defaults to 'L+R'.\n\n  --start \u003ctime\u003e         The start time of the segment of audio to render, in Go time format (e.g. 10s\n                         or 1m5s). Defaults to 0s.\n\n  --end \u003ctime\u003e           The end time of the segment of audio to render, in Go time format (e.g. 10s\n                         or 1m5s). Defaults to the end of the audio.\n\n\nExample:\n\n  wav2mp4 --debug --window 1s --fps 30 --cursor red:sweep --out ./example/chirp.mp4 ./samples/chirp.wav\n  cd ./example/frames\n  ffmpeg -framerate 30 -i frame-%05d.png -c:v libx264 -pix_fmt yuv420p -crf 23 -y out.mp4\n  ffmpeg -i out.mp4    -i ./samples/chirp.wav -c:v copy -c:a aac -y ../chirp.mp4\n```\n\n## References \u0026 Related Projects\n\n1. [Audio File Format Specifications](http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html)\n2. [SoX](http://sox.sourceforge.net)\n3. [WaveFile Gem](https://wavefilegem.com/how_wave_files_work.html)\n4. [DirectMusic: wav2png](https://directmusic.me/wav2png)\n5. [Shulz Audio: wav2png](https://schulz.audio/products/wav2png)\n6. [iconmonstr](https://iconmonstr.com/sound-wave-2-png)\n7. [BBC](https://github.com/bbc/audiowaveform)\n8. [BBC CLI](https://github.com/marc7806/bbc-audiowaveform-cli-wrapper)\n9. [stackoverflow](https://stackoverflow.com/questions/4468157/how-can-i-create-a-waveform-image-of-an-mp3-in-linux)\n10. [github:waveform](https://github.com/andrewrk/waveform)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranscriptaze%2Fwav2png","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftranscriptaze%2Fwav2png","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranscriptaze%2Fwav2png/lists"}