MUMT 306: Homework

Homework Submission Process

Homework Policy

"Collaboration Policy": Students can often learn a great deal from their peers. Feel free to seek help from other students (as well as the instructor and TA) when you are having difficulty. But DO NOT COPY assignments. We expect you to write your own patches and code.

Max Patch Remarks: Design your interfaces in order to group the elements (i.e., buttons, displays, sliders) in an intuitive way. Verify the implementation of the patch so that default parameters are initialized at load time. Add small comments to help the user get started and to understand how the patch works. Test your patch (before delivering it) as if you were a real user that does not know anything about the way it has been implemented. For example, make a copy in another folder, quit Max/MSP, reload the patch and test it. Design each patch in a small window that can be printed on one page only.

Wiring and C++ Code Remarks: Your C++ and Wiring programs should be easy to read and understand. At the top of each program, provide the program name, your name, and information about the program and how to use it. For C++ programs, include a g++ compiler statement that can be used to compile the program in the working directory. In your code, be liberal with comments. Even when a program does not execute properly, partial credit may be given based on comments that show good understanding of the issues and ways to approach the solutions. Use the C++ style guide to uniformly format your code.

Homework #8Due: Tuesday, 17 November 2020 at 22:00

  1. Create a Max/MSP patch that uses cycle~ objects to synthesize at least two different types of "bird-like" calls or songs. It should be possible to hear each type of bird call separately or all of them at once. [10 pts]

  2. Create a Max/MSP patch that uses the noise~ object to synthesize the sound of wind. There should be at least three "spectral regions" to the sound (i.e., you should use at least three reson objects with different parameters. You should provide controls for the "speed" and "variability" (or "randomness") of the wind. [10 pts]

Homework #7Due: Tuesday, 10 November 2020 at 22:00

  1. Modify the playsmf.zip project (specifically the playsmf.cpp program) to simultaneously play all tracks of a MIDI File of format 1. [15 pts]
  2. Write a Max patch that converts incoming MIDI channel messages to OSC messages (using the OpenSoundControl object) and outputs them via the udpsend object to a specified computer host and port. The patch should be designed for use as an object and allow the host and port to be specified both as default arguments and via inlets. You will need to define your own OSC address scheme. You should design your object to take a raw MIDI byte stream. [10 pts]

Homework #6Due: Tuesday, 3 November 2020 at 22:00

  1. Reimplement your looping polyphonic MIDI sequence from Homework #2 (or create a new one) in C++. Use the sample project directory MUMT306HW6 and modify the midiout.cpp example program to produce the sequence. Create a variable at the top of your program that defines the number of times the sequence should be repeated. Your program should make use of the chooseMidiPort() function provided in midiout.cpp, as well as the SLEEP() preprocessor macro to pause for the appropriate durations between MIDI events. [10 pts]
  2. Write a Max or Pd patch, using raw MIDI objects (but not midiformat), that can output all types (7 different channel and 16 system messages, even if they are undefined, see chart for types). Only one message for each type is necessary and the use of Max message boxes filled with status and data bytes is acceptable. For Control Change messages, provide a slider that allows one to select the Control Change type. There should be a single number object that can be used to specify the MIDI channel for all channel message types. [5 pts]
  3. Write a C++ MIDI parser program that reads MIDI input data using the RtMidi class. Use the sample project directory MUMT306HW6 and modify the qmidiin.cpp example program to do the parsing. For each MIDI message received, print to stdout the message type (Note On, Note Off, Control Change, Program Change, SysEx, ...), channel, and subsequent byte values as decimal numbers in a human readable text format (one line per message). Use the Max patch from the previous question to test your program. (Windows users should look into loopMIDI to create virtual MIDI ports.) [10 pts]
Homework #5Due: Tuesday, 13 October 2020 at 22:00

  1. Reimplement your looping polyphonic MIDI sequence from Homework #2 (or create a new one) on the Arduino. The MIDI data should be sent out through a serial connection to a Max patch (from which it should be routed to the internal DLS synthesizer of the computer). The MIDI sequencing must be done on the Arduino (message formatting and timing), not in Max. If you make any changes to the arduino_midiin Max patch that are required for your sequence, be sure to include that patch and any necessary subpatches in your submission. [15 pts]
Homework #4Due: Tuesday, 6 October 2020 at 22:00

  1. Create a command-line C++ program that randomly selects, without repetition, all of the elements from the set of numbers 1 - 10. For example, one possible correct result of the program would be the sequence of numbers: 3 5 9 1 2 10 4 8 6 7. You should make use of the std::vector class to store the numbers. The program should "seed" the random number generator with a unique value every time it is run. Do not use any built-in C++ functions other than those demonstrated in the class notes (for example, do not use the random_shuffle() function). Type "man random" in a terminal window to learn more about the random() and srandomdev() functions (and see the std::vector example program in the class notes). Submit only the (uncompiled) program text file and provide a commented compile statement at the top of the file. [10 pts]
Homework #3Due: Tuesday, 29 September 2020 at 22:00

  1. Create a Max or Pd patch that implements a MIDI arpeggiator. Continuously arpeggiate a bass note (notes below middle C, note number = 60) until the next bass note is hit. Notes from middle C and above should play normally. There should be a stop button and a way to control the speed of arpeggiation. Provide at least three different chord types (major, minor, dominant 7th, etc.) and allow them to be selected by the user. The patch must work with an external MIDI source, such as MidiKeys. [15 pts]
  2. Create a random pentatonic monophonic melody generator in Max or Pd. It should have a three-octave range and melodic leaps greater than an octave should not be allowed. Three different note lengths should be produced, where shorter notes are more frequent than longer notes, and notes should follow one another without delay or overlap. [10 pts]
Homework #2Due: Tuesday, 22 September 2020 at 22:00
  1. Read CMJ articles on MIDI:

  2. Create a Max or Pd patch that generates a looping polyphonic MIDI sequence of at least 4 "beats" (without using a sequencer object!). The patch should be designed to use the internal DLS synthesizer for sound output. The sequence should include a drum part, a bass "riff", and another voice of your choice doing "fills". The voices for each part should be specified using program change messages. [15 pts]

Homework #1Due: Tuesday, 15 September 2020 at 22:00

  1. Read Dannenberg, "A Brief Survey of Music Representation Issues, Techniques, and Systems", Computer Music Journal, 17(3), pp. 20-30, 1993 and write a synopsis of 1-2 pages, with a more in-depth consideration of 4 particular representation issues (of your choice) discussed in the paper. [10 pts]
  2. Create a Max or Pd patch that implements a stop watch with 0.01 second accuracy (using only the objects demonstrated in the Week #1 notes). Provide a "Start/Stop" toggle and a "Reset" button. [5 pts]


McGill ©2003-2020 McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.