K7DJ

Max/MSP极速入门:手把手教你打造MIDI音序器(录制、编辑、回放)

47 0 音轨探索者

嗨,各位音乐制作的朋友们!今天想跟大家分享一个超酷的Max/MSP小项目:如何从零开始搭建一个属于你自己的简易MIDI音序器!Max/MSP的魅力就在于它能让你自定义几乎所有音乐工具,而MIDI音序器绝对是入门的好选择。这个音序器能实现MIDI音符的录制、基本的编辑和回放,快跟我一起来探索吧!

第一步:Max/MSP音序器的核心 —— seq 对象

Max/MSP中最适合做音序的便是 seq 对象。它就像一个微型的时间轴,可以储存MIDI事件,并按照时钟信号播放。

  1. 创建 seq 对象: 在Max Patcher中双击空白处,输入 seq,然后回车。
  2. 连接时钟: seq 对象需要一个时钟信号来驱动。我们通常会用到 transport 对象,它能提供一个全局的时钟。
    • 创建一个 transport 对象。
    • 创建一个 metro 对象,设定播放速率,例如 metro 250 (每250毫秒触发一次)。
    • metro 的输出连接到 transport 的第一个输入口 (bang)。
    • transportbang 输出连接到 seq 的第一个输入口。
    • 为了控制 transport 的启停,可以连接一个 toggle (开关) 到 transport 的第三个输入口 (on/off)。
  3. 连接MIDI输出: seq 会输出MIDI音符数据,我们需要将其发送到MIDI设备或软件合成器。
    • 创建一个 midioout 对象。
    • seq 的第二个输出口(MIDI数据)连接到 midioout 的第一个输入口。
    • midioout 对象旁边会出现一个小下拉菜单,选择你想要输出到的MIDI设备(比如系统自带的MIDI合成器或DAW的虚拟MIDI端口)。

现在,你的音序器已经有了一个基本的心脏和输出通道了!

第二步:录制MIDI音符

接下来,我们让音序器能“听”到并记录下你弹奏的MIDI音符。

  1. MIDI输入:
    • 创建一个 midiin 对象。同样,它旁边也会出现一个下拉菜单,选择你的MIDI键盘或其他MIDI输入设备。
    • midiin 的第一个输出口会输出原始的MIDI数据。
  2. 处理MIDI数据: 原始的MIDI数据通常是 pitch velocity channel 的形式。我们需要将其转换为 seq 对象能理解的格式。seq 期望的格式是 note (pitch) (velocity)
    • 创建一个 notein 对象,将 midiin 的输出连接到 notein 的输入。
    • notein 会将原始MIDI数据解析成音高(pitch)、力度(velocity)和通道(channel)三个单独的输出。
    • 创建一个 pack note 0 0 对象。这个对象会将三个独立的数字打包成一个列表,并加上 note 标签。
    • notein 的第一个输出(pitch)连接到 pack 的第二个输入。
    • notein 的第二个输出(velocity)连接到 pack 的第三个输入。
  3. 发送到 seq
    • 创建一个 message 对象,内容为 add $1
    • pack 的输出连接到 message 对象的输入。
    • message 对象的输出连接到 seq 的第四个输入口(message input)。
    • 为了开始录制,我们需要一个开关来控制 add 消息的发送。可以连接一个 button (按钮) 到 message 对象之前,只在按下按钮时才将 pack 的数据传递给 add 消息。或者,更常见的做法是,使用一个 gate 对象来控制数据流。

第三步:基本的MIDI编辑和清除

seq 对象允许你通过消息进行一些基本的编辑。

  1. 清除序列:
    • 创建一个 message 对象,内容为 clear
    • 连接一个 button 到这个 message 对象。点击按钮即可清空 seq 中所有已录制的音符。
  2. 手动添加/修改:
    • 虽然不如图形界面直观,但你可以通过 add 消息手动输入音符。例如,创建一个 message 对象,内容为 add note 60 100 (添加一个C3,力度100)。
    • 更高级的编辑通常需要结合 coll 或其他列表处理对象,将 seq 的内容导出、编辑后再导入。但对于一个“简单”音序器,我们先聚焦于录制和回放。

第四步:构建用户界面和控制

让你的音序器更易用,需要一些控制元素。

  1. 播放/停止: 之前我们已经连接了一个 toggletransporton/off 输入,这就是播放/停止按钮。
  2. 录制开关: 可以创建一个 toggle 来控制 gate 对象,从而实现录制模式的开关。
    • 创建一个 gate 1 对象。
    • pack note 0 0 的输出连接到 gate 的第二个输入口。
    • gate 的输出连接到 add $1 message 对象的输入。
    • 连接一个 togglegate 的第一个输入口(control)。当 toggle 为真时,gate 打开,MIDI数据可以流过并被 seq 记录。
  3. 速度控制:
    • 创建一个 number 对象。
    • number 的输出连接到 metro 对象的输入,这样就可以动态调整播放速度了。
  4. 循环播放: seq 对象默认是单次播放。要实现循环,可以创建一个 message 对象,内容为 loop 1。将其连接到一个 toggle。当 toggle 开启时,seq 会循环播放。

总结与展望

通过以上步骤,你已经成功搭建了一个Max/MSP中的简易MIDI音序器!它具备了基本的MIDI输入、录制、播放和清除功能。

核心逻辑回顾:

  • midiin & notein:负责接收并解析外部MIDI输入。
  • pack note 0 0 & add $1:将解析后的音符数据格式化并发送给 seq 录制。
  • seq:储存和管理MIDI音符序列。
  • transport & metro:提供时钟驱动 seq 播放。
  • midioout:将 seq 播放的MIDI音符发送出去。
  • toggle, button, number:提供用户交互和控制。

这只是一个起点!你可以根据自己的需求进一步扩展:

  • 可视化: 使用 jit.pwindowjit.gl.grid 等Jitter对象,将音序器的音符在屏幕上图形化显示出来。
  • 高级编辑: 结合 coll 对象,实现更复杂的音符列表编辑功能,如量化、移调、删除指定音符等。
  • 多轨: 创建多个 seq 对象,实现多轨音序。
  • 保存/加载: 利用 pattrstoragecollread/write 功能,保存和加载你的序列。

Max/MSP的世界充满无限可能,动手实践是最好的学习方式。希望这个小教程能帮你打开一扇新的大门,玩得开心!

评论