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); */}