Puede sintetizar tonos fácilmente con SoX. Hubo algunos obstáculos, pero finalmente pude resolverlo.
Tuve problemas para interconectar SoX con PulseAudio, así que simplemente canalizo soxdatos sin procesar paplay.
La canalización es tediosa, así que creé un script:
$ cat sox-paplay
#!/bin/bash
: ${HZ:=44100}
: ${NCHAN:=6}
: ${SINK:=mysink}
sox -c $NCHAN -n -t raw -r $HZ -L -b 16 - "$@" | paplay --no-remix --no-remap --raw -v -p --rate $HZ -d $SINK --channels $NCHAN
p.ej
sox-paplay synth sine 1000 gain -5 remix -m 0 0 1 0 0 0
El remixefecto solo se usa para enviar el resultado a un canal específico. Es mucho más potente, pero aquí solo usamos la funcionalidad básica. En este ejemplo, tenemos un dispositivo de seis canales y estamos enviando un tono al tercer canal.
Originalmente creé un dispositivo ALSA que envolvía el dispositivo PulseAudio, pero luego descubrí que es imposible controlar la asignación de canales utilizando ALSA, por lo que los canales aleatorios se mezclaron de acuerdo con la forma en que mi mapa de canales personalizado difería del valor predeterminado de ALSA. Esto es por lo que tengo --no-remix --no-remapen la paplayanterior; Solo quiero que se ordene el canal sin procesar para el comando sox.
Desearía que las cosas de audio en Linux tuvieran mejor documentación e informes de errores.
Puede que le interese una respuesta que publiqué recientemente que muestra cómo configurar el ecualizador PulseAudio desde la línea de comandos .