Project 1 proposal
CS 312 Audio Programming Winter 2020

Table of Contents

Class7.1 project proposal

The goal for class Project 1 is to use and extend the concepts you've learned to create an original MIDI based musical project.

Due by email before beginning of class 5.3

  • What are you going to create?
  • What previous class assignments will be incorporated?
  • What new features are you bringing to the project?
  • Are you introducing ideas not discussed in class?

Guidelines

  • Projects must be built using cmake.
  • Project must use CAppleMidiSynth for playback.
  • At least four tracks.
  • Each track uses a different MIDI channel.
  • Your program must include a command line option that enables printing the playback vector to cout during playback.
  • The song duration at playback tempo must be at least one minute.
  • The maximum song duration at playback tempo must not exceed two minutes.
  • You may use any code snippets or examples found on the internet but you must cite the reference in a code comment.
  • You may use any code snippet/example from the class web pages or homework without citation.
  • Projects that recreate a class homework project with only minor changes will lose grade points on the grounds of originality.
  • Projects that use and combine class concepts, or invent new ones, will gain grade points.
  • The quality of the project concept, code structure and implementation will be graded, not the musical outcome.
  • It is hoped that you will be pleased with your projects musical outcome.
  • Each team will present their project presentations in class on Monday class 7.1.
  • A "Best Song" award as voted on by the class will be presented.

Ideas

Scale Pattern Ideas

  • Choose/combine scale patterns or invent new ones.
  • You can find many more scales on the internet.
  • You can invent new ways to the order the notes of the scale.
  • You do not have to rely on random patterns.
  • You can create your own patterns in a vector and use them in the natural vector order.

Duration Pattern Ideas

  • The drum machine project used four beats in a measure with four subdivisions per beat.
  • You could allow 3,5, or more beats in a measure.
  • You could allow beat subdivisions 3, 4, 5, or more notes per beat.

Modify the drum_machine into a melody_machine

  • Turn the drum machine rows into scale note numbers with each row on a different instrument on a different channel.

Write your own melodies and rhythms

  • Insert volume/expression control changes in your melodies.
    Say you wanted to increase the volume from time 4000-8000. To avoid a "stair step" effect you might need to send a control message every 100ms over the 4000ms range. You could write a for loop to add 40 MIDI Volume control messages with correct timestamps for that time range. You could append them to the end of your track vector and re-sort your vector.

Track Start/Stop times

  • Not all tracks have to start/end at the same time.

Learn how to read and parse a Standard MIDI File

  • Convert the SMF file tracks into CMidiTracks and play them back with CAppleMidiSynth.
  • You'll probably have to filter out messages that CMidiPacket doesn't handle.
  • You might find a program on the interent that converts a MIDI file to text.
  • You could then parse the text into CMidiPackets.

Learn how to write a Standard MIDI File (SMF)

  • The CMidiPacket information you have is about 80% the the data needed by a SMF. The rest is file formatting.
  • You'd have to learn the about SMF track header format and track data format.
  • You'd have to convert the differential timestamps into SMF PPQ format.
  • There is plenty of information on the internet.

Add tempo changes and volume changes to your tracks // Create/use new function objects

  • Class 5.2 reference section
  • Add swing
    change (0 500 1000 1500 2000 2500…) to (0 667 1000 666 2000 667…)
  • Quantize
    Simple duple musical beat subdivisions are 125, 250, 500
    For a given timestamp, move it to the closest (left or right) musical beat subdivision.
  • Accents by note number/beat number
  • Accent beats 1(0) and 3(2000) for beats (0 1000 2000 3000…) similar for all following beats
  • Accent beats 2(1000) and 4(3000) for beats (0 1000 2000 3000…) similar for all following beats
  • Accent every eight notes in a 3+3+2 pattern (common Latin American rhythm).
  • Accent every six notes as 3+3 followed by 2+2+2 patterns (another common Latin American rhythm)
  • Humanize rhythm (avoid machine precision)
    overshoot/undershoot by various ms amounts still adding to 1000ms a beat in pairs
  • Increase or decrease volume gradually over a range of timestamps
  • Fade in at beginning, fade out at end of a track
  • Create "cross rhythms" by assigning different accent patterns to each track
  • Rock generally accents beats 1 and 3 while jazz might accent beats 2 and 4.
  • Some Latin American rhythms accent notes in a 3+3+2 pattern.
  • Another interesting rhythm pattern called hemiola is over a group of 6 notes: 2+2+2 or 3+3.
  • You can find many world rhythms on the internet.

Add command line options

As an example you could use command line options for
selecting any combination of tracks to play
changing the tempo by say +5 every time the up arrow key is pressed
changing the tempo by say -5 every time the down arrow key is pressed
toggle a track on off by typing a keyboard key

Imitate a song you like
Propose something else you're interested in within the context of the course so far

Author: John Ellinger

Created: 2020-02-03 Mon 12:30

Validate