/* * maestropond.c * * Convert Acorn Maestro files to LilyPond files * * (c) 2011 Thomas White * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include static const int bpm[] = { 40, 50, 60, 65, 70, 80, 90, 100, 115, 130, 145, 160, 175, 190, 210 }; static void show_syntax(const char *s) { printf("Syntax: %s [options]\n", s); } static void show_help(const char *s) { show_syntax(s); printf( "\nConvert Acorn Maestro files to LilyPond files.\n" "\n" " -h, --help Display this help message.\n" "\n" ); } static unsigned int get_basic_int(unsigned char *f, size_t *pptr) { unsigned int v; size_t ptr = *pptr; int sig; v = 0; sig = f[ptr++]; if ( sig != 0x40 ) { fprintf(stderr, "Not a BASIC integer (sig %i, val %i)\n", sig, v); goto out; } v += f[ptr++] << 24; v += f[ptr++] << 16; v += f[ptr++] << 8; v += f[ptr++]; out: *pptr = ptr; return v; } static void music_attribute(unsigned char ma) { if ( (ma & 0x7f) == 0x40 ) { printf("Warning: reserved gate type.\n"); } else if ( (ma & 0x3f) == 0x20 ) { printf("Bar line\n"); } else if ( (ma & 0x1f) == 0x10 ) { printf("Bar line\n"); } else if ( (ma & 0xf) == 0x8 ) { printf("Octave shift\n"); } else if ( (ma & 0x7) == 0x4 ) { int st; st = 1 + ((ma & 0xc0) >> 6); if ( ma & 0x10 ) { printf("Slur on (stave %i)\n", st); } else { printf("Slur off (stave %i)\n", st); } } else if ( (ma & 0x3) == 0x2 ) { int ct, st; ct = (ma & 0x18) >> 3; switch ( ct ) { case 0 : printf("Treble clef:"); break; case 1 : printf("Alto clef:"); break; case 2 : printf("Tenor clef:"); break; case 3 : printf("Bass clef:"); break; } st = (ma & 0x60) >> 5; printf(" stave %i\n", st); } else if ( (ma & 0x1) == 0x1 ) { int tn, td; tn = 1 + ((ma & 0x1e) >> 1); td = 1 + ((ma & 0xe0) >> 5); printf("Time signature %i/%i\n", tn, td); } } static void get_note(unsigned char **notes, int *nptrs, int ch) { unsigned char n1, n2; int rest = 0; n1 = notes[ch][nptrs[ch]++]; if ( n1 & 0xf8 ) { n2 = notes[ch][nptrs[ch]++]; } else { rest = 1; } if ( rest ) { printf("rest %i\n", n1); } else { printf("note %i:%i\n", n1, n2); } } static void interpret_gates(unsigned char *gates, unsigned char **notes, int n_gates) { int i; int ma = 0; int nptrs[8]; for ( i=0; i<8; i++ ) nptrs[i] = 0; for ( i=0; i= argc ) { show_syntax(argv[0]); return 1; } infile = argv[optind++]; printf("Input: '%s'\n", infile); convert_file(infile); return 0; }