Насколько я знаю, Mathematica никогда не поддерживала звук в Linux.
Команда Play
была представлена в версии 3, а вся звуковая система была пересмотрена в версии 6.
Если вы будете искать comp.soft-sys.math.mathematica, вы найдете вопросы, возвращающиеся к версии 3.
В версии 6 была введена команда EmitSound
.
Теперь это лежит в основе большей части генерации звука Mathematica, но я не смог найти быстрый способ исправить / взломать его для linux, так как EmitSound
выполняет некоторую предварительную обработку (выясняя, какие типы объектов были переданы) перед передачей звука во внешний интерфейс. оценить.
Звуковой драйвер /API по умолчанию, используемый в большинстве установок linux, - ALSA (wiki).
Это стало по умолчанию в 2002 году в ядре Linux 2.6, и OSS был помечен как "устаревший" (хотя OSS все еще находится в активной разработке).
Многие дистрибутивы Linux теперь используют PulseAudio, который расположен поверх основного звука ALSA.
(Любой, кто лучше понимает звук Linux, может свободно редактировать это!)
Mathematica представила звук в версии 3 (1996) и, таким образом, использовала OSS для своих * nix вариантов.
Это все еще так, несмотря на то, что OSS больше не используется по умолчанию практически в любом варианте Linux.
Знание этого дает нам возможное решение: использовать слой эмуляции OSS (см., Например, http://wiki.debian.org/SoundFAQ).
Самое простое - использовать эмуляцию режима пользователя и запускать Mathematica через aoss
aoss mathematica
или эквивалент PulseAudio
padsp mathematica
Проблема с обоими из них заключается в том, что он работает только со звуками MIDI, а не с сэмплированными звуками.
По крайней мере, это верно для моей системы Ubuntu 10.10 и системы linux Скотта Крюгера (из команды технической поддержки WRI ).
Сообщение об ошибке было подано по этому вопросу.
Кроме того, вы можете загрузить совместимость OSS в ваше ядро
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
и вы можете добавить snd_pcm_oss
и snd_mixer_oss
в /etc/modules
чтобы загрузить их во время загрузки.
Эти модули недоступны в Ubuntu 10.10, так как они решили удалить обратную совместимость.
Я не могу проверить выше, не перекомпилировав мое ядро ...
Так как вышеупомянутая эмуляция OSS в настоящее время не работает идеально, вот несколько быстрых обходных путей, основанных на некоторых обсуждениях, которые я видел (например, a b c) и переписанных для использования команд ALSA по умолчанию.
Для сэмплированного звука используйте 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 <> ")&"];]
например, ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Вы также должны иметь возможность Export
прямо на соответствующее устройство /dev/snd/
...
но я не мог заставить это работать.
Для midi
используйте aplaymidi
.
Чтобы это работало, вам нужен какой-то программно-аппаратный Midi-синтезатор.
У меня timidity
работает на порте 128. (Смотрите здесь для помощи)
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 <> ")&"];]
например, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Теперь вы можете обернуть соответствующую команду ALSASound
вокруг любого звукового объекта.
Вы также можете переопределить Play
чтобы использовать ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
По сути, это эквивалентно установке $ SoundDisplayFunction, как рекомендовано многими дискуссиями в Интернете.
Эта настройка параметра будет воспроизводить звук, а затем выводить обычную графику.
Play[Sin[1000 t^2], {t, 0, 1}]
но кнопки старт / стоп не будут работать, так как они основаны на EmitSound
.
Чтобы сделать простой Beep[]
эквивалент, попробуйте
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Наконец, если вы установите праздничное преобразование текста в речь (или любую другую программу преобразования текста в речь ), то вы можете заменить функциональность Mathematica Speak
, например:
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]