Skip to content

v1.2.0

Choose a tag to compare

@zoomoid zoomoid released this 13 Dec 14:53
· 11 commits to main since this release
a16e204

v1.2.0

This update includes some new features for the transformer stage and changes up the plugin architecture to allow for more modular extension.

  • feat(transformer): samples can be clamped, using --clamp-low and --clamp-high
  • feat(transformer): windowing functions for attenuating samples at the start and end of a track. This helps with undersampling peaks
  • feat(transformer)!: normalization is now optional. Running in batch mode screws with the levels of all tracks as a whole. The old behaviour can be recreated by using --normalize.
  • feat(infra): plugins are now self-contained in a group. They are also exposed by an interface.
  • feat(cmd)!: plugins are no longer enabled by flags, but attach a subcommand to the root waveman command, e.g., waveman --box is now waveman box. This also makes the manual mutual exclusion code obsolete.
  • feat(plugin/line): add mirroring -- For an example, just see the waveform at the top of the README
  • fix(plugin/line): inverted now behaves as you would expect: if not specified, the 0-axis is at the bottom of the frame (whereas it was at the top previously); specifying --inverted will reproduce the previous behaviour visually (under the hood, the CSS transforms have been exchanged for explicit coordinate computation)
  • ci: removed cosign and upgraded actions

Decoder abstractions

We experimented with exchanging the (really slow) go-mp3 dependency for other MP3 decoder backends. This proved to be more challenging than expected: the next best implementation uses CGO and https://github.com/lieff/minimp3 to provide bindings to a single-header MP3 decoder library. It's instrumentation is not particularly fit for our use-case. Also, the Go bindings don't implement seeking which we heavily rely upon (though the underlying C library does). We looked at some Rust bindings of the same C library and considered adapting that to Go, but kept running into issues when trying to pass in data structures and heap-allocated stuff due to Go's memory layout constraints and particularly, the constraints for CGO.

We have decided to postpone this implementation indefinitely until there's more reason for it: currently go-mp3 still works fine if you can spare a couple of seconds. MP3 decoding is messed up anyways...

Full Changelog: v1.1.2...v1.2.0