เท่าที่ฉันรู้ 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 ยังอยู่ระหว่างการพัฒนาที่ใช้งานอยู่) ลีนุกซ์หลายรุ่นใช้PulseAudio
ซึ่งอยู่บนสุดของเสียง ALSA (ใครก็ตามที่มีความเข้าใจในเสียง Linux ดีกว่าควรแก้ไขได้!)
Mathematica แนะนำเสียงในรุ่น 3 (1996) และใช้ OSS สำหรับตัวแปร * nix ยังคงเป็นกรณีนี้แม้ว่า OSS จะไม่เป็นค่าเริ่มต้นในรุ่น Linux เกือบทุกชนิดอีกต่อไป การรู้สิ่งนี้ทำให้เรามีทางออกที่เป็นไปได้: ใช้เลเยอร์การจำลอง OSS (ดูตัวอย่างเช่นhttp://wiki.debian.org/SoundFAQ )
ที่ง่ายที่สุดคือการใช้การจำลองโหมด userspace และรัน Mathematica ผ่าน aoss
aoss mathematica
หรือเทียบเท่า PulseAudio
padsp mathematica
ปัญหาของทั้งสองสิ่งนี้คือใช้งานได้กับเสียง MIDI เท่านั้นไม่ใช่เสียงตัวอย่าง อย่างน้อยก็เป็นจริงในระบบ Ubuntu 10.10 ของฉันและระบบ linux ของ Scott Kruger (จากทีมสนับสนุนด้านเทคนิคของWRI ) มีการรายงานข้อผิดพลาดเกี่ยวกับปัญหานี้
หรือคุณสามารถโหลดความเข้ากันได้ของ OSS ลงในเคอร์เนลของคุณ
apt-get install alsa-oss
modprobe snd_pcm_oss
modprobe snd_mixer_oss
และคุณสามารถเพิ่มsnd_pcm_oss
และsnd_mixer_oss
เพื่อ/etc/modules
ที่จะโหลดพวกเขาที่ boottime โมดูลเหล่านี้ไม่พร้อมใช้งานใน 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}]
แต่ปุ่ม START / STOP 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]]