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 są ł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}]

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]]