【问题标题】:Pure Data abstraction to take n arguments采用 n 个参数的纯数据抽象
【发布时间】:2020-05-05 04:41:11
【问题描述】:

我创建了一个 Pure Data 抽象,它接受 5 个 MIDI 控制器 ID 作为参数,并有两个入口(速度和 MIDI 控制器)。如果 MIDI 控制器 ID 与抽象的第 i 个参数匹配,我使用spigot 在出口 i 处输出输入速度。

我用它来控制我的 MIDI 控制器的 5 个滑块(音量、起音、衰减、延音、释放),如下所示:

如您所见,抽象是非常重复的,理想情况下它可以接受 n 个参数,在第 i 个出口处输出给定 MIDI 滑块的滑块值。或者,我可以只使用一个参数并为每个滑块重新使用抽象,但这也有点重复。

有没有办法在我的抽象中采用 n 个参数?或者,有没有其他更优雅的解决方案来控制我缺少的 MIDI 滑块?

【问题讨论】:

标签: midi puredata


【解决方案1】:

对于核心原版objects 或externals,采用可变数量的参数是一个常见功能。 [trigger]、[select]、[pack] 或 [unpack] 等许多对象都以这种方式运行,并根据给定参数的数量创建许多 xlet。

对于抽象,没有简单的方法可以根据给定参数的数量来获得可变数量的输出。这是可能的,但它是一个黑客。

让我们先看一些使补丁更容易的技术。

正如您在以下屏幕截图中所见,您的补丁中的 [expr] 对象可以很容易地被一个简单的 Pd 对象替换:[==]

让我们看看 MIDI 消息。 MIDI 对象输出分层树的元素:channel、controller、value 按此顺序但从右到左(对于Pd,最右边的出口首先触发)。您想要的是根据控制器编号路由它们,而忽略通道编号。为此,您需要翻转前两个插座的顺序,以便可以将控制器编号用作列表中的选择器。一种方法是打包数字,然后使用美元符号在消息中重新排序它们(注意,消息对象中的美元符号对本地消息起作用,它们与美元符号在对象框中的作用无关)。另一种方法是使用对象[swap](在这种情况下使用[swap]会在补丁中将对象数量减少一个,但[pack]和[message(更通用,这就是我在这里展示它的原因)。

关于采用 n 个参数来改变网点数量的实际问题:这个挑战是两个独立的问题:

  1. 如何检测参数的数量
  2. 如何动态更改网点数量

直到最近,还没有一种正确的方法来检测参数的存在。由于 Pd 0.50 有 [pdcontrol] 允许这样做。

在此处使用 [initbang] 是因为 [loadbang] 会为创建插座而触发太晚。 挑战的第二部分可以通过称为“dynamic patching”的技术或通过输出列表而不是创建额外的出口来解决。但是,使用列表输出后,您需要对其进行路由,然后您将快速到达上图所示的补丁。

【讨论】:

  • 这个解决方案要好得多,所以我不需要带有 n 个参数的抽象。顺便说一句,[route] 对象似乎需要 n 个参数 - 我想知道它是如何实现的?
  • 对于核心 vanilla 对象或外部对象,采用可变数量的参数不是问题。许多对象,如 [trigger] [select] [pack] [unpack] 以这种方式运行并相应地创建许多 xlet。只是很难为抽象修补这种行为。
  • 感谢 max,非常有帮助。 [route] 似乎是一个非常有用的对象,我仍然没有完全欣赏
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2017-06-30
  • 2011-09-08
  • 2013-01-15
相关资源
最近更新 更多