Figure 1 - Music Maker Form Showing Jingle Bells
I was just involved in writing a musical play in New York and we needed some sheet music to give to the director. I just had the notes in letters so I needed to transpose them to music. I then thought to myself, what better way to do this than by using the power of C# and Visual Studio.NET! This program will create music from a file of letter-coded notes. It will also print and print preview the music. The tough thing about writing a music program is how to initially design it. Once the design was thought out, the program fell into place fairly easily. Below is the design in UML:
Figure 2 - This design was reverse engineered using WithClass 2000 UML Design Tool
Basically, the design is a hierarchy of collections of Pages->Staffs->Measures->Notes. The notes are read in using the StreamReader class and parsed into a Measure using the NoteReader Class.
A Sample Music File is shown below:
E E Ea/E E Ea/E G Ce De Ea
F F Fa/Fe Fe E Ea/Ee Ee E D/D E Da/Gw
E E Ea/E E Ea/E G Ce De Ea
F F Fa/Fe Fe E Ea/Ee Ee G Ga/F D Ca
The rules for writing music are as follows:
- Keywords Title, Signature1 and Signature2 must end in a colon and followed by the value.
- Measures are separated by a forward slash /
- Notes are described as letters C D E F G A B along with descriptor letters in lower case separated by a single space.
- Octaves - MusicMaker covers three octaves. A lower octave note contains a lower case l, A higher octave note contains an h, m is the default.
- Sharps and flats - You can add a sharp to a note with a lower case s, a flat with a lower case f.
- Timing is as follows sixteenth - x, eighth - e, quarter(default), half - a, three-quarter - t, whole - w
- Descriptor letters can be placed in any order next to the note.
Once you've created your file in notepad or any simple text editor, just save it as a .notes file (e.g. mysong.notes).
The jingle bells song sample is included in the download. Now on to our C# lesson.
In this article we will discuss an important structure in C# called an enumeration. Enumerations are used to define your own set of values in a common collection. Enumerations are great because you can use very descriptive words for values in the set. Below is the enumeration declarations for a note in this program: // chromatic enumeration for flats, sharps, naturals
public enum Chromatic
// Timing for notes enumeration
public enum Timing
// pitch of note ranging from C to B
public enum Pitch
// octave of note divided into 3 octaves (low, middle, high)
public enum Octave
All enumerations can be converted to integers by coercing them, and all enumerations start at 0, (unless forcefully assigned) and increment by 1. For example low = 0, middle = 1, high = 2 in the above declaration.
If the enumeration were like this: public enum Octave
Then the starting element in the enumeration sequence is 1 instead of 0, so the values would be low = 1, middle=2, high = 3.
To declare an enumeration field and initialize it, you just do the following:
public Octave TheOctave = Octave.middle;
To get the Octave value as an integer, coerce it:
int n = (int)TheOctave; This is a fairly simple music editor, but has the potential for adding many powerful features (including playing the music through the sound card. Perhaps some adventurous programmer will take it a step further using the DirectSound or DirectMusic API. In the next phase we will probably include a way to add words for the song in between the staffs.