Até onde eu sei, o Mathematica nunca realmente suportou som no Linux.
O comando Play
foi introduzido na versão 3 e todo o sistema de som foi revisado na versão 6. Se você pesquisar comp.soft-sys.math.mathematica, encontrará perguntas desde a versão 3. Na versão 6, o comando EmitSound
foi introduzido. Isso agora está na base da maior parte da geração de som do Mathematica, mas eu não consegui encontrar uma maneira rápida de corrigi-lo / hackear para o linux, já que EmitSound
faz um pré-processamento (descobrindo que tipos de objetos foram dados) antes de passar o som para o frontend. Avalie.
O driver / API de som padrão usado na maioria das instalações Linux é o ALSA ( wiki ). Tornou-se o padrão em 2002 no kernel Linux 2.6 e o OSS foi marcado como "depreciado" (embora o OSS ainda esteja em desenvolvimento ativo). Muitas distribuições Linux agora usam o PulseAudio,
que fica em cima do som ALSA subjacente. (Qualquer pessoa com uma melhor compreensão do som do Linux deve ficar à vontade para editar isso!)
O Mathematica introduziu o som na versão 3 (1996) e, portanto, usou o OSS para suas variantes * nix. Este ainda é o caso, apesar de o OSS não ser mais o padrão em quase todas as variantes do Linux. Saber disso nos dá uma solução possível: use uma camada de emulação OSS (consulte, por exemplo, http://wiki.debian.org/SoundFAQ ).
O mais simples é usar uma emulação no modo de espaço do usuário e executar o Mathematica através aoss
aoss mathematica
ou o equivalente PulseAudio
padsp mathematica
O problema de ambos é que ele só funciona com sons MIDI, não com sons amostrados. Pelo menos isso é verdade no meu sistema Ubuntu 10.10 e no sistema linux de Scott Kruger (da equipe de Suporte Técnico do WRI ). Um relatório de bug foi arquivado sobre esse problema.
Como alternativa, você pode carregar a compatibilidade do OSS no 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
para /etc/modules
carregá-los na hora da inicialização. Esses módulos não estão disponíveis no Ubuntu 10.10,
pois eles decidiram remover a compatibilidade com versões anteriores. Não consigo testar o acima sem recompilar meu kernel ...
Como a emulação OSS acima não está atualmente funcionando perfeitamente, aqui estão algumas soluções rápidas, baseadas em algumas das discussões que eu já vi (por exemplo, a b c ) e reescritas para usar os comandos ALSA padrão.
Para 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
acessar o /dev/snd/
dispositivo apropriado ... mas não consegui fazer isso funcionar.
Para midi
uso aplaymidi
. Para que isso funcione, você precisa de algum tipo de software / hardware midi synth instalado. Estou timidity
executando na porta 128. (Veja 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 envolver o ALSASound
comando 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 à configuração de $ SoundDisplayFunction , conforme recomendado por muitas discussões na Internet. Essa configuração de opção reproduzirá o som e emitirá os gráficos normais.
Play[Sin[1000 t^2], {t, 0, 1}]
![Toque](https://i.stack.imgur.com/P5U3J.png)
mas os botões iniciar / parar não funcionarão, pois são baseados EmitSound
.
Para fazer um Beep[]
equivalente simples , tente
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Por fim, se você instalar o festival de conversão de texto em fala (ou qualquer outro programa de conversão de texto em voz ), poderá substituir a Speak
funcionalidade do Mathematica , por exemplo,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]