Nessun suono in Mathematica sotto Linux


10

Ho una vasta serie di eventi a Mathematica a cui devo reagire, e non è sempre pratico verificarlo, soprattutto perché gli eventi sono distribuiti casualmente nel tempo.
Quindi volevo aggiungere un suono semplice per ricordarmi di andare a controllare l'evento. Volevo usare Beep[]ma non ottengo risultati, infatti, non avevo realizzato fino ad ora che Mathematica non emettesse alcun suono.

Uso Debian Squeeze Stable e non ho problemi con qualsiasi altra applicazione che utilizza l'audio.

Ciò ha effetto su tutte le versioni recenti (7, 8 e 9) di Mathematica e probabilmente sulle versioni precedenti a seconda della configurazione audio del sistema.


Questo è stato un problema in Mma da quando hanno aggiunto i comandi audio nella versione 6. Ricordo di averlo riparato in quel momento, ma non mi sono preoccupato delle versioni più recenti. Prova qui la documentazione .
Simon,

Questa domanda dovrebbe essere migrata al superutente?
Simon,

Sfortunatamente non ricevo ancora alcun suono.

Sono il poster originale su StackOverflow. Grazie per avermi parlato di questo sito, non sapevo che esistesse. È fantastico poterne fare buon uso.
enedene,

Risposte:


10

Per quanto ne so, Mathematica non ha mai veramente supportato l'audio in Linux. Il comando è Playstato 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 è EmitSoundstato 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 EmitSoundfa 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_osse snd_mixer_ossper /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 Exportdirettamente al /dev/snd/dispositivo appropriato ... ma non sono riuscito a farlo funzionare.

Per l' midiuso aplaymidi. Perché ciò funzioni è necessario installare una sorta di software midi synth hardware / hardware. Ho timidityeseguito 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 ALSASoundcomando appropriato attorno a qualsiasi oggetto audio. Puoi anche ridefinire Playper 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}]

Giocare

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 Speakfunzionalità Mathematica , ad es.

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]

Simone, questa risposta ha funzionato, grazie mille.
enedene,

A proposito, qualcuno sa se Mathematica intende supportare il suono su Linux in futuro? Immagino che siano software specifici in cui la percentuale di persone che lo usano su Linux è molto maggiore rispetto alla maggior parte degli altri software.
enedene,

@enedene: ho posto quella domanda di supporto WRI oggi. Spero di ricevere una risposta nei prossimi giorni ...
Simon,

Grazie Simone, sei stato utile. Se ricevi una risposta, pubblicala qui o fornisci un link.
enedene,

@enedene: ho ricevuto una risposta utile dal supporto WRI. Vedi la modifica!
Simon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.