Per quanto ne so, Mathematica non ha mai veramente supportato l'audio in Linux.
Il comando è Play
stato introdotto nella versione 3 e l'intero sistema audio è stato revisionato nella versione 6. Se cerchi comp.soft-sys.math.mathematica, troverai domande che risalgono fino alla versione 3. Nella versione 6, il il comando è EmitSound
stato introdotto. Questo è alla base della maggior parte della generazione del suono di Mathematica, ma non sono riuscito a trovare un modo rapido per risolverlo / hackerarlo per Linux, dal momento che EmitSound
fa un po 'di pre-elaborazione (capire quali tipi di oggetti è stato dato) prima di passare il suono al frontend a valutare.
Il driver audio / API predefinito utilizzato nella maggior parte delle installazioni di Linux è ALSA ( wiki ). È diventato il valore predefinito nel 2002 nel kernel 2.6 di Linux e OSS è stato contrassegnato come "deprezzato" (sebbene OSS sia ancora in fase di sviluppo attivo). Molte distribuzioni Linux ora usano PulseAudio
che si trova al di sopra del suono ALSA sottostante. (Chiunque abbia una migliore comprensione del suono di Linux dovrebbe sentirsi libero di modificarlo!)
Mathematica ha introdotto il suono nella versione 3 (1996) e quindi ha usato OSS per le sue varianti * nix. Questo è ancora il caso, nonostante OSS non sia più il predefinito in quasi tutte le varianti di Linux. Sapendo questo ci offre una possibile soluzione: utilizzare un livello di emulazione OSS (vedere, ad esempio, http://wiki.debian.org/SoundFAQ ).
Il più semplice è usare un'emulazione in modalità userspace ed eseguire Mathematica aoss
aoss mathematica
o l'equivalente PulseAudio
padsp mathematica
Il problema con entrambi è che funziona solo con suoni MIDI, non con suoni campionati. Almeno questo è vero sul mio sistema Ubuntu 10.10 e sul sistema Linux di Scott Kruger (del team di supporto tecnico WRI ). Su questo problema è stata presentata una segnalazione di bug.
In alternativa, puoi caricare la compatibilità OSS nel tuo kernel
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
ed è possibile aggiungere snd_pcm_oss
e snd_mixer_oss
per /etc/modules
caricarli al momento del boot. Questi moduli non sono prontamente disponibili in Ubuntu 10.10
poiché hanno deciso di rimuovere la compatibilità con le versioni precedenti. Non riesco a provare quanto sopra senza ricompilare il mio kernel ...
Poiché l'emulazione OSS di cui sopra attualmente non funziona perfettamente, ecco un paio di soluzioni rapide basate su alcune delle discussioni che ho visto (ad esempio, a b c ) e riscritte per utilizzare i comandi ALSA predefiniti.
Per il suono campionato, usare 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 <> ")&"];]
ad es ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Dovresti anche essere in grado di accedere Export
direttamente al /dev/snd/
dispositivo appropriato ... ma non sono riuscito a farlo funzionare.
Per l' midi
uso aplaymidi
. Perché ciò funzioni è necessario installare una sorta di software midi synth hardware / hardware. Ho timidity
eseguito sulla porta 128. (Vedi qui per aiuto)
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 <> ")&"];]
per esempio, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Ora puoi avvolgere il ALSASound
comando appropriato attorno a qualsiasi oggetto audio. Puoi anche ridefinire Play
per usare ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Ciò è sostanzialmente equivalente all'impostazione di $ SoundDisplayFunction , come raccomandato da molte delle discussioni su Internet. Questa impostazione di opzione riprodurrà il suono, quindi emetterà la grafica normale.
Play[Sin[1000 t^2], {t, 0, 1}]
ma i pulsanti di avvio / arresto non funzioneranno, poiché sono basati su EmitSound
.
Per fare un Beep[]
equivalente semplice , prova
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Infine, se installi il text-to-speech del festival (o qualsiasi altro programma di sintesi vocale ), puoi sostituire la Speak
funzionalità Mathematica , ad es.
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]