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