Max:MIDI音符管理

maxmidi2

1. makenote物件是Max中最好用的MIDI音符催生物件,因为它不但可以选择音高、力度和延音时间,而且还能在note-on(音符产生)信息后自动发送一个note-off(音符停止)信息,这样对于我们的使用来说就很简便。这里注意用物件检查器查看一下标注为“dur”那个滑动条的参数,这是用来向makenote物件发送音符延音时间的物件。

2. 中间部分:stripnote物件与notein物件相连,将仅通过note-on消息而抹去MIDI设备的note-off消息。flush物件干的便是发送note-off的事,它能创建一个内部没有接到note-off命令音符的note-on信息的表格,当它的左输入口接到一个bang信息后,它便发送还在延续的音符的note-off信息。

3. sustain物件,件如其名,作为延音用,类似键盘的延音踏板。

本例内新物件:
makenote:伴随每个note-on信息生成一个note-off信息
stripnote:滤掉note-off信息,仅通过note-on信息
flush:为进行中的音符提供note-off信息
sustain:持有note-off信息,收到命令后输出它们

Max:基本的MIDI

01iMIDIBasics.maxpat
01iMIDIBasics.maxpat

1. MIDI为Musical Instrument Digital Interface(音乐乐器数字接口)的缩写。

2. midiin物件输出收到的外部MIDI信息,midiout物件传送MIDI信息到外部。双击它们将打开MIDI设备选择选单。

3. notein和noteout物件输出和传送MIDI音符信息。三个口从左至右分别为音符数字(音高)、力度和MIDI通道。如第三个例子所示:我们可以将这三个信息通过一个消息框一次传送给noteout发声。我们用将力度设为0的方式停止一个音符的声音。

4. ctlin和ctlout物件输出和传送MIDI控制值,例如MIDI控制器映射或者键盘延音踏板。

5. 灰色那个物件叫做gswitch2,自己玩玩就知道,它可以为一个输入分配不同的两个输出。左输入口为控制入口,如果进入的值为0则默认从左边的口输出,如果进入的值为1则默认从右边的口输出,你可以自己挂个数字框调整0和1看结果;右输入口为数据入口,为控制器的命令值通过。

6. 更多关于端口、通道等的信息,大家可以参见这几个物件里边的提取─inport.maxhelp,在里边有很详尽的介绍。

7. midiinfo物件是个很方便的midi端口选择器。用它与一个umenu物件相连,收到一个bang信息后,如果它连在左边,则会自动检测并将你可用的MIDI输出设备列印在umenu物件上;如果它连在右边,则会自动检测并将你可用的MIDI输入设备列印在umenu物件上。它的用法不止这一个,我们会在今后的课程中探讨更多。

8. 结论:输入MIDI流的基本内容可以通过midiin物件复原,一个MIDI流可以使用midiout’物件发送。但是,在大多数情况下,对待独立信息类型更简单的方式是使用它们的消息专用物件(message-specific objects)。notein/onteout物件和ctlin/ctlout物件为无需解码原始MIDI输入或创建原始MIDI输出的信息提供了简单的解决之道。midiinfo物件,是一个检测你当前MIDI设备状态的强大工具。

本例内新物件:
midiin:输出收到的原始MIDI数据
midiout:传输原始MIDI数据
notein:输出收到的MIDI音符信息
noteout:传输MIDI音符信息
ctlin:输出收到的MIDI控制值
ctlout:传输MIDI控制信息
midiinfo:设置一个包含MIDI设备清单的下拉菜单
gswitch2:从两个输出口其中之一通过一个输入

Max:等式设计

22mDesigningEquations.maxpat
22mDesigningEquations.maxpat

1. 一看这些复杂的运算首先绝对有一种晕菜的感觉,但是本课相反没有过多可记录的东西。一共7个值:x, y, z, A, B, C, D, E,空格键(老伎俩)random出0~1000的四个数,然后scale这四个数到-4.~4.的范围,然后分别赋给A, B, C, D, E五个数,然后这五个数又分别套用一堆复杂的公式计算出x, y, z的值。这三个值在lcd上画线段和空心圆,同时通过名为changecolor的subpatch控制颜色的渐变。其实就这么简单。

2. 搞这么大阵势,其实这课主要要告诉我们,用一个物件便可以完成诸如像x = sin(A*y)-z*cos(B*x)或者y = z*sin(C*x)-cos(D*y)这样的复杂运算,这个物件便是─expr。试想要是没有它,我们要运算以上的公式得堆起多么高的一个建筑来。

3. 关于expr物件,有几点值得注意:表达式中$f1的意思是由第一输入口接收的浮点数,剩下接口依此类推。

4. 如果一个expr物件引数为int(exp($f1)*5.),我们该如何理解它呢?其实我们看不懂的仅为exp($f1)的部分,这个部分的意思是运用exp功能(function)创造一个新值。乘以5之后将之整数化。

5. 这里复习一下value物件,它在第16课:远程信息中第一次出现,同名value物件的值在整个patch甚至supatch中都是一致的,在本例中,x, y, z, A, B, C, D, E这几个数字的多次运用就是通过value物件实现的。

本例内新物件:
expr:为一个数学表达式赋值

到这里,官方教程第一部分Basic全部学完,给自己一点掌声吧~下一篇进入MIDI。

Max:数据流控制

21mControllingDataFlow.maxpat
21mControllingDataFlow.maxpat

1. #1:主要有三点:
1)那个竖着排列可以点选的小圆点是由一个叫做radiogroup的物件弄出来的,用物件检查器将其打开,Number of Items项是几,便有几个小圆点,它们代表的数字由0开始,后续每个递增1。这一特性可以很好的与gate以及switch物件的属性配合。
2)gate物件:一个输入,然后可以选择不同的输出。与switch物件刚好相反。你要几个输出,就将引数设为几。
3)switch物件:一个输出,然后可以选择不同的输入。与gate物件刚好相反。你要几个输入,就将引数设为几。

2. #2:
1)如果你需要既控制特定的输入又控制特定的输出,便需要使用router物件。它的第一个引数为输入的口数,第二个引数为输出的口数。
2)router物件正上方那个网格咱之前没见过,它叫做matrixctrl物件。它与router物件是一对绝配。
3)我们注意到这个网格的线条组成:横四竖三。他们分别代表:四个输出和三个输入。点击任何一个横竖线交叉点,会放置下一个白色红心的圆点,就是由它控制不同输入、输出口的组合。例如,选择左上角的交叉点,这表明我们选择了router物件第一输入和第一输出口这个组合,那么在本例中,它将跟随我们鼠标的轨迹画出一连串空心的矩形。从上至下、从左至右,不同的点对应不同的输出、入组合,依此类推。
4)打开Max窗口,我们可以看到router物件与gate和switch物件的另外不同。还是以点选matrixctrl物件左上角的交叉点为例。这时在Max窗口中显示为0 0 1。这三个数字分别代表:输入口 输出口 状态。这里我们看到,router物件的输入与输出口均是由0开始,而gate和switch物件则由1开始(0代表关闭),这是它们之间的又一个不同之处。第三个数字“状态”:1代表连接,0代表断开连接。因此,如果我们取消matrixctrl物件左上角的点,则max窗口返回0 0 0三个值。

本例内新物件:
(gate:将一个输入通过一个特定的输出口输出)
switch:通过一个特定的输入输出信息
(router:可配合matrixctrl使用的Max消息整合分配)
radiogroup:点选按钮用户界面物件
matrixctrl:矩阵转换控制

Max:演出模式

1. 点击patcher窗口下方第四个按钮将带我们进入演出模式(Presentation Mode),它可以让我们在表演时隐藏我们patch中不需要显示的部分而仅留下关乎操作的部分,也就是设计我们自己的用户界面(UI)。这是Max5的新功能。

2. unlock这个patch,我们可以发现,凡是将出现在演出模式的物件周围都会有一圈粉色的“光环”。

3. 在演出模式下unlock,可以任意移动、缩放你希望改变的物件,这个改动不会改变它们在patch模式下的位置及大小。

4. 在patch模式下,选中你希望放到演出模式下的物件后Object > Add to Presentation将把它们放入演出模式物件中。

5. 在演出模式下同样可以添加新的物件,而且当你返回patch模式,它仍将在原来的位置存在,并且,你可以看到它的粉色“光环”。

6. View > New View 将打开一个与你当前操作的patch一模一样的一个复制品,这么做的好处是,你可以将其中之一放在patch模式,另一个转到演出模式,同时对比两种模式协同工作。

这一课比较简单,所以顺便玩了一下视频录像软件,本来想做成Flash,但想想太麻烦,还不如直接录像。没想到也挺好玩的..

Max:时间控制

19mTiming.maxpat
19mTiming.maxpat

1. 例1:pipe物件起到一个延迟输出的作用,引数为希望延迟输出的时间(以毫秒为单位,1毫秒=千分之一秒)。左侧数字框为将要延迟的数字,右侧数字框为延迟的时间。

2. 例2:delay物件类似于piep的功能,区别是,delay是专门用于延迟bang信息的。与pipe一样,右边数字框也可以手动设定希望延迟的时间。

3. 例3:clocker物件与metro物件密切相关。二者原始的区别在于输出:metro是以固定的时间间隔产生bang信息,clocker则输出在你发送一个bang信息后消耗的时间(依毫秒计)。点击stop将停止clocker,重新发送bang信息,则计时器清零重新开始。

4. 例4:timer物件是另一个计时工具,它能记录你点击左、右两个按钮间的间隔时间。类似速度选择里的Tap功能。注意timer物件与Max其他物件有些许不同,因为它的右输出为热输出,而不是惯常的左输出。

5. 例5:在实践中展示了几个最常见的布尔体系的物件。 >(大于),当公式成立返回值1(真),反之则返回值0(假);<(小于)与大于相反;==(等于),当输入值等于它的引数的时候返回值1;!=(不等于),与等于相反。&&(逻辑和),只有当两个输入的值非零的时候,他才会返回值1,反之则输出值0;||(逻辑或),当左或右至少一方输入值非零,它就将返回值1,其他任何情况,均返回值0。

6. 大家伙例6:
1)韵律时间控制(Metrical timing)基于一个中心时间保持物件──transport,它的作用是向其他物件发送时间信息。在与它的结合使用中,时间用韵律乐谱(metrical notation)表述:4n(四分音符)的值可以被用于毫秒时间乐谱(millisecond timing notation)的替代。transport物件是中心时间保持者,并将时间以小节/拍/音位(tick)的形式提供─全部基于一个速度和一个拍子。因此,如果一个传送设置为以四分之四拍、每分钟120拍的速度运行的话,每一拍将占据500毫秒,一小节则为2秒(2000毫秒)。

2)选中大黄toggle按钮开启程序──主要由于它开启了transport。大toogle同时开启了它左边红色部分的小toggle,它使用了4n作为时间的引数。之前,我们都使用毫秒作为metro物件的时间控制,但在本例中,4n乐谱意味着它将在基于transport时间的基础上每四分之一音符发送一个bang。这个metro输出到两各地方:到一个产生MIDI音符70(通过makenote物件)的消息框,然后回到transport。为什么它会被tranport路由?因为收到bang信息后,transport会以小节/拍/音位(tick)的形式输出当前的时间(它下方的三个数字框)。这里默认每一拍含有480个音位。

3)绿色部分:使用小节数+大于、小于物件来决定我们是否处于第4和第8小节之间。当我们处于这个范围内的时候,触发另一个以十六分音符定时的metro。通过random和select物件在四个数中选择一个随机值,这些数字被送入makenote物件后生成MIDI音符。这个值同样被送入一个引数为4nd的pipe物件,将此值延迟一个附点四分音符。这个输出再加上7,这样的结果教程上写的是“sounds a perfect fifth above the original”,我不知道该如何翻译才好。。

4)蓝色部分:这是使整个音序器循环的部分。它的头部是一个新的物件:timepoint,它的引数以小节/拍/音位(tick)标注,当transport的时间到达它的引数的时候发送一个bang,在本例中,当音乐行进到第17小节的时候,一个四个音符的和弦被送入makenote,同时一个bang经0.消息框被送入transport的右输入。这个信息(0.)告诉transport回到起点,第一小节/第一拍/第一音位。这就是我们如何使音序器循环的:每当它跑到第17小节的时候,我们将被立马带回一开始的部分。

5)棕色部分:key和sel 32捕捉空格键的动作,用timer物件获取每两次敲击空格键的时间间隔,用60000(1分钟)除以这个时间(X !/ 60000=600000/X)可以得到bpm值(每分钟的拍数)。但是,我们希望这个值在一个可感知的范围,所以我们使用split物件采30.~200.之间的值,如果得到的值在这个范围之间,则从split物件左输出口经tempo信息传入transport,这将迅速改变音序的回放速度以及一部分(并非完全)用于构成音序器的物件的相对速度。如果timer输出了一个split规定范围之外的值,则这个值将从split右输出输出并被忽略。

6)蓝紫部分:并非所有音序都会改变的原因在于一些patch使用了标准(毫秒)时间而非韵律时间。这个部分就是个很好的例子。当音乐进行到第6小节第3拍的时候,timepoint触发按钮。开启clocker跑10秒(10000毫秒)(当clocker的值大于10000之后,深红色按钮触发stop消息框停止clocker的运行),每四分音符弹响一个两个音符的和弦(紫色小按钮)。timepoint同时将一个bang送入delay 3000物件,在收到bang后推迟3000毫秒触发一个两音和弦的声音(深绿小按钮)(仅触发一次)。在一个很慢的tempo下,当timepoint被触发后,它也许只能进行几拍,当tempo很快的时候,它也许又能跑几小节。这就是标准时间与韵律时间混搭产生的奇妙结果。紫蓝按钮正下方那个timer的存在仅仅是为了证明clocker的确是不多不少跑了10秒而已。。。

7. 如果运行诸如本例这样的以时间作为决定性因素的例子,通常建议选中Options > Overdrive,选中后,事件程序和计算将优先于屏幕绘制和图形程序。

本例内新物件:
pipe:延迟数字或数列
delay:延迟一个bang信息
clocker:以固定的间隔报告已消耗的时间
timer:报告两个事件之间的时间
>:在两个数字之间比较,大于
<:在两个数字之间比较,小于
==:比较两个数字,如果他们相等则输出1
!=:比较两个数字,如果他们不等则输出1
&&:如果全部数字都是非零的,则输出1
||:如果两个数中有一个是非零的,则输出1
transport:控制一个主导时钟并报告时间的值
timepoint:当达到transport一个特定时间的时候输出一个bang
split:寻找一组数字的范围