首页 > 解决方案 > 如何从列表的元素中提取所有汽车?

问题描述

如果我在 Audacity 2.4.2 音轨上创建几个空标签(通过单击轨道上的各个点,并Ctrl-B在每次单击后按下),奈奎斯特提示符会评估表达式

(cadar (aud-get-info "Labels"))

...到一个列表L,其元素又是 3 元素子列表。为了便于描述,我将这些 3 元素子列表称为“三元组”。

碰巧的是,对于这些三元组中的每一个,前两个元素都是相同的浮点数,最后一个元素是空字符串。

因此,这种列表L的典型实例可能以类似

((0.12345 0.12345 "") (6.78901 6.78901 "") (23.45678 23.45678 "") ...

如何创建一个包含此类列表L的所有第一个元素的新列表?

例如,如果我的初始列表L如上所示开始,则涉及列表L的奈奎斯特表达式将评估为如下所示的列表开头?

(0.12345 6.78901 23.45678 ...)

(我尝试过类似的东西(mapc (lambda (x) x) (cadar (aud-get-info "Labels"))),不仅没有产生预期的结果,而且在某些情况下实际上导致在轨道上添加了几个新标签,我觉得这完全是令人困惑的。因此,尽管这听起来很奇怪,但我必须强调我正在寻找保持原始界面不变的解决方案,特别是不要在当前选择的轨道上添加任何新标签。)

标签: audacitynyquist

解决方案


我正在使用当前的 Audacity 3.1.3 版本,但这对于 Audacity 2.4.2 应该都是一样的。

在 Nyquist Prompt 中,如果您使用 Debug 按钮运行:

(print (aud-get-info "Labels"))

您将看到类似于以下内容的输出:

((1 ((0.184322 0.184322 "") (0.654661 1.24576 "") (2.25424 2.25424 ""))))

第一个“1”是轨道号(零索引)。如果有两个标签轨道,它看起来像:

((1 ((0.184322 0.184322 "") (0.654661 1.24576 "") (2.25424 2.25424 "")))
 (3 ((0.449153 0.449153 ""))))

每个标签的格式为:( 开始时间结束时间“标签文本”) (注意轨道 1 中的第二个标签是区域标签。)

因此 (aud-get-info "Labels") 返回的数据格式为:

(list (list track-num (list (first-label) (second-label) ...))
      (list track-num (list (first-label) ...)))

要从每个轨道获取标签列表:

(let ((label-info (aud-get-info "Labels")))
  (dolist (track label-info)
    (print (second track))))

在上述情况下,它将打印到调试窗口:

((0.184322 0.184322 "") (0.654661 1.24576 "") (2.25424 2.25424 ""))
((0.449153 0.449153 ""))

要创建每个标签开始时间的列表:

(let ((output-list ())
      (label-info (aud-get-info "Labels")))
  (dolist (track label-info)  ;step through each track in label-info
    (setf labels (second track))
    (dolist (label labels)     ;step through each label in labels
      (setf start-time (first label))
      (push start-time output-list)))
  ;; Print the list:
  (format nil "~a" output-list))

其中,在上面的例子中。印刷: (0.449153 2.25424 0.654661 0.184322)


推荐阅读