Bildiğim kadarıyla, Mathematica Linux'ta sesi gerçekten hiç desteklemedi.
Komut Play
, sürüm 3'te tanıtıldı ve tüm ses sistemi sürüm 6'da elden geçirildi. Comp.soft-sys.math.mathematica'yı ararsanız, sürüm 3'e kadar giden soruları bulacaksınız. komutu EmitSound
tanıtıldı. Bu, şimdi Mathematica ses üretiminin çoğunun altında duruyor, ancak linux için düzeltmenin / hacklemenin hızlı bir yolunu bulamadım, çünkü EmitSound
sesi ön tarafa geçirmeden önce bazı ön işlemler (ne tür nesnelerin verildiğini belirleme) yapıyor değerlendirmek.
Çoğu linux kurulumunda kullanılan varsayılan ses sürücüsü / API ALSA'dır ( wiki ). Linux çekirdeği 2.6'da 2002'de varsayılan oldu ve OSS "amortismana tabi tutuldu" olarak işaretlendi (OSS hala aktif geliştirme aşamasındadır). Birçok Linux dağıtımı artık
temel ALSA sesinin üstünde yer alan PulseAudio'yu kullanıyor . (Linux sesini daha iyi anlayan herkes bunu düzenlemekten çekinmeyin!)
Mathematica, sürüm 3 (1996) 'da ses getirdi ve böylece * nix varyantları için OSS kullandı. Neredeyse herhangi bir Linux varyantında OSS artık varsayılan olmamasına rağmen, bu hala geçerlidir. Bunu bilmek bize olası bir çözüm sunar: bir OSS öykünme katmanı kullanın (bkz. Örneğin, http://wiki.debian.org/SoundFAQ ).
En basit olanı, bir kullanıcı alanı modu öykünmesini kullanmak ve Mathematica'yı aoss
aoss mathematica
veya PulseAudio eşdeğeri
padsp mathematica
Her ikisinin de sorunu, örneklenmiş seslerle değil, sadece MIDI sesleriyle çalışmasıdır. En azından bu benim Ubuntu 10.10 sistemim ve Scott Kruger'in ( WRI Teknik Destek ekibinin) linux sistemi için geçerli . Bu konuda bir hata raporu sunuldu.
Alternatif olarak, OSS uyumluluğunu çekirdeğinize yükleyebilirsiniz
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
ve ekleyebilir snd_pcm_oss
ve snd_mixer_oss
için /etc/modules
MySQL'i de bunları yüklemek için. Bu modüller
, geriye dönük uyumluluğu kaldırmaya karar verdikleri için Ubuntu 10.10'da mevcut değildir . Çekirdeğimi derlemeden yukarıdakileri test edemiyorum ...
Yukarıdaki OSS öykünmesi şu anda mükemmel çalışmadığından, burada gördüğüm bazı tartışmalara (örneğin, a b c ) dayanan ve varsayılan ALSA komutlarını kullanmak için yeniden yazılmış birkaç hızlı çözüm bulunmaktadır .
Örneklenen ses için aplay
şunları kullanın :
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 <> ")&"];]
ör ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Ayrıca Export
uygun /dev/snd/
cihaza da doğru yönelebilmelisin ... ama çalışamadım.
İçin midi
kullanım aplaymidi
. Bunun çalışması için bir çeşit yazılım / donanım midi synth'in kurulu olması gerekir. Ben var timidity
port 128. çalışan (Bkz buraya yardım için)
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 <> ")&"];]
Örneğin, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Artık uygun ALSASound
komutu herhangi bir ses nesnesinin etrafına sarabilirsiniz . Ayrıca yeniden tanımlamak olabilir Play
kullanmak ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Bu, internetteki tartışmaların birçoğu tarafından önerildiği gibi , $ SoundDisplayFunction ayarı ile eşdeğerdir . Bu seçenek ayarı sesi çalacaktır, ardından normal grafikleri çıkaracaktır.
Play[Sin[1000 t^2], {t, 0, 1}]
ancak başlat / durdur düğmeleri çalışmadığı için çalışmaz EmitSound
.
Basit bir Beep[]
eşdeğer yapmak için şunu deneyin:
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Son olarak, festival metinden konuşmaya (veya başka bir metinden konuşmaya programına) yüklerseniz , Mathematica Speak
işlevini, ör.
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]