У Mathematica під Linux немає звуку


10

У мене є величезний набір подій в Mathematica, на які я повинен реагувати, і це не практично завжди перевіряє на це, тим більше, що події розподіляються випадковим чином у часі.
Тому я хотів додати простий звук, щоб нагадати мені піти перевірити подію. Я хотів використати, Beep[]але я не отримав результатів, насправді я до цього часу не розумів, що Mathematica не видає жодних звуків.

Я використовую Debian Squeeze Stable і не маю проблем з будь-яким іншим додатком, що використовує звук.

Це впливає на всі останні версії (7, 8 та 9) Mathematica та, ймовірно, більш старі версії залежно від настроюваної вами системи.


Ця проблема в Mma була проблемою з тих пір, коли вони додавали звукові команди у версії 6. Я пам’ятаю, що виправляли її в той час, але не переймалися в останніх версіях. Спробуйте документацію тут .
Саймон

Чи варто це питання перенести на суперпользователь?
Simon Simon

На жаль, я все ще не отримую звуку.

Я оригінальний плакат на Stackoverflow. Дякую, що розповіли про цей сайт, я не знав, що він існує. Це фантастично, я міг би його добре використати.
enedene

Також дивіться: unix.stackexchange.com/q/15191/2842
Саймон

Відповіді:


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 synth. У мене 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]]

Саймоне, ця відповідь зробила трюк, дуже дякую.
enedene

До речі, хтось знає, чи планує Mathematica підтримувати звук на Linux у майбутньому? Я б здогадався, що це специфічне програмне забезпечення, де відсоток людей, які використовують його в Linux, значно більший, ніж для більшості інших програм.
enedene

@enedene: Я сьогодні задав це питання підтримки WRI. Сподіваємось, ми отримаємо відповідь у найближчі кілька днів ...
Саймон

Дякую, Саймоне, ти був корисним. Якщо ви отримаєте відповідь, будь ласка, опублікуйте її тут або надішліть посилання.
ендене

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