将CD-DA时序列表放入emacs calc向量中

时间:2013-12-10 20:57:12

标签: emacs

我想将包含许多歌曲的自动生成的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'的矢量,所以我可以总结分钟和秒使用内置函数。

感谢。

1 个答案:

答案 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)))))))))