Linux altında Mathematica'da ses yok


10

Mathematica'da tepki vermem gereken çok sayıda olay var ve her zaman bunu kontrol etmek pratik değil, özellikle olaylar zaman içinde rastgele dağıtıldığından.
Bu yüzden olayı kontrol etmemi hatırlatmak için basit bir ses eklemek istedim. Kullanmak istedim Beep[]ama sonuç alamadım, aslında Mathematica'nın şimdiye kadar hiç ses çıkardığını fark etmedim.

Debian Squeeze Stable kullanıyorum ve ses kullanan başka bir uygulamada sorunum yok.

Bu, Mathematica'nın tüm yeni sürümlerini (7, 8 ve 9) ve muhtemelen sisteminizin ses ayarına bağlı olarak daha eski sürümleri etkiler.


Bu sürüm 6'da ses komutları ekledikleri için Mma'da bir sorun oldu . O zaman düzeltmeyi hatırlıyorum, ancak daha yeni sürümlerde rahatsız etmedim. Buradaki belgeleri deneyin .
Simon

Bu soru süper kullanıcıya geçmeli mi?
Simon

Ne yazık ki hala ses alamıyorum.

Stackoverflow'daki orijinal posterim. Bana bu siteyi anlattığınız için teşekkür ederim, sitenin var olduğunu bilmiyordum. Bunu iyi kullanabilmek harika.
enedene

Yanıtlar:


10

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 EmitSoundtanı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ü EmitSoundsesi ö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_ossve snd_mixer_ossiç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 Exportuygun /dev/snd/cihaza da doğru yönelebilmelisin ... ama çalışamadım.

İçin midikullanım aplaymidi. Bunun çalışması için bir çeşit yazılım / donanım midi synth'in kurulu olması gerekir. Ben var timidityport 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 ALSASoundkomutu herhangi bir ses nesnesinin etrafına sarabilirsiniz . Ayrıca yeniden tanımlamak olabilir Playkullanmak 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}]

Oyna

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 Speakişlevini, ör.

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

Simon, bu cevap hile yaptı, çok teşekkür ederim.
enedene

Btw, Mathematica'nın gelecekte Linux'ta sesi desteklemeyi planlayıp planlamadığını bilen var mı? Linux'ta kullanan insanların yüzdesinin diğer çoğu yazılımdan çok daha fazla olduğu özel bir yazılım olduklarını tahmin ediyorum.
enedene

@enedene: Bugün WRI desteği sorusunu sordum. Umarım önümüzdeki birkaç gün içinde bir cevap alırız ...
Simon

Teşekkürler Simon, yardımcı oldun. Bir cevap alırsanız, lütfen buraya gönderin veya bir bağlantı verin.
enedene

@enedene: WRI desteğinden yararlı bir yanıt aldım. Düzenlemeye bakın!
Simon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.