私の知る限り、MathematicaはLinuxのサウンドを実際にサポートしたことはありません。
このコマンドPlay
はバージョン3で導入され、サウンドシステム全体がバージョン6でオーバーホールされました。comp.soft-sys.math.mathematicaを検索すると、バージョン3までさかのぼって質問が見つかります。バージョン6では、コマンドEmitSound
が導入されました。これは現在、ほとんどのMathematicaサウンド生成の基礎となっEmitSound
ていますが、サウンドをフロントエンドに渡す前にいくつかの前処理(与えられたオブジェクトのタイプを設定する)を行うため、Linux用にすばやく修正/ハックする方法を見つけることができませんでした。評価する。
ほとんどのLinuxインストールで使用されるデフォルトのサウンドドライバ/ APIはALSA(wiki)です。Linuxカーネル2.6では2002年にデフォルトになり、OSSは「非推奨」とマークされました(ただし、OSSはまだ開発中です)。多くのLinuxディストリビューションは現在
、基になるALSAサウンドの上にあるPulseAudioを使用しています。(Linuxサウンドをよく理解している人なら、自由に編集してください!)
Mathematicaはバージョン3(1996)でサウンドを導入したため、* nixバリアントにOSSを使用しました。ほとんどすべてのLinuxバリアントでOSSがデフォルトではなくなったにもかかわらず、これは依然として当てはまります。これを知ることで可能な解決策が得られます:OSSエミュレーションレイヤーを使用します(例:http://wiki.debian.org/SoundFAQを参照)。
最も簡単なのは、ユーザー空間モードのエミュレーションを使用してMathematicaを実行することです aoss
aoss mathematica
またはPulseAudio相当
padsp mathematica
これらの両方の問題は、サンプリングされたサウンドではなく、MIDIサウンドでのみ機能することです。少なくとも、これは私のUbuntu 10.10システムと(WRIテクニカルサポートチームの)スコットクルーガーのLinuxシステムには当てはまります。この問題についてバグレポートが提出されています。
または、カーネルにOSS互換性をロードすることもできます
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
あなたが追加することができますsnd_pcm_oss
とsnd_mixer_oss
して/etc/modules
ブート時の時にそれらをロードします。これらのモジュールは
、下位互換性を削除することを決定したため、Ubuntu 10.10ではすぐには利用できません。カーネルを再コンパイルせずに上記をテストすることはできません...
上記のOSSエミュレーションは現在、完全に動作していないので、ここで私が見てきた議論のいくつか(例えば、に基づいた迅速な回避策のカップルのbは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"]
。
またExport
、適切な/dev/snd/
デバイスに直接アクセスできるはずです...しかし、私はそれを機能させることができませんでした。
以下のためのmidi
使用aplaymidi
。これを機能させるには、何らかのソフトウェア/ハードウェアmidiシンセがインストールされている必要があります。私がしているtimidity
ポート128上で実行されている(参照してくださいここで助けを求めて)
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]]