Não há som no Mathematica no Linux

10

Eu tenho um grande conjunto de eventos no Mathematica aos quais preciso reagir, e nem sempre é prático procurá-lo, principalmente porque os eventos são distribuídos aleatoriamente no tempo.
Então, eu queria adicionar um som simples para me lembrar de ir verificar o evento. Eu queria usar, Beep[]mas não obtive resultados; de fato, até agora não percebi que o Mathematica não emitia nenhum som.

Eu uso o Debian Squeeze Stable e não tenho problemas com nenhum outro aplicativo que utilize som.

Isso afeta todas as versões recentes (7, 8 e 9) do Mathematica e provavelmente as versões mais antigas, dependendo da configuração do som do seu sistema.

enedene
fonte
Este tem sido um problema no Mma desde que eles adicionaram comandos de som na versão 6. Lembro-me de corrigi-lo na época, mas não me incomodei nas versões mais recentes. Tente a documentação aqui .
Simon
Essa pergunta deve ser migrada para superusuário?
Simon
Infelizmente ainda não recebo som.
Eu sou o pôster original no Stackoverflow. Obrigado por me falar sobre este site, eu não sabia que este existia. É fantástico eu ter conseguido usá-lo bem.
enedene

Respostas:

10

Até onde eu sei, o Mathematica nunca realmente suportou som no Linux. O comando Playfoi 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 EmitSoundfoi 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 EmitSoundfaz 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_osse snd_mixer_osspara /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 Exportacessar o /dev/snd/dispositivo apropriado ... mas não consegui fazer isso funcionar.

Para midiuso aplaymidi. Para que isso funcione, você precisa de algum tipo de software / hardware midi synth instalado. Estou timidityexecutando 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 ALSASoundcomando apropriado em torno de qualquer objeto de som. Você também pode redefinir Playpara 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

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 Speakfuncionalidade do Mathematica , por exemplo,

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
Simon
fonte
Simon, esta resposta fez o truque, muito obrigado.
enedene
Aliás, alguém sabe se o Mathematica planeja suportar som no Linux no futuro? Eu acho que eles são software específico, onde a porcentagem de pessoas que o usa no Linux é muito maior do que na maioria dos outros softwares.
enedene
@enedene: Fiz hoje a pergunta do suporte do WRI. Esperamos que vamos ter uma resposta nos próximos dias ...
Simon
Obrigado Simon, você foi útil. Se você receber uma resposta, poste aqui ou dê um link.
enedene
@enedene: recebi uma resposta útil do suporte do WRI. Veja a edição!
Simon