【问题标题】:Calling a function after another function is called在调用另一个函数之后调用一个函数
【发布时间】:2013-02-28 00:34:35
【问题描述】:

我正在使用基于 Python 的 API 编写与 Ableton Live 8 一起使用的控制器。在我的代码中,我使用 API 中提供的方法来观察属性值的变化,并在值发生变化时调用函数。我的目标是在注意到值更改时更改剪辑的颜色。

我的代码已经完成,它编译没有错误。来自 Ableton 的日志:

742234 ms. RemoteScriptError: RuntimeError
742234 ms. RemoteScriptError: : 
742234 ms. RemoteScriptError: Changes cannot be triggered by notifications
742234 ms. RemoteScriptError: 

这似乎是使用内置通知系统在通知期间更改现场设置的结果。触发实际更改AFTER,监听函数已经完成执行应该可以工作。这可以使用 Python 实现吗?

编辑澄清:

目前我们有

  1. 发现值变化,调用函数
  2. 函数尝试更改剪辑颜色(导致错误)

我们需要

  1. 监听器注意到值变化,调用函数
  2. 函数找到新的颜色值
  3. 函数执行结束
  4. 在侦听器范围之外调用另一个函数,并更改剪辑颜色

【问题讨论】:

  • 我对 Abelton Live 一无所知,但我猜如果通知无法进行修改,会有一些 API 允许您排队等待稍后发生的事情(一次通知已结束)。我在任何地方都找不到 API 的文档,所以我不能再具体了。
  • 使用 Max For Live API 中的函数可以做到这一点,但我正在尝试在此之外工作。我想我需要创建自己的监听器,并观察全局变量的变化。

标签: python-2.7 listener ableton-live


【解决方案1】:

我在 M4L 中做了很多工作,并且牢记这个错误 :) 恐怕你对此无能为力 - 在我的菜鸟眼中,它看起来像一个内置的安全机制,所以你不能循环(改变了什么?改变它!改变了什么......)。

在 M4L 中,我使用 Javascript 任务来分隔步骤(任务几乎忘记了所有内容), 像

观察者 -> 发生了一些变化

创建一个响应的任务

task.execute() 或 task.schedule(time)

也许python线程模块可以实现类似的东西? 顺便说一句,如果你对 _Framework-Tasks 有任何了解,请告诉我。

【讨论】:

  • 怀疑我可以在没有 M4L 的情况下连接到 Javascript,这有点违背了在 Python 中构建它的目的。真可惜。我猜您对“安全机制”的看法是正确的。看起来 AL 在听众对 Live 模块的某些部分进行更改时遇到了麻烦。从(非常)简短的检查来看,它可能与用于保存集合的文件的内容有关,尽管这对我来说没有多大意义......
【解决方案2】:

我在尝试从剪辑停止侦听器中删除曲目时遇到了同样的问题,然后我找到了这个帖子并遵循了 @user2323980 的建议。
每个框架类上似乎都有一个“_tasks”对象(我通过 ClipSlotComponent 和 ControlSurface 中的 log_message 找到它)来处理任务之间的并发。而且使用起来真的很简单:

self._tasks.add(Task.run(func, args))

我在 Push 和 MK2 脚本中发现了它的一些用途,这些都是很好的参考。

【讨论】:

    猜你喜欢
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多