home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Multimed / Multimed.zip / chord3_6.zip / chord / xpose.c < prev   
C/C++ Source or Header  |  1995-04-25  |  2KB  |  113 lines

  1. static char SccsId[] = "@(#)xpose.c    3.6\t Mar. 1995";
  2. static char copyright[] = "Copyright 1991-1995 by Martin Leclerc & Mario Dorion";
  3.  
  4. #include "chord.h"
  5.  
  6. extern int grid_size;
  7. extern int transpose;
  8.  
  9. extern char *mesg;
  10.  
  11. int do_transpose ( chord )
  12. char *chord;
  13. {
  14.  
  15. /*
  16.  
  17. attempting parsing
  18.  
  19. 1) look for a known note name at start of name
  20. 2) copy literally until delimiter found 
  21. 3) repeat
  22.  
  23. */
  24. int i,j;
  25. int p_chord, p_new_chord;
  26. int sharp, flat, new_i;
  27. char new_chord[MAXTOKEN];
  28. static char *notes[] = { "C", "D", "E", "F", "G", "A", "B" };
  29.  
  30. p_chord = 0;
  31. p_new_chord = 0;
  32.  
  33. while (TRUE)
  34.     {
  35.     /* Find basic note */
  36.     i=0;
  37.     while ( (i < 7) && (strncmp ( chord + p_chord, notes[i], strlen (notes[i]))) )
  38.         i++;
  39.     
  40.     if (i >= 7) 
  41.         return(1);
  42.     
  43.     /* Look for sharp or flat */
  44.     p_chord += strlen(notes[i]);
  45.     flat = ( chord[p_chord] == 'b');
  46.     sharp = ( chord[p_chord] == '#');
  47.     if (sharp || flat) p_chord++;
  48.     
  49.     
  50.     /*compute new chord name */
  51.     
  52.     new_i = i;
  53.  
  54.  
  55.     /* moving upscale ... */
  56.     if (transpose > 0) 
  57.         for (j=0; j < transpose; j++)
  58.             if (sharp)
  59.                 {
  60.                 sharp = 0;
  61.                 new_i = (new_i + 1) % 7;
  62.                 }
  63.             else
  64.                 if (flat)
  65.                     flat = 0;
  66.                 else 
  67.                     if ((new_i == 2) || (new_i == 6))
  68.                         new_i = (new_i + 1) % 7;
  69.                     else 
  70.                         sharp++;
  71.     
  72.  
  73.     /* moving downscale ... */
  74.     else
  75.         for (j=0; j > transpose; j--)
  76.             if (flat)
  77.                 {
  78.                 flat = 0;
  79.                 new_i = (new_i + 6) % 7;
  80.                 }
  81.             else
  82.                 if (sharp)
  83.                     sharp = 0;
  84.                 else 
  85.                     if ((new_i == 3) || (new_i == 0))
  86.                         new_i = (new_i + 6) % 7;
  87.                     else 
  88.                         flat++;
  89.     
  90.     
  91.     sprintf ( (char*)new_chord+p_new_chord, "%s", notes[new_i]);
  92.     p_new_chord += strlen(notes[new_i]);
  93.     
  94.     if (sharp) sprintf( (char*)new_chord + p_new_chord++, "#");
  95.     if (flat) sprintf( (char*)new_chord + p_new_chord++, "b");
  96.     
  97.     while ((chord[p_chord] != '/') && (chord[p_chord] != '\0'))
  98.         new_chord[p_new_chord++] = chord[p_chord++];
  99.     
  100.     if (chord[p_chord] == '\0')
  101.         {
  102.         new_chord[p_new_chord] = '\0';
  103.         sprintf (mesg, "[%s] becomes [%s]", chord, new_chord);
  104.         debug (mesg);
  105.         strcpy(chord, new_chord);
  106.         return(0);
  107.         }
  108.  
  109.     p_chord++;
  110.     new_chord[p_new_chord++] = '/';
  111.     }
  112. }
  113.