web analytics

Max:数据采集

18mDataCollections.maxpat
18mDataCollections.maxpat

1. #1:coll物件的基本使用,点击三个消息框,将建立一个小型的索引,当第一个数字框分别输入0、1、2的时候,底部的数字框将分别得到20、-50和33。双击coll物件,将打开一个编辑窗口,在上面你能看到,消息框的第一个数字为索引,第二个数字则为它们对应的值。其实coll物件完成的就是一个索引值设置的储存机制。

2. #2:与#1一样,只不过是索引换为了符号(单词)。我们注意到要以符号作为索引,必须在存储信息之前加上“store”。

3. #3:已经事先储存了数据在其中。选择0~3,在底部的消息框内会显示不同的句子(由prepend set实现)。用文件检查器打开本例的coll物件,看到属性“Save Data With Patcher”被选中。当这个属性被设置后,当patcher文件被保存后任何储存于这个coll物件的信息都将被写入,并且在patch再次打开后能被立即使用。

4. #4:选中toggle触发drawit子patch内prepend在lcd上画圈,makenote/noteout物件发声。coll物件中存储了150000个索引,prepend画的圈依它们对应的值作为纵坐标,makenote/noteout用它们对应的值乘以127后触发MIDI音符。coll物件存储的值位于一个叫做egg的txt文件中,这样做的好处是,当你需要存储大量数据饿的时候,为你的patcher减肥。

5. #5:现双击打开名为cues的coll物件索引,然后顺序选择数字框的0~7,或者next和prev消息框可以在整个coll物件的索引内实现步进式跳转(需要route物件的配合)。他旁边那一个小patch:双击打开同名的coll物件,我们可以看到,它和#5coll的内容是一致的,因为它俩同名。这很想value物件分享数据的方式。同名coll物件共享可以在整个patch甚至是子patch内实现。

6. 右下角的例子:一个route物件的实例,其实就是将各种输入和其对应的输出分流,你可以通过触发指定的输入得到你要的输出,如同这个物件的名字,你可以把它理解为一个路由器。注意最后一个出口是留给无法识别的信息的,比如此例中的zeppo。在本例中,对无法识别输入信息的处理是打印nomatch内容到Max窗口。

本例内新物件:
coll:存储并编辑一组不同的消息集合
route:有选择性的从一个特定的出口通过一个输出

Rio老师关于储存coll物件内容的解读(采于Max 4.6中文教材课程37:资料结构):
一但你將訊息存入coll中後,你可以將之設定為與程式一併儲存。解除視窗鎖定,選擇coll物件,按下Object選單中的Get Info…,勾選Save coll with Patcher選項。

或者你可以將coll物件內容存成獨立檔案(此內容可被用在其他程式內)。你可打開coll物件的文字視窗後,選擇File選單中的Save as…。或是送入write訊息到coll物件內,打開儲存文件對話框。

要由檔案載入coll物件,你可以直接將檔名當成其引數輸入,或是送入read訊息到coll物件,打開開啟文件對話框。

Max:数据结构和可能性

17mDataStructuresAndProbability.maxpat
17mDataStructuresAndProbability.maxpat

1. #1:在patcher第一次打开的时候,灰色框(itable物件)内布满了随机的值,这是一组基于XY坐标的数据结构图,滑动横向slider物件(X轴)的同时,纵向slider会显示它相应的Y轴坐标。点击旁边两个信息框,第一个当你X滑动到50的时候,Y会显示为80,100和20那组数据同理。你可以点击并拖动鼠标在itable内画下一组数据结构,如果你想画直线,那么同时按下shift键。

继续阅读Max:数据结构和可能性

Max:远程信息

16mRemoteMessaging.maxpat
16mRemoteMessaging.maxpat

1. 除了使用连线的方式,我们还可以使用send和recieve物件传递信息。这可以免去过多连线造成视觉混乱的弊端。

2. 与send物件同名的所有receive物件都将接收到同名send传送的信息并同时做出相应改变。这种效应在教程中被称为“广播”(Broadcast)。注意,同名send发送的消息会被整个Max环境中的所有同名receive接收到,包括其他patcher里的receive。新建一个patcher,可以实验一下。send和receive在物件内可以分别缩写为s和r。

3. slider那组例子中,set $1是数字框的一个message,它储存并显示当前数字,但并不触发output。这应该是之前的知识,只是我忘了,所以补充一下。

4. 另一种传送远程信息的方式是运用消息框,在希望传送的名称前加上分号(;),比如 ;bob 155 就等于将值155传送到任何以bob命名的receive物件。演示patcher左下角那个绿色消息框就是个很好的例子。点击它,看结果。

5. 运用forward物件可以分配send的讯息流向。

6. 一个没有名称的receive物件可以接收来自任何send物件或以上方式远程传送的讯息。set讯息可以对receive物件实施更名,因此它可以监听patcher内不同的部分。例子中forward隔壁就是这样一个receive物件。选择一个不存在的名称将切断它的监听动作,注意只有未命名的receive物件才会有输入口。

7. 右上角的例子,int和float物件,左输入设定并输出一个值,右输入设定储存但并不输出一个值(这个值需由一个经左输入触发的bang输出,例如例子中的按钮)。第一次bang将输出它们的初始值,也就是它们的引数。

8. value物件,类似一个int/float物件及send/receive组合的合体,每一组value物件都有一个名字(本例中为joe),任何一个value物件的值都将被其他同名value物件共享,改动本例其中一个value物件的值,然后bang另外一个,看看得到的是不是同样的值。value物件可以接受除整数、浮点数以外的任何类型的讯息,包括符号和list。

本例内新物件:
send:无线传输信息
receive:无线接收信息
forward:向多个物件传输远程信息
int:储存一个整数值
float:储存一个小数
value:与其它物件共享一个储存的数字

Max:提取

max15
15mAbstractions.maxpat

1. #1:开启toggle后,捕捉你的鼠标轨迹,然后在lcd上画线,这里使用了bucket物件,他总输出它收到的最后一个值,这个物件可以将你之前的鼠标位置与当前鼠标的位置连接起来。无论你何时关闭这个程序,当你下一次开启的时候,它仍会从你上一个结束点开始继续绘制。

2. 在程序的第一部分,里边有很多逻辑关系,这时我们会想到用封装来简化这个界面。同时,这组依屏幕分辨率进行鼠标控制的逻辑运算貌似在很多的地方都可以用得到,如果无需复制粘贴它便可让它为其他patch所用那就太棒了。这里便引出了提取(abstractions)的概念。一个提取就是一个保存为外部文件的subpatcher,同时可以被作为一个常规的Max物件使用。本例中的提取与这个例子位于同一文件夹下,一组提取可以在你将它们放入“patches”文件夹下的一个或多个文件夹后被创建(或者任何Max检索文件的地方)。

3. #2:绿框WTHITM(代表”Where The Heck Is The Mouse?”)就是一个典型的提取案例,双击它,则将打开这个提取,这看起来与封装很像,除了一点─这个提取无法被unlock后修改,因为它是一个独立存在的patcher文件。要查找一个提取,最简单的方式是通过File > New File Browser的搜索功能。如果你修改并保存了一个提取,则程序中所有使用到它的部分都会改变─甚至在这个patcher已经载入的情况下。

4. 用文件检查器查看WTHITM这个patch的出、入口,三点标注值得注意:Annotation(注释):在这里标记的所有文本都将在你鼠标悬停于被标记物件上方的时候显示在Clue窗口内;Hint(线索):在这里标记的所有文本都将在你鼠标悬停于被标记物件上方的时候显示在鼠标旁的气球式注释框内;Comment(评论):在这里标记的所有文本都将在你鼠标指向上级patcher的出、入口的时候显示为assistance(援助)文本。善用这些文本标记法将大大有利于今后你对它们的重复利用。

5. #3:看上去与#2很像,但在里边使用的提取叫做WTHITM_scaled,并包括了两个引数,分别为lcd物件的长度和高度。打开它,我们看到两个有趣的值,#1和#2,是的,它们分别代表WTHITM_scaled提取的两个引数。使用这些可替换值(称为 pound-sign arguments)是重复弹性使用提取的关键。如果换为更大或更小的lcd,你只需改变WTHITM_scaled提取的引数弹性变化,而无需去打开并修改它。这便是模块化封装的好处。

本例内新物件:
bucket:通过一个接一个outlet循环式传递一个数字

Max:封装

14mEncapsulation.maxpat
14mEncapsulation.maxpat

1. 运用patcher物件可以在一个patch内创建一个子patch(subpatcher),为了使我们的patch更简单易懂、易于修改,使用子patch封装可以很好的做到以上的诉求。在lock的状态下双击patcher物件可以打开封装在其中的子patch。

2. 双击绿框patcher物件,弹出它的子patch,上下两个分别为入口(inlet)和出口(outlet)物件,分别替代patcher物件的出、入口。在子patch内创建多少个入口(inlet)和出口(outlet)物件,在patcher物件上就分别对应有多少个出、入口。打开入口(inlet)和出口(outlet)物件的检查器,在comment一栏填入相应的名称或标记,将在今后编辑patcher物件的某些时候显示,以便于我们进一步的编辑。

3. 大家伙:拖动灰色框内的小球(这是一个叫做pictslider的物件)可以在底部lcd物件窗口内绘制出相应的图形。按空格键清除绘制内容(ASCII码对应为32,由key物件捕捉并由select物件(缩写为sel)触发)

4. 选中例子中“encapsulate from here —>”到“to here —>“之间的物件(共15个),然后选择Edit > Encapsulate可以将这一堆复杂的玩意全部封装到一个patcher物件内。lock状态下双击它,可以看到打开的子patch里使用了四个inlet物件和1个outlet物件,这与原始patch内这一部分的输入输出口的数量是一致的。

5. 封装能够完成两件事:i. 它允许我们在不与全部物件交互(甚至是看到)的情况下进行高层的应用,ii. 它允许我们在不改变高层程序任何东西的情况下,改变低层的逻辑。

本例内新物件:
patcher:在一个patch内创建一个子patch
inlet:从外部patch获取讯息
outlet:将讯息送至外部patch
pictslider:基于图像的滑动控制

Max:“影”序器

max13

1. rslider物件可以设定一个输出值的范围,如左列上例,点击并拖动鼠标可以设定这个范围,左边数字框为此范围最小值,右边的为最大值(默认值为0~127)。

2. loadbang物件可以在一个patcher载入后自动发送一个bang讯息,改变左列中例下方数字框的数字,双击loadbang物件则将发送一个bang讯息触发下边的消息框55,于是数字框内数字又将变为55。

3. umenu物件可以添加一个下拉列表,两种输出:左边的口可以输出当前选项的号数,由0开始;中间的口输出当前选项的文字。

4. #1:上部:一个loadbang物件从右至左触发两个消息框,这两个消息框为umenu物件的两个属性:prefix:在输出umenu文件名前加入路径,用于文件定位。autopopulate:将自动定位与文件夹内容联系起来,当接收到prefix的文件路径后触发。结果是:我们得到了一个在patches/media文件夹下所有文件的umenu下拉菜单。当我们选择其一的时候,三件事发生:首先,dispose消息被发送至imovie物件,清除当前载入imovie内的内容。其次,包含prefix路径的消息通过trigger物件(缩写为t)的引数symbol(缩写为s)后传入prepend物件,prepend物件在这组数据之前加上“read”后送入imovie物件。第三,trigger物件经过delay物件发送一个bang讯息,delay物件将这个讯息延迟100毫秒,这给了imovie物件读取数据的时间。过了delay的周期后,delay下边的消息框被发动,它包含了一些对于imovie物件的控制信息:length(得到影片的长度),loop 1(循环影片),以及start(开始回放)。在这样的情况下,一切都是由trigger物件中部的输出口(基于文字的)发动的。应该认识到,在这样的情况下trigger物件起着多么大的作用。

下部:imovie物件左下角文件长度信息通过size消息框进入rslider物件,并设置rslider选中整段片长(0 $1的作用)。鼠标拖动的前后位置由两个数字框表现并发送进入pack打包后进入并出发loopset消息框,它可以改变一个循环的开始、结束点,并将影片倒回loop起点($1)播放。

5. #2:screensize物件可以获得当前萤幕的分辨率,依我mbp的萤幕分辨率1440×900为例,screensize返回的数据是四个:0 0 1440 900。unpack出四个值后减1送入scale物件的最大值入口。左边mousestate获得当前鼠标坐标值,送入scale物件。scale物件将当前坐标值scale到0.~1.的范围后分别乘以240和180(设定小矩形最大值为240×180)。rect消息框可以在imovie画布上嵌入一个矩形,四个值:前两个为鼠标坐标值,后两个为矩形的宽、高。开启toggle,开始影片播放,移动鼠标看结果。

本例内新物件:
rslider:显示或改变一组数据的范围
umenu:下拉菜单,显示和发送命令
loadbang:在patcher在如后自动发送一个bang讯息
screensize:输出萤幕分辨率