Hi

I have the following assignment to do for a music programming class but I'm a brutal programmer so need some help with C. I don't expect someone to do the whole thing for me, but any help with the following problem would be greatly appreciated. If anyone can help with some parts of this, I would really appreciate it.

Matrices are a major problem so help with the matrix elements would be particularly great.

Thanks

The program is to: Write a program that, given a certain series of 12 unique pitch-classes
(notes), prints out the 12x12 serial matrix. Here’s an algorithm:


and the info is given below:


Serial Matrix Display

Serial Music is one of the names given to the technique of composition developed by
Arnold Schoenberg in the early decades of the 20th Century. It consists on using a tone
row of 12 different pitch-classes (C, C#, ..., B) in four different versions (original,
inverted, retrograde and retrograde of inversion) as the basis for a piece. The tone row
can have pitch-classes in any order, but without any repetition (as a plain introduction,
see Twelve-tone Technique in the Wikipedia or, for more details, Serialism in the online
Grove Dictionay of Music).

In order to assist the process of composition or analysis of 12-tone music, a 12x12 serial
matrix can be built. The first row of the matrix will receive the original 12 notes, from the
left to the right. The inversion of the series will fill the first column of the matrix, from
the top to the bottom. To complete the matrix, the other rows will receive transposed
versions of the original series, each one starting with the note in the first column. When
the matrix is completed, all the transposition forms of the original series can be read in
the rows from left to right, the retrograde forms in the same rows from right to left, the
inversions in the columns from top to bottom and the retrograde of inversion forms in the
opposite sense.

Write a program that, given a certain series of 12 unique pitch-classes
(notes), prints out the 12x12 serial matrix. Here’s an algorithm:


(a) substitute the notes for integers in an ordered form from 0 to 11, i.e. representing
pitch-class C by the number 0, the pitch-class D-flat (or C-sharp) by the number 1 and
so on, up to the pitch-class B, which will be represented by the number 11.

(b) all the manipulations with the serial forms can be treated by arithmetical formulas. In
this case, the formulas for the creation of the first column inverse form could be
Pm,1 = [(Pm-1,1+ (P1,m-1 - P1, m)] mod12

(c) and the subsequent transposition of the original series
Pm,n = [(P1,n + (Pm,1 - P1,1)] mod12

For this assignment, you will write a program that takes in a user-defined tone-row as
input and then build a serial matrix and display it at the terminal (see notes below).

Example:

1 Original series: B B-flat D E-flat G G-flat A-flat E F C D-flat (Webern , op. 24)
2 Numerical representation: 11 10 2 3 7 6 8 4 5 0 1 9
3 First column inverse form:

P2,1 = [(P1,1+ (P1,1 - P1, 2)] mod12 = [(11 + ( 11 - 10)] mod12 = 12 mod12 = 0
P3 1 = [(P2,1+ (P1,2 - P1, 3)] mod12 = [(0 + ( 10 -2)] mod12 = 8 mod12 = 8
P4 1 = [(P3,1+ (P1,3 - P1, 4)] mod12 = [(8 + ( 2 - 3)] mod12 = 7 mod12 = 7
...
P12 ,1 = [(P11,1+ (P1,11 - P1, 12)] mod12 = [(9 + ( 1 - 9)] mod12 = 1 mod12 = 1

4 First row transposed original form:

P2,2 = [(P1,2+ (P2,1 - P1, 1)] mod12 = [(10 + ( 0 - 11)] mod12 = [-1] mod12 = 11
P2,3 = [(P1,3+ (P2,1 - P1, 1)] mod12 = [(2 + ( 0 - 11)] mod12 = [-9] mod12 = 3
....
P2,12 = [(P1,12+ (P2,1 - P1, 1)] mod12 = [(9 + ( 0 - 11)] mod12 = [-3] mod12 = 9

5 The 12x12 serial matrix:

11 10 2 3 7 6 8 4 5 0 1 9
0 11 3 4 8 7 9 5 6 1 2 10
8 7 11 0 4 3 5 1 2 9 10 6
7 6 10 11 3 2 4 0 1 8 9 5
3 2 6 7 11 10 0 8 9 4 5 1
4 3 7 8 0 11 1 9 10 5 6 2
2 1 5 6 10 9 11 7 8 3 4 0
6 5 9 10 2 1 3 11 0 7 8 4
5 4 8 9 1 0 2 10 11 6 7 3
10 9 1 2 6 5 7 3 4 11 0 8
9 8 0 1 5 4 6 2 3 10 11 7
1 0 4 5 9 8 10 6 7 2 3 11

Notes:

1. mod12 = is the generalized modulus-12 operation (defined for both positive and
negative numbers), and not simply the ‘%’ remainder operator. Eg.: 5mod12 = 5;
12mod12=0; -5mod12=7; 15mod12=3; -10mod12=2, etc. It is up to you to implement
this operation as best as possible.
2. The program should ideally take pitch-class names (C,c,C#,c#, Db,db,D,d etc...),
which will then be translated into numeric form. For the matrix display, you should also
print pitch-class names. Remember that C and c should be equally good inputs for pitchclass
C and that certain notes have the same pitch class (eg. Db and C#) and should also
be allowed.
3. The program should do all the checks for wrong inputs etc.
4. As a suggestion, write the program in incremental steps, implementing one
functionality at a time. If you do not manage to implement everything, at least you have
something that works partially.
5. The mode of input should be interactive (ie. the user should be queried for input).
6. As an extra, if you are on Windows would be to playback the series or one of its
variants (say a column or a row of the matrix) using MIDI (see the website for a sample
code).