我想将包含许多歌曲的自动生成的CUE表分成总长度低于74或可能为80分钟的组,以便刻录到CD。歌曲持续时间列表以下列格式显示在CUE表中:
REM FILE-DECODED-SIZE 03:55:72
REM FILE-DECODED-SIZE 02:18:59
REM FILE-DECODED-SIZE 04:21:43
REM FILE-DECODED-SIZE 02:15:26
REM FILE-DECODED-SIZE 04:56:72
REM FILE-DECODED-SIZE 03:37:30
REM FILE-DECODED-SIZE 05:02:73
...
格式为MM:SS:FF - 分钟,秒和光盘数字音频(CD-DA)帧,第二帧有75个CD-DA帧。我想使用M-x calc-grab-rectangle
将一些这些时序的矩形抓取到Emacs中的Calc矢量中,然后将它们相加以产生最终的MM:SS:FF编号(其中MM <99)。这需要在emacs Calc中创建一个新的“类型”,还是自动转换为其中一种内置类型?是否有相关的代码用于处理这种格式解析和类型转换?
或者最低限度,我希望能够将一些MM:SS数字作为矩形抓取,并让它自动将它们转换为emacs Calc'HMS forms'的矢量,所以我可以总结分钟和秒使用内置函数。
感谢。
答案 0 :(得分:2)
以下lisp代码从点开始收集当前缓冲区中的提示时间字符串并将它们放到calc
堆栈中:
(require 'cl)
(require 'calc)
(defun cue-collect-times ()
"Collect times in cue-format starting at point and put them in hms format on the calc stack."
(save-excursion
(calc-push-list
(loop while (re-search-forward "^REM FILE-DECODED-SIZE \\([0-9]+\\):\\([0-9]+\\):" nil t)
collect (list 'hms 0 (string-to-number (match-string 1)) (string-to-number (match-string 2)))))))
我忽略了框架。希望这没关系。
您还可以将时间作为向量放在堆栈中:
(defun cue-collect-times-as-vector ()
"Collect times in cue-format starting at point into a calc vector and put it on the stack."
(save-excursion
(calc-push-list (list (append '(vec)
(loop while (re-search-forward "^REM FILE-DECODED-SIZE \\([0-9]+\\):\\([0-9]+\\):" nil t)
collect (list 'hms 0 (string-to-number (match-string 1)) (string-to-number (match-string 2)))))))))