All pastes #438488 Raw Edit

Anonymous

public cpp v1 · immutable
·published 2007-04-13 17:29 UTC
rendered paste body
#include <cstdlib>#include <iostream>#include <map>#define MAX 100000#define MAXA 16#define MAXN 8using namespace std;const int NNUT = 12;const int NTRYB = 6;const int NID = 102;char * strNut[2][NNUT] = {    {"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"},     {"C","Db","D","Eb","E","F","Gb","G","Ab","A","Bb","B"}};char * strTryb[NTRYB] = {     "maj7","min7","dim","7","7b9","7#9"};int M[NTRYB][NNUT] = {   //0  1  2  3  4  5  6  7  8  9 10 11    {0, 2, 2, 4, 4, 4, 7, 7, 9, 9,11,11},    {0, 2, 2, 3, 5, 5, 7, 7, 9, 9,10, 0},    {0, 2, 2, 3, 5, 5, 6, 8, 8, 9,11,11},    {0, 2, 2, 4, 4, 4, 7, 7, 9, 9,10, 0},    {0, 1, 3, 3, 4, 6, 6, 7, 9, 9,10, 0},    {0, 1, 3, 3, 4, 6, 6, 8, 8,10,10, 0} };struct NBT{       int n,b,t;};NBT T[NID];struct ltstr{  bool operator()(char* s1, char* s2) const  {    return strcmp(s1, s2) < 0;  }};map<char*, int, ltstr> mapAcord;map<char*, int, ltstr> mapNote;int D[NID][NNUT];int getNut(int a,int b){      if(b>0)      return (a+b)%NNUT;    else      return (a+NNUT+b)%NNUT;}int mm,nn;char* I[MAX+1];char* J[MAX+1];char* P[MAX+1];void readAndInit();void countNear(int id);int main(int argc, char *argv[]){        readAndInit();        printf("P = ");    for(int i=0; i<mm; i++)      printf("%s ",P[i]);    printf("\nI = ");    for(int i=0; i<nn; i++)      printf("%s ",I[i]);    printf("\n");        int n,t,b,id,u;    int p,j;    p = 0;     for(int i=0; i<nn; i++)    {         j=-1;         if(mapNote[I[i]] != -1)         {              id = mapAcord[P[p]];              b = T[id].b;                            u = mapNote[I[i]];              j = D[id][u];              //j =                             if( (i+1)%4==0 )              {                  p++;                  if (p > mm-1) p = 0;              }          }            printf("i=%d p=%d id=%d u=%d\n",i,p,id,u);         if(j==-1) printf("_ ");         else printf("%s ",strNut[b][j]);    }            printf("\n");    system("PAUSE");    return EXIT_SUCCESS;    }void readAndInit(){     mapAcord.clear();     char str[16];     int n,b,t;     int id=0;     for( b=0; b<2; b++)     {        for(t=0; t<NTRYB; t++)        {             for(n=0; n<NNUT; n++)             {                                  str[0]=0;                 strcpy(str,strNut[b][n]);                 strcat(str,strTryb[t]);                                  mapAcord[str]=id;                                  if(b==1 && (n==0||n==2||n==4||n==5||n==7||n==9||n==11)) continue;                                                   T[id].n = n;                 T[id].b = b;                 T[id].t = t;                                   for(int i=0; i<NNUT; i++)                  {                    D[id][i] = M[t][getNut(i,-n)];                    D[id][i] = getNut(D[id][i],n);                  }                /*  printf("D= ");                  for(int i=0; i<NNUT; i++)                    printf("%d ",D[id][i]);                */                 printf("\n%d - %s %d\n",id,str,id);                                      id++;                  }        }     }     mapNote["_"] = -1;     for(b=0; b<2; b++)     {       for(n=0; n<NNUT; n++)       {             if(b==1 && (n==0||n==2||n==4||n==5||n==7||n==9||n==11)) continue;             mapNote[strNut[b][n]] = n;       }     }          scanf("%d",&mm);          for(int i=0; i<mm; i++)     {             P[i] = new char[MAXA];             scanf("%s",P[i]);     }     scanf("%d",&nn);     for(int i=0; i<nn; i++)     {             I[i] = new char [MAXN];             scanf("%s",I[i]);     }          map<char*, int, ltstr>::iterator cur = mapAcord.begin();     mapAcord["dd"]=44;     printf("map = %d\n", mapAcord["Cmaj7"]);     /*     printf(" T = \n");     for(id = 0; id<NID; id++)        printf("id=%d n=%d t=%d b=%d \n",id,T[id].n, T[id].t, T[id].b);           */}