Tanto quanto sei, o Mathematica nunca apoiou realmente o som no Linux.
O comando Play
foi introduzido na versão 3,
e todo o sistema de som revisado na versão 6.
Se você pesquisar comp.soft-sys.math.mathematica,
você encontrará perguntas voltando até a versão 3.
Na versão 6, o comando EmitSound
foi introduzido.
Isso agora é a base da maior parte da geração de sons do Mathematica,
mas eu não consegui encontrar uma maneira rápida de consertar / hackear para linux,
desde EmitSound
faz algum pré-processamento
(descobrir quais tipos de objetos foram dados)
antes de passar o som para o frontend para avaliar.
O driver / API de som padrão usado na maioria das instalações do Linux é ALSA (wiki ). Tornou-se o padrão em 2002 no kernel Linux 2.6 e OSS foi marcado como "depreciado" (embora o OSS ainda esteja em desenvolvimento ativo). Muitas distribuições Linux agora usam PulseAudio que fica em cima do som subjacente do ALSA. (Qualquer um com uma melhor compreensão do som do Linux deve se sentir livre para editar isso!)
O Mathematica introduziu o som na versão 3 (1996) e, portanto, utilizou o OSS para suas variantes * nix. Este ainda é o caso, apesar de o OSS não ser mais o padrão em praticamente qualquer variante do Linux. Saber disso nos dá uma solução possível: use uma camada de emulação do OSS (veja, por exemplo, link ).
O mais simples é usar uma emulação de modo de espaço de usuário e executar o Mathematica através de aoss
aoss mathematica
ou o equivalente do PulseAudio
padsp mathematica
O problema com ambos é que ele só funciona com sons MIDI, não com sons amostrados. Pelo menos isso é verdade no meu sistema Ubuntu 10.10 e o sistema linux de Scott Kruger (da equipe Suporte Técnico WRI ). Um relatório de bug foi arquivado nesta edição.
Alternativamente, você pode carregar a compatibilidade com o OSS em seu kernel
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
e você pode adicionar snd_pcm_oss
e snd_mixer_oss
a /etc/modules
para carregá-los no boottime.
Estes módulos são não disponíveis no Ubuntu 10.10
desde que eles decidiram remover a compatibilidade com versões anteriores.
Eu não posso testar o acima sem recompilar meu kernel ...
Como a emulação de OSS acima não está funcionando corretamente no momento, aqui está um par de soluções rápidas com base em algumas das discussões que vi (por exemplo, um b c ) e reescrito para usar os comandos padrão do ALSA.
Para o som amostrado, 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 exemplo, ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Você também deve ser capaz de Export
direto no dispositivo /dev/snd/
apropriado ...
mas eu não consegui fazer isso funcionar.
Para midi
use aplaymidi
.
Para isso funcionar, você precisa de algum tipo de software / hardware midi synth instalado.
Eu tenho timidity
em execução na porta 128. (Consulte aqui para obter ajuda)
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 <> ")&"];]
por exemplo, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Agora você pode agrupar o comando ALSASound
apropriado em torno de qualquer objeto de som.
Você também pode redefinir Play
para usar ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Isso é essencialmente equivalente a definir $ SoundDisplayFunction , como recomendado por muitas das discussões em torno da internet. Esta configuração de opção reproduzirá o som e, em seguida, exibirá os gráficos normais.
Play[Sin[1000 t^2], {t, 0, 1}]
masosbotõesdeinício/paradanãofuncionarão,poissãobaseadosemEmitSound
.
Para criar um Beep[]
equivalente, tente
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Finalmente, se você instalar o festival text-to-speech
(ou qualquer outro programa texto-para-fala ),
então você pode substituir a funcionalidade Speak
do Mathematica, por exemplo,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]