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 EmitSound
effectue 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_oss
et 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 Export
directement à l' /dev/snd/
appareil approprié ... mais je ne pouvais pas le faire fonctionner.
Pour midi
utilisation aplaymidi
. Pour que cela fonctionne, vous avez besoin d'une sorte de synthé midi logiciel / matériel installé. J'ai timidity
exé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 ALSASound
commande appropriée autour de tout objet sonore. Vous pouvez également redéfinir Play
pour 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}]
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 Speak
fonctionnalité Mathematica , par exemple,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]