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