Jack multi-canal com poucos recursos

Eis uma forma simples e barata de ter N saídas (ou entradas) num servidor jack.

A ideia é usar algumas placas de som USB baratas e configurar o ALSA para juntá-las num interface único. Para isso usamos um ficheiro de configuração do ALSA parecido com este:

$ cat ~/.asoundrc
pcm.geral {
  type multi
  slaves.a.pcm hw:0
  slaves.a.channels 6
  slaves.b.pcm hw:1
  slaves.b.channels 2
  slaves.c.pcm hw:2
  slaves.c.channels 2
# 6 canais da placa 1
  bindings.0.slave a
  bindings.0.channel 0
  bindings.1.slave a
  bindings.1.channel 1
  bindings.2.slave a
  bindings.2.channel 2
  bindings.3.slave a
  bindings.3.channel 3
  bindings.4.slave a
  bindings.4.channel 4
  bindings.5.slave a
  bindings.5.channel 5

# 2 canais da placa 2
  bindings.6.slave b
  bindings.6.channel 0
  bindings.7.slave b
  bindings.7.channel 1

# 2 canais da placa 3
  bindings.8.slave c
  bindings.8.channel 0
  bindings.9.slave c
  bindings.9.channel 1
}

ctl.geral {
  type hw
  card 0
}

Cheguei a esta configuração com base neste tutorial.

Estou a usar esta configuração num portátil, usando a placa interna (que tem 6 canais) e mais duas placas de som USB simples só com 1 entrada e 1 saída, e apenas aproveito as saídas. A mesma ideia podia servir para ter N entradas para gravação de várias fontes (para uma banda, por exemplo).
Não tomei atenção à latência do sistema, mas isto não pretende ser algo que compita com placas dedicadas de som de N entradas e saídas, mas que custam várias centenas ou alguns milhares de euros. Potencia porém quem se queira aventurar no assunto e começar a aprender, mas tenha poucos recursos para investir em equipamento e já tenha um computador relativamente recente.
Com os circuitos simples que estas placas têm é possível também sincronizá-las, soldando ligações do cristal de uma das placas para as outras. Um tutorial a abordar esta modificação pode ser encontrado aqui. Isto será mais importante na gravação de áudio para garantir que a sample rate é igual para todas as origens de áudio.

Depois a partir daqui com o jackd a correr poderão ser necessários alguns ajustes para tudo funcionar bem. Não experimentei com o kernel rt, mas uso permissões de rt para o áudio no limit.conf:

@audio - rtprio 99
@audio - nice -10
@audio - memlock 512000

Para arrancar o jackd uso o seguinte .jackdrc:

/usr/bin/jackd -R -m -dalsa -P -dgeral -r48000 -p1024 -n2 -m

De notar que uso a opção -P para só usar o playback, já que não configurei a captura das placas no ficheiro de configuração do ALSA.

Isto permite usar o mixxx com várias placas de som, basta usar uma versão com suporte para o jack e configurar o master para os canais 6-7 e o monitor para os canais 8-9, para neste exemplo usar as 2 placas externas. Podendo fazer a mistura directamente no mixxx ou usando uma mesa de mistura externa.

Terei que experimentar melhor para saber se este sistema é minimamente estável, mas para quem quer começar a aprender técnicas de DJ ou a criar alguma coisa com os sequenciadores e sintetizadores que suportem o jackd tendo a possibilidade de monitorizar algumas dessas aplicações, este sistema pode ser um ponto de partida.

Actualmente as aplicações que estou a usar com este sistema são o seq24 (sequenciador) a activar o hydrogen (drumbox com samples), o zynaddsubfx (sintetizador multi-canal, polifónico e com efeitos) e o nekobee (emulador da 303), o som destas 3 aplicações entra no jackeq (mesa de mistura virtual com equalizador e 4 canais), o monitor deste liga a uma placa externa e o master entra no jamin (equalizador e compressor). Do jamin sai para a placa principal que liga ao sistema de som, ou uso o timemachine para gravações. Tudo isto é ligado com a ajuda do patchage. Cheguei a usar o qjackctl mas o patchage suporta o lash e tem um interface mais simples.
Estas aplicações têm quase todas suporte para o gestor de sessão lash, o que simplifica a preparação do sistema quando queremos voltar a um estado usável, ou à última configuração. Além disso permite configurar várias sessões com diferentes aplicações. As aplicações sem suporte para o lash (jackeq, jack-dssi-host para correr o nekobee e o jamin) podem ser arrancadas com o lash_wrap para ficarem associadas à sessão. Algumas configurações podem não ficar guardadas, mas na globalidade funciona suficientemente bem.

Com várias aplicações e tantos controlos, sinto que o rato se torna um bocado ineficiente… mas com a ajuda de vários desktops virtuais e como a máquina é suficientemente rápida, o compiz também dá alguma ajuda com os plugins cube, expo e scale, por exemplo. Tenho que experimentar isto com o whiteboard para o wiimote quando tiver acesso a um projector… 😎 Não sei se seria funcional, mas não deixa de ser uma ideia engraçada. Os controladores nano da Korg também parecem ser uma alternativa de baixo custo para tornar o sistema mais fácil de gerir.

Programação de controladores para Linux, pelos programadores do kernel

O autor do livro Linux Kernel in a Nutshell promoveu através do seu blog a disposição da comunidade de programadores do kernel Linux em desenvolver controladores para hardware que não seja actualmente suportado por este sistema operativo, de forma gratuita. Estas empresas ganham com isto o suporte oficial de mais uma plataforma, e os utilizadores desta plataforma que não podiam usar determinado hardware porque este suporte não existia passarão a poder utilizá-lo. Isto permitirá também que utilizadores de plataformas mais restritivas como o Windows, que não podiam deixar de usar esta plataforma por terem hardware não suportado, possam migrar para uma plataforma mais amigável.

Esperemos que haja empresas à escuta que aceitem esta oferta, pois beneficiará toda a gente.

EDIT: E parece que já apareceram alguns interessados nesta oferta. Para mais esclarecimentos, Greg adicionou ao seu blog um post com perguntas frequentes e respostas. Isto será formidável para o já muito bom e crescente suporte de hardware do Linux. Muito bem!