O ile mi wiadomo, Mathematica nigdy tak naprawdę nie obsługiwał dźwięku w Linuksie.
Komenda Play
został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 EmitSound
został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ż EmitSound
wykonuje 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_oss
i snd_mixer_oss
aby /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ść Export
bezpośredniego połączenia z odpowiednim /dev/snd/
urządzeniem ... ale nie mogłem tego uruchomić.
Do midi
użytku aplaymidi
. Aby to zadziałało, potrzebujesz zainstalowanego oprogramowania / sprzętowego syntezatora midi. Mam timidity
uruchomiony 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 ALSASound
polecenie wokół dowolnego obiektu dźwiękowego. Możesz także zdefiniować Play
na 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ć Speak
funkcjonalność Mathematica , np.
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]