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.



Concepts Demonstrated


  • 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.

External Technology

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


Additional Remarks

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.