算法创作实战02 - 用 MaxMSP 生成随机颜色

在「生成式艺术和算法创作」系列第二篇中,00 介绍了随机和噪声在算法创作中的应用。上一篇我们用 Max/MSP 做了一个随机生成星座描述的小应用,切身实践和感受了巴纳姆效应。

今天我们一起来用 Max/MSP 实现简单的随机颜色生成器,加深对 Max/MSP 中 random 对象的了解。

名称:Random Color

主要使用的对象:random, send, receive, uzi, pack, jit.matrix, jit.pwindow

难度系数:★☆☆☆☆

这个程序叫 Random Color,可以指定行(y)和列(x)的数量,然后用随机颜色填充,可以手动生成新的图像,也可以自动连续生成。生成的图像可以导出成图片。最后的成果是这样:

首先来拆解需要实现的功能:

  • 手动生成或者自动连续生成
  • 指定图像的尺寸(dim)
  • 生成随机颜色
  • 自动填充每一个单元格
  • 显示图像
  • 导出图片

开始动手前,请复习 Max/MSP 文档中 random, send, receive, uzi, pack, jit.matrix, jit.pwindow 等对象的说明。

准备就绪后,我们先来看前两步如何实现:

1.手动生成或者自动连续生成

button 触发生成事件,前面加上 metro 对象并指定时间间隔就可以自动连续触发生成事件。

2.指定图像的尺寸(dim)

设置两个整数数字框,可以输入水平和垂直维度的数量,来指定图像的尺寸。

生成事件的 bang、x 和 y 的数值,都通过 send(简写为 s) 对象传递到后面的步骤。

接下来是关键的部分,用随机颜色自动填充每一个单元格:

3.生成随机颜色

用 3 个random 对象分别生成 R G B 三个颜色值,然后用 pack 对象打包起来。因为最后需要用 jit.pwindow 显示图像,它需要接收 ARGB 颜色,所以我们还需要用 setcell 消息指定需要填充的单元格,并且传递 255 作为 ARGB 的 Alpha 值。于是,pack 对象的参数需要写成:pack setcell 0 0 val 255 0 0 0。其中,前面两个 0 会传入之前通过数字框输入的 x 和 y 的垂直和水平 dim 值,后面 3 个 0 会传入由 random 对象生成的 GRB 值。

4.自动填充每一个单元格

编程中经常使用 for 循环来实现矩阵的填充,在 MaxMSP 里常用 uzi 对象来实现简单的循环效果。(当然,如果是 modern 的矩阵处理和运算,会用 jit 提供的丰富的矩阵功能;这里我们怀旧一下用 uzi)uzi 的作用是连续发出 bang,左入口接收触发命令,右入口接收连续 bang 的数量;左出口输出 bang,中出口输出完成所有 bang 后的消息,右出口输出当前是第几个 bang。

首先接收 y 维度的值,用 1 个 uzi 作为外层循环。因为 uzi 对象从 1 开始计数,所以需要减去 1 再传给 setcell,因为矩阵单元格从 0 开始计数。然后接收 x 维度的值,作为内层循环(同样要减去 1)。

uzirandom 生成的矩阵单元格位置和颜色都传给 pack 对象打包。

最后是显示和导出图像:

5.显示图像

使用 jit.matrix 存储并显示矩阵,更多 jit.matrix 的用法请参考 00 翻译的 Max/MSP/Jitter 官方教程系列

指定矩阵为 4 个平面(plane),用 receive 对象(简写为 r)接受 x 和 y 维度的值。为了实时响应维度修改的操作,这里用 pak 对象而不是 pack 对象。pak 对象响应任一一个输入的变化,而 pack 对象需要由 bang 触发何时响应。

另外,使用一直开启的 qmetro 对象(@active 属性为 1)来监控矩阵的变化,以便随时更新,将矩阵值通过 send 对象发送给 jit.pwindow 中显示。

6.导出图片

exportimage 消息可以触发 jit.matrix 导出图像保存。因为矩阵的初始尺寸是 10x10,所以最后用了一个 jit.matrix 4 char 400 400 将矩阵扩大为 400x400 的尺寸,这样导出的图像大小就是 400x400 像素。

完整的 patch 如下:



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

👇👇👇

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