Jeremy Poulin and Mike Stowell
May 2, 2014
SchArpeggio is a Racket program that allows users to experience dynamic, arpeggiated sound. The program allows a user to enter a custom chord progression with several other options including speed, variable soundfonts, arpeggio motion, and more. The user's configuration is then played back as a dynamic sheet music is drawn.
- Data abstraction and message passing are used in many objects like the chord-configuration.
- String and symbolic manipulation is used to transform user input into something our program can understand.
- Notes are drawn using a recursive function.
- Heavy use of let statements prevent tedious code repetitions in the drawing program.
- Hash tables are kept to perform lookups on notes and their properties.
- Lists are utilized to allow easy passing of multiple chord configurations.
- Optional arguments allow procedures like that which draws a musical staff behave differently on different input.
- Begin is used heavily in the draw-note procedure to allow multiple s-expressions to be evaluated in one if-block.
- Data abstraction and message passing are used to interface with notes objects.
- Strings and symbolic manipulation are used to transform user input into options/commands the arpeggiator understands.
- Progressions are played in a recursive fashion.
- A let statement provides internal variables for the play-chord function.
- Hash tables are used to organize both notes and their relative positions.
- Lists are manipulated to allow the user to play notes in different orders.
- If and cond statements allow configuration for different sounds.
- Begin is the foundation of the core functionality for playing multiple notes in the same chord.
- A lambda function provides a handle for multi-threading.
Mike has made use of the built-in Turtle drawing library while Jeremy worked with the Racket port of SuperCollider 3.
Our project is innovative in that it performs two unique tasks at once: it plays back an ear-soothing arpeggio based on a small set of user input while a dynamic sheet music is drawn. The "live" and multi-tasking aspects of this application make it unique in how it behaves. Also it's an arpeggiator in scheme - the first of its kind.
Technology Used Block Diagram
Jeremy: The real challenge in building an apeggiator in scheme is that the SuperCollider port provides only a subset of SuperCollider's features. The reduces the feasibility of playing song like structures, and forced me to resort to cheap multithreading tricks to play notes. Overall, whilst I don't recommend doing music synthesis in Racket, we've proven it to be possible.
Mike: Drawing musical notes, staves, and symbols is not a simple task utilizing a library that only draws with straight lines and requires you to always keep track of your last drawing movement. Nevertheless, I enjoyed working on this project with Jeremy as it allowed us to explore music in a new light.