• Main Page
  • Files
  • File List
  • File Members

/Users/garethloy/Musimathics/Musimat1.2/MusimatChapter9/C091102.cpp

Go to the documentation of this file.
00001 #include "MusimatChapter9.h"
00002 MusimatChapter9Section(C091102) {
00003         Print("*** 9.11.2 The Set Complex ***");
00004         /*****************************************************************************
00005          
00006          9.11.2 The Set Complex
00007          
00008          Using these tools, we can create a matrix containing the prime form, inverse, 
00009          retrograde, and all transpositions of any row, called the set complex. The 
00010          purpose of these transformations is to generate variants that are related to 
00011          the original intervallic structure of the prime row, to be used as material 
00012          in developing compositions.
00013          
00014          Matrix is simply a two-dimensional grid, or list of lists, all of the same 
00015          length. The individual elements of Matrix can be accessed by extending the 
00016          index operator […]. The first operand is the matrix, the second is the row 
00017          position, and the third is the column position. (Whether row or column comes 
00018          first is arbitrary. The following order is called row/column order.)   
00019          
00020                                 0       1
00021          M =    0       A       B
00022                         1       C       D
00023          
00024          For example, for this matrix, M[0][0] == A, M[0][1] == B, M[1][0] == C, and 
00025          M[1][1] == D. The following is a method for creating a set complex. It 
00026          basically copies the prime form to the zeroth row, then copies the inverse 
00027          form to the zeroth column, then for each other cell in the matrix sums the 
00028          corresponding row and column value modulo the length of the prime form:
00029          *****************************************************************************/
00030         para1(); // Step into this function to continue.
00031         para2(); // Step into this function to continue.
00032 }
00033 
00034 IntegerMatrix setComplex(IntegerList prime) {
00035         Print("Prime row:", prime);
00036         Integer len = Length(prime);
00037         IntegerMatrix M(len, len);
00038         IntegerList inverted = invert(prime);
00039         Print("Inverted row:", inverted);
00040         For (Integer i = 0; i < len; i = i + 1) {
00041                 M[0][i] = prime[i];
00042                 M[i][0] = inverted[i];
00043         }
00044         For (Integer i = 1; i < len; i = i + 1) {
00045                 For (Integer j = 1; j < len; j = j + 1) {
00046                         Integer a = M[i][0];
00047                         Integer b = M[0][j];
00048                         // M(i,j) = Mod(M(i,0) + M(0,j), len);
00049                         M[i][j] = Mod(a + b, len);
00050                 }
00051         }
00052         Return(M);
00053 }
00054 
00055 
00056 Static Void para1() {
00057         /*****************************************************************************
00058          To demonstrate these tools, table 9.4 shows the set complex the following row: 
00059          (G, As, B, F, E, Cs, C, A, Gs, D, Ds, Fs) 
00060          o  Prime rows are read left to right, 
00061          o  Retrograde rows, right to left 
00062          o  Inverse rows, top to bottom, 
00063          o  Retrograde inverse rows, bottom to top.
00064          This completes the precomposition phase. Now it's time to look at methods to 
00065          traverse the rows created with the preceding techniques to generate a 
00066          composition.
00067          
00068          Table 9.4 Set Complex
00069          {0, 3, 4, 10, 9, 6, 5, 2, 1, 7, 8, 11}
00070          {9, 0, 1, 7, 6, 3, 2, 11, 10, 4, 5, 8}
00071          {8, 11, 0, 6, 5, 2, 1, 10, 9, 3, 4, 7}
00072          {2, 5, 6, 0, 11, 8, 7, 4, 3, 9, 10, 1}
00073          {3, 6, 7, 1, 0, 9, 8, 5, 4, 10, 11, 2}
00074          {6, 9, 10, 4, 3, 0, 11, 8, 7, 1, 2, 5}
00075          {7, 10, 11, 5, 4, 1, 0, 9, 8, 2, 3, 6}
00076          {10, 1, 2, 8, 7, 4, 3, 0, 11, 5, 6, 9}
00077          {11, 2, 3, 9, 8, 5, 4, 1, 0, 6, 7, 10}
00078          {5, 8, 9, 3, 2, 11, 10, 7, 6, 0, 1, 4}
00079          {4, 7, 8, 2, 1, 10, 9, 6, 5, 11, 0, 3}
00080          {1, 4, 5, 11, 10, 7, 6, 3, 2, 8, 9, 0}
00081          
00082          The functions below perform steps in preparation for calling setComplex().
00083          getPC() converts a PitchList to an IntegerList by summing the diatonic
00084          pitch class and accidental of the Pitch.
00085          generateSetComplex() first calls getPC() to convert the Pitch list to
00086          an IntegerList, then transposes the resulting set, then
00087          invokes setComplex() to generate the set complex Matrix.
00088          *****************************************************************************/
00089 }
00090 
00091 IntegerList getPC(PitchList p) {
00092         IntegerList x;
00093         
00094         For (Integer i = 0; i < Length(p); i++)
00095                 x[i] = PitchClass(p[i]) + Accidental( p[i] );
00096         
00097         Return( x );
00098 }
00099 
00100 
00101 Void generateSetComplex(PitchList P) {
00102         IntegerList set = getPC(P);
00103         Print("Starting set:", set);
00104         Integer offset = set[0];
00105         IntegerList tSet = transpose(set, -offset);
00106         Print("Transposed set:", tSet);
00107         IntegerMatrix sc = setComplex( tSet );
00108         Print("Set complex:");
00109         Print(sc);
00110 }
00111 
00112 Static Void para2() {
00113         /*****************************************************************************
00114          Here we evaluate the set complex for our test set.
00115          *****************************************************************************/
00116         PitchList test(G, As, B, F, E, Cs, C, A, Gs, D, Ds, Fs);
00117         Print("*** Pitch classes for test ***");
00118         Print(test);
00119         generateSetComplex(test);
00120         
00121 }
00122 
00124 /* $Revision: 1.3 $ $Date: 2006/09/05 08:02:45 $ $Author: dgl $ $Name:  $ $Id: C091102.cpp,v 1.3 2006/09/05 08:02:45 dgl Exp $ */
00125 // The Musimat Tutorial © 2006 Gareth Loy
00126 // Derived from Chapter 9 and Appendix B of "Musimathics Vol. 1" © 2006 Gareth Loy 
00127 // and published exclusively by The MIT Press.
00128 // This program is released WITHOUT ANY WARRANTY; without even the implied 
00129 // warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
00130 // For information on usage and redistribution, and for a DISCLAIMER OF ALL
00131 // WARRANTIES, see the file, "LICENSE.txt," in this distribution.
00132 // "Musimathics" is available here:     http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&tid=10916
00133 // Gareth Loy's Musimathics website:    http://www.musimathics.com/
00134 // The Musimat website:                 http://www.musimat.com/
00135 // This program is released under the terms of the GNU General Public License
00136 // available here:                      http://www.gnu.org/licenses/gpl.txt
00137 

Generated on Fri Nov 26 2010 16:18:24 for Musimat Chapter 9 Code Examples by  doxygen 1.7.2