I'm also working on a gameboy inspired music app! (for Android, in Rust)
If you use a perfect square wave, the aliasing is extremely audible and sounds terrible.
As far as I can tell, in native everyone uses a nifty algorithm called bank-limited audio synthesis, and specifically blargg's implementation blip_buf.
https://slack.net/~ant/bl-synth/
If I were OP I'd try to compile the rust port of this library to WASM.