Max:手势捕捉

Gesture Capture
Gesture Capture

1. 鸟瞰一下手痒一下,再结合标题,就可以知道这是一个可以捕捉鼠标手势的程序。不过看到key和sel物件的搭配便可知,我们可以用键盘按键来控制它。32, 114和112分别是空格、r和p的ASCII码,空格清除画布内容,r开始记录鼠标手势(再按一次则停止记录),p开始回放(再按一次则停止回放)。

2. 这种记录不仅能记录你绘制的东西,还能记录你鼠标实际的运动包括时间,并将这一切重放。

3. 整个程序共有3个coll物件,但他们都共享同样的数据—thegest。双击它,可以看到它所记录的数据(每记录一次,里边的数据便更新一次,当然)。它以20毫秒的间隔抓取我们的运动。

4. 录制部分:选中toggel开启trigger物件(复习一下:其中引数i为int的缩写),trigger俩口,左边设定metro为20毫秒进入WTHITM,意为以20毫秒的“采样率”捕捉鼠标行为。另外,metro还进入了int物件(缩写为i)。WTHITM提取scale出的两个值进入一个名为draw的子patch(bucket物件的作用是什么?自己看看它的help档)后在lcd物件上绘制出图案。

5. int和+物件,作用简单来说,就是一个没有时间上限的计时器(counter)。它可以给你鼠标行为记录的时间。这个值,以及WTHITM的两个值被pack后一起送入coll物件,第一个值是时间轴,后两个值是鼠标X、Y的位置,这三个值以20毫秒的间隔被coll物件记录,这里,coll物件其实是充当了一个数据记录的角色。

6. 为什么每次点击record(或者按r键)后,lcd面板内的图像都会被清除掉呢?这里我认为sel 1下边那个trigger用得很妙,每次点击,都会有两个clear命令通过t物件被分别送入lcd(s lcd)和coll物件内,因此没次点击,都会清空(及重写)lcd以及coll里边的内容。另外两个0分别被送入绿色的toggle物件(PLAY)及int物件,关闭绿色toggle(停止任何回放),并将计时器清零。当收到一个bang猴,trigger物件从右至左输出它的引数,更多内容请自行参阅它的help档。

7. 回放部分:原理同录制部分,而且更简单。有一点有意思,就是你可以改变这部分metro的快慢,以实现快进或慢放的效果。

8. 深蓝框的coll物件是告诉我们,我们可以依此让coll读取(read)外部的文档或者将它的记录存储(write)到外部以供以后使用。它存储的文档为普通的txt文件,可以用任何相关软件打开或编辑。

本里内关键物件:
coll:保存并编辑一个不同消息的集合。

疑问:
每次回放,都会有一个填充为黑色的三角形(如图),每次位置大小都不一样,不知道为什么,也不知道是不是这个例子的bug,有知情者谢谢告知。

Max:数据测量

Data Scaling
Data Scaling

1. 新物件iter:点击消息框后看Max窗口就很清楚了,它能将输入其的信息列转为一组数据流,信息列中的各个数据被打散,每个一行。

2. 新物件trough和peak:自己一试便知,trough捕捉并输出目前为止最小的输入,peak捕捉并输出目前为止最大的输入。注意这里的“目前为止”四个字,这两个物件的工作并不是以每一次的动作为基础,而是以全程为基础,比如你一开始将例子中的数字框从1拖到12,那么这两个物件就会认为1是最小,12是最大,即使你今后又在1~12的范围内改变了无数次数字框的值,但是trough和peak的输出永远都是1和12。因为他们并不以每一次的操作为基础,而是以全程作为基础判断最大和最小值。

3. 新物件slide:平滑一组数据的输出。教程唧唧歪歪讲了一大堆,不清不楚。实践出真知:引数为两个值,第一个值决定上升的速度,第二个值决定下降的速度,值越小,速度越快,反之亦然。这里边用到一个除法,具体我认为没必要深究。在拖动的过程中,发现一些很有意思但不好解释的现象,发觉已超越吾之智商所及,或者需要静心冥想,这里就不表了,诸位看官请自便。

4. 大家伙:这是一个基于天气数据的patch。开启程序最上方的toggle,先看右边那一溜:counter从0数到364,代表一年的天数,这个值被输入其下方的coll无建中,双击它,我们可以看到,这是一组以天数限定月输出的数据,比如说,第90天,就是四月的第一天,依此类推,这个coll输出相应天数对应的月份后,进入红框的coll物件,双击它,发现里边包含的是一组四个地区(纽约,巴黎,布宜诺斯艾利斯和东京)月平均气温的值,这四个值被unpack后送入四个浮点(f)物件后转为小数后送入slide。这里slide上行和下行都设为了15,意即一个相同的气温值至多被发送31次(一个月的天数),而这个发送的次数,实际上还是由蓝框coll里的数据决定,比如二月,它就只会被发送28次。slide出来的数字被pack入multislider形成柱状图,multislider左下方的出口输出它的值后送入iter拆解后,每次形成一个个由四个音符组成的合声发送出来。

5. multislider右上方那个写着peakhold…的消息框,是这么个意思,multislider有个属性叫做Peak Hold(教程上写的,但我一直没在物件检查器里照着过…),开启它,就会在柱状图每根柱子顶端放一条横线,到最大值的时候,柱子往下走,而横线还放在那,用于标示每个阶段的最大值。他举这个例子就是告诉我们,我们可以使用这样的方式来对检查器类型的消息进行控制。后边还跟了个peakreset,用于在toggle关闭开启后更新最大值。

6. 现在来看大家伙左边那一溜,它用来设定multislider的范围。一切都很好理解,这里我们可以看到coll搭配iter以及trough和peak的用法、用途。trough和peak这么设初始值(最小值1000,最大值0)的原因是,可以让任何输入他们的新值马上建立起一个新的标准。coll物件的消息框dump的作用是:设置coll物件一次输出一个list。

7. 注意,这里trough和peak出来的最小和最大值32、81进入的不再是pack物件,而是pak(念作pock)。二者的区别教程里没写,这里我copy英文help档原文在这吧,因为我已经很晕了,,而且他写得非常绕,所以懒得翻了:PACK:pack takes separate items and combines them into an output list. PAK:The pak object (pronounced “pock”) offers much of the functionality of its big brother, pack, but works like a combination of the pack and bondo objects–output of the entire stored list occurs whenever input is received in any inlet.

本里内新物件:
iter:将一个list打散为一系列数字
peak:如果一个数字大于之前的数字,输出它
trough:如果一个数字小于之前的数字,输出它
slide:用对数法过滤一个输入值

Max:数据观察

Data Viewing
Data Viewing

1. 例1:自己捣鼓一下就知道,你开启那个toggle,也就是打开metro,counter从1数到16,然后经过prepend到那个空白块顺序fetch输出,这个东西叫做multislider物件,可粗译为“多滑块”物件,点击右边的按钮,每点一下,multislider里的图形就变换一次,并且改变整个音序的声音输出。uzi和drunk物件创造16个随机的值(0~127,标准MIDI音符范围),然后prepend 将他们逐一fetch出去发声。你也可以在multislider物件上拖动,指定每一个滑块的值。

2. 为什么说它是多滑块物件?我看不出来呀。。。没关系,这是这个例子滑块视图样式造成的。进入它的物件检查器,倒数第二行Slider Style那里,将“Thin Line”改为”Bar”,再返回去看,如何?现在能看出一条条的滑块了吧?是的,和你一样,我觉得这其实更像“多柱状图”物件。。。当然,顺物件检查器里各参数向上看,你能无师自通它很多的属性设置,比如滑块的数量、颜色、范围、间距、厚度、bla bla…这里我就不多费口舌了。

3. 例2:开启toggle,无限被使用的提取WTHITM再次登场(整个Max教程中最红的程序)。。看到这个模块意味着什么?意味着这又是一个与记录鼠标轨迹有关的程序。的确如此,WTHITM模块下方的两个multislider显示的正是你鼠标的位置,它们使用的样式是Line Scroll,你也可以尝试其他样式,不过对于表述鼠标移动,这个样式应该是最明显的了。

4. 鼠标X、Y值(0~1)被scale到-1与1之间,然后分别送入pack物件的两个输入,另两个输入,是它们scale后值的极坐标值(分别为点距和角度),然后一同被pack后送入最下方的multislider物件,这四个数据流以四条滑块的方式被展现出来。

5. 别忘了用物件检查器看看例2中的三个multislider的参数,你会发现一些有趣并需要注意的东西。

6. 在连线上鼠标右键,可以加入观察点(watchpoint),它可以显示数剧的流动,两个选项:监视(Monitor)和中断(Break)。前者可以监测消息的值,后者在一个消息在被选中的连线被看到时强制patch停止运行(force the patch to stop running when ever a message is seen on the selected patch cord,这话貌似比较难理解..)。

7. Debug -> Watchpoints将打开观察点窗口。
第一列:观察点标识
第二列:附加到观察点上的动作类型
第三列:传送消息的物件的类
第四列:包含观察点的子patcher的名字(在主patcher的时候此栏为空)
第五列:与最后一次收到消息关联的值
第六列:此观察点收到消息的计数器
第七列:最后在此观察点看到的三个值的历史记录

8. 当你开启Debugging(通过Debug菜单),并且将观察点设为break,则任何被此观察点看到的消息都将使得程序暂停,使你能够在除错模式步进你的整个patch。当patch一旦暂停,除错窗口将打开,这时你便可以每次一个消息的进度步进你的patch。

本例内新物件:
multislider:多滑块滚动显示

Max:进阶音序

Advanced Sequencing
Advanced Sequencing

1. MIDI录制,不单能够录入音符,并且还能录入诸如弯音信息、连续控制器\程序转换等MIDI数据。在seq物件下方加入了上一课的midiflush物件,用以在我们停止音序之后将所有剩余的note-on消息静音。

2. patch右边,我们可以看到存储及读取MIDI音序的方式,write存储,read读。两种方式读:read打开文件选择窗口选择文件读;read+文件名(文件需位于该maxpat同级目录下)直接读。

3. 让音序loop起来。这里运用了seq物件结束后在右输出口输出bang讯息的特性。右下角:这个灰色的玩意叫做gswitch2(图形门),当toggle物件被选中的时候,它会将通路打开,结果就是seq物件结束后发送的bang讯息又会被返送回start消息框重新触发音序,因此使得这个音序不断循环。这只是seq物件右部bang输出的简单应用,它同样可以被用于载入另一个音序,开启第二个seq物件或者甚至是全部打开Max中的另一个进程。

Max:基础音序

MIDI Sequencing Tute 1

1. #1:seq物件可载入一组midi音序,start按钮触发它,stop停止全部音符,后者是由midiflush物件造成的。midiflush是有维持note-on和note-off配对的作用,同时,当它收到一个bang信息的时候,它将发送一个note-off指令,停止音序中的全部音符。当音序跑完后,在seq物件的右输出口将发送一个bang信息,这可以通过挂在它右边那个大按钮看到。

2. #2:用于改变播放速率的一组小程序,1024为正常播放速度,这里我们使用了start消息框引数来实现这一改变。*1024物件上方的数字框,显而易见,是播放速率的倍数,如果它为0.5,则将以正常速率一半的速率播放,依此类推。注意两点:1、Go!消息框里的文字可以是任意文字,因为按钮物件可以转换一切消息为一个bang;2、这种变速方式仅仅能从开始播放时起作用,要在播放进行中变速,我们还需要tick消息。

3. #3:在播放时变速的两个关键消息:start -1和tick。前者使得音序脱离seq物件的中心时钟而等待tick发布的命令来改变速率。因此点击start -1消息框后,再勾选toggle物件,改变tempo物件上方数字框的值将实时控制音序回放的速率。用line物件替代这个数字框作为tempo物件tempo的输入值,那么可以产生平滑变速的效果。注意,这里勾选与取消勾选toggle物件,它的作用为暂停而不是停止,即:在演奏途中取消勾选,则暂停播放,再次勾选,则由上次暂停播放的点开始继续播放。

4. tempo物件三个引数的解释:120:默认速率,本例内为将默认速率设置为120bpm;1:默认拍子倍加器;96:每个全音符的脉动(pulse)。

5. seq_sc.midi文件位于装载本maxpat文件的同级目录下。

本例内新物件:
seq:录制与播放MIDI数据的音序器
midiflush:为原始MIDI信号note-on发送note-off
tempo:以一个节拍器的速度输出数字

Max:MIDI分析

midi03

1. midiparse物件可以对midiin物件收集到的原始MIDI信号进行捕捉分析,并输出多项控制数据,比如音符、力度、弯音(pitch bend)等等。

2. midiformat与之相反,它可以将各种输入的信息还原为MIDI流到输出。滑动一下例子下半部分中的slider试试,不过注意因为没有配备相应的note-off信息,所以一旦想起来,它就无法停止了。。(本人的遭遇)

3. 绝大多数情况下,MIDI控制器传送及接收的7比特值(0~128)对于处理合成器及采样器控制已经足够了。但是,在少数情况下,7比特值对于细微差别的信息还是不够用的,最普遍的例子便是完音控制。因此,我们使用能够提供14比特值的xbendin物件来解决这一问题。但不幸的是,即使是最稳定的MIDI控制器,在捕捉弯音控制延伸值的时候也会产生过度的MIDI信息──硬件无法长时间保持在一个单独的值上,这将使得我们的patch表现得不规律,或者至少,就加大我们对于那些复杂patch适当除错的能力。

4. 这个问题的解决方式正是speedlim物件,它可以获得任何物件的输出(本例中为xbendin),并且限制输出在指定的时间周期仅输出一个信息。在例子中,引数250告诉speelim物件至多250毫秒(1/4秒)输出一个信息。当你发送弯音信息给例子中的patch,你将看到xbendin物件的button和数字框比speedlim的更新要更频繁,speedlim仅仅是每1/4秒才更新一次。

5. 总结:midiparse和midiformat物件是一切大型复杂基于MIDI的系统的核心。用xbendin物件接收延伸的弯音信息将帮助我们用Max/MSP创建更稳定的声响合成器。但是,也许有的信息可能被接收的太快了,使用speedlim物件延缓接收这些信息的时间可以帮助我们控制那些过头数据的总量。

本例内新物件:
midiparse:解释原始MIDI数据
midiformat:以MIDI信息的方式准备数据
xbendin:解释额外精确的MIDI弯音值
speedlim:限制消息通过的速度