我在Mathematica中需要处理大量事件,并且总是检查它是不实际的,特别是因为事件是随时间随机分布的。
因此,我想添加一个简单的声音来提醒我去检查事件。我想使用它,Beep[]
但没有任何结果,实际上,直到现在我才意识到Mathematica没有发出任何声音。
我使用Debian Squeeze Stable,对于使用声音的任何其他应用程序都没有问题。
这会影响Mathematica的所有最新版本(7、8和9),并且可能会影响较旧的版本,具体取决于系统的声音设置。
我在Mathematica中需要处理大量事件,并且总是检查它是不实际的,特别是因为事件是随时间随机分布的。
因此,我想添加一个简单的声音来提醒我去检查事件。我想使用它,Beep[]
但没有任何结果,实际上,直到现在我才意识到Mathematica没有发出任何声音。
我使用Debian Squeeze Stable,对于使用声音的任何其他应用程序都没有问题。
这会影响Mathematica的所有最新版本(7、8和9),并且可能会影响较旧的版本,具体取决于系统的声音设置。
Answers:
据我所知,Mathematica从未真正支持Linux中的声音。
该命令Play
是在版本3中引入的,整个声音系统在版本6中已进行了大修。如果搜索comp.soft-sys.math.mathematica,您会发现问题一直追溯到版本3。在版本6中,命令EmitSound
被引入。现在,这是大多数Mathematica声音的基础,但是我找不到为Linux修复/破解它的快速方法,因为EmitSound
在将声音传递到前端之前,需要进行一些预处理(弄清楚给出的对象类型)。评估。
大多数Linux安装中使用的默认声音驱动程序/ API是ALSA(wiki)。它在2002年成为Linux内核2.6中的默认值,并且OSS被标记为“已贬值”(尽管OSS仍在积极开发中)。现在,许多Linux发行版都使用PulseAudio ,它位于基础ALSA声音的顶部。(任何对Linux声音有更好了解的人都应该随时对其进行编辑!)
Mathematica在版本3(1996)中引入了声音,因此将OSS用于* nix变体。尽管OSS不再是几乎所有Linux变体中的默认设置,但情况仍然如此。知道这一点将为我们提供一种可能的解决方案:使用OSS仿真层(请参阅例如http://wiki.debian.org/SoundFAQ)。
最简单的方法是使用用户空间模式仿真并通过以下方式运行Mathematica aoss
aoss mathematica
或等价的PulseAudio
padsp mathematica
两者的问题在于它仅适用于MIDI声音,不适用于采样声音。至少在我的Ubuntu 10.10系统和Scott Wruger(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 Ç),并重新写入使用默认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,这是Internet上许多讨论所建议的。此选项设置将播放声音,然后输出普通图形。
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]]