Repository navigation
v1.2.0
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-lowand--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
wavemancommand, e.g.,waveman --boxis nowwaveman 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
--invertedwill 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