Насколько я знаю, 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"]&)]
Наконец, если вы установите праздничное преобразование текста в речь (или любую другую программу преобразования текста в речь ), вы можете заменить Speakфункциональность Mathematica , например:
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]