Brak dźwięku w Mathematica pod Linuksem

10

Mam ogromny zestaw wydarzeń w Mathematica, na które muszę zareagować, i nie zawsze jest praktyczne sprawdzanie tego, zwłaszcza, że ​​wydarzenia są losowo rozmieszczone w czasie.
Chciałem więc dodać prosty dźwięk przypominający mi, żebym poszedł sprawdzić wydarzenie. Chciałem użyć, Beep[]ale nie otrzymuję żadnych rezultatów, w rzeczywistości nie zdawałem sobie sprawy, że Mathematica nie wydaje żadnych dźwięków.

Używam Debian Squeeze Stable i nie mam problemów z żadną inną aplikacją używającą dźwięku.

Wpływa to na wszystkie najnowsze wersje (7, 8 i 9) Mathematica i prawdopodobnie starsze wersje, w zależności od konfiguracji dźwięku twojego systemu.

enedene
źródło
To był problem w Mma, odkąd dodali polecenia dźwiękowe w wersji 6. Pamiętam, jak to wtedy naprawiałem, ale nie zawracałem sobie głowy nowszymi wersjami. Wypróbuj dokumentację tutaj .
Simon
Czy to pytanie powinno zostać przeniesione do administratora?
Simon
Niestety nadal nie mam dźwięku.
Jestem oryginalnym plakatem na Stackoverflow. Dziękujemy za poinformowanie mnie o tej stronie, nie wiedziałem, że ta istnieje. To fantastyczne, że mogę z tego dobrze skorzystać.
enedene

Odpowiedzi:

10

O ile mi wiadomo, Mathematica nigdy tak naprawdę nie obsługiwał dźwięku w Linuksie. Komenda Playzostała wprowadzona w wersji 3, a cały system dźwiękowy przebudowany w wersji 6. Jeśli przeszukujesz comp.soft-sys.math.mathematica, znajdziesz pytania sięgające wstecz do wersji 3. W wersji 6 polecenie EmitSoundzostało wprowadzone. To leży u podstaw większości generowania dźwięku Mathematica, ale nie mogłem znaleźć szybkiego sposobu, aby naprawić / zhakować go w systemie Linux, ponieważ EmitSoundwykonuje pewne wstępne przetwarzanie (ustalenie, jakie typy obiektów zostało podane) przed przekazaniem dźwięku do interfejsu oceniać.

Domyślny sterownik dźwięku / API używany w większości instalacji Linuksa to ALSA ( wiki ). Stał się domyślny w 2002 r. W jądrze Linuksa 2.6, a OSS został oznaczony jako „przestarzały” (chociaż OSS jest wciąż w fazie rozwoju). Wiele dystrybucji Linuksa korzysta teraz z PulseAudio, które znajduje się nad dźwiękiem ALSA. (Każdy, kto lepiej rozumie dźwięk Linuksa, powinien go edytować!)

Mathematica wprowadziła dźwięk w wersji 3 (1996) i tym samym wykorzystała OSS do swoich wariantów * nix. Tak jest nadal, mimo że OSS nie jest już domyślny w prawie żadnym wariancie Linuksa. Znajomość tego daje nam możliwe rozwiązanie: użyj warstwy emulacji OSS (patrz np. Http://wiki.debian.org/SoundFAQ ).

Najprościej jest użyć emulacji trybu użytkownika i uruchomić Mathematica aoss

aoss mathematica

lub odpowiednik PulseAudio

padsp mathematica

Problem w obu przypadkach polega na tym, że działa tylko z dźwiękami MIDI, a nie z próbkowanymi dźwiękami. Przynajmniej tak jest w moim systemie Ubuntu 10.10 i systemie linux Scott Kruger (z zespołu pomocy technicznej WRI ). Zgłoszono błąd dotyczący tego problemu.

Alternatywnie możesz załadować kompatybilność OSS do jądra

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

i można dodać snd_pcm_ossi snd_mixer_ossaby /etc/modules załadować je na przy ładowaniu systemu. Moduły te niełatwo dostępne w systemie Ubuntu 10.10, ponieważ postanowiono usunąć kompatybilność wsteczną. Nie mogę przetestować powyższego bez ponownej kompilacji mojego jądra ...


Ponieważ powyższa emulacja OSS obecnie nie działa idealnie, oto kilka krótkich obejść opartych na niektórych dyskusjach, które widziałem (np. A b c ) i przepisałem, aby używać domyślnych poleceń ALSA.

Aby uzyskać próbkowany dźwięk, użyj 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 <> ")&"];]

np ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"].
Powinieneś także mieć możliwość Exportbezpośredniego połączenia z odpowiednim /dev/snd/urządzeniem ... ale nie mogłem tego uruchomić.

Do midiużytku aplaymidi. Aby to zadziałało, potrzebujesz zainstalowanego oprogramowania / sprzętowego syntezatora midi. Mam timidityuruchomiony na porcie 128. (Zobacz tutaj, aby uzyskać pomoc)

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 <> ")&"];]

na przykład, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

Możesz teraz zawinąć odpowiednie ALSASoundpolecenie wokół dowolnego obiektu dźwiękowego. Możesz także zdefiniować Playna nowo ALSASound:

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];

Jest to zasadniczo równoważne z ustawieniem $ SoundDisplayFunction , zgodnie z zaleceniami wielu dyskusji w Internecie. To ustawienie opcji odtworzy dźwięk, a następnie wyświetli normalną grafikę.

Play[Sin[1000 t^2], {t, 0, 1}]

Grać

ale przyciski start / stop nie będą działać, ponieważ są oparte na EmitSound.

Aby zrobić prosty Beep[]odpowiednik, spróbuj

ALSABeep[] := Play[Sin[5000 t], {t, 0, .1}, 
                   DisplayFunction -> (ALSASound[#, "WAV"]&)]

Wreszcie, jeśli zainstalujesz festiwalowy tekst na mowę (lub inny program do zamiany tekstu na mowę ), możesz zastąpić Speakfunkcjonalność Mathematica , np.

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
Szymon
źródło
Simon, ta odpowiedź załatwiła sprawę, dziękuję bardzo.
enedene
Przy okazji, czy ktoś wie, czy Mathematica planuje w przyszłości wspierać dźwięk w Linuksie? Sądzę, że to specyficzne oprogramowanie, w którym odsetek osób używających go w systemie Linux jest znacznie większy niż w przypadku większości innych programów.
enedene
@enedene: Zadałem dziś pytanie dotyczące wsparcia WRI. Mamy nadzieję, że otrzymamy odpowiedź w ciągu kilku najbliższych dni ...
Simon
Dziękuję Simon, byłeś pomocny. Jeśli otrzymasz odpowiedź, opublikuj ją tutaj lub podaj link.
enedene
@enedene: Otrzymałem pomocną odpowiedź od wsparcia WRI. Zobacz edycję!
Simon