Нет звука в Mathematica под Linux


10

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

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

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


Это было проблемой в Mma с тех пор, как они добавили звуковые команды в версии 6. Я помню, как исправлял это в то время, но не беспокоился о более поздних версиях. Попробуйте документацию здесь .
Саймон

Должен ли этот вопрос быть перенесен в суперпользователя?
Саймон

К сожалению, у меня до сих пор нет звука.

Я оригинальный постер на Stackoverflow. Спасибо, что рассказали мне об этом сайте, я не знал, что этот существует. Это потрясающе, я мог с пользой этим воспользоваться.
Ежене

Ответы:


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"]&)]

Наконец, если вы установите праздничное преобразование текста в речь (или любую другую программу преобразования текста в речь ), вы можете заменить Speakфункциональность Mathematica , например:

FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]

Саймон, этот ответ сработал, большое спасибо.
Енедене

Кстати, кто-нибудь знает, планирует ли Mathematica поддерживать звук в Linux в будущем? Я предполагаю, что это специфическое программное обеспечение, где процент людей, использующих его в Linux, намного больше, чем в большинстве других программ.
Ежене

@enedene: Я задал этот вопрос о поддержке WRI сегодня. Надеюсь, мы получим ответ в ближайшие несколько дней ...
Саймон

Спасибо, Саймон, ты мне помог. Если вы получили ответ, пожалуйста, оставьте его здесь или дайте ссылку.
Ежене

@enedene: я получил полезный ответ от поддержки WRI. Смотрите редактирование!
Саймон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.