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