I'm trying to make a transposer in JavaScript..
Give it a key and a scale/mode and it will generate it for you
For instance
C Lydian (WWWHWWH) is C D E F# G A B
C Aeolian (WHWWHWW) is C D Eb F G Ab Bb
I cannot for the life of me figure out how to accomplish this.
Thoughts?
>inb4 SICP
Name:
Anonymous2010-06-10 14:49
I've just knocked something up in C to do this. Not well tested.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int maj[7] = {2,2,1,2,2,2,1};
int min[7] = {2,1,2,2,1,2,2};
char *N = "ABCDEFGABCDEFG";
void printscale(char k, char a, int s[7],char *d) {
int i;
char *p = strchr(N,k);
printf("%s: %c%c",d,k,a);
for(i=0;i<7;i++) {
p++;
switch(a) {
case 'b': if(s[i]==3) a = ' '; break;
case ' ': if(s[i]==1) a = 'b'; break;
case '#': if(s[i]==1) a = ' '; break;
}
if(*p=='C'||*p=='F') {
switch(a) {
case 'b': a = ' '; break;
case ' ': a = '#'; break;
case '#': a = 'b'; p++; break;
}
}
printf(" %c%c",*p,a);
}
printf("\n");
}
int main(int argc, char **argv) {
char k='C',a=' ';
if(argv[1]) {
k = argv[1][0];
if(islower(k))
k = toupper(k);
if(!strchr(N,k)) {
printf("error: invalid key\n");
return 1;
}
a = argv[1][1];
if(!(a==0||a=='#'||a=='b')) {
printf("error: invalid key\n");
return 1;
} else if(a==0)
a = ' ';
}