Emacs下的多媒体系统 – EMMS

简介
emms 是 emacs中的多媒体系统,可以用来在 emacs 调用外部的音乐播放器播放音乐。通过emacs的elisp脚本的控制,可以自定义播放列表的样式,状态栏的显示甚至歌词的自动下载和动态显示。
安装
emacs 及 emms
在 windows 下,建议使用emacsw32,emms 建议使用emms-3.0版本,也可以使用最新的git版本,看个人喜好。
外部程序
使用 emms 比较麻烦的是在 windows 下没有 native 的 cli 音乐播放程序,因此你需要自己下载所需的音乐播放软件,建议使用 mplayer,mpg123。linux下,mpg321,mpd 或许效果会更好。特别是 mpd,它的设计思想就是 c/s 架构的。
另外,为了显示歌曲信息,需要解析音乐文件的标签,如果你的音乐文件的 tags比较有 序,那就可以使用 mp3info来对你的音乐读取标签,可以用来做播放列表和状态栏的进一步处理。如果你的音乐文件的 tags处于无序,也可以考虑直接使用音乐文件名作为标签。
自己选择的是 mplayer,emms 对它的支持比较好,mpg123 可能未来会考虑拓展。
配置
基本配置
EMMS 提供了一个 emms-setup.el 可以方便地进行必要的设置,按照功能需求可以使用minimalistic 、standard 、all 以及包括了各种还在测试中的功能的 devel。自己选择的是在 standard 的基础上增加自己需要的插件。
1 2 3 4 5 6 7 8 9 10 | (require 'emms-setup) (emms-standard) ;; no cli volume setup tools in windows ;(require 'emms-volume) (require 'emms-score) (emms-score 1) ;; autodetect musci files id3 tags encodeing (require 'emms-i18n) ;; auto-save and import last playlist (require 'emms-history) |
播放列表
用 emms 大部分的时间,可能大部分的时间不大会关注播放列表的现实,但如果要做展示或是查看一些音乐信息的话,还是需要自己定义的。可能这里也是 emms的乐趣所在,因为默认的播放列表可能你不一定会满意,但是自定义需要一定lisp基础。
可以自定义一个显示函数,hook 到 emms-track-description-function即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ;; my customizable playlist format (defun bigclean-emms-info-track-description (track) "Return a description of the current track." (let ((artist (emms-track-get track 'info-artist)) (title (emms-track-get track 'info-title)) (album (emms-track-get track 'info-album)) (ptime (emms-track-get track 'info-playing-time))) (if title (format "%-35s %-40s %-35s %5s:%-5s" (if artist artist "") (if title title "") (if album album "") (/ ptime 60) (% ptime 60))))) (setq emms-track-description-function 'bigclean-emms-info-track-description) |
这个自定义播放列表不大完善的地方在于,当显示英文字符时,一切表现的很好,但是如果中文和英文混合,就会显得很凌乱,原因在于 format 函数把一个汉字当做两个英文字符处理,暂时还没有想到可以解决此问题的 tricks。
状态栏
同自定义的播放列表相似,只是需要把自定义的显示函数hook到emms-mode-line-mode-line-function 就可以的。
1 2 3 4 5 6 7 8 9 10 11 | ;; format current track,only display title in mode line (defun bigclean-emms-mode-line-playlist-current () "Return a description of the current track." (let* ((track (emms-playlist-current-selected-track)) (type (emms-track-type track)) (title (emms-track-get track 'info-title))) (format "[ %s ]" (cond ((and title) title))))) (setq emms-mode-line-mode-line-function 'bigclean-emms-mode-line-playlist-current) |
快捷键绑定
为了尽可能的与 emms-playlist-mode状态下的快捷键兼容,因此大部分的全局快捷键只是添加了前缀 “C-c e”而已,另外,也仿照这个规则,自己定义了一组相似的快捷键。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ;; global key-map ;; all global keys prefix is C-c e ;; compatible with emms-playlist mode keybindings ;; you can view emms-playlist-mode.el to get details about ;; emms-playlist mode keys map (global-set-key (kbd "C-c e s") 'emms-stop) (global-set-key (kbd "C-c e P") 'emms-pause) (global-set-key (kbd "C-c e n") 'emms-next) (global-set-key (kbd "C-c e p") 'emms-previous) (global-set-key (kbd "C-c e f") 'emms-show) (global-set-key (kbd "C-c e >") 'emms-seek-forward) (global-set-key (kbd "C-c e <") 'emms-seek-backward) ;; these keys maps were derivations of above keybindings (global-set-key (kbd "C-c e S") 'emms-start) (global-set-key (kbd "C-c e g") 'emms-playlist-mode-go) (global-set-key (kbd "C-c e t") 'emms-play-directory-tree) (global-set-key (kbd "C-c e h") 'emms-shuffle) (global-set-key (kbd "C-c e e") 'emms-play-file) (global-set-key (kbd "C-c e l") 'emms-play-playlist) (global-set-key (kbd "C-c e r") 'emms-toggle-repeat-track) (global-set-key (kbd "C-c e R") 'emms-toggle-repeat-playlist) (global-set-key (kbd "C-c e u") 'emms-score-up-playing) (global-set-key (kbd "C-c e d") 'emms-score-down-playing) (global-set-key (kbd "C-c e o") 'emms-score-show-playing) |
快捷键的定义,只要自己觉得合理,好记就可以。仅作参考。
emms也可以显示指定目录中的歌词文件,也可以利用脚本自动下载歌词,自己没有配置,不再赘述。
tips
主要是编码的设置。
1 2 3 4 5 | ;; coding settings (setq emms-info-mp3info-coding-system 'gbk emms-cache-file-coding-system 'utf-8 ;; emms-i18n-default-coding-system '(utf-8 . utf-8) ) |

loading...
我把歌词放到另外一个目录下面, 英文歌名的歌曲可以找到歌词, 中文名的歌曲找不到歌词, 求解~
我的环境是win+emacs23+cygwin
其中cygwin ls可以显示中文, 但是find的中文显示是一堆问号,大概和这个有关
有什么方法可以搞定么
[回复]
@float
可能是中文歌词的 gbk 编码缘故导致的,你可以试试吧中文歌词改成 utf8 编码试试,可以尝试下。
自己以前也试过歌词的配置,应该是可行的,只是个人感觉不是太实用。现在 emms 也用的很少,在 windows 上也实在不大方便。
[回复]
应该是没找到歌词文件…
我把歌词放到和歌曲相同的目录下面就可以显示歌词了…
[回复]
但是怎么样才能找到在另外一个目录里面的歌词文件呢
[回复]
bigclean 回复:
三月 8th, 2010 at 11:23 上午
@float, 默认是在当前目录下寻找歌词文件的,或者你也可以设置 “emms-lyrics-dir” 变量的值为为你存放歌词的目录,但是歌词的编码需要为 utf8,详细可以参考下 emms 的文档(http://www.gnu.org/software/emms/manual/Lyrics.html).
[回复]
float 回复:
三月 9th, 2010 at 4:39 上午
@bigclean,
对啊, 我就是设置了emms-lyrics-dir,
然后把歌词放到emms-lyrics-dir目录下面就找不到中文歌名的歌词了,
英文歌名的歌词也是在emms-lyrics-dir下面, 是可以显示出来的
歌词编码是utf8
emms找歌词貌似是调用gnu find去找的
我也设置过cygwin, 但是估计是找不到中文的文件名,所以找不到相应的歌词了
[回复]
bigclean 回复:
三月 9th, 2010 at 6:24 上午
@float,
或许你可以试试把中文歌曲名改成英文试试 find 是否可以找到对应的歌词,或者中文歌曲名用英文歌词文件试试。自己很少用 cygwin,一直只是用 gnuwin32, 其中的 find 版本个人感觉行为是有点古怪,不如 native 的版本。还有变量”emms-lyrics-coding-system”也可以设置试试看。
[回复]
你这个快捷键的设置,反而不如 waterlin在
http://waterlin.blog.35.cn/articles/%E9%85%8D%E7%BD%AEemms%E3%80%81ediff%E8%AE%A9emacs%E6%88%90%E4%B8%BA%E9%80%86%E5%90%91%E5%AD%A6%E4%B9%A0%E8%8B%B1%E8%AF%AD%E7%9A%84%E5%88%A9%E5%99%A8.html
里定义的这个方便,特别如果你的用途是学英语:)
(global-set-key (kbd “M-p”) ‘emms-pause)
(global-set-key (kbd “M-=”) ‘emms-seek-forward)
(global-set-key (kbd “M–”) ‘emms-seek-backward)
[回复]
我用的是emacsw32,怎么为它安装emms了?
[回复]
我用的是ubuntu 我从apt-get 装了emacs emms mplayer 但是要如何开始播发一首歌和创建一个播放列表,
案装emms的时候也附带了mpg321,但是我把mpg321删除了,因为我有mplayer
[回复]
bigclean 回复:
六月 5th, 2010 at 12:43 下午
@阅读中, 设置好音乐目录或是使用诸如 “emms-play-directory-tree”等播放音乐的命令,如果已经设置好了播放程序(mplayer),就可以播放音乐了。
[回复]
windows上,emms好像不能播放中文文件名的mp3
[回复]
bigclean 回复:
九月 3rd, 2010 at 6:50 下午
@Meteor Liu 在自己这里(windows7 + mplayer) emms 可以播放中文名 mp3,不知你所使用的播放器是否是 mplayer?mplayer 在命令行下是否可以播放中文名 mp3?如果 mplayer 可以正常播放,那问题可能是会在 emms 读取文件名的编码所致。
[回复]
Meteor Liu 回复:
九月 3rd, 2010 at 10:05 下午
@bigclean,
哦?你的默认就可以么?
我的默认不行,不过我把default-process-coding-system改为(cp936 . cp936)就能放了。
[回复]
请问声音调节的函数名是什么,想配置以下快捷键调整声音.
[回复]
bigclean 回复:
十一月 17th, 2010 at 2:06 下午
@leekic, ‘emms-volume-raise’, ‘emms-volume-lower’,需要 amixer 的协作。
[回复]
我在WIN7下为什么使用不了emms?
按照说明安装好了emms,也进行了.emacs的配置,但输入:emms-start后提示是
Don’t know how to play track: nil
什么原因?
如何制定播放器?需要特殊的设定吗?
[回复]
bigclean 回复:
一月 10th, 2012 at 3:55 下午
@king64, 可能需要设置播放音乐的程序,诸如 mpg123/mpd/mplayer。emms 只是管理控制音乐,并不负责播放音乐。
[回复]