Вызов функции после вызова другой функции
Я программирую контроллер для использования с Ableton Live 8, используя API на основе Python. В моем коде я использую метод, предоставленный в API, для отслеживания изменений в значении свойства и вызываю функцию всякий раз, когда значение изменяется. Моя цель - изменить цвет клипа, когда будет замечено изменение значения.
Мой код завершен, и он компилируется без ошибок. Из журнала Эблтона:
742234 ms. RemoteScriptError: RuntimeError
742234 ms. RemoteScriptError: :
742234 ms. RemoteScriptError: Changes cannot be triggered by notifications
742234 ms. RemoteScriptError:
Похоже, что это результат использования встроенной системы уведомлений для внесения изменений в действующий набор во время уведомления. Запуск фактического изменения ПОСЛЕ того, как функция прослушивания закончила выполняться, должна работать. Возможно ли это с помощью Python?
Изменить для уточнения:
в настоящее время у нас есть
- замечено изменение значения, вызвана функция
- функция пытается изменить цвет клипов (приводит к ошибке)
нам нужно
- слушатель замечает изменение значения, вызывается функция
- функция находит новое значение цвета
- выполнение функции заканчивается
- другая функция вызывается за пределами области действия слушателя и изменяет цвет клипов
2 ответа
Я много сделал в M4L и знаю эту ошибку наизусть:) Боюсь, вы ничего не можете с этим поделать - на мой взгляд, это выглядит как встроенный механизм безопасности, так что вы не можете зацикливаться (Что-то изменилось? Измени это! Что-то изменилось...).
В M4L я использовал Javascript Tasks для разделения шагов (Tasks забывают почти все), что-то вроде
Наблюдатель -> Что-то изменилось
Создать задачу, которая реагирует
task.execute() или task.schedule(время)
Может быть, модуль Python Threading может достичь чего-то подобного? Кстати, если вам случится что-то понять о заданиях _Framework, дайте мне знать.
У меня возникла та же проблема при попытке удалить дорожку из прослушивателя остановки клипа, затем я нашел эту ветку и последовал предложению @user2323980.
Кажется, что есть объект "_tasks" в каждом классе Framework (я нашел его через log_message внутри ClipSlotComponent и ControlSurface), который обрабатывает параллелизм между задачами. И это действительно просто использовать:
self._tasks.add (Task.run (func, args))
Я нашел несколько вариантов его использования в скриптах Push и MK2, это хорошие ссылки.