Sobre PicoTap
Siempre me ha gustado el sonido de los teclados mecánicos, pero solo el sonido. He intentado usar varios, pero nunca me adapto: después de unas horas me doy cuenta de que estoy cometiendo muchos errores y escribiendo mas lento y termino regresando al teclado de la MacBook. Es más cómodo, escribo rápido y sin errores. Pero no tienen el efecto ASMR de un teclado mecánico, por eso intenté que me gustaran, por mucho tiempo. Cada vez que llegaba un teclado nuevo, mi esposa tenia un comentario al respecto y no la culpo.
Sonido de teclado mecánico… sin usar uno
Luego encontré una app llamada Klack y me gustó mucho. La idea era simple: reproducir sonidos de teclado mecánico mientras escribes. Funciona bien y, siendo justo, esos ~80MB de memoria que Klack usa eran aceptables, pasaba por una app ligera. Aun así, hay algo que no me convenció: reproduce el sonido en el dispositivo de audio activo. Si estás usando audífonos, el sonido sale por ahí; si tienes bocinas externas, también. Se siente raro, porque el sonido debería venir de la laptop. En ese punto decidí hacer mi propia versión, solo como reto personal, para ver si podía resolver eso, y de paso también para ver si podía hacerla todavía más ligera usando algunos trucos.
PicoTap hace básicamente lo mínimo: escucha eventos de teclado y reproduce un sonido. No hay frameworks pesados ni UI compleja, y la decisión principal es que el audio siempre salga por las bocinas internas de la Mac, independientemente del output activo, lo cual hace que se sienta más natural. También evité depender de frameworks de apple, ya que mostrar un simple dialogo hubiera requerido usar AppKit (PicoTap esta hecha en Rust), asi que, por ejemplo, los pocos diálogos que necesita la app (permisos de accesibilidad y pantalla de bienvenida) los muestro usando osascript, lo suficiente para no tener que cargar más de lo necesario. Es super sencillo, pero mantiene la app lo más ligera posible.
Para los sonidos grabé uno de mis teclados, un Lofree Flow Lite, en lugar de usar algo genérico: