Max/MSP极速入门:手把手教你打造MIDI音序器(录制、编辑、回放)
嗨,各位音乐制作的朋友们!今天想跟大家分享一个超酷的Max/MSP小项目:如何从零开始搭建一个属于你自己的简易MIDI音序器!Max/MSP的魅力就在于它能让你自定义几乎所有音乐工具,而MIDI音序器绝对是入门的好选择。这个音序器能实现MIDI音符的录制、基本的编辑和回放,快跟我一起来探索吧!
第一步:Max/MSP音序器的核心 —— seq 对象
Max/MSP中最适合做音序的便是 seq 对象。它就像一个微型的时间轴,可以储存MIDI事件,并按照时钟信号播放。
- 创建
seq对象: 在Max Patcher中双击空白处,输入seq,然后回车。 - 连接时钟:
seq对象需要一个时钟信号来驱动。我们通常会用到transport对象,它能提供一个全局的时钟。- 创建一个
transport对象。 - 创建一个
metro对象,设定播放速率,例如metro 250(每250毫秒触发一次)。 - 将
metro的输出连接到transport的第一个输入口 (bang)。 - 将
transport的bang输出连接到seq的第一个输入口。 - 为了控制
transport的启停,可以连接一个toggle(开关) 到transport的第三个输入口 (on/off)。
- 创建一个
- 连接MIDI输出:
seq会输出MIDI音符数据,我们需要将其发送到MIDI设备或软件合成器。- 创建一个
midioout对象。 - 将
seq的第二个输出口(MIDI数据)连接到midioout的第一个输入口。 midioout对象旁边会出现一个小下拉菜单,选择你想要输出到的MIDI设备(比如系统自带的MIDI合成器或DAW的虚拟MIDI端口)。
- 创建一个
现在,你的音序器已经有了一个基本的心脏和输出通道了!
第二步:录制MIDI音符
接下来,我们让音序器能“听”到并记录下你弹奏的MIDI音符。
- MIDI输入:
- 创建一个
midiin对象。同样,它旁边也会出现一个下拉菜单,选择你的MIDI键盘或其他MIDI输入设备。 midiin的第一个输出口会输出原始的MIDI数据。
- 创建一个
- 处理MIDI数据: 原始的MIDI数据通常是
pitchvelocitychannel的形式。我们需要将其转换为seq对象能理解的格式。seq期望的格式是note (pitch) (velocity)。- 创建一个
notein对象,将midiin的输出连接到notein的输入。 notein会将原始MIDI数据解析成音高(pitch)、力度(velocity)和通道(channel)三个单独的输出。- 创建一个
pack note 0 0对象。这个对象会将三个独立的数字打包成一个列表,并加上note标签。 - 将
notein的第一个输出(pitch)连接到pack的第二个输入。 - 将
notein的第二个输出(velocity)连接到pack的第三个输入。
- 创建一个
- 发送到
seq:- 创建一个
message对象,内容为add $1。 - 将
pack的输出连接到message对象的输入。 - 将
message对象的输出连接到seq的第四个输入口(message input)。 - 为了开始录制,我们需要一个开关来控制
add消息的发送。可以连接一个button(按钮) 到message对象之前,只在按下按钮时才将pack的数据传递给add消息。或者,更常见的做法是,使用一个gate对象来控制数据流。
- 创建一个
第三步:基本的MIDI编辑和清除
seq 对象允许你通过消息进行一些基本的编辑。
- 清除序列:
- 创建一个
message对象,内容为clear。 - 连接一个
button到这个message对象。点击按钮即可清空seq中所有已录制的音符。
- 创建一个
- 手动添加/修改:
- 虽然不如图形界面直观,但你可以通过
add消息手动输入音符。例如,创建一个message对象,内容为add note 60 100(添加一个C3,力度100)。 - 更高级的编辑通常需要结合
coll或其他列表处理对象,将seq的内容导出、编辑后再导入。但对于一个“简单”音序器,我们先聚焦于录制和回放。
- 虽然不如图形界面直观,但你可以通过
第四步:构建用户界面和控制
让你的音序器更易用,需要一些控制元素。
- 播放/停止: 之前我们已经连接了一个
toggle到transport的on/off输入,这就是播放/停止按钮。 - 录制开关: 可以创建一个
toggle来控制gate对象,从而实现录制模式的开关。- 创建一个
gate 1对象。 - 将
pack note 0 0的输出连接到gate的第二个输入口。 - 将
gate的输出连接到add $1message对象的输入。 - 连接一个
toggle到gate的第一个输入口(control)。当toggle为真时,gate打开,MIDI数据可以流过并被seq记录。
- 创建一个
- 速度控制:
- 创建一个
number对象。 - 将
number的输出连接到metro对象的输入,这样就可以动态调整播放速度了。
- 创建一个
- 循环播放:
seq对象默认是单次播放。要实现循环,可以创建一个message对象,内容为loop 1。将其连接到一个toggle。当toggle开启时,seq会循环播放。
总结与展望
通过以上步骤,你已经成功搭建了一个Max/MSP中的简易MIDI音序器!它具备了基本的MIDI输入、录制、播放和清除功能。
核心逻辑回顾:
midiin¬ein:负责接收并解析外部MIDI输入。pack note 0 0&add $1:将解析后的音符数据格式化并发送给seq录制。seq:储存和管理MIDI音符序列。transport&metro:提供时钟驱动seq播放。midioout:将seq播放的MIDI音符发送出去。toggle,button,number:提供用户交互和控制。
这只是一个起点!你可以根据自己的需求进一步扩展:
- 可视化: 使用
jit.pwindow和jit.gl.grid等Jitter对象,将音序器的音符在屏幕上图形化显示出来。 - 高级编辑: 结合
coll对象,实现更复杂的音符列表编辑功能,如量化、移调、删除指定音符等。 - 多轨: 创建多个
seq对象,实现多轨音序。 - 保存/加载: 利用
pattrstorage或coll的read/write功能,保存和加载你的序列。
Max/MSP的世界充满无限可能,动手实践是最好的学习方式。希望这个小教程能帮你打开一扇新的大门,玩得开心!