Max/MSP/Jitter 官方教程翻译18 - 使用已命名的矩阵

00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 16: Using Named Jitter Matrices

本教程将学习如何使用 jit.matrix 的 name 属性将来自多个源的矩阵数据写入同一矩阵。我们还将研究如何在复制时缩放矩阵的大小,以及如何用 Max 低优先级队列来降低事件的优先级,以支持更耗时的任务。

教程 patch 分为五个彩色区域。中间(浅蓝色)区域包含两个 jit.movi​e 对象。loadbang 对象在 patch 打开时读取两个视频(rain.mov 和 traffic.mov)到 jit.movi​e

与之前的教程不同,这里的 jit.movi​e 使用 sendreceive 对象与 patch 的其余部分通信。名为 m1 和 m2 的 receive 对象将消息转发给两个 jit.movi​e 对象。然后发送它们的输出矩阵(使用 send)到 patch 其他位置名为 movie1 和 movie2 的 receive 对象。

patch 顶部的黄色区域包含驱动 patch 中 Jitter 进程的 metro​

metro 驱动两个消息框中的一个

点击开关启动 metro 。 patch 中的三个 jit.pwindow 开始显示图像。

优先级

metro 经过 Ggatejit.qball 到达 gatemetro 发送的 bang 由 gate 分流到两个消息框之一。最终输出矩阵(在 patch 底部的 jit.pwindow 中)将根据哪个消息框被触发而改变。

单击连接到 gate 左入口的两个消息框(1 和 2)。注意底部的 jit.pwindow 如何变化:

最终输出矩阵根据 patch 的消息顺序而变化

两个消息框都将 bang 发送到三个命名相同的 receive 对象(m1,m2 和 output)。两者的区别在于发送消息的顺序。左侧消息框(由 metro 驱动,当 gate 设置为 1 时)将第一个 bang 发送到 jit.movie (rain movie)。最后,patch 底部的 jit.matrix 收到 bang,最终矩阵被发送出去。右侧消息框(由 metro 驱动,当 gate 被设置为 2 时)调换驱动 jit.movie 的两个 bang 的顺序(左 jit.movie 先输出矩阵,然后是右边的 jit.movie)。

当查看两个 jit.movie 和最终的 jit.pwindow 之间发生了什么时,这些消息发送的顺序才有意义。

要点:如果不确定 Max patch 中发生事件的顺序,可以查看 patch 的 trace 的执行方式。在接线中设置断点就可以使用 “Auto Step” 命令逐步执行 patch ,查看它如何运行。但是这对于 metro 效果不好,因为 bang 将持续重启。先在 metro 位置添加按钮用于调试。

名字里面有什么?

一旦 jit.movie 接收到 bang,就会向下面的 send 对象输出一个矩阵,然后传递给名为 movie1 和 movie2 的 receive 对象。receive(在 patch 右侧两个相同的区域)连接到 jit.pwindow 以及两个已命名的 jit.matrix 对象:

已命名的 jit.matrix

patch 右侧的两个 jit.matrix(以及 patch 底部 jit.pwindow 上方的 jit.matrix)都有名称。这三个对象的名称是 composite。它们共享包含在名为 composite 的矩阵中的数据。

理解了两个 jit.movie 将数据写入相同的矩阵(名称相同的两个独立的 jit.matrix),就明白为什么 bang 的顺序很重要。如果左边的 jit.movi​e 首先发出矩阵,它会将数据写入 composite 矩阵,然后是右边的 jit.movi​e,它将数据写入同一个矩阵。如果两个矩阵写入任何共同的单元格(见下文),那么最后到达的矩阵将覆盖之前单元格中的数据。

目的地维度

教程 patch 右侧的两个 jit.matrix 对象将 usedstdim 属性设置为 1。这样可以缩放由 jit.movie 发送的矩阵,以便它们只写入 composite 矩阵的某个区域。

调整标记为 x origin y origin 的数字框,缩放它所连接的两个子 patch p coords。请注意 composite 矩阵如何移动和调整 jit.movie 中两个图像的大小。

图片内的图片

p coords 包含相同的辅助 patch ,用于格式化 jit.matrix 对象的 dstdimstartdstdimend 属性。这些属性分别指定将数据复制到 composite 矩阵时的左上角和右下角坐标。usedstdim 属性告诉 jit.matrix 复制数据时使用这些属性。当 usedstdim 为 0 时,缩放输入矩阵以填充 jit.matrix 引用的整个矩阵。

写入共享矩阵之前先缩放输入矩阵

发送到子 patch 的三个数字由内部对象格式化,生成要填充的输出矩阵的左上和右下区域坐标列表。消息在输出前,用 $ 暂时替代列表中对应的数字参数。

在两个矩阵写入 composite 矩阵之后,最后一件事是发送 bang 到名为output 的 receive 对象:

最后的结果

教程 patch 底部的区域是第三个名为 jit.matrix 的对象。由 metro 发送的 bang 经过一个 trigger 对象发送 bang 到 jit.matrix(让它输出矩阵到 jit.pwindow),紧接一个 clear 消息(0),清除所有名为 composite 矩阵中的单元格。如果不清空矩阵,改变任何jit.matrixdstdimstartdstdimend 属性,可能导致残留之前输出位置的图像。

队列优先级

当 Max 运算跟不上速度时, patch 顶部的 jit.qball 对象就有了用武之地。metro​ (每隔 50 毫秒发出 bang)正在触发三个独立的操作(从 jit.movi​e 对象写入数据到两个已命名的矩阵,显示数据,清空矩阵以便重新开始)。jit.matrix 写入数据到内部矩阵(这个例子中是 composite 矩阵)并允许后续消息来插队。运行任务时,它允许其他优先级更高的 Max 事件发生。这样可以在前一操作完成之前显示矩阵(或将更多数据写入),从而引起闪烁和其他意外结果。

jit.qball 对象把消息放到 Max 低优先级队列的最后, 在那里其他消息可以被优先处理。如果 jit.qball 在所有当前任务完成之前从 metro​ 得到 bang,它将等到队列中其他所有任务都完成后,再发出 bang。同样,如果另一个 bang 在发出第一个 bang 之前就出现了(即如果 patch 的剩余时间需要超过 50 毫秒才能完成所有事情),第一个 bang 将被抢先(抛弃)而只发出第二个 bang。这让我们可以放心地在 Max patch 中设置极值,而不必担心事件累积过快 Max 处理不过来。

单击标记为 jit.qball bypass switchGgate 对象,让 metro​ 的输出绕过 jit.qball 。底部 jit.pwindow 中的合成图像开始闪烁,表示消息乱序到达。

通常,发送 bang 到 Jitter 对象将插到已经挂起的事件(例如已经到达但尚未被处理的 bang)前面。不过 jit.qball 提供了对多个 Jitter 对象链的控制,自动调度事件(dropframing)保证消息以正确的顺序到达。

注:在大多数应用中 Qball已被 qmetro​​ 取代。 qmetro​​ 是内置 qball 机制的 metro​​ 对象。

小结

命名多个 jit.matrix 为同一个名称,可以在 patch 的不同部分中写入和读取矩阵数据。使用 dstdimstart 和 dstdimend 属性,或者设定 usedstdim 属性为 1,可以在将其复制到 jit.matrix 内部时缩放矩阵。jit.qball 对象把 Max 事件放到低优先队列中来降低优先级,如果没有足够资源来执行,则优先处理其他事件。



友情提示:独自折腾 Max 易患上癔症……不妨入群互助

👇👇👇

kidult00 wechat
扫码关注 00 的公众号
如果文章帮您节省时间或者解答疑问,不妨打个赏 :)