Aucun son dans Mathematica sous Linux

10

J'ai un énorme ensemble d'événements dans Mathematica auxquels je dois réagir, et ce n'est pas pratique de toujours le vérifier, d'autant plus que les événements sont distribués au hasard dans le temps.
J'ai donc voulu ajouter un son simple pour me rappeler d'aller vérifier l'événement. Je voulais l'utiliser Beep[]mais je n'obtiens aucun résultat, en fait, je ne savais pas jusqu'à présent que Mathematica ne faisait aucun son.

J'utilise Debian Squeeze Stable et je n'ai aucun problème avec toute autre application utilisant le son.

Cela affecte toutes les versions récentes (7, 8 et 9) de Mathematica et probablement les anciennes versions en fonction de la configuration sonore de votre système.

enedene
la source
Cela a été un problème dans Mma depuis qu'ils ont ajouté des commandes sonores dans la version 6. Je me souviens de l'avoir corrigé à l'époque, mais cela ne m'a pas dérangé dans les versions les plus récentes. Essayez la documentation ici .
Simon
Cette question doit-elle être migrée vers le superutilisateur?
Simon
Malheureusement, je n'obtiens toujours aucun son.
Je suis l'affiche originale sur Stackoverflow. Merci de m'avoir parlé de ce site, je ne savais pas que celui-ci existait. C'est fantastique, je pourrais en faire bon usage.
enedene

Réponses:

10

Pour autant que je sache, Mathematica n'a jamais vraiment supporté le son sous Linux. La commande a Playété introduite dans la version 3, et l'ensemble du système audio a été révisé dans la version 6. Si vous recherchez comp.soft-sys.math.mathematica, vous trouverez des questions remontant jusqu'à la version 3. Dans la version 6, le commande a EmitSoundété introduite. Cela sous-tend maintenant la plupart de la génération de sons Mathematica, mais je n'ai pas trouvé de moyen rapide de le réparer / le pirater pour Linux, car il EmitSoundeffectue un prétraitement (déterminer quels types d'objets lui ont été donnés) avant de transmettre le son à l'interface évaluer.

Le pilote audio / API par défaut utilisé dans la plupart des installations Linux est ALSA ( wiki ). Il est devenu la valeur par défaut en 2002 dans le noyau Linux 2.6 et OSS a été marqué comme "déprécié" (bien que OSS soit toujours en développement actif). De nombreuses distributions Linux utilisent désormais PulseAudio qui se trouve au-dessus du son ALSA sous-jacent. (Quiconque ayant une meilleure compréhension du son Linux devrait se sentir libre de le modifier!)

Mathematica a introduit le son dans la version 3 (1996) et a donc utilisé OSS pour ses variantes * nix. C'est toujours le cas, bien que OSS ne soit plus la valeur par défaut dans presque toutes les variantes de Linux. Le savoir nous donne une solution possible: utilisez une couche d'émulation OSS (voir, par exemple, http://wiki.debian.org/SoundFAQ ).

Le plus simple est d'utiliser une émulation en mode espace utilisateur et d'exécuter Mathematica via aoss

aoss mathematica

ou l'équivalent PulseAudio

padsp mathematica

Le problème avec ces deux est qu'il ne fonctionne qu'avec des sons MIDI, pas avec des sons échantillonnés. C'est du moins le cas sur mon système Ubuntu 10.10 et le système Linux de Scott Kruger (de l' équipe de support technique WRI ). Un rapport de bogue a été déposé sur ce problème.

Alternativement, vous pouvez charger la compatibilité OSS dans votre noyau

apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss

et vous pouvez ajouter snd_pcm_osset snd_mixer_ossà /etc/modules les charger à boottime. Ces modules ne sont pas facilement disponibles dans Ubuntu 10.10 car ils ont décidé de supprimer la compatibilité descendante. Je ne peux pas tester ce qui précède sans recompiler mon noyau ...


Étant donné que l'émulation OSS ci-dessus ne fonctionne pas actuellement parfaitement, voici quelques solutions rapides basées sur certaines des discussions que j'ai vues (par exemple, un b c ) et réécrites pour utiliser les commandes ALSA par défaut.

Pour le son échantillonné, utilisez 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 <> ")&"];]

par exemple ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"].
Vous devriez également pouvoir accéder Exportdirectement à l' /dev/snd/appareil approprié ... mais je ne pouvais pas le faire fonctionner.

Pour midiutilisation aplaymidi. Pour que cela fonctionne, vous avez besoin d'une sorte de synthé midi logiciel / matériel installé. J'ai timidityexécuté sur le port 128. (Voir ici pour de l'aide)

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 <> ")&"];]

par exemple, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]

Vous pouvez maintenant envelopper la ALSASoundcommande appropriée autour de tout objet sonore. Vous pouvez également redéfinir Playpour utiliser ALSASound:

SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];

Cela revient essentiellement à définir $ SoundDisplayFunction , comme le recommandent de nombreuses discussions sur Internet. Ce paramètre d'option jouera le son, puis affichera les graphiques normaux.

Play[Sin[1000 t^2], {t, 0, 1}]

Jouer

mais les boutons marche / arrêt ne fonctionneront pas, car ils sont basés sur EmitSound.

Pour créer un Beep[]équivalent simple , essayez

ALSABeep[] := Play[Sin[5000 t], {t, 0, .1}, 
                   DisplayFunction -> (ALSASound[#, "WAV"]&)]

Enfin, si vous installez la synthèse vocale du festival (ou tout autre programme de synthèse vocale ), vous pouvez remplacer la Speakfonctionnalité Mathematica , par exemple,

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]
Simon
la source
Simon, cette réponse a fait l'affaire, merci beaucoup.
enedene
Au fait, quelqu'un sait-il si Mathematica prévoit de prendre en charge le son sous Linux à l'avenir? Je suppose que ce sont des logiciels spécifiques où le pourcentage de personnes l'utilisant sous Linux est beaucoup plus élevé que pour la plupart des autres logiciels.
enedene
@enedene: J'ai posé cette question du soutien de l'IRG aujourd'hui. J'espère que nous aurons une réponse dans les prochains jours ...
Simon
Merci Simon, tu as été utile. Si vous obtenez une réponse, veuillez la poster ici ou donner un lien.
enedene
@enedene: J'ai reçu une réponse utile du support WRI. Voir l'édition!
Simon