No hay sonido en Mathematica bajo Linux

10

Tengo un gran conjunto de eventos en Mathematica a los que necesito reaccionar, y no es práctico siempre verificarlo, especialmente porque los eventos se distribuyen aleatoriamente en el tiempo.
Así que quería agregar un sonido simple para recordarme ir a ver el evento. Quería usarlo Beep[]pero no obtengo resultados, de hecho, hasta ahora no me había dado cuenta de que Mathematica no emitía ningún sonido.

Uso Debian Squeeze Stable y no tengo problemas con ninguna otra aplicación que use sonido.

Esto afecta a todas las versiones recientes (7, 8 y 9) de Mathematica y probablemente a versiones anteriores dependiendo de la configuración de sonido de su sistema.

enedene
fuente
Esto ha sido un problema en Mma desde que agregaron comandos de sonido en la versión 6. Recuerdo haberlo solucionado en ese momento, pero no me he molestado en las versiones más recientes. Prueba la documentación aquí .
Simon
¿Debería migrar esta pregunta al superusuario?
Simon
Lamentablemente, todavía no tengo sonido.
Soy el póster original en Stackoverflow. Gracias por contarme sobre este sitio, no sabía que existía. Es fantástico que pueda aprovecharlo.
enedene

Respuestas:

10

Hasta donde yo sé, Mathematica nunca ha soportado realmente el sonido en Linux. El comando Playse introdujo en la versión 3, y todo el sistema de sonido se revisó en la versión 6. Si busca comp.soft-sys.math.mathematica, encontrará preguntas que se remontan a la versión 3. En la versión 6, el EmitSoundSe introdujo el comando . Esto ahora subyace a la mayor parte de la generación de sonido de Mathematica, pero no pude encontrar una manera rápida de arreglarlo / hackearlo para Linux, ya que EmitSoundhace un preprocesamiento (averiguar qué tipo de objetos se le ha dado) antes de pasar el sonido a la interfaz para evaluar.

El controlador de sonido / API predeterminado utilizado en la mayoría de las instalaciones de Linux es ALSA ( wiki ). Se convirtió en el valor predeterminado en 2002 en el kernel 2.6 de Linux y OSS se marcó como "depreciado" (aunque OSS todavía está en desarrollo activo). Muchas distribuciones de Linux ahora usan PulseAudio que se encuentra encima del sonido ALSA subyacente. (¡Cualquiera con una mejor comprensión del sonido de Linux debería editarlo!)

Mathematica introdujo el sonido en la versión 3 (1996) y, por lo tanto, utilizó OSS para sus variantes * nix. Este sigue siendo el caso, a pesar de que OSS ya no es el predeterminado en casi cualquier variante de Linux. Saber esto nos da una posible solución: usar una capa de emulación OSS (ver, por ejemplo, http://wiki.debian.org/SoundFAQ ).

Lo más simple es usar una emulación de modo de espacio de usuario y ejecutar Mathematica a través de aoss

aoss mathematica

o el equivalente de PulseAudio

padsp mathematica

El problema con ambos es que solo funciona con sonidos MIDI, no con sonidos muestreados. Al menos esto es cierto en mi sistema Ubuntu 10.10 y el sistema Linux de Scott Kruger (del equipo de Soporte Técnico de WRI ). Se ha presentado un informe de error sobre este tema.

Alternativamente, puede cargar la compatibilidad OSS en su kernel

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

y se puede añadir snd_pcm_ossy snd_mixer_osspara /etc/modules cargarlos al arrancar. Estos módulos no están disponibles en Ubuntu 10.10 ya que decidieron eliminar la compatibilidad con versiones anteriores. No puedo probar lo anterior sin recompilar mi kernel ...


Dado que la emulación OSS anterior no funciona actualmente perfectamente, aquí hay un par de soluciones rápidas basadas en algunas de las discusiones que he visto (por ejemplo, a b c ) y reescritas para usar los comandos ALSA predeterminados.

Para el sonido muestreado, use aplay:

ALSASound[snd_, "WAV"] := Module[{playCmd = "aplay", soundFileName},
  soundFileName = "/dev/shm/" <> ToString[Unique["MmaSound"]] <> ".wav";
  playCmd = playCmd <> " " <> soundFileName;
  Export[soundFileName, snd, "WAV"];
  Run["(" <> playCmd <> ";" <> "/bin/rm -f " <> soundFileName <> ")&"];]

por ejemplo, ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"].
También deberías poder acceder Exportdirectamente al /dev/snd/dispositivo apropiado ... pero no pude hacerlo funcionar.

Para midisu uso aplaymidi. Para que esto funcione, necesita algún tipo de sintetizador midi de software / hardware instalado. Me estoy timidityejecutando en el puerto 128. (Consulte aquí para obtener ayuda)

ALSASound[snd_, "MIDI"] := 
 Module[{playCmd = "aplaymidi", port = "128:0", soundFileName},
  soundFileName = "/dev/shm/" <> ToString[Unique["MmaSound"]] <> ".mid";
  playCmd = playCmd <> " -p " <> port <> " " <> soundFileName;
  Export[soundFileName, snd, "MIDI"];
  Run["(" <> playCmd <> ";" <> "/bin/rm -f " <> soundFileName <> ")&"];]

p.ej, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

Ahora puede ajustar el ALSASoundcomando apropiado alrededor de cualquier objeto de sonido. También puede redefinir Playpara usar ALSASound:

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];

Esto es esencialmente equivalente a configurar $ SoundDisplayFunction , como lo recomiendan muchas de las discusiones en Internet. El ajuste de esta opción reproducirá el sonido y luego emitirá los gráficos normales.

Play[Sin[1000 t^2], {t, 0, 1}]

Tocar

pero los botones de inicio / parada no funcionarán, ya que están basados ​​en EmitSound.

Para hacer un Beep[]equivalente simple , intente

ALSABeep[] := Play[Sin[5000 t], {t, 0, .1}, 
                   DisplayFunction -> (ALSASound[#, "WAV"]&)]

Finalmente, si instala el texto a voz del festival (o cualquier otro programa de texto a voz ), puede reemplazar la Speakfuncionalidad de Mathematica , por ejemplo,

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
Simón
fuente
Simon, esta respuesta funcionó, muchas gracias.
enedene
Por cierto, ¿alguien sabe si Mathematica planea admitir sonido en Linux en el futuro? Supongo que son software específico donde el porcentaje de personas que lo usan en Linux es mucho mayor que para la mayoría de los otros programas.
enedene
@enedene: Hoy hice esa pregunta sobre el apoyo de la IRG. Esperemos que recibamos una respuesta en los próximos días ...
Simon
Gracias Simon, has sido útil. Si recibe una respuesta, publíquela aquí o proporcione un enlace.
enedene
@enedene: Recibí una respuesta útil del soporte de WRI. ¡Mira la edición!
Simon