Насколько я знаю, 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]]