Não há som no Mathematica no Linux

10

Eu tenho um grande conjunto de eventos no Mathematica que eu preciso reagir, e não é prático verificar sempre, especialmente porque os eventos são distribuídos aleatoriamente no tempo.
Então eu queria adicionar um som simples para me lembrar de ir checar o evento. Eu queria usar Beep[] mas não obtive resultados, na verdade, eu não sabia até agora que o Mathematica não faz nenhum som.

Eu uso Debian Squeeze Stable e não tenho problemas com qualquer outro aplicativo usando som.

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

    
por enedene 11.06.2011 / 13:26

1 resposta

10

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ãobaseadosem EmitSound .

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]]
    
por 12.06.2011 / 04:25