Assignment 3
Home Up Assignment 1 Assignment 2 Assignment 3 Assignment 4 Assignment 5 Assignment 6 Assignment 7 Assignment 8

 

Interpretation and Performance

Due: Wednesday October 1  at noon.

This assignment is based mostly on the material in Chapter 6 of HSOM.  Those without the musical training to understand either of these problems should see me or Eric for a quick explanation -- it's not difficult.

Note: the original assignment was flawed in that it is difficult to know where the "downbeat" is, which is required in order to solve either of the two problems.  So I have revised the assignment accordingly.  Note that the deadline has been extended until next Wednesday.

  1. Define a function jazzMan (or jazzWoman if you prefer :-) whose type is Music1 -> Music1 (see Chapter 6 for the definition of Music1), such that jazzMan m  is the melody m modified to reflect a jazz "swing rhythm".

    Since there are different kinds and degrees of swing, let's be more specific:  whenever there is a string of two eighth notes, they should be interpreted instead as a quarter note followed by an eighth note, but with tempo 3/2.  So in essence, the first note is lengthened, and the second note is shortened, so that the first note is twice as long as the second, but they still take up the same amount of overall time.

    In addition, jazzMan should accent the second note of each eighth-note pair, and play the first note slightly staccato.  When making these two changes, do not modify the note volume or duration -- rather, use the Modify constructor in a suitable way.

    The link http://www.musilosophy.com/swing-jazz-rhythm.htm expresses all three of these ideas in conventional music notation.

    (There are two complications to this problem:  One is that you only want it to work on eighth-note pairs that begin on the quarter-note downbeat.   The other is that you want it to apply only to a melody, i.e. a string of primitive notes connected with (:+:).  I will accept any reasonable attempt to get these issues right.)
     
  2. Define a player extraFancyPlayer that appropriately handles the Pedal articulation and both the ArpeggioUp and ArpeggioDown ornamentations.  You should define extraFancyPlayer as a derivative of fancyPlayer.

    Note:  To test this part of the assignment, you have to somehow make play know about your new player.  To do that, you should use playA, a variation of play that takes a PMap and a Context as arguments.  Specifically, you should do the following.  First define a new PMap:

    myPMap :: PlayerName -> Player (Pitch,[NoteAttribute])
    myPMap "ExtraFancy" = extraFancyPlayer
    myPMap n            = defPMap n


    Then, supposing that we wish to apply a pedal to cMaj :: Music Pitch, we can do:

    cMaj' = player "ExtraFancy" (phrase [Art Pedal] cMaj)

    Finally, to play it, we do the following in ghci:

    playA myPMap defCon cMaj'

    where defCon is the pre-defined default context.

    To get this to work, be sure to do an update (darcs pull, etc.) on your Haskore installation, since playA was just recently added.