Soweit ich weiß, hat Mathematica Sound unter Linux nie wirklich unterstützt.
Der Befehl Play
wurde in Version 3 eingeführt und das gesamte Soundsystem in Version 6 überarbeitet. Wenn Sie nach comp.soft-sys.math.mathematica suchen, finden Sie Fragen, die bis zu Version 3 zurückreichen Befehl EmitSound
wurde eingeführt. Dies liegt nun dem größten Teil der Mathematica-Soundgenerierung zugrunde, aber ich konnte keinen schnellen Weg finden, um es für Linux zu reparieren / hacken, da EmitSound
einige Vorverarbeitungen (Herausfinden, welche Arten von Objekten es gegeben wurde) durchgeführt wurden, bevor der Sound an das Frontend übergeben wurde bewerten.
Der in den meisten Linux-Installationen verwendete Standard-Soundtreiber / API ist ALSA ( Wiki ). Es wurde 2002 zum Standard im Linux-Kernel 2.6 und OSS wurde als "abgeschrieben" markiert (obwohl OSS noch in der aktiven Entwicklung ist). Viele Linux-Distributionen verwenden jetzt PulseAudio,
das über dem zugrunde liegenden ALSA-Sound liegt. (Jeder, der den Linux-Sound besser versteht, sollte dies jederzeit bearbeiten können!)
Mathematica führte Sound in Version 3 (1996) ein und verwendete daher OSS für seine * nix-Varianten. Dies ist immer noch der Fall, obwohl OSS in fast jeder Linux-Variante nicht mehr die Standardeinstellung ist. Wenn wir dies wissen, erhalten wir eine mögliche Lösung: Verwenden Sie eine OSS-Emulationsebene (siehe z . B. http://wiki.debian.org/SoundFAQ ).
Am einfachsten ist es, eine Emulation im Userspace-Modus zu verwenden und Mathematica auszuführen aoss
aoss mathematica
oder das PulseAudio-Äquivalent
padsp mathematica
Das Problem bei beiden ist, dass es nur mit MIDI-Sounds funktioniert, nicht mit gesampelten Sounds. Zumindest gilt dies für mein Ubuntu 10.10-System und das Linux-System von Scott Kruger (vom WRI Technical Support- Team). Zu diesem Problem wurde ein Fehlerbericht eingereicht.
Alternativ können Sie die OSS-Kompatibilität in Ihren Kernel laden
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
und Sie können hinzufügen snd_pcm_oss
und snd_mixer_oss
zu /etc/modules
ihnen beim Booten zu laden. Diese Module sind in Ubuntu 10.10 nicht ohne weiteres verfügbar,
da sie beschlossen haben, die Abwärtskompatibilität zu entfernen. Ich kann das oben genannte nicht testen, ohne meinen Kernel neu zu kompilieren ...
Da die oben genannte OSS-Emulation derzeit nicht einwandfrei funktioniert, finden Sie hier einige schnelle Umgehungen, die auf einigen der Diskussionen basieren, die ich gesehen habe (z. B. a b c ) und die neu geschrieben wurden, um Standard-ALSA-Befehle zu verwenden.
Verwenden Sie für gesampelten Sound 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 <> ")&"];]
zB , ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Sie sollten auch in der Lage sein, Export
direkt auf das entsprechende /dev/snd/
Gerät zuzugreifen ... aber ich konnte das nicht zum Laufen bringen.
Zur midi
Verwendung aplaymidi
. Damit dies funktioniert, muss eine Art Software- / Hardware-Midi-Synthesizer installiert sein. Ich habe timidity
auf Port 128 ausgeführt. ( Hilfe finden Sie hier )
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 <> ")&"];]
z.B, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Sie können jetzt den entsprechenden ALSASound
Befehl um jedes Soundobjekt wickeln . Sie könnten auch neu definieren Play
zu verwenden ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Dies entspricht im Wesentlichen dem Festlegen von $ SoundDisplayFunction , wie von vielen Diskussionen im Internet empfohlen. Diese Optionseinstellung spielt den Ton ab und gibt dann die normalen Grafiken aus.
Play[Sin[1000 t^2], {t, 0, 1}]
Die Start / Stopp-Tasten funktionieren jedoch nicht, da sie auf basieren EmitSound
.
Beep[]
Versuchen Sie es mit einem einfachen Äquivalent
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Wenn Sie schließlich das Festival Text-to-Speech (oder ein anderes Text-to-Speech- Programm) installieren , können Sie die Mathematica- Speak
Funktionalität ersetzen , z.
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]