Max/MSP/Jitter 官方教程翻译14 - 颜色查找表

00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 12: Color Lookup Tables

本教程将讲解如何使用颜色查找表(lookup tables)重新映射 Jitter 矩阵内的数据。jit.charmap 对象是为此而设计的。我们还将研究生成查找表矩阵的不同策略,包括 jit.gradient 对象。

查找过程

查找表(通常称为传递函数/transfer functions)是一个数组,以数字为表的索引。检索存储在该索引(地址或位置)的数字来替换原数字。任何函数 graph - 每个 x 值(地址)有相应的 y 值(输出)- 都可以用作查找表。Max 对象如 funbufftable 和 MSP buffer~ 对象是常用的查找表。本教程将以类似的方式使用 Jitter 矩阵。

打开教程 patch 读取图像

patch 左上角有一个 jit.movi​​e 对象,读取两个文件。初始化对象(通过 loadbang)并加载文件 colorwheel.pct。也可以点击 rain.mov 消息加载视频。可以随意切换两个图像源。

单击 patch 顶部的开关启动 metro。色轮同时出现在顶部和底部的 jit.pwindow。底部第三个(矩形)jit.pwindow 中出现渐变。


jit.charmap 的输出和查找表矩阵

patch 底部有一个jit.charmap 对象,用它来重新映射图像中的单元格值。对象有两个入口,左入口连接到顶部的 jit.movi​​e。右入口连接到 jit.matrix colortable。名为 colortable 的矩阵只有一维共 256 个单元,有四个 char 型数据平面。这是jit.charmap 用来重新映射左边矩阵中单元格的颜色查找表。带有名字 ctable 的receive(一般缩写为 r)对象从 patch 的其他位置接收数据并发送到 jit.matrix。打开顶部的开关发送一个 bang 到 jit.matrix colortable,它将矩阵消息发送到jit.pwindowjit.charmap

jit.charmap 用输入(左)矩阵中的值,指向(右)矩阵中对应的位置并复制那里的值,生成输出矩阵。如果发送给jit.charmap 的矩阵包含一个在四个平面中值为 100 50 35 20 的单元格。如果查找表在平面 1 第 100 个单元格的值是 73,平面 2 第 50 个单元格的值是 25 ,平面 3 的第 35 个单元格的值是 0,平面 4 第 20 个单元格的值是 203,输出单元的值是 73 25 0 203

jit.charmap 查找表是有 256 个单元格的一维矩阵,其平面数量与要重新映射的矩阵相同。因为 char 矩阵的值范围是 0~255,因此需要 256 个数字来覆盖查找表。

生成查找表

patch 的右上侧包含三个 multislider,可以设计 colortable 查找表矩阵 1-3 平面的传递函数:


用 multislider 的值填充查找表矩阵

multislider(有 256个 整数 slider,范围为 0~255)把列表发送到下面的 jit.fill对象。它用 multislider 的值替换 colortable 矩阵当前存储在平面1-3(即红,绿和蓝)的值。当矩阵采用新值时,jit.fill发出 bang 到 patch 左边连接到 jit.charmap 右入口的 jit.matrix。这里忽略了平面 0,因为只有将 4 平面矩阵视为视频时,它才包含 Alpha 值。

patch 中的 jit.matrixjit.fill 的名称相同(colortable)。这样两个对象从同一矩阵读取和写入,一个对象(jit.fill)生成另一个对象(jit.matrix)可读取的数据,而不必在两个矩阵之间复制数据。这跟许多 MSP 对象(例如 peek~play~groove~)可以共享存储在单个 buffer~ 中的样本数据类似。关于命名矩阵请参见教程 13,18 和 19。

multislider 中随意绘制一些形状,看它如何影响查找表(较小的jit.pwindow)和 jit.movi​​e 的输出图像。可以来回切换两个图像源。

如果想重置任一平面为 y = “x” 传递函数(使所有值保持不变的固定斜率直线),可以单击相应 multislider 上的按钮。名为 p clear 的子 patch 用 uzi 初始化了 multislider

要点:与许多 Max 对象一样,Jitter 对象会保留存储在一个入口中的矩阵,即使另一个入口接收到了新矩阵。所以这个 patch 的 metro 只需要触发 jit.movi​​e。包含查找表jit.charmapjit.matrix 只需要在所存储的数据发生变化时输出值。

以下是一些查找表及其结果:


三组 multislider及其生成的颜色查找表和输出颜色轮

例 1 中,红色和蓝色查找表调换而绿色正常。结果是输入图像中较大的红色和蓝色值在输出时变小,反之亦然。所以色轮的白色背景现在看起来是绿色的(单元格值 0 255 255 255 映射为 0 0 255 0)。

例 2 设置绿色平面为 0(查找表在整个输入值范围内设置为 0)。红色和蓝色平面如果超过阈值也设置为 0,这时值会突然上升(红色比蓝色上升得更明显)。结果是色轮大部分都是黑色的(特别是在绿色区域)。红色平面仅在非常高的值(即色轮背景中的品红色)中可见。

例 3 正常映射红色平面。绿色平面是抛物线形状,极值映射为高,中间阴影映射为低。蓝色平面除了中间调中被归零的范围,其余正常。这种非线性表现为贯穿彩色轮顶部和右侧的红色“断层线”。

有无数组合可以重新映射矩阵单元格的值。接下来研究另一个以更精确方式重新映射颜色值的对象。

jit.gradient 对象

打开 Duotone 子 patch,它显示了使用 jit.gradient 生成查找表的方法:


使用 jit.gradient 对象

jit.gradient 生成两个单元格的值之间平滑渐变的单维 char 矩阵。startstop 属性是指定这些单元格的值列表。例如,start 属性 0 0 0 0 和 end 属性 0 0.5 1.0 0.5 将生成从黑色(矩阵中的单元格 0)到浅绿色(矩阵中最后一个单元格)的渐变。

我们已经用参数指定 jit.gradient 为 256 单元宽,这样当它改变时可以存储在 jit.matrix colortable 中。请注意, jit.gradient 在属性列表中使用浮点数来指定 char 值(即属性中用值 1.0 指定 char 值为 255)。

swatch 对象输出的 RGB 列表转换为 ARGB 浮点数来获得格式化属性。将属性发送到 jit.gradient 对象后,它接收触发对象发出的 bang,将矩阵输出到 patch 左侧的jit.matrix

尝试在 swatch 中选择颜色。start 和 end 属性指定查找表的边界,所以输入图像的值表现为在两种颜色之间变化的双色调外观。patch 顶部的 multislider 将反映 jit.gradient 所生成的查找表。


使用颜色渐变作为查找表

例 1 是翻转的图像。查找表的 start 是白色(start 0 1.0 1.0 1.0),end 是黑色(end 0. 0. 0. 0)。结果是输入值 0 映射到 255,反之亦然(y = 255 - x)。

例 2 和 3 是双色调渐变,将色轮的光谱重新映射到红色和橙色(例 2)以及橄榄色和青色(例 3)之间。请注意,根据色轮中不同点的原始颜色,渐变曲线变得更陡峭或更和缓。

jit.gradient 的另一个属性是 cheby,它指定在矩阵开始和结束值之间的变形曲线。cheby 属性的参数列表是浮点数。这些参数是 Chebyshev polynomials(见下文的切比雪夫多项式)不同阶数的振幅。使用查找表时,这些特殊功能曲线会产生不同的效果。patch 中设置 cheby 属性的 multislider,可以指定前 8 个 Chebyshev polynomials 曲线的相对振幅,形状如下(如果将它们视为从黑色到白色的过渡):


用 Chebyshev orders 1-4(顶行)和 5-8(底行)生成的梯度

技术说明:切比雪夫多项式通常用作数字合成算法中波形整形音频信号的查找表(它们的特殊属性可以将正弦波形扭曲成等效于不同阶数幅度的谐波频谱)。MSP lookup~ 对象可以与加载到 buffer~ 中的函数一起来完成音频信号处理(跟本教程中的图像处理类似)。更多内容请参阅 MSP 手册中的教程 12:综合波形整形。

复位 gradient 中开始和结束点(单击上面的消息框),缓慢调整 multislider控制的 cheby 属性。观察颜色轮在颜色消失并在不同区域重新出现时如何变化。

jit.gradient 中使用 cheby 属性时,即使将渐变起点和终点保留为黑色和白色,也可以得到一些非常有趣的颜色变形效果。以下是视频剪辑 rain.mov 的一些例子:


不同梯度曲线对雨水彩色频谱的影响

左边图像显示 rain.mov 中未处理的静止图像。中间图像显示了当使用二阶切比雪夫多项式(图像中最暗的区域现在位于色谱的中间)生成梯度时色谱的变化。右侧图像显示更复杂的梯度,色谱显示多个峰和谷。

patch 顶部的 multislider反映查找表的当前状态(由 jit.gradient 生成的矩阵被发送到 p showit 子 patch 中的 jit.iter,在那里数字被组合以设定 multislider 的状态)。尝试生成渐变,然后调整 multislider 手动修改查找表。这样 jit.gradient 就作为更复杂的查找表的起始点。

小结

使用 jit.charmap 映射 char 矩阵中单元格的值。jit.charmap 的右入口接收 256 单元矩阵来定义要用于输入矩阵数据的查找表(或传递函数)。可以使用多种方法定义查找表,包括使用 jit.fill从 Max 列表生成矩阵,或使用 jit.gradient 对象根据 cheby 指定的曲线形状,在开始和结束单元格值之间生成颜色渐变属性。



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

👇👇👇

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