| It is easy to make a tone-row. It is very hard to write good 12-tone
music becuase it is fundamentally contrapuntal, and contrapuntal
music calls for the greatest gifts in music. Re: Johann Sebastian
Bach, Palestrina, Lasso, Hindemith, Webern, & others.
Pan-tonal music that would sound serial to you was written for 18
years before Schoenberg formalized it with tonal serialism in 1923,
by Berg, Webern, and Schoenberg. Scriabin came very close to the
same tonal usage as well.
Tom
|
| Following Berg, Schoenberg, and Webern were the serialists,
Luigi Dallipiccola, (I think) Ernst Toch and Ernst Krenek, Milton Babbitt,
50's Pierre Boulez, 50's Karlheinz Stockhausen, George Perle.
Elliot Carter has been pantonal, but not a serialist.
Hundreds of composers around the world have contributed to a vast
literature of serial music in different idioms and at different
stages. This is not a fly-by-night affair. It is a world music.
An international style from 1955 to 1970.
Tom
|
| Here's a C program that accepts a tone-row as input and outputs (to the
terminal and to a file called matrix.dat) the matrix for the row. It also
flags transpositions of the original row that are combinitorial (i.e., none of
the first 6 pitches in p-n are the same as any of the first 6 pitches in p-0)
by putting an asterisk next to them.
Before you try to compile and link the program, make sure you set up
these logicals:
$ define lnk$library sys$library:vaxccurse.olb
$ define lnk$library_1 sys$library:vaxcrtlg.olb
$ define lnk$library_2 sys$library:vaxcrtl.olb
/* Program name: MATRIX.C */
/* Author : Paul Harmon */
/* Purpose : This program accepts a tone-row from the terminal */
/* and generates the matrix for the row. It also */
/* scans the matrix for combinitoriality and flags */
/* transpositions of p-0 which are combinitorial with */
/* p-0. */
#include curses
WINDOW *m_win;
FILE *fptr;
char io_array[12][12][3];
int num_array[12][12];
int w_row, w_col, i, j, dup[12];
main()
{
char next_row;
fptr = fopen("matrix.dat","w");
initscr();
mvaddstr(2,4,"Enter your tone-row: ");
mvaddstr(4,4,"Use sharps, flats");
mvaddstr(5,4,"or naturals and");
mvaddstr(6,4,"press RETURN");
mvaddstr(7,4,"after each pitch.");
mvaddstr(9,4,"(\"#\" = sharp)");
mvaddstr(10,4,"(\"b\" = flat )");
refresh();
m_win = newwin(12,39,2,30);
do
{
get_row();
create_inversions();
create_transpositions();
scan_combin();
display_matrix();
mvaddstr(22,21,"Process another row? [Y] ");
next_row = getch();
mvaddstr(22,21," ");
refresh();
if (next_row != 'N' && next_row != 'n')
{
werase(m_win);
fprintf(fptr,"\n");
fprintf(fptr,"\n");
}
}
while (next_row != 'N' && next_row != 'n');
fclose(fptr);
}
get_row()
{
w_row = 0;
w_col = 0;
for (i=0;i<12;i++)
{
/* accept original row pitch */
mvwgetstr(m_win,w_row,w_col,io_array[0][i]);
io_array[0][i][2] = '\0';
if (io_array[0][i][1] != '#' && io_array[0][i][1] != 'b')
io_array[0][i][1] = ' ';
fprintf(fptr,"%s ",io_array[0][i]);
/* Convert pitch strings to numbers */
if (io_array[0][i][0] == 'c' || io_array[0][i][0] == 'C')
num_array[0][i] = 1; else
if (io_array[0][i][0] == 'd' || io_array[0][i][0] == 'D')
num_array[0][i] = 3; else
if (io_array[0][i][0] == 'e' || io_array[0][i][0] == 'E')
num_array[0][i] = 5; else
if (io_array[0][i][0] == 'f' || io_array[0][i][0] == 'F')
num_array[0][i] = 6; else
if (io_array[0][i][0] == 'g' || io_array[0][i][0] == 'G')
num_array[0][i] = 8; else
if (io_array[0][i][0] == 'a' || io_array[0][i][0] == 'A')
num_array[0][i] = 10; else
if (io_array[0][i][0] == 'b' || io_array[0][i][0] == 'B')
num_array[0][i] = 12;
if (io_array[0][i][1] == '#')
num_array[0][i] += 1;
else
if (io_array[0][i][1] == 'b')
num_array[0][i] -= 1;
w_col += 3;
}
wrefresh(m_win);
fprintf(fptr,"\n");
} /* End of get row procedure */
create_inversions()
{
int subno;
for (i=1;i<12;i++)
{
subno = num_array[0][i] - num_array[0][0];
if (subno <= 0) subno += 12;
num_array[i][0] = num_array[0][0] - subno;
if (num_array[i][0] <= 0) num_array[i][0] += 12;
}
} /* End of create inversion procedure */
create_transpositions()
{
int calc_num;
for (i=1;i<12;i++)
{
calc_num = num_array[i][0] - num_array[i-1][0];
if (calc_num < 1) calc_num += 12;
for (j=1;j<12;j++)
{
num_array[i][j] = num_array[i-1][j] + calc_num;
if (num_array[i][j] > 12) num_array[i][j] -= 12;
}
}
} /* End of create transpositions procedure */
scan_combin()
{
int k;
for (i=0;i<6;i++) dup[i] = 1;
for (i=6;i<12;i++) dup[i] = 0;
for (k=0;k<6;k++)
{
for (i=6;i<12;i++)
{
for (j=0;j<6;j++)
{
if (! dup[i])
dup[i] = (num_array[0][k] == num_array[i][j]);
}
}
}
} /* End of scan for combinitoriality procedure */
display_matrix()
{
w_row = 1;
for (i=1;i<12;i++)
{
w_col = 0;
for (j=0;j<12;j++)
{
switch(num_array[i][j])
{
case 1 : strcpy(io_array[i][j],"c \0");
break;
case 2 : strcpy(io_array[i][j],"c#\0");
break;
case 3 : strcpy(io_array[i][j],"d \0");
break;
case 4 : strcpy(io_array[i][j],"d#\0");
break;
case 5 : strcpy(io_array[i][j],"e \0");
break;
case 6 : strcpy(io_array[i][j],"f \0");
break;
case 7 : strcpy(io_array[i][j],"f#\0");
break;
case 8 : strcpy(io_array[i][j],"g \0");
break;
case 9 : strcpy(io_array[i][j],"g#\0");
break;
case 10 : strcpy(io_array[i][j],"a \0");
break;
case 11 : strcpy(io_array[i][j],"a#\0");
break;
case 12 : strcpy(io_array[i][j],"b \0");
break;
} /* End case */
mvwaddstr(m_win,w_row,w_col,io_array[i][j]);
fprintf(fptr,"%s ",io_array[i][j]);
w_col += 3;
} /* endfor */
if (! dup[i])
{
w_col += 2;
mvwaddch(m_win,w_row,w_col,'*');
fprintf(fptr," *");
}
w_row += 1;
fprintf(fptr,"\n");
} /* endfor */
wrefresh(m_win);
} /* End of display matrix procedure */
|