Hasta donde yo sé, Mathematica nunca ha soportado realmente el sonido en Linux.
El comando Play
se 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 EmitSound
Se 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 EmitSound
hace 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_oss
y snd_mixer_oss
para /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 Export
directamente al /dev/snd/
dispositivo apropiado ... pero no pude hacerlo funcionar.
Para midi
su uso aplaymidi
. Para que esto funcione, necesita algún tipo de sintetizador midi de software / hardware instalado. Me estoy timidity
ejecutando 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 ALSASound
comando apropiado alrededor de cualquier objeto de sonido. También puede redefinir Play
para 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}]
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 Speak
funcionalidad de Mathematica , por ejemplo,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]