- Main Page
- Namespaces
- Files

- File List
- File Members

# C:/Musimathics_local/Musimat/MusimatTutorial/B0201.cpp

Go to the documentation of this file.

    00001 #include "MusimatTutorial.h"
    00002 MusimatTutorialSection(B0201) {
    00003 Print("*** B.2.1 Pitch ***");
    00004 /*****************************************************************************
    00005
    00006 B.2.1 Pitch
    00007
    00008 We would ideally like to have a uniform way to represent all pitch systems discussed in chapter 3.
    00009 It would be convenient if we could do arithmetic on pitches, for example, to find the size of an
    00010 interval by subtracting two pitches, to calculate the frequency of a pitch, or to get the pitch of
    00011 a frequency.
    00012
    00013 Solving the simplest problem first, I designed a data type for the equal-tempered scale using the
    00014 piano keyboard. This can be generalized to other scales. The gamut of a standard piano keyboard
    00015 is 88 keys, indexed from 0 to 87, lowest to highest. We start by associating each key number with
    00016 a name. The lowest pitch on standard pianos is A0, corresponding to key 0, and the highest pitch
    00017 is C8, corresponding to key 87. Interval size in degrees is the difference between key indexes. For
    00018 example, C4 is key 48 and F4 is key 53, so the interval C4 – F4 corresponds to five semitones,
    00019 which is the diatonic interval of a fourth.
    00020
    00021 Musimat comes with a built-in data type called Pitch. By default, it assumes 12 degrees per
    00022 octave, but the degrees can correspond to any frequencies, so for example, it can be used directly
    00023 to create any dodecaphonic scale. It also can be adjusted to handle scales with other than 12 degrees
    00024 per octave.
    00025
    00026 By default, the Pitch data type emulates common musical notation conventions regarding
    00027 scale degrees, interval sizes, and transposition. For example, the pitch As4 (pitch class A# in the
    00028 fourth piano octave) is defined as
    00029 *****************************************************************************/
    00030
    00031 Pitch As4 = Pitch(9,1,4);
    00032
    00033 /*****************************************************************************
    00034 The first number, 9, represents the diatonic degree as the number of semitones above C.
    00035 Diatonic pitch A is the ninth semitone above C (see figure B.1). The second number, 1, indi-
    00036 cates the accidental. In this case, the A is sharped (raised by a semitone). The chromatic scale
    00037 degree is obtained by adding the diatonic scale degree, 9, and the accidental, 1, which for A#
    00038 yields 10 (see figure B.1). The third number, 4, indicates the octave on the standard piano
    00039 keyboard.
    00040
    00041 The chromatic degrees from A0 to C8 are predefined in Musimat in both flats and sharps. Since
    00042 As4 and Bb4 represent the same chromatic degree, the statement
    00043 *****************************************************************************/
    00044
    00045 Print(Bb4 == As4);
    00046
    00047 /*****************************************************************************
    00048 prints True. In general, Pitch is defined by the triple (pitch-class, accidental, octave), where
    00049 pitch-class is an integer from 0 to N-1, and N is the number of degrees in an octave.
    00050
    00051 In defining the pitch A#4, the triple (9, 1, 4) is assigned to the variable As4. Variable As4
    00052 contains these three values as one compound entity. This compound value can be passed from one
    00053 Pitch variable to the next. For example, the statements
    00054 *****************************************************************************/
    00055
    00056 Pitch x = As4; // assign As4 to x
    00057 Print(x == As4);
    00058
    00059 /*****************************************************************************
    00060 print True. Arithmetic can be performed on pitches to sharp or flat them. For example,
    00061 *****************************************************************************/
    00062
    00063 Print(Pitch(A4) + 1);
    00064
    00065 /*****************************************************************************
    00066 prints As4, and
    00067 *****************************************************************************/
    00068
    00069 Print(Pitch(A4) - 3);
    00070
    00071 /*****************************************************************************
    00072 prints Gb4. Similarly,
    00073 *****************************************************************************/
    00074
    00075 Print(Pitch(A4) * 3);
    00076
    00077 /*****************************************************************************
    00078 prints C12, and
    00079 *****************************************************************************/
    00080
    00081 Print(Pitch(A4)/3);
    00082
    00083 /*****************************************************************************
    00084 prints E1.
    00085
    00086 Each element of a Pitch can be accessed using these built-in functions:
    00087
    00088 PitchClass(Pitch p)
    00089         Returns the diatonic pitch class. For example, if p is As4, 9
    00090         is returned (see figure B.1).
    00091
    00092 Accidental(Pitch p)
    00093         Returns the accidental as an integer, where 0 is natural,
    00094         negative values are increasingly flat, and positive values are
    00095         increasingly sharp. For example, if p is As4, 1 is returned.
    00096
    00097 Octave(Pitch p)
    00098         Returns the octave on the piano keyboard. For example, if
    00099         p is As4, 4 is returned.
    00100
    00101 These elements can be used to determine the piano key index corresponding to
    00102 a particular pitch, as shown by the key() function defined below.
    00103 *****************************************************************************/
    00104         para1(); // Step into this function to continue the tutorial
    00105 }
    00106
    00107 Integer key(Pitch p) {
    00108         Integer pc = PitchClass(p);                                                     // from 0 .. 11
    00109         Integer acc = Accidental(p);                                            // –1=flat, 0=natural, 1=sharp
    00110         Integer oct = Octave(p);                                                        // from 0 .. 8
    00111         Return((pc + acc) + 12 * (oct - 1) + 3);                        // combine
    00112 }
    00113
    00114 Static Void para1() {
    00115 /*****************************************************************************
    00116 A way to think about the expression in the Return() statement is as follows. Say we want to find
    00117 the piano key index for A0. We know it’s the bottom note on the piano, so it should return an index
    00118 value of 0. The triple of A0 is (9, 0, 0). The expression in the Return() statement equals 0 for
    00119 this triple. Similarly, the triple of A4 is (9, 0, 4), and its corresponding key index is 48.
    00120
    00121 *****************************************************************************/
    00122 }}
    00123
    00125 /* $Revision: 1.2 $ $Date: 2006/09/09 06:23:10 $ $Author: dgl $ $Name:  $ $Id: _b0201_8cpp-source.html,v 1.2 2006/09/09 06:23:10 dgl Exp $ */
    00126 // The Musimat Tutorial © 2006 Gareth Loy
    00127 // Derived from Chapter 9 and Appendix B of "Musimathics Vol. 1" © 2006 Gareth Loy
    00128 // and published exclusively by The MIT Press.
    00129 // This program is released WITHOUT ANY WARRANTY; without even the implied
    00130 // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    00131 // For information on usage and redistribution, and for a DISCLAIMER OF ALL
    00132 // WARRANTIES, see the file, "LICENSE.txt," in this distribution.
    00133 // "Musimathics" is available here:     http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=10916
    00134 // Gareth Loy's Musimathics website:    http://www.musimathics.com/
    00135 // The Musimat website:                 http://www.musimat.com/
    00136 // This program is released under the terms of the GNU General Public License
    00137 // available here:                      http://www.gnu.org/licenses/gpl.txt
    00138