web-dev-qa-db-ja.com

LinuxでMathematicaに音が出ない

Mathematicaには反応する必要のある膨大な数のイベントがありますが、特にイベントは時間的にランダムに分散されるため、常にチェックするのは実用的ではありません。
それで、イベントをチェックするように思い出させるために、簡単な音を追加したかったのです。 Beep[]を使いたかったのですが、結果が出ませんでした。実際、Mathematicaがまったく音を出していないことに今まで気づいていませんでした。

私はDebianSqueeze Stableを使用しており、サウンドを使用する他のアプリケーションに問題はありません。

これは、Mathematicaの最近のすべてのバージョン(7、8、9)と、システムのサウンド設定に応じておそらく古いバージョンに影響します。

10
enedene

私の知る限り、MathematicaはLinuxでサウンドを実際にサポートしたことはありません。 コマンドPlayはバージョン3で導入され、サウンドシステム全体がバージョン6でオーバーホールされました。comp.soft-sys.math.mathematicaを検索すると、バージョン3までさかのぼる質問が見つかります。 。バージョン6では、コマンドEmitSoundが導入されました。これは現在ほとんどのMathematicaサウンド生成の根底にありますが、EmitSoundが渡す前にいくつかの前処理(与えられたオブジェクトのタイプを把握する)を行うため、Linux用に修正/ハックする簡単な方法を見つけることができませんでした評価するフロントエンドへの音。

ほとんどのLinuxインストールで使用されるデフォルトのサウンドドライバー/ APIは [〜#〜] alsa [〜#〜]wiki )です。これは、2002年にLinuxカーネル2.6でデフォルトになり、 [〜#〜] oss [〜#〜] は「減価償却済み」としてマークされました(ただし、OSSはまだ活発に開発中です)。現在、多くのLinuxディストリビューションは PulseAudio を使用しています。これは、基盤となるALSAサウンドの上にあります。 (Linuxサウンドをよく理解している人は、これを自由に編集してください!)

Mathematicaはバージョン3(1996)でサウンドを導入したため、* nixバリアントにOSSを使用しました。ほとんどすべてのLinuxバリアントでOSSがデフォルトではなくなったにもかかわらず、これは依然として当てはまります。これを知っていると、考えられる解決策が得られます。OSSエミュレーションレイヤーを使用します(たとえば、 http://wiki.debian.org/SoundFAQ を参照)。

最も簡単なのは、ユーザースペースモードのエミュレーションを使用し、aossを介してMathematicaを実行することです。

aoss mathematica

またはPulseAudioと同等のもの

padsp mathematica

これらの両方の問題は、MIDIサウンドでのみ機能し、サンプリングされたサウンドでは機能しないことです。少なくとも、これは私のUbuntu10.10システムとScottKrugerのLinuxシステム(- WRIテクニカルサポート チーム)この問題に関するバグレポートが提出されました。

または、OSS互換性をカーネルにロードすることもできます

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

snd_pcm_osssnd_mixer_oss/etc/modulesに追加して、起動時にロードできます。これらのモジュールは buntu 10.10ではすぐに利用できません 下位互換性を削除することを決定したためです。カーネルを再コンパイルせずに上記をテストすることはできません...


上記のOSSエミュレーションは現在完全には機能していないため、これまでに見たいくつかの議論に基づいた簡単な回避策をいくつか示します(たとえば、 ab - c )、デフォルトのALSAコマンドを使用するように書き直されました。

サンプリングされたサウンドには、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 <> ")&"];]

例:ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
適切な/dev/snd/デバイスに直接Exportすることもできるはずです...しかし、それを機能させることができませんでした。

midiには、aplaymidiを使用します。これを機能させるには、何らかのソフトウェア/ハードウェアMIDIシンセをインストールする必要があります。ポート128でtimidityを実行しています(ヘルプについては ここ を参照してください)

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 <> ")&"];]

例:ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

これで、適切なALSASoundコマンドを任意のサウンドオブジェクトにラップできます。 Play を再定義してALSASoundを使用することもできます。

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];

これは、インターネットに関する多くの議論で推奨されているように、基本的に $ SoundDisplayFunction を設定することと同じです。このオプション設定は、サウンドを再生してから、通常のグラフィックを出力します。

Play[Sin[1000 t^2], {t, 0, 1}]

Play

ただし、開始/停止ボタンは EmitSound に基づいているため、機能しません。

単純な Beep[] 同等のものを作成するには、

ALSABeep[] := Play[Sin[5000 t], {t, 0, .1}, 
                   DisplayFunction -> (ALSASound[#, "WAV"]&)]

最後に、フェスティバルのテキスト読み上げ(またはその他の テキスト読み上げ プログラム)をインストールすると、MathematicaのSpeak機能を置き換えることができます。

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
10
Simon