10

У меня есть огромный набор событий в Mathematica, на которые мне нужно реагировать, и не всегда проверять это, тем более что события случайным образом распределяются во времени.
Поэтому я хотел добавить простой звук, чтобы напомнить мне, чтобы пойти проверить событие. Я хотел использовать Beep[] но я не получил результатов, на самом деле, я до сих пор не осознал, что Mathematica не издает никаких звуков вообще.

Я использую Debian Squeeze Stable и у меня нет проблем с другими приложениями, использующими звук.

Это влияет на все последние версии (7, 8 и 9) Mathematica и, возможно, более старые версии в зависимости от настроек звука вашей системы.

1 ответ1

10

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .