MIDI Tutorial 5: MIDI Advanced Sequencing
Introduction
In this tutorial, we will expand on our use of the seq object by recording new MIDI data, loading existing files and writing sequences to disk. We will also use the second outlet of the seq object to provide looped playback of the current sequence.
Working with existing sequences is useful, but being able to record new sequences within Max allows us to create and store sequences and phrases for later use. This sequencing tutorial is focused on recording, the use of the file input/output functions, and the ability to use the seq object output to loop playback.
To open the tutorial patch, click on the Open Tutorial button in the upper right-hand corner of the documentation window.
Recording a sequence
Our tutorial has a number of regions with different patcher logic in each. The leftmost region (labeled Recording) shows the basic setup for selecting MIDI input that we saw in earlier MIDI tutorials. The seq object expects a raw MIDI stream, so our recording input comes directly from a midiin object.
Select a valid MIDI input device from the umenu so we can record MIDI data into our own sequence. In addition, double-click the midiout object and select a valid MIDI output device. In addition to feeding the seq object, the midiin object is also sending data to the midiout (via midiflush), so you should be able to test your connections by playing on your MIDI controller.
Clicking on the red record
message will start the recording of MIDI data. Click on this message box, then play some MIDI data in from a connected controller. Clicking the stop
message will stop recording; we can then hit start
to hear the playback of the MIDI we just recorded. Since the seq object is recording the complete MIDI stream, we can also send continuous controllers, pitchbend messages, program changes or any other MIDI data – it will be recorded and played back just like note messages. As in the last tutorial, we use the midiflush object in between seq and midiout to silence any remaining note-on messages when we stop
our sequence.
Loading and saving a sequence
Once we’ve recorded a sequence, we may want to save the results. This is where the file-handling messages come into play. The top-right area (labeled File Handling) shows three messages that seq understands for saving and loading files; in this case, the write
message is our friend. Clicking on the write
message will open a Save dialog that allows us to store the sequence to disk. Click on the write
message, and save your newly recorded sequence to disk.
Reading the file from disk can take two forms: we can explicitly choose a file to read, or open a dialog to select from any MIDI file stored on disk. Explicit selection is done using a file name argument to the read
message. Sending the read
message without an argument will provide an Open dialog for selecting any available MIDI file. Click on the read seq_sc.midi
message to load our test sequence file; to prove that we have changed the current sequence, play it using the start
message. Click on the no-argument read
message and select your saved sequence. Clicking the start
message should play back our sequence as we performed it earlier.
Looping playback
In the previous tutorial, we saw that the right outlet of seq produces a bang
message when a sequence is done with playback. Using this information, we can perform a common sequencing task: looping playback of our sequence. The bottom-right area (labeled Loop Playback) shows a gswitch2 (Graphical Gate) that will route the bang
message back to the start
message whenever the toggle object is checked. This is a simple use of the right-hand output for sequencer control; it could also be used for loading another sequence, starting a second seq object or even starting another process in Max entirely.
Summary
Recording a raw MIDI stream is one of the strengths of the seq object; it can grab and store almost any type of MIDI message. Using the read and write commands, we can save and then restore any recorded MIDI data, whether received from a MIDI controller or generated from Max. We can also use the right outlet of seq to control playback parameters or even start completely new Max processes. The seq object should be seen as a robust, useful tool for many sequencing tasks.