for循环里radio多选_Max里的for循环

c2a19ce8defd449d241e72b48b920c0a.png

/***先说点题外的,只是些个人感受。上周二去fruityspace看了个演出,其中一曲是Tomas Korber和Konus Quartett合作的《给一个场地的音乐》。一台电脑加四个萨克斯。听了几分钟以后我觉得这个哥们儿(tomas)似乎在用Max,因为他轮番的freez sample(萨克斯的),做layer,被触发,包括那些噪音和波形的生产逻辑,让我似乎能看见他屏幕背面的patch了。下来一问,确实猜对了。虽然曲子现在听来十分的古典和学院,但是Max作为现场乐器,和四个原声乐器的搭配以及选择的效果,处理的方式都不错。交流了一会,我们似乎都有共同的叹息,就是类似编程这样生产声音的方式,有无限的可能,很容易就完全迷失在技术当中,比如我就完全不知道如何和原声乐器配合(除了采样处理和触发之外,但这并不是它未来应该一直做的事情)。tomas的观点是还是要以“听”为主,我的观点当然完全不一样,但是作为抑郁症患者,这种情况下(或者任何情况下)是不会表达与人相左的意见的。尤其现场效果还不错。但恰恰就是这个“效果”,或者换句话来说“音乐的好坏”,其实完全不重要,至少它已经不再是努力的目标。抛开广场舞、古典、滥俗情爱流行、周杰伦、民族、EDM、前卫实验这些风格/逼格不论(其实就是要“论”也行),中间这些品味啊,格调啊,涵养啊,欣赏和接受能力等等的差别,一点意义都没有。重要的是你/我为什么要做/听音乐呢?为什么去生产出这么些过剩的声音和图像呢?我觉得四五线城镇的苦闷青年通过快手、抖音传播和消费到的快乐和我从巴赫、arvo part音乐里听来的感受是完全等价的;音乐节上的吉他英雄被后来扭推子的DJ代替,噼里啪啦闪的声光电和村口红白喜事、坟头蹦迪、发廊的迈克尔杰克逊刺激出的难道不是相同的荷尔蒙吗?当我把心悸、惊恐发作说出来也只是消遣旧景观当中的陈词滥调罢了,就像那些为人类已彻底经历够了的事情硬加上新的设问,着急引用朗西埃,以及抱着哈贝马斯看不懂就沮丧··· ··· 的人一样,都困在这个球形的屏幕之外 ***/

------------------------既然这样,只能说一点不涉及价值的技术--------------------------

Max和写代码最明显的区别是纬度。代码是一维的,从上到下一行行执行,遇到 loop()一类的命令再从头往下顺,从一眼看过去的逻辑和简洁来说很方便。而Max是二维的,上下左右都有Object/Function/message/UI,如果纯粹说可读性,大多数情况不如代码。但是对于原本的艺术、设计、音乐人来说,可读性上的牺牲(也不一定绝对)换来UI和进入编程的可能还是很值。尤其是声音/DSP角度来说,中途要看各种图表实在是很方便。

但是Max一直有些让coder不适应的思路,比如递归、迭代、for循环,这些在代码里边比较容易解决的事情在Max里找不到对应。当然你可以在js这个object里边写Javascript,但这就算不上纯粹的人。其实说起来,Max的歪门邪道有点多,比如可以写JS,有jit.gl.slab之类跑GPU,physics物理“引擎”,有Gen~和jit.gen这些玩采样点和像素点的,现在又来了Node,坑越来越多,都值得好好踩一遍。不过这里还是说回最基础的坑——Max,怎么用最质朴的连线来做个for循环。比如画满一窗口的圆(只是2D图形,因为3D的有jit.gl.multiple又是另一回事了)。

一。如果先画一个圆,processing大概这样写:

9f31ecf3306c2b8a2fb5f886e064de1a.png
size(600,600);  //窗口大小
background(0);  //背景颜色
noStroke();  //不画圆形边缘线
ellipseMode(CORNERS);  //以左上角和右下角为基点画圆
ellipse(200,200,400,400); //四个参数:左上角xpos,左上角ypos,右下角xpos,右下角ypos

代码很直白,Max是这样:

417d1e118453a740ffb63da6f34c77eb.png
<pre><code>
----------begin_max5_patcher----------
583.3ocqTssiaCBD8Y6uBDO6FAXG639T62QU0JhMIKQ1PDFmjsq1+8BC3MMY
2lKqhhfXFlqm4L7ZZBdo9fX.i9N5WnjjWSSR.QdAIwyI3d9glN9.nFd4n0pU
3rvU5QamvZeYqH3C7RtZMF8630C1W5favSFnF6kJmIfynQga41lmkp0OYDM1
finKlQxPrb+dIYZ+cG6bSHzm3GYKDK8xMeKu.6k8VZpeK6FKtdwv.esXJYsh
CP53RPoxp2w6PLBAVEwEa97oUFBJ9+GxbITYkVYGj+ADRoylWOmtn5yPL10P
LJgA.WQE7G8pXlOzJdeHe9oQx6veDMqy+JnoRr2Y7G.yMR6r8RUqdO5G9zGQ
b+JIv5x7prGDJdcdGMeFiNmvpbHZf9cAnjcOPoqA8fwxtlVTAp4Yt4pnnS8m
54Vi7vcgkdJ0WAFok.Yj5wNGBxdPH3IjQvi3No57mwfrxK+TTcPOZZlviH2N
CcLwZECVohaktG4NpDMpzm14t0H4dS55Qp9QDI5MUSNl34gJfl7sa2ILCQ0g
n3XiazF+QXhB6nAgi4vQiXmbR+RPB233DVGgXzDZmGVThClpaEF0nDnPo95K
Mx.OqCdjIL1J08dRaZnbVwG6rmhAKWuR100n6BoUx623lVhC.30FdqTnrQRU
BFTmFhJYVdUYQEMy+0hhbZg+K21+L3GsfMYAqlPqKAKH0KHEgubhnelY2sUt
27BikrJxzHniDXza0loloyzZ3BnCFPSfoXbE54y03dGtA.OI1tSeK8u.9ohz
0B
-----------end_max5_patcher-----------
</code></pre>

参数有点挤在一行的意思,可读性略差,可以调整成这样:

a7fa4a7e52ccfc6a5cab6e3a04d1d9fa.png
<pre><code>
----------begin_max5_patcher----------
706.3ocqVssaiCBD8Y6uBDO6MBv22m186X0pJ7kjRkMXgwsoaU+2Wt4z1zKN
N0JBRXXfgyYFNjmBCfUhisiPvOA+ADD7TXPf0jwPfeb.rmdrtiNZcCxaePTc
GLxMkp8nxZtBDOaSLo5ZUpGGZc6KrhxO.iN6ave8tOpdry5IbdC3S8LtdKrA
D6MNPU02x3GtQ1VqbaLoXGJBTlZ5KhM8DxNzoMVuMtihceh8VYM1XowvORgF
SOGFZ5htP722NNROz9NBXu7PEfjlN29T13hQN4KPtAnQ.bhE6XDdAvieO3iu
FvWMoTB9Wmn2rDKwBtLzb+JvVxVlYGnLtRbOsCPPHaKw0tpT7dAWMx9m0HFu
KsLEWjuxzuiSly9I4V1BuHCYBMm16NO+Vxncv2yckWUgwmnJbGSs6AFuQ7.3
WliO.o+jgrsEkK1DVDuDKFiJ2QvoHRtlJcl9BpjrFpDiHaLW1U2.R.02RkKx
hZ2uompjriqhKM5JWCMRRs2YwjkjhVGC9lhQ6NB6X7yewxdpL1eKqNJlj0y7
gu1NB7xAqocTw3TESKo8hSXuSeXl6RijV9GfWHPkaUfHKDnsJNWJy4cpVzIj
toskHncYE4n77n4gkmbsm0LHzpr97Zb9tTSQjS5u7zfuIFzOKrLHR2.xJd8j
0YL.IFaQcR1qn.yfu4ICeQGMst04jf6tGcX39V4n2caTzZW24RyV8WMP3tg1
+vET1dOa1+LqEpTqfnzxGSR2k+iEYP2REMsR9DyJ3DZvWnWu5r66unaL0vD8
FItPGb1Sm5TukCpNrm00cpXL3zLZsUubI7fj1vZ4JuDju1EOW7FmmkjiMkrw
EIw3Dyuzcu5YB+JHyqfThvkY1UfJKPIteoMg+nks5UoegzIhSxQyB15h.oXP
HmSl5kVZmvlAcrosRQpA54uB.607lk3Q9zc3yg+GY77tPA
-----------end_max5_patcher-----------
</code></pre>

单把颜色分出来,可以避免一条message里边信息太多,分不清。

二。如果是做一排圆形,processing:

788a34af98e2f36142644190a7fad8b5.png
size(600, 600);  
background(0);  
noStroke(); 
ellipseMode(CORNER);  //为了方便,改用的CORNER,不是CORNERS,
for (int i=0; i<width; i+=20) { 
 ellipse(i, height/2, 18, 18); //因为是CORNER,所以四个参数是xpos,ypos,长,宽
}

for (int i=0; i<width; i+=20) 意思就是i 从零开始,每次加20,直到它大于窗口的长度,那么i 是这么发展的:0,20,40,60,80 ··· ··· 最后一个是580,作为圆形的坐标平均分布一排。

Max的一排:

da64407a4769fd8433aae68f68730601.png
<pre><code>
----------begin_max5_patcher----------
788.3ocwVssaiCBD8Y6uBDpOsaZDfuuOs62wpUUDa2T5Zahrwsosp+66.X2K
oowNITsJJXafgyLmANCO46gWI2V1gQ+.8ajm2S9ddltzc3M7sGtluMuh2YlF
dUuRIavKrCI6UUkJ0CaJsqAdEuYMF8mgg6TOTYFAOZPSesnALwrXzgN2vU42
HZVeUaYtxtPAgKIKPATcKKbr8kEFVFKzuacDEFrjqt8RFV20y995lEyL1ZJu
GrczUUkaMNC9RD8SiWQiZ1gK6yCWJgoiQJ0FpYKifV1wDvzLGFwa34+EIPhO
MrOTLesrQ0IdzzIUm.OIpfEax8gQlOnSREZTa30VW4WsBdE9ijTF4THo5xtN
95x8vRP1WdGuBcAEEPHnKXvN1TDKJZ7uKHvnrHZZxIxhYolGCe4JZLvg60tU
nVdunoPdO5mZ+GQfewDy+CKyrvQzHcRZLLJbIiFQXIvYzXxDbI6X3R.AGSlU
4EnPT9M71IoQX5WUyUshsGEYx1+g5o4wfLywYJypqybDE5xsieGQSOU09yU4
iYOrxRLbkSOxxhbHG8MPP4+EGMTnzVcHf3RNJwgTT+iBv6lT+Z74WKoYuLUh
oMMYBJK3Xnr32RYlEDWIZ18FkFWR2+64wNYea9HiLTWYA5U+pnrSIZ3JAbey
WmDcXR6MWMajHy.oLWfTxb.58dirsnr0jp+xQFjE1KxjyB4XXQYSkFyb.4pA
hNy8KCSpVTrQBG2F1hljnupcPRh852zW95L8rcH1Cj2omKRy.nXGv0iIrCBT
hK.ZVp.D1Gfxp+v2r4tx1tgoaPATruUZ1Wat+GrGnw9oQqC2VdmXb9wld3sf
DpBzO6as5eaSiwVSkvIjldwvwSH97GDr2Qy6Uoy9BgrVeCKea3bMuuR8dNX0
5qEUU4xJqa48xHPEkghF30s7BQITmXwvHloSsnRVFjDGlPWneKMLfFpeCZdi
N+fErQKXYDZVrwBRVJIz9FzEcelczVAU1rUwXIjwJVvlfV4FY6XxDLMyLfIC
ZYSyNkVHP2sLHtF3Mwn5jNc6+r++.bpiHqH
-----------end_max5_patcher-----------
</code></pre>

主要就是uzi了,这个object是Max里边比较特别的东西,我甚至怀疑它是为了写loop而诞生的,怎么说都比较抽象,但是看例子又很直观:

c774feb2727b03d8fe5d2d11432ecf53.png

或者看帮助文档,比这个详细。总之,这里需要的只是它右输出出来的数字,每次乘以20(间距)来作为圆形左上角位置。而出来之后立即减1:

bed18a74bc575cfed1d35da076663b48.png

是为了从窗口最左边开始画,不然左边就会空出20个像素点。其实除了思路上有点不同,这里proessing的sketch和Max的patch,几乎就是等价的。每个东西都能找到对应,除了:

1.Max的循环没有终止条件,也就是少了 i<width 。

2.Max的jit.lcd没有办法选画圆的模式,只能以圆左上角xy和右下角xy来进行,有时候就会有点不方便,比如计算两个圆的距离,就得用左上角的xy分别加半径来找圆心,然后勾股。

三。画一窗口的圆,processing就再套一个for:

48c070a5930b330957c8d1a34e65e46c.png

而Max的uzi就要多忙一件事情:

ff93e994d8f90cdbce9b521b2f152adb.png
<pre><code>
----------begin_max5_patcher----------
908.3oc2X00aaBCE8Y3WgEJOskFYaLesm19cLMU4.zT2A3HioMsU8+9L1lrl
zz.owQSqBgSvec843iu2K7ruWvR9lx1.v2.+D348rummtp9J7rO6ETS2jWQa
0cKno7A9x6BlaZRVtQpqthSKVRaVMz.uSVUJkOttzL4A5FA+x1bq7wJcKACC
noql0nFh1JHakqox7aYMqtVTlKMSDIdAbtsLF1WhwKfamX0zXL8NyCqPaK0B
+JTZPecu362WL+7P8xiC24tF1IQ8kYnQfM9.vNwgv9J.5cANqQNY7hee7hRR
6AIJISi0rEQm5FMF9eFhCyNSDixbHhWSy+MfYtdWneLbeCuQ1xdRWIpWwd.5
fLJcDh0BeTn9GLZT9n2rMzZyZ4GBFsJ3sLU1GRaTW11RWUd.pRIA32Sq.yPf
YXvrPvLB.GEMb6B9KJKBkl7wzTgwgZRLMyojXnCka2wjKdf0Tve.7890O.pt
hg56Qcx5DZDMJMFgIKvnHHNQwk1XOnQcBOItDAwNlLqxK.DP9sTwnznp6WWS
kB1lShLwG9L837HIVGFCgmZbroQgtTN9U0gkOpC+o336HmYwnDS..nw+mKOx
hi9jvQQwWNNh3PN5K.L7eDGYOrgMAPCgtjibYxjcOwTqtokH87KNogLocZcT
MFoEdJjV7mDckIy7Khth7YWWA05pjLWpqPulzzSXPEqY+2pWun5qeWlrk2Ix
G3DaVcyA+ccUT1JYMTIi27pNgrc5f6VS1RvIXoLWXojoXncWMbQQoPuYewsr
Jn7AsL7rrbrZRwisMl4.xkLUxE4ZxcJVFStDj6daYGAz3yjcwSldCOWKMkii
DGHXFTcG0PItvPoSwUlSrTxI3zz1obdEWXiNzGN.ts30wEpYEq4pXSVu4QQ8
eVHh5UDT+fHoaexE..MF.bASMovKp2F1AlZBVJ1Q1YLOsCGtdSjZ5502WJZs
8VaCU1M2YTF5uSgRBzXdTmUPfn7d1P+i00PEpzMjpbM5DlLE1jFGXFJW4tqo
iY80pPmuM4l8xN3uIYzUv308eI.eCZtg1UI2kAVt5FVU0V8q21VTYeYSvJXk
fVvJU4TM21ht6HiUgKBShIInd8dXJIDQ5+GYGkucD3gQndWOTVrdDvrTHw7O
UUnCMrSdTpr.MY7gSfCY2oj.B9ZtXXuTMzLcC5cPCap0IBEP2OkwfZEuwFB0
zuc6+h+e.zOO6JC
-----------end_max5_patcher-----------
</code></pre>

上边的uzi最左的输出也连上了,当uzi每次从右输出发出一个数字之后,左输出紧跟也发出一个bang给下边的uzi,画一横排的圆。因为和代码不同,Max要靠事件来驱动,也就是要有信息(这里信息是bang)传递到object(这里是下边的uzi)才能继续下一步,所以叫做Dataflow/数据流。

四。加点交互。如果要用鼠标横向移动来控制圆形大小,竖向移动改变圆形的颜色,那么processing改动也挺多,至少要加setup(),draw(),和一些变量声明:

210430ef719bdd35e1832caebadae693.png
float bcolor=random(255); //背景颜色每次随机一个灰度
void setup() {
 size(600, 600);
}

void draw() {
 float rad=map(mouseX, 0, 600, 0, 70);  //鼠标横向控制圆直径
 float b=map(mouseY, 0, 600, 255, 0); //纵向控制蓝色
 background(bcolor);  
 noStroke();  
 for (int i=0; i<width+20; i+=20) {
 for (int j=0; j<height+20; j+=20) {
 fill(255, 255, b, 80);
 ellipse(i, j, rad, rad);
 }
 }
}

Max是这样:

7fcf2452c5b2f5e04194b6bf71047ae9.png
<pre><code>
----------begin_max5_patcher----------
1316.3oc0ZksbhiCE8Y3qPkq7zLDFs4s4od9N5pqtDXEZkwairIIc5p+2GsX
GfzBPz1FpTjvh7xQmy8pqt2K7i4yBVU8BuI.72fOClM6GymMyLjdfYcedVPA
6k04rFyoETxetZ0iAKrGpk+RqY3+Bf6GSjYFQcV2SH8CVtsPTlyaM2D7tAq1
11OJpazl1umyM2h9K1dRseulamoAhREpeo6n0r10eSTt4qR95V6IPhvKgK.3
Dn4kzkgpmUCA9h9R94745mVLLFeuK9huQ7EQ0DkfoWY9htM7EGGN4780BVM.
BhfP0ywPGrGm3j8gCk8mj5Tng5Xpg5Hn0Ce53NNLD3j7w2.xGBizzMjPrjOd
JHuZh2vaZYsbWz1cDMjSZGdYd7KNwKdnJnvT8KwjAIJE7lF1F9unJOH2rx3L
n++NDHwkSAJYZhG3kSgMlOBglBmBIqLqpPQ9HWzN5FE1ONcukC1XhiMwyqXY
qXkabQ6vKXsvEPaCb9vanIFXDbRb3Woc3UN5l+bwd5MvWum4Ve8jIwh2BVod
rNmyjNncxEXyIWnMewtWsvexb.BMV+Xyx8HxTnD+WAuUVAvPvmXqaEOwAtbD
lnb9N6pfNAfZC6gmjvd26lwvaZZtXa7tIJMWmLFkdSSzcRYbMa8+BD1GNndp
aiMsavGpJaKYEVd9ORAKOX7h.pu4MhWMGvru94DJJzlYHwjRfdMwntmPMSYv
pdhka1U.Cti.ti5RyNccuWSMKLMDkDedgiP2OLBZbcwdTzt7YgJCpmAeRCM.
1Ucg5eWq1f3StKiu5G9x2+Yn5XjJIbLJDhiUhYWlISfXluNCPAq+FSdJYjbs
UQ0T6qErVo3kSnkXOVGGgimvc09SvtBU1easvq8p1CB+6evNRnIJGIpqqOSg
W1wzH5GEMJEO4Zze.vtV2E+AQh5Stv1kTxjDrZ6qB.wUqgiFEQZ.UX76JZ1r
tw1FuQgWQ+pOLK85RS+l3Wg9X6W00DuA5WUyJ44tDG7ET8N7nZvJUECajUaK
y1+pcPJDLIRWxBMEYiBa12JDmn4U2kUTkw2GNkLZgCGCeSvVsYcUdkzdWgKI
IvzP7B86H3vzXy6fzzjDkBt28tVVUWIaEUkFDVRR2SLMmUPtn78eAXFhnG+P
EtoZqbcuUuOKevNvx3MshRVOZedWRXfiYE8EI0Nw.rm.0Kqhr5JkuXG2HvXs
gPkYp0wxld0Aehlbb2Memn5bFtNRht8aWIj7xLqKYY3PotGnAYmww1vH1Ebc
8M3vOQ0EGOvIp9qA4ryTbxHHIXe7nzYkt2zoRlwMwJfWAnCcCMZ5glbnmvaP
iGDzDeb2Inof09AMdJr0FB4ksFdSfV2ENWPOLAO1WS8PWESv9tJd7kWrux6n
6OS80cdvAIo9xQxPQJzWjvCDo24weDjFqrqN6dYiEPmMQhQ.mHeRWLcL767I
.BZTRCf3Am5mNCCIe76niAPdfyXHc8V5SBzXnb5eFDm2aXLjNjOQg5mNCNi7
yAzXgyYcug+BP1ZXY00OwkMcmsAifB1i15kMemEpxDJsezzYi.I+IQ+4GYFg
IUEu2ppbeqzVr+KI1VzYJPWVtUzsenhcy6ZJv6padWiU1lIpJzeI.ysr4A11
71CUfUadPjm+VU8yd6HyB5atRvFIKSv0+Hn5Nh4zQu0Ef3HZLxT6eBkfn52Q
OnA.cWAt+JvoPTZjsaAoIPp8cpgPttrK9pb05hi0DBqEzplF+DohnuuUKAEJ
cSzmCj1bO+my+eDP0OWB
-----------end_max5_patcher-----------
</code></pre>

因为是基于事件的,所以信息有个先来后到,从qmetro出来就要用trigger 来规定一下处理顺序。另外由于Max的jit.lcd只能以左上角xy和右下角xy的办法来画圆,所以需要坐标减去半径又加上直径来实现变大变小,这样动起来就会抖动。当然,一般正儿八经的东西,都不会用lcd来做,文档里边,jit.lcd的介绍是:

23e1ef7601f55a2b19a53af049d07209.png

这里用它只是举例uzi来实现for循环。

就这么一点小事,Happy Patching!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值