Theo như tôi biết, Mathematica chưa bao giờ thực sự hỗ trợ âm thanh trong Linux.
Lệnh Play
được giới thiệu trong phiên bản 3 và toàn bộ hệ thống âm thanh được đại tu ở phiên bản 6. Nếu bạn tìm kiếm comp.soft-sys.math.mathIALa, bạn sẽ thấy các câu hỏi quay trở lại phiên bản 3. Trong phiên bản 6, lệnh EmitSound
đã được giới thiệu. Điều này bây giờ làm nền tảng cho hầu hết việc tạo ra âm thanh Mathicala, nhưng tôi không thể tìm ra cách nhanh chóng để sửa / hack nó cho linux, vì đã EmitSound
thực hiện một số tiền xử lý (tìm ra loại đối tượng nào được đưa ra) trước khi truyền âm thanh đến frontend đánh giá.
Trình điều khiển âm thanh / API mặc định được sử dụng trong hầu hết các bản cài đặt linux là ALSA ( wiki ). Nó trở thành mặc định vào năm 2002 trong kernel linux 2.6 và OSS được đánh dấu là "không dùng nữa" (mặc dù OSS vẫn đang được phát triển tích cực). Nhiều bản phân phối Linux hiện sử dụng PulseAudio
nằm trên âm thanh ALSA bên dưới. (Bất cứ ai có hiểu biết tốt hơn về âm thanh Linux nên thoải mái chỉnh sửa phần này!)
Mathematica đã giới thiệu âm thanh trong phiên bản 3 (1996) và do đó đã sử dụng OSS cho các biến thể * nix của nó. Đây vẫn là trường hợp, mặc dù OSS không còn là mặc định trong hầu hết các biến thể Linux. Biết điều này mang lại cho chúng tôi một giải pháp khả thi: sử dụng lớp mô phỏng OSS (xem, ví dụ: http://wiki.debian.org/SoundFAQ ).
Đơn giản nhất là sử dụng mô phỏng chế độ không gian người dùng và chạy Mathicala thông qua aoss
aoss mathematica
hoặc tương đương PulseAudio
padsp mathematica
Vấn đề với cả hai điều này là nó chỉ hoạt động với âm thanh MIDI, không phải với âm thanh được lấy mẫu. Ít nhất điều này đúng với hệ thống Ubuntu 10.10 của tôi và hệ thống linux của Scott Kruger (thuộc nhóm Hỗ trợ Kỹ thuật WRI ). Một báo cáo lỗi đã được nộp về vấn đề này.
Ngoài ra, bạn có thể tải khả năng tương thích OSS vào kernel của mình
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
và bạn có thể thêm snd_pcm_oss
và snd_mixer_oss
để /etc/modules
tải chúng tại boottime. Các mô-đun này không có sẵn trong Ubuntu 10.10
vì chúng đã quyết định loại bỏ tính tương thích ngược. Tôi không thể kiểm tra ở trên mà không biên dịch lại kernel của mình ...
Kể từ khi trên OSS thi đua hiện không làm việc một cách hoàn hảo, đây là một vài cách nhanh chóng công việc ở quanh dựa trên một số các cuộc thảo luận tôi đã nhìn thấy (ví dụ, một b c ) và viết lại để các lệnh sử dụng mặc định ALSA.
Đối với âm thanh được lấy mẫu, sử dụng 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 <> ")&"];]
ví dụ ALSASound[Play[Sin[1000 t^2], {t, 0, 1}], "WAV"]
.
Bạn cũng có thể đi Export
thẳng vào /dev/snd/
thiết bị phù hợp ... nhưng tôi không thể làm việc đó được.
Để midi
sử dụng aplaymidi
. Để làm việc này, bạn cần cài đặt một số phần mềm / phần cứng midi synth. Tôi đã timidity
chạy trên cổng 128. (Xem tại đây để được giúp đỡ)
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 <> ")&"];]
ví dụ, ALSASound[Sound[SoundNote /@ CharacterRange["A", "G"]], "MIDI"]
Bây giờ bạn có thể bọc ALSASound
lệnh thích hợp xung quanh bất kỳ đối tượng âm thanh. Bạn cũng có thể xác định lại Play
để sử dụng ALSASound
:
SetOptions[Play, DisplayFunction -> ((ALSASound[#, "WAV"]; #) &)];
Điều này về cơ bản tương đương với việc thiết lập $ SoundDisplayFunction , theo khuyến nghị của nhiều cuộc thảo luận trên internet. Cài đặt tùy chọn này sẽ phát âm thanh, sau đó xuất đồ họa bình thường.
Play[Sin[1000 t^2], {t, 0, 1}]
nhưng các nút start / stop sẽ không hoạt động, vì chúng dựa trên EmitSound
.
Để làm một Beep[]
tương đương đơn giản , hãy thử
ALSABeep[] := Play[Sin[5000 t], {t, 0, .1},
DisplayFunction -> (ALSASound[#, "WAV"]&)]
Cuối cùng, nếu bạn cài đặt các lễ hội text-to-speech (hoặc bất kỳ khác text-to-speech chương trình), sau đó bạn có thể thay thế Mathematica Speak
chức năng, ví dụ như,
FestivalSpeak[str_String] := (Run["(echo \"" <> str <> "\" | esddsp festival --tts)&"];)
FestivalSpeak[expr_] := FestivalSpeak[SpokenString[expr]]