Mathematicaには反応する必要のある膨大な数のイベントがありますが、特にイベントは時間的にランダムに分散されるため、常にチェックするのは実用的ではありません。
それで、イベントをチェックするように思い出させるために、簡単な音を追加したかったのです。 Beep[]
を使いたかったのですが、結果が出ませんでした。実際、Mathematicaがまったく音を出していないことに今まで気づいていませんでした。
私はDebianSqueeze Stableを使用しており、サウンドを使用する他のアプリケーションに問題はありません。
これは、Mathematicaの最近のすべてのバージョン(7、8、9)と、システムのサウンド設定に応じておそらく古いバージョンに影響します。
私の知る限り、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_oss
とsnd_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}]
ただし、開始/停止ボタンは 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]]