Max/MSP/Jitter 教程18 - 使用已命名的矩阵
Max/MSP/Jitter 教程11 - 矩阵混合
Max/MSP/Jitter 教程12 - 视频去背景合成
Max/MSP/Jitter 教程13 - 列表和矩阵
Max/MSP/Jitter 教程14 - 颜色查找表
Max/MSP/Jitter 教程15 - 剪刀和胶水
Max/MSP/Jitter 教程16 - 矩阵定位
Tutorial 16: Using Named Jitter Matrices
https://docs.cycling74.com/max7/tutorials/jitterchapter16
本教程将学习如何使用 jit.matrix
的 name 属性将来自多个源的矩阵数据写入同一矩阵。我们还将研究如何在复制时缩放矩阵的大小,以及如何用 Max 低优先级队列来降低事件的优先级,以支持更耗时的任务。
教程 patch 分为五个彩色区域。中间(浅蓝色)区域包含两个 jit.movie
对象。loadbang
对象在 patch 打开时读取两个视频(rain.mov 和 traffic.mov)到 jit.movie
:
与之前的教程不同,这里的 jit.movie
使用 send
和 receive
对象与 patch 的其余部分通信。名为 m1 和 m2 的 receive
对象将消息转发给两个 jit.movie
对象。然后发送它们的输出矩阵(使用 send
)到 patch 其他位置名为 movie1 和 movie2 的 receive
对象。
patch 顶部的黄色区域包含驱动 patch 中 Jitter 进程的 metro
:
``metro`` 驱动两个消息框中的一个
点击开关启动 metro
。 patch 中的三个 jit.pwindow
开始显示图像。
优先级
metro
经过 Ggate
和 jit.qball
到达 gate
。 metro
发送的 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.movie
首先发出矩阵,它会将数据写入 composite 矩阵,然后是右边的 jit.movie
,它将数据写入同一个矩阵。如果两个矩阵写入任何共同的单元格(见下文),那么最后到达的矩阵将覆盖之前单元格中的数据。
目的地维度
教程 patch 右侧的两个 jit.matrix
对象将 usedstdim
属性设置为 1。这样可以缩放由 jit.movie
发送的矩阵,以便它们只写入 composite 矩阵的某个区域。
调整标记为 x origin
y origin
的数字框,缩放它所连接的两个子 patch p coords
。请注意 composite 矩阵如何移动和调整 jit.movie
中两个图像的大小。
图片内的图片
p coords
包含相同的辅助 patch ,用于格式化 jit.matrix
对象的 dstdimstart
和 dstdimend
属性。这些属性分别指定将数据复制到 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.matrix
的 dstdimstart
和dstdimend
属性,可能导致残留之前输出位置的图像。
队列优先级
当 Max 运算跟不上速度时, patch 顶部的 jit.qball
对象就有了用武之地。metro
(每隔 50 毫秒发出 bang)正在触发三个独立的操作(从 jit.movie
对象写入数据到两个已命名的矩阵,显示数据,清空矩阵以便重新开始)。jit.matrix
写入数据到内部矩阵(这个例子中是 composite 矩阵)并允许后续消息来插队。运行任务时,它允许其他优先级更高的 Max 事件发生。这样可以在前一操作完成之前显示矩阵(或将更多数据写入),从而引起闪烁和其他意外结果。
jit.qball
对象把消息放到 Max 低优先级队列的最后, 在那里其他消息可以被优先处理。如果 jit.qball
在所有当前任务完成之前从 metro
得到 bang,它将等到队列中其他所有任务都完成后,再发出 bang。同样,如果另一个 bang 在发出第一个 bang 之前就出现了(即如果 patch 的剩余时间需要超过 50 毫秒才能完成所有事情),第一个 bang 将被抢先(抛弃)而只发出第二个 bang。这让我们可以放心地在 Max patch 中设置极值,而不必担心事件累积过快 Max 处理不过来。
单击标记为 jit.qball bypass switch
的 Ggate
对象,让 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/MSP/Jitter 教程系列
Max/MSP/Jitter 教程 01 - 什么是矩阵?
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 04 - 创建矩阵
Max/MSP/Jitter 教程 05 - 矩阵的数学运算
Max/MSP/Jitter 教程 06 - 控制视频播放
Max/MSP/Jitter 教程 07 - ARGB 颜色
Max/MSP/Jitter 教程 08 - 调整颜色
Max/MSP/Jitter 教程 09 - 调整图像颜色
Max/MSP/Jitter 教程 10 - 交叉渐变
友情提示:独自折腾 Max 易患上癔症……不妨入群互助
👇👇👇