There is no general concept of duplicating a device. Even restricting to the case of an input-only device, it still returns different values at different times. If two programs access the same device at different times (even if it's a matter of microseconds), they might get completely different data.
The loop devices give access to block devices. Block devices behave differently: if you read from the same position twice with no write in between, you get the same data. This doesn't apply to other types of devices, thus there is no concept of loop devices for character devices.
You are considering a specific kind of device which returns a stream — you're making the assumption that the data read by the program depends solely on when it starts and stops reading. The kernel won't help you there, it has no special support for this special case.
What you can do is read from the device once, and replicate the data in userland. Why are you attempting to feed the data back into a device? You've got it, so read it. You'll need to pass the output of
tee to multiple programs, so either use a named pipe or process substitution.
mkfifo low high
apply-live-effects -filter lo-pass <low >output1.raw
apply-live-effects -filter ho-pass <high >output2.raw
arecord -D [mic] | tee low >high
arecord -D [mic] | tee >(apply-live-effects -filter lo-pass >output1.raw) >(apply-live-effects -filter hi-pass >output2.raw)
Beware that if the filters are too slow,
tee may not be able to read the output from
arecord as fast as it should, which may result in
arecord not being able to read from the device as fast as it should, causing lost frames. This can be solved with multitee, which does its best not to block.
arecord -D [mic] | multitee 0-3,4 3> >(apply-live-effects -filter lo-pass >output1.raw) 4> >(apply-live-effects -filter hi-pass >output2.raw)