Kevin Wayne
Overview.
A Musikalisches Würfelspiel
is a process for generating music by concatenating a random sequence of
precomposed musical fragments.
In this exercise, you will “compose” a Viennese waltz in the style of Mozart
by playing a sequence of 32 WAV files that are chosen
at random (from a set of 272) according to the results of throwing dice,
as described below.
The waltz is composed of two parts—the minuet, followed by the trio.
Minuet.
The minuet consists of a sequence of 16 musical phrases (numbered 0 to 15),
each chosen at random.
For the purposes of this assignment, a musical phrase is short musical fragment,
approximately two seconds in length.
To determine which WAV file to play for phrase i, roll two fair dice.
If the sum is s, then play minueti-s.wav
.
For example, if you roll an 8 for phrase 3,
then play minuet3-8.wav
.
Note that each roll has 11 possible outcomes (2 through 12) but some outcomes
(such as 7) are much more likely than others (such as 2 or 12).
Trio.
The trio
consists of a sequence of 16 phrases (numbered 0 to 15), each chosen at random.
To determine which WAV file to play for phrase i,
roll one fair die.
If the result is s, then play trioi-s.wav
.
For example, if you roll a 6 for phrase 15,
then play trio15-6.wav
.
Data files.
The WAV file are available for download as mozart.zip.
After unzipping,
the piano
directory contains the 272 WAV files
(\(11 \times 16 = 176\) for the minuet phrases
and \(6 \times 16 = 96\) for the trio phrases),
using the naming conventions described above.
Other directories
(clarinet
,
flute-harp
, and
mbira
)
contain the same 272 musical phrases,
but generated using different musical instruments.
Playing a WAV file.
To play a WAV file, call StdAudio.play()
with the name of the WAV file as an arugment.
For example, the following two statements will play the
two specified WAV files, one after the other:
StdAudio.play("piano/minuet3-8.wav"); StdAudio.play("piano/trio5-6.wav");
To access
StdAudio
,
you must either add
stdlib.jar
to your Java classpath or
put StdAudio.java
in your working directory.
Your program.
Write a program MusicalDiceGame.java
that plays a waltz according to the rules above.
Your program should take one string as a command-line argument. That string
specifies the name of a directory containing the WAV files,
such as piano
.
Here are some sample executions:
~/Desktop/mozart> javac MusicalDiceGame.java ~/Desktop/mozart> java MusicalDiceGame piano ~/Desktop/mozart> java MusicalDiceGame piano ~/Desktop/mozart> java MusicalDiceGame clarinet ~/Desktop/mozart> java MusicalDiceGame flute-harp ~/Desktop/mozart> java MusicalDiceGame mbira
Context.
Each time you run the program you will compose a piece of music
that has never been heard before!
The precomposed musical phrases obey a rigid harmonic structure so that
each waltz reflects Mozart’s distinct style.
However, due to this rigid structure, the process never results in
anything truly extraordinary.
Credits.
The 272 phrases were published in 1792 by Mozart's publisher Nikolaus Simrock
and attributed to Mozart.
The WAV files were generated using MuseScore
and the open-source MuseScore_General.sf3
soundfont; they were post-processed using ffmpeg.
The images of the dice are minor modifications to those created by
Steaphan Greene and are released under
a CC BY-SA 3.0 license.