Ah, now I understand a bit better how you want to generate the different volume levels.
2) You can specify high/low thresholds for pcm2pwm, ie.
$ pcm2pwm sound.wav hi lo
where hi and lo are 8-bit unsigned integers. Default is hi=252, lo=3. Lowering hi and raising lo will make the converter more sensitive.
3) To get rid of the parasite tone (3903Hz), mixing frequency would need to rise above the audible range. So ideally you'd mix at 20KHz or more. On Spectrum we usually mix around 15KHz, and rely on hardware filtering/smoothing to take care of any remaining noise/whining. Beware that emulators introduce additional noise, depending on how they implement sound. MAME's MZ-700 suffers from this, for example.
4). Let me try to construct a basic example. Late night coding attempt, and completely untested, but the idea is to do something like this:
; two-channel OR mixing (aka Squeeker method)
ld hl,0 ; reset oscillator 2 state
ld de,div2 ; osc2 clock [freq = sample_rate * div2 / $10000]
ld hl,0 ; reset osc1 state
ld de,div1 ; osc1 clock
ld bc,ring_buffer ; must be aligned to 256b page
add hl,de ; update osc counter channel 1
add a,$e0 ; $100 - duty ($e0 = 12.5%)
adc a,0 ; if duty threshold exceeded, A is now $28
add hl,de ; same for channel 2
adc a,c ; A is now $27, $28, or $29
and #28 ; mask bits, A = $20 | $28
PS: You should be able to change your nick now. Let me know if it doesn't work, then I'll change it for you.