home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / d / dir_nm20.zip / Dir_NM_2.0 / NM-Atom.c < prev    next >
C/C++ Source or Header  |  1992-07-16  |  31KB  |  1,134 lines

  1. /*                          ======  NM-Atom.c  ====== 
  2.  *
  3.  * char *Get_Filename(Now,Full_Name)
  4.  * void Display_Array(Id,P_a,P_z,Now)
  5.  * void Save_Words()
  6.  * void Load_Words()
  7.  * int  Get_Word_Id()
  8.  * void Get_Set_List()
  9.  * void Get_List()
  10.  * void Save_Set()
  11.  * void Save_Name()
  12.  * void Load_Name()
  13.  * void Load()
  14.  * void Save(k,Last_Id)
  15.  * void Delete_Set(Id)
  16.  * void Init()
  17.  * void Draw_Silent(X,Y)
  18.  * void Addot(x,z)
  19.  * void Blank(X,Z,At_high)
  20.  * void Semi_Blank(x,z,At_high)
  21.  * void Line_Sector(x,delt_x,z,At_high)
  22.  * void Repeat_Sector(x,z,twice,At_high)
  23.  * void Adjust_High_Low(fx,fy,Switch)
  24.  * void Adjust_Text(fx,fy,Switch)
  25.  * void Show_Text_Table(X,Y)
  26.  * void Draw_Wave(x,y)
  27.  * void Draw_Climax(x,y)
  28.  * void Draw_Rise(x,y)
  29.  * void Draw_Fall(x,y)
  30.  * void Draw_Arch(x,y)
  31.  * void Draw_Bowl(x,y)
  32.  * void Draw_R_Line(x,y)
  33.  * void Draw_Repeat(x,y)
  34.  * void Draw_F_Line(x,y)
  35.  * void Draw_H_Line(x,y)
  36.  * void Set_Table(X,Y)
  37.  * void Draw_Mini_Staff(X,Y)
  38.  * void Draw_A_Staff(I,Y)
  39.  * void Staff(now,five,input)
  40.  * void Cat(x,y,dx,dy,bkcolor)
  41.  * void Square(n,k)
  42.  * void Mixup()
  43.  * void Fix_p(p,i,num)
  44.  * void Tableout(k)
  45.  * void Figout()
  46.  * void Pickup(x,way,n)
  47.  * void Pointout(x,y,z,ny,At_high)
  48.  * void Get_Tempo(Mdy_Id,St_H_L)
  49.  * int  Same_Tempo(Mdy_Id,St_H_L,Tempo_Id)
  50.  * void Add_To_Tempo(Mdy_Id,St_H_L)
  51.  * void Check_Tempo()
  52.  * void Clear_Chord_Bank()
  53.  *
  54.  */
  55.  
  56. #include "NM.h"
  57.  
  58. two place={{2,5,1,4,7,3,6},{6,3,7,4,8,5,9}};
  59.  
  60. char *Get_Filename(Now,Full_Name)
  61.   int Now,Full_Name;
  62. {
  63.   if (Full_Name==1)
  64.     {
  65.       strcpy(filname,"Dir_Song/im.");
  66.       if (*Old_name[Now]!='\0')
  67.         sprintf(filname+strlen(filname),"%s",
  68.         Sub_Str(Old_name[Now],0,strlen(Old_name[Now])-1));
  69.       else sprintf(filname+strlen(filname),"%s",
  70.            Sub_Str(In_name[Now],0,strlen(In_name[Now])-1));
  71.       return filname;
  72.     }
  73.   else return In_name[Now];
  74. }
  75.  
  76. void Display_Array(Id,P_a,P_z,Now)
  77.   int Id,P_a,P_z,Now;
  78. {
  79.   int i,j;
  80.  
  81.   printf("\n============================================================");
  82.  
  83.   if (Now==0)
  84.     {
  85.       printf("\n tmp=%i    tmp.note   tmp.act   tmp_buf.note   tmp_buf.act",Id);
  86.       printf("\n-----------------------------------------------------------\n");
  87.       for (i=P_a;i<30;i++) 
  88.     printf(" <%2i>      %4i      %4i         %4i          %4i\n",i,
  89.            tmp[Id][i].note,tmp[Id][i].act,tmp_buf[Id][i].note,
  90.            tmp_buf[Id][i].act);
  91.     }
  92.   else 
  93.     {
  94.       printf("===================================================");
  95.       printf("==================================================\n");
  96.       printf(" St=%i  ",Id);
  97.       printf("V_nt[0]  V_nt[1]  V_nt[2]  V_nt[3]  V_act   V_vol  ");
  98.       printf("H_nt[0]  H_nt[1]  H_nt[2]  H_nt[3]  H_act   H_vol  ");
  99.       printf("L_nt[0]  L_nt[1]  L_nt[2]  L_nt[3]  L_act   L_vol\n");
  100.       printf("---------------------------------------------------");
  101.       printf("---------------------------------------------------");
  102.       printf("-----------------------------------------------------------\n");
  103.       for (i=P_a;i<P_z;i++)
  104.          {
  105.        printf(" <%3i>",i);
  106.        for (j=0;j<4;j++) printf("    %4i",St[Id][i][0].nt[j]);
  107.        printf("    %4i     %4i  ",St[Id][i][0].act,St[Id][i][0].vol);
  108.        for (j=0;j<4;j++) printf("    %4i",St[Id][i][1].nt[j]);
  109.        printf("    %4i     %4i  ",St[Id][i][1].act,St[Id][i][1].vol);
  110.        for (j=0;j<4;j++) printf("    %4i",St[Id][i][2].nt[j]);
  111.        printf("    %4i     %4i\n",St[Id][i][2].act,St[Id][i][2].vol);
  112.      }
  113.       printf("===================================================");
  114.       printf("==================================================");
  115.     }
  116.   printf("============================================================\n");
  117. }
  118.  
  119. void Save_Words()
  120. {
  121.   int i,Junk;
  122.  
  123.   if ((filvar=fopen("Dir_Song/im.Words","w"))!=NULL) 
  124.     { setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
  125.   else filvar=tmpfile();
  126.                                            /*   Kick out the junks   */
  127.   S_bf=(char *)malloc(10);*S_bf='\0';*Word_Top='\0';Junk=0;
  128.   for (i=0;i<Word_Num;i++) 
  129.     if (strlen(Words[i])<5 || Words_Array[i]==0) { Words_Array[i]=0;Junk++; }
  130.   sprintf(S_bf,"%4ld",Word_Num-Junk);strcat(Word_Top,S_bf);
  131.   for (i=0;i<Word_Num;i++) 
  132.     if (Words_Array[i]>0) 
  133.       { 
  134.     S_bf=(char *)malloc(10);*S_bf='\0';
  135.     sprintf(S_bf,"%5ld",Words_Array[i]);strcat(Word_Top,S_bf); }
  136.   fprintf(filvar,"%s\n",Word_Top);
  137.   for (i=0;i<Word_Num;i++) 
  138.     if (Words_Array[i]>0) fprintf(filvar,"%s\n",Words[i]);
  139.   if (filvar != NULL) fclose(filvar);filvar=NULL;
  140. }
  141.  
  142. void Load_Words()
  143. {
  144.   int i,j;
  145.   char *Word_Buf;
  146.  
  147.   for (i=0;i<1000;i++)
  148.     { Words[i]=(char *)malloc(3000);*Words[i]='\0';Words_Array[i]=0; }
  149.   Word_Buf=(char *)malloc(3000);*Word_Buf='\0';Word_Num=0;New_Word=0;
  150.  
  151.   if ((filvar=fopen("Dir_Song/im.Words","r"))!=NULL)
  152.     {
  153.       setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar);
  154.       S_bf=(char *)malloc(10);*S_bf='\0';
  155.       fgets(Word_Top,5004,filvar);Word_Num=atoi(strncpy(S_bf,Word_Top,4));
  156.  
  157.       for (i=0;i<Word_Num;i++) 
  158.     { 
  159.       S_bf=(char *)malloc(10);*S_bf='\0';
  160.       j=atoi(strncpy(S_bf,Word_Top+5*i+4,5));Words_Array[i]=j;
  161.       fgets(Word_Buf,3000,filvar);
  162.       sprintf(Words[i],"%s",Sub_Str(Word_Buf,0,strlen(Word_Buf)-1));
  163.     }
  164.       if (filvar != NULL) fclose(filvar);filvar=NULL;
  165.     }
  166. }
  167.  
  168.  
  169. int Get_Word_Id()
  170. {
  171.   int i;
  172.  
  173.   for (i=0;i<Word_Num;i++) { if (Words_Array[i]-1==now*1000+M_Id) return i; }
  174.   if (Motion==Input_On || Load_On==1)
  175.     {
  176.       New_Word=Word_Num;Words_Array[New_Word]=now*1000+M_Id+1;Word_Num++;
  177.       return New_Word;
  178.     }
  179.   else return -1;
  180. }
  181.  
  182. void Get_Set_List()
  183. {
  184.   int j;
  185.  
  186.   if (content[Max_kind-1]>Max_num) Max_num=content[Max_kind-1];
  187.   for (j=0;j<Max_num+1;j++)
  188.     { 
  189.       Atom_array[j][Max_kind]=(char *)malloc(50);*Atom_array[j][Max_kind]='\0';
  190.     }
  191.   for (j=0;j<content[Max_kind-1];j++)
  192.     strcpy(Atom_array[j][Max_kind]+strlen(Atom_array[j][Max_kind]),
  193.        cont[j].Set_name);
  194. }
  195.  
  196. void Get_List()
  197. {
  198.   int i,j,Number;
  199.  
  200.   Table_Column_Num=Max_kind+1;Table_Row_Num=0;
  201.   
  202.   for (i=0;i<Max_kind;i++) 
  203.     { 
  204.       Number=content[i];if (Number>Table_Row_Num) Table_Row_Num=Number;
  205.       Out_name[i]=(char *)malloc(50);*Out_name[i]='\0';
  206.       strcpy(Out_name[i],In_name[i]);S_bf=(char *)malloc(10);*S_bf='\0';
  207.       sprintf(S_bf,"%-4i",Number);
  208.       sprintf(Out_name[i]+strlen(Out_name[i])-1," = %s\n",S_bf);
  209.     }
  210.   for (j=0;j<Max_num+1;j++)
  211.     { 
  212.       Atom_array[j][0]=(char *)malloc(50);*Atom_array[j][0]='\0';
  213.       sprintf(S_bf,"%-4i",j+1);strcpy(Atom_array[j][0],S_bf);
  214.     }
  215.  
  216.   for (i=0;i<Max_kind;i++)
  217.     {
  218.       if (i<Max_kind-1)
  219.     {
  220.       for (j=0;j<Max_num+1;j++)
  221.         { Atom_array[j][i+1]=(char *)malloc(50);*Atom_array[j][i+1]='\0'; }
  222.       Number=content[i];
  223.       for (j=0;j<Number;j++)
  224.         strcpy(Atom_array[j][i+1]+strlen(Atom_array[j][i+1]),
  225.            names[i*1000+j]);
  226.     }
  227.       else Get_Set_List();
  228.    }
  229. }
  230.  
  231. void Save_Set()
  232. {
  233.   int j,Num;
  234.  
  235.   if ((confile=fopen("Dir_Song/IM.con","w"))!=NULL) 
  236.     { setvbuf(confile,buf,_IOFBF,2048);rewind(confile); }
  237.   else confile=tmpfile();
  238.   Num=content[Max_kind-1];
  239.   for (j=0;j<Num;j++) fwrite(&cont[j],sizeof(Tempo_Set),1,confile);
  240.   if (confile != NULL) fclose(confile);confile=NULL;
  241. }
  242.  
  243. void Save_Name()
  244. {
  245.   int i,j,p,Num;
  246.   char *F_Old,*F_New,*Command;
  247.  
  248.   if ((filvar=fopen("Dir_Song/IM.Names","w"))!=NULL) 
  249.     { setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
  250.   else filvar=tmpfile();
  251.   fprintf(filvar,"%s",Table_Name);
  252.   for (i=0;i<Max_kind;i++)
  253.     {
  254.       fprintf(filvar,"%s",In_name[i]);
  255.       if (*Old_name[i]!='\0')
  256.         {
  257.       F_Old=(char *)malloc(50);*F_Old='\0';
  258.       sprintf(F_Old+strlen(F_Old),"Dir_Song/im.%s",
  259.           Sub_Str(Old_name[i],0,strlen(Old_name[i])-1));
  260.       if ((melodyfile=fopen(F_Old,"r"))!=NULL)
  261.         { 
  262.           fclose(melodyfile);melodyfile=NULL;
  263.           F_New=(char *)malloc(50);*F_New='\0';
  264.           sprintf(F_New+strlen(F_New),"Dir_Song/im.%s",
  265.               Sub_Str(In_name[i],0,strlen(In_name[i])-1));
  266.           Command=(char *)malloc(200);*Command='\0';
  267.           sprintf(Command+strlen(Command),"mv %s %s",F_Old,F_New);
  268.           system(Command);Old_name[i]=(char *)malloc(50);*Old_name[i]='\0';
  269.         }
  270.     }
  271.     }
  272.   if (filvar != NULL) fclose(filvar);filvar=NULL;
  273.  
  274.   if ((filvar=fopen("Dir_Song/im.lst","w"))!=NULL) 
  275.     { setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
  276.   else filvar=tmpfile();
  277.   *top='\0';S_bf=(char *)malloc(10);*S_bf='\0';
  278.   for (i=0;i<Max_kind;i++) { sprintf(S_bf,"%4ld",content[i]);strcat(top,S_bf); }
  279.   fprintf(filvar,"%s\n",top);
  280.   for (i=0;i<Max_kind-1;i++)
  281.     {
  282.       Num=content[i];
  283.       for (j=0;j<Num;j++) 
  284.     { p=i*1000+j;if (*names[p]!='\0') fprintf(filvar,"%s",names[p]); }
  285.     }
  286.   if (filvar != NULL) fclose(filvar);filvar=NULL;
  287.   if (Word_Num<0) { Word_Num=-Word_Num;Save_Words(); }
  288. }
  289.  
  290. void Load_Name()
  291. {
  292.   int i,j,Num;
  293.  
  294.   for (i=0;i<35000;i++) { names[i]=(char *)malloc(50);*names[i]='\0'; }
  295.  
  296.   if ((filvar=fopen("Dir_Song/im.lst","r"))!=NULL)
  297.     {
  298.       setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar);;
  299.       fgets(top,180,filvar);S_bf=(char *)malloc(10);*S_bf='\0';Max_num=-1;
  300.  
  301.       for (i=0;i<Max_kind-1;i++) 
  302.     { 
  303.       j=atoi(strncpy(S_bf,top+4*i,4));Get_Filename(i,1);
  304.       if ((melodyfile=fopen(filname,"r"))!=NULL)
  305.         { 
  306.           fclose(melodyfile);melodyfile=NULL;content[i]=j;
  307.           for (Num=0;Num<j;Num++) { fgets(names[i*1000+Num],50,filvar); }
  308.         } 
  309.       else content[i]=0;
  310.       if (content[i]>Max_num) Max_num=content[i];
  311.       total+=content[i];
  312.     }
  313.       if (filvar != NULL) fclose(filvar);filvar=NULL;
  314.     }
  315.   for (i=0;i<1000;i++)
  316.     {
  317.       *cont[i].Set_name='\0';S_bf=(char *)malloc(10);*S_bf='\0';
  318.       sprintf(S_bf,"%5ld",i+1);strcpy(cont[i].Set_name,S_bf);ch='.';
  319.       sprintf(cont[i].Set_name+strlen(cont[i].Set_name),"%c",ch);
  320.       sprintf(cont[i].Set_name+strlen(cont[i].Set_name),"%s\n","???");
  321.       for (j=0;j<6;j++) { cont[i].tempo[j]=-1;cont[i].instru[j]=-1; }
  322.     }
  323.   if ((confile=fopen("Dir_Song/IM.con","r"))!=NULL)
  324.     {
  325.       setvbuf(confile,buf,_IOFBF,2048);rewind(confile);Num=0;
  326.       do {
  327.        fread(&cont[Num],sizeof(Tempo_Set),1,confile);Num++;
  328.      } while (!feof(confile));
  329.       content[Max_kind-1]=Num;if (Num>Max_num) Max_num=Num;
  330.       if (confile != NULL) fclose(confile);confile=NULL;
  331.     } 
  332.   else content[i]=0;
  333.   Load_Words();
  334. }
  335.  
  336. void Load()
  337. {
  338.   int i,j,Nt_V,Nt_H,Nt_L,FORLIM;
  339.  
  340.   Get_Filename(now,1);FORLIM=content[now];
  341.   melodyfile=fopen(filname,"r");rewind(melodyfile);
  342.  
  343.   for (j=0;j<FORLIM;j++) 
  344.     {
  345.       i=0;Nt_L=Nt_V=200;
  346.       do {
  347.            if (now>0) 
  348.              {
  349.            fread(&St[j][i][0],sizeof(Chord),1,melodyfile);
  350.            fread(&St[j][i][1],sizeof(Chord),1,melodyfile);
  351.            fread(&St[j][i][2],sizeof(Chord),1,melodyfile);
  352.            Nt_V=St[j][i][0].nt[0];
  353.            Nt_H=St[j][i][1].nt[0];Nt_L=St[j][i][2].nt[0];
  354.              } 
  355.        else 
  356.          {
  357.            fread(&tmp[j][i],sizeof(Tempo_Unit),1,melodyfile);
  358.            Nt_H=tmp[j][i].note;
  359.              }
  360.        i++;
  361.          } while ((Nt_V!=200 || Nt_H!=200 || Nt_L!=200) && 
  362.           ((now>0 && i<M_Len-7) || (now==0 && i<29)));
  363.  
  364.       do {
  365.            if (now>0) St[j][i][0].nt[0]=St[j][i][1].nt[0]=St[j][i][2].nt[0]=200;
  366.        else tmp[j][i].note=200;
  367.        i++;
  368.          } while ((now>0 && i<M_Len) || (now==0 && i<29));
  369.     }
  370.   if (melodyfile != NULL) fclose(melodyfile);melodyfile=NULL;
  371. }
  372.  
  373. void Save(k,Last_Id)
  374.   int k,Last_Id;
  375. {
  376.   int i,j,Nt_V,Nt_H,Nt_L,Num,FORLIM;
  377.  
  378.   if (Del>-1)
  379.     {
  380.       if (Del != content[now]-1)
  381.     {
  382.       FORLIM=content[now]-Del-k;
  383.       for (j=0;j<FORLIM;j++) 
  384.         {
  385.           i=-1;
  386.           do {
  387.            Num=Del+j;i++;
  388.            if (now>0)
  389.              {
  390.                St[Num][i][0]=St[Num+k][i][0];
  391.                St[Num][i][1]=St[Num+k][i][1];
  392.                St[Num][i][2]=St[Num+k][i][2];
  393.              }
  394.            else tmp[Num][i]=tmp[Num+k][i];
  395.          } while ((now>0 && i<M_Len) || (now==0 && i<29));
  396.           sprintf(names[now*1000+Num]+6,"%s",Sub_Str(names[now*1000+Num+k],
  397.                              6,44));
  398.         }
  399.     }
  400.       else { names[now*1000+Del]=(char *)malloc(50);*names[now*1000+Del]='\0'; }
  401.       content[now]-=k;Last_Id=content[now];
  402.     }
  403.  
  404.   Get_Filename(now,1);melodyfile=fopen(filname,"w");
  405.   if (melodyfile != NULL) rewind(melodyfile);else melodyfile=tmpfile();
  406.  
  407.   for (j=0;j<Last_Id;j++) 
  408.     {
  409.       if (Debug==20) Display_Array(j,20,35,now);
  410.       i=0;Nt_V=Nt_L=200;
  411.       do {
  412.            if (now>0) 
  413.              {
  414.            fwrite(&St[j][i][0],sizeof(Chord),1,melodyfile);
  415.            fwrite(&St[j][i][1],sizeof(Chord),1,melodyfile);
  416.            fwrite(&St[j][i][2],sizeof(Chord),1,melodyfile);
  417.            Nt_V=St[j][i][0].nt[0];
  418.            Nt_H=St[j][i][1].nt[0];Nt_L=St[j][i][2].nt[0];
  419.              } 
  420.            else 
  421.              { 
  422.            if (i>26) tmp[j][i].act=200;
  423.            fwrite(&tmp[j][i],sizeof(Tempo_Unit),1,melodyfile);
  424.            Nt_H=tmp[j][i].note;
  425.              }
  426.        i++;
  427.          } while ((Nt_V!=200 || Nt_H!=200 || Nt_L!=200) && 
  428.           ((now>0 && i<M_Len) || (now==0 && i<29)));
  429.     }
  430.   if (Last_Id>Max_num) Max_num=Last_Id;
  431.   if (melodyfile != NULL) fclose(melodyfile);melodyfile=NULL;
  432.   content[now]=Last_Id;Save_Name();Get_List();
  433. }
  434.  
  435. void Delete_Set(Id)
  436.   int Id;
  437. {
  438.   int i,k,Num;
  439.  
  440.   Num=content[Max_kind-1];
  441.   for (i=Id+1;i<Num;i++)
  442.     {
  443.       sprintf(cont[i-1].Set_name+6,"%s",Sub_Str(cont[i].Set_name,6,44));
  444.       for (k=0;k<6;k++)
  445.     {
  446.       cont[i-1].tempo[k]=cont[i].tempo[k];
  447.       cont[i-1].instru[k]=cont[i].instru[k];
  448.     }
  449.     }
  450.   *cont[Num-1].Set_name='\0';sprintf(S_bf,"%5ld",Num);
  451.   strcpy(cont[Num-1].Set_name,S_bf);ch='.';
  452.  
  453.   sprintf(cont[Num-1].Set_name+strlen(cont[Num-1].Set_name),"%c",ch);
  454.   sprintf(cont[Num-1].Set_name+strlen(cont[Num-1].Set_name),"%s\n","???");
  455.   for (k=0;k<6;k++) { cont[Num-1].tempo[k]=0;cont[Num-1].instru[k]=0; }
  456.  
  457.   if (Num>0) content[Max_kind-1]--;
  458. }
  459.  
  460. void Init()
  461. {
  462.   int k;
  463.  
  464.   next=total=Signal=unite=On_Text=Column_On=Row_On=Table_Width=Table_Height=0;
  465.   Piano_X=40;Piano_Y=660;Atom_On=1;Tour_On=0;Back_Id=0;Debug=100;
  466.   Map_Row_Id=Map_Column_Id=Text_Row_Id=Text_Column_Id=Row_Id=Column_Id=-10;
  467.   Row_Aim=-1;Column_Aim=-1;Word_Pos=Word_X=Text_Base;Word_Y=0;Text_SY=743;
  468.   Show_Column_Line=1;Show_Row_Line=1;Column_Pointer=1;Row_Pointer=0;Load_On=0;
  469.   Volumn=100;At_Value=0;Value_H_X=72;Value_H_Y=30;Value_H_W=50;Value_H_H=20;
  470.   Print_pt=0;V_Ht=128;Dist=222+V_Ht;
  471.   Find_Filename();Load_Name();
  472.  
  473.   if (content[0]>0) Load(); 
  474.   if ((timfile=fopen("Dir_Song/IM.tim","r"))!=NULL)
  475.     {
  476.       rewind(timfile);Timbre_num=0;
  477.       do {
  478.        tim[Timbre_num]=(more *)malloc(sizeof(more));
  479.        fread(tim[Timbre_num],sizeof(more),1,timfile);Timbre_num++;
  480.      } while (!feof(timfile));
  481.       if (timfile != NULL) fclose(timfile);timfile=NULL;
  482.     } 
  483.   else Timbre_num=0;
  484.   if ((unifile=fopen("Dir_Song/IM.uit","r"))!=NULL)
  485.     {
  486.       rewind(unifile);contain=0;
  487.       do {
  488.        for (k=0;k<11;k++) fread(&uniset[contain][k],sizeof(long),1,unifile);
  489.            contain++;
  490.      } while (!feof(unifile));
  491.       if (unifile != NULL) fclose(unifile);unifile=NULL;
  492.     } 
  493.   else contain=0;
  494.   Get_List();
  495. }
  496.  
  497. void Draw_Silent(X,Y)
  498.   int X,Y;
  499. {
  500.   Line(X-3,Y-24,X+1,Y-17);Line(X-3,Y-24,X+3,Y-17);Line(X+1,Y-18,X-3,Y-10);
  501.   Line(X+2,Y-18,X-2,Y-10);Line(X+3,Y-18,X-1,Y-10);Line(X-3,Y-10,X+4,Y-4);
  502.   Line(X-1,Y-10,X+4,Y-4);Line(X,Y-7,X-3,Y-7);Line(X,Y-6,X-2,Y-6);
  503.   Line(X-3,Y-7,X-1,Y-2);Line(X-2,Y-6,X-1,Y-2);
  504. }
  505.  
  506. void Addot(x,z)
  507.   int x,z;
  508. {
  509.   if (x<0) { x=-x;SetColor("blue"); }
  510.   if (nt<36) DrawEllipse(x*36+8,z+51,1,1,0,360*64);
  511.   else if (nt>47) 
  512.          {
  513.            DrawEllipse(x*36+8,z+31,1,1,0,360*64);
  514.            if (nt>59) DrawEllipse(x*36+12,z+31,1,1,0,360*64);
  515.          }
  516.   SetColor("white");
  517. }
  518.  
  519. void Blank(X,Z,At_high)
  520.   int X,Z,At_high;
  521. {
  522.   int i,Dy,Dz,Dh;
  523.  
  524.   if (now>0) 
  525.     {
  526.       switch (At_high)
  527.     {
  528.       case 0:Dy=164+V_Ht;Dz=157+V_Ht;Dh=97;break;
  529.       case 1:Dy=84+V_Ht;Dz=33+V_Ht;Dh=124;break;
  530.       case 2:Dy=84;Dz=33;Dh=115;break;
  531.     }
  532.       Rub(X*36+5,Z+Dz,36,Dh,"NavyBlue");
  533.       if (At_high==2) SetColor("white");
  534.       else if (At_high==1) SetColor("ivory");
  535.            else if (At_high==0) SetColor("grey");
  536.       for (i=0;i<=4;i++) Line(X*36+5,Z+i*8+Dy,X*36+41,Z+i*8+Dy);
  537.     }
  538.   else if (now==0) 
  539.          { 
  540.        Rub(X*36+5,Z+69,36,60,"NavyBlue");SetColor("white");
  541.        Line(X*36+5,Z+100,X*36+41,Z+100); 
  542.      }
  543. }
  544.  
  545. void Semi_Blank(x,z,At_high)
  546.   int x,z,At_high;
  547. {
  548.   int i,Dy,Dz,Dh;
  549.  
  550.   switch (At_high)
  551.     {
  552.       case 0:Dy=164+V_Ht;Dz=157+V_Ht;Dh=97;break;
  553.       case 1:Dy=84+V_Ht;Dz=33+V_Ht;Dh=124;break;
  554.       case 2:Dy=84;Dz=33;Dh=115;break;
  555.     }
  556.   Rub(x*36+5,z+Dz,25,Dh,"NavyBlue");
  557.   if (At_high==2) SetColor("white");
  558.   else if (At_high==1) SetColor("ivory");
  559.        else if (At_high==0) SetColor("grey");
  560.   for (i=0;i<=4;i++) Line(x*36+5,z+i*8+Dy,x*36+32,z+i*8+Dy);
  561. }
  562.  
  563. void Line_Sector(x,delt_x,z,At_high)
  564.   int x,delt_x,z,At_high;
  565. {
  566.   int Sy,Ey;
  567.  
  568.   switch (At_high)
  569.     {
  570.       case 0:Sy=V_Ht+165;Ey=V_Ht+196;break;
  571.       case 1:Sy=V_Ht+85;Ey=V_Ht+116;break;
  572.       case 2:Sy=85;Ey=116;break;
  573.     }
  574.   SetColor("SpringGreen");Line(x*36+34+delt_x,z+Sy,x*36+34+delt_x,z+Ey);
  575. }
  576.  
  577. void Repeat_Sector(x,z,Twice,At_high)
  578.   int x,z,Twice,At_high;
  579. {
  580.   int Sy,Ey;
  581.  
  582.   switch (At_high)
  583.     {
  584.       case 0:Sy=V_Ht+165;Ey=V_Ht+196;break;
  585.       case 1:Sy=V_Ht+85;Ey=V_Ht+116;break;
  586.       case 2:Sy=85;Ey=116;break;
  587.     }
  588.  
  589.   SetColor("SpringGreen");
  590.   if (x==1) 
  591.     {
  592.       if (z!=0) 
  593.     {
  594.       Line(31*36+Twice*4-4,z-Dist+Sy,31*36+Twice*4-4,z-Dist+Ey);
  595.       FillEllipse(31*36-Twice*6,z-Dist+Sy+9,3,4,0,360*64);
  596.       FillEllipse(31*36-Twice*6,z-Dist+Ey-14,3,4,0,360*64);
  597.     }
  598.     } 
  599.   else 
  600.     {
  601.       Line(x*36+Twice*4-4,z+Sy,x*36+Twice*4-4,z+Ey);
  602.       FillEllipse(x*36-Twice*6,z+Sy+9,3,4,0,360*64);
  603.       FillEllipse(x*36-Twice*6,z+Ey-14,3,4,0,360*64);
  604.     }
  605. }
  606.  
  607. void Adjust_High_Low(fx,fy,Switcher)
  608.   int fx,fy,Switcher;
  609. {
  610.   if (Switcher==1)
  611.     switch (On_High)
  612.       {
  613.         case 0:On_High=2;OutTextXY(fx+760,fy+30,"Vois");break;
  614.     case 1:On_High=0;OutTextXY(fx+764,fy+30,"Low");break;
  615.     case 2:On_High=1;OutTextXY(fx+760,fy+30,"High");break;
  616.       }
  617.   else switch (On_High)
  618.      {
  619.        case 0:OutTextXY(fx+764,fy+30,"Low");break;
  620.            case 1:OutTextXY(fx+760,fy+30,"High");break;
  621.        case 2:OutTextXY(fx+760,fy+30,"Vois");break;
  622.          }
  623.   XSetLineAttributes(display,gc,1,0,0,0);
  624. }
  625.  
  626. void Adjust_Text(fx,fy,Switch)
  627.   int fx,fy,Switch;
  628. {
  629.   SetColor("cyan");XSetLineAttributes(display,gc,2,0,0,0);Use_Font("7x14");
  630.   DrawRectangle(fx+756,fy+45,38,35);SetColor("magenta");
  631.   DrawRectangle(fx+758,fy+47,34,31);Rub(fx+761,fy+51,28,23,"NavyBlue");
  632.   SetColor("white");
  633.   if (Switch==1) 
  634.     {
  635.       if (On_Text==0) { On_Text=1;OutTextXY(fx+760,fy+70,"Text"); }
  636.       else { On_Text=0;OutTextXY(fx+760,fy+70," ** "); }
  637.     }
  638.   else
  639.     {
  640.       if (On_Text==0) OutTextXY(fx+760,fy+70," ** ");
  641.       else OutTextXY(fx+760,fy+70,"Text");
  642.     }
  643.   XSetLineAttributes(display,gc,1,0,0,0);
  644. }
  645.  
  646. void Show_Text_Table(X,Y)
  647.   int X,Y;
  648. {
  649.   int i,j;
  650.  
  651.   Rub(X-2,Y-1,233,75,"MediumBlue");XSetLineAttributes(display,gc,2,0,0,0);
  652.   SetColor("DeepSkyBlue");DrawRectangle(X,Y,229,73);
  653.   XSetLineAttributes(display,gc,1,0,0,0);SetColor("ivory");
  654.   for (i=1;i<12;i++) Line(X+19*i,Y+1,X+19*i,Y+72);
  655.   for (i=1;i<4;i++) Line(X+1,Y+18*i,X+228,Y+18*i);SetColor("khaki");
  656.   S_bf=(char *)malloc(10);*S_bf='\0';
  657.   for (i=0;i<4;i++) 
  658.     for (j=0;j<12;j++)
  659.       { sprintf(S_bf,"%c",Map_Letter(j,i));OutTextXY(X+6+19*j,Y+14+18*i,S_bf); }
  660. }
  661.  
  662. void Draw_Wave(x,y)
  663.   int x,y;
  664. {
  665.   DrawEllipse(x,y,12,8,0,180);DrawEllipse(x+13,y,12,8,0,-180);
  666.   DrawEllipse(x+26,y,12,8,0,180);DrawEllipse(x+39,y,12,8,0,-180);
  667.   DrawEllipse(x+52,y,12,8,0,180);
  668. }
  669.  
  670. void Draw_Climax(x,y)
  671.   int x,y;
  672. {
  673.   DrawEllipse(x+5,y+3,12,8,0,180);DrawEllipse(x+18,y+3,12,8,0,-180);
  674.   DrawEllipse(x+31,y+3,12,8,0,180);DrawEllipse(x+39,y-21,20,30,0,-120);
  675.   OutTextXY(x+57,y-9,"*");
  676. }
  677.  
  678. void Draw_Rise(x,y)
  679.   int x,y;
  680. {
  681.   DrawEllipse(x+1,y+1,10,10,10,-180);DrawEllipse(x+11,y-2,13,13,10,-180);
  682.   DrawEllipse(x+24,y-5,16,16,10,-180);DrawEllipse(x+39,y-21,20,30,0,-160);
  683.   OutTextXY(x+57,y-9,"*");
  684. }
  685.  
  686. void Draw_Fall(x,y)
  687.   int x,y;
  688. {
  689.   DrawEllipse(x-4,y+2,16,12,0,90);DrawEllipse(x+12,y+4,16,12,0,160);
  690.   DrawEllipse(x+28,y+6,16,12,0,160);DrawEllipse(x+44,y+8,16,12,0,160);
  691.   OutTextXY(x+5,y,"*");
  692. }
  693.  
  694. void Draw_Arch(x,y)
  695.   int x,y;
  696. {
  697.   DrawEllipse(x+2,y+3,60,20,0,180);OutTextXY(x+30,y,"*");
  698. }
  699.  
  700. void Draw_Bowl(x,y)
  701.   int x,y;
  702. {
  703.   DrawEllipse(x+19,y-2,26,16,0,-180);OutTextXY(x+30,y+10,"*");
  704.   DrawEllipse(x+2,y,16,12,0,180);DrawEllipse(x+46,y,16,12,0,180);
  705. }
  706.  
  707. void Draw_R_Line(x,y)
  708.   int x,y;
  709. {
  710.   Line(x+3,y+2,x+60,y-6);
  711. }
  712.  
  713. void Draw_Repeat(x,y)
  714.   int x,y;
  715. {
  716.   Line(x+8,y-5,x+8,y+15);Line(x+12,y-5,x+12,y+15);Draw_Dot(x+17,y);
  717.   Draw_Dot(x+17,y+6);Line(x+50,y-5,x+50,y+15);Line(x+54,y-5,x+54,y+15);
  718.   Draw_Dot(x+45,y);Draw_Dot(x+45,y+6);
  719. }
  720.  
  721. void Draw_F_Line(x,y)
  722.   int x,y;
  723. {
  724.   Line(x+3,y+2,x+60,y+10);
  725. }
  726.  
  727. void Draw_H_Line(x,y)
  728.   int x,y;
  729. {
  730.   Line(x+3,y+2,x+60,y+2);
  731. }
  732.  
  733.  
  734. void Set_Table(X,Y)
  735.   int X,Y;
  736. {
  737.   SetColor("LightSkyBlue");XSetLineAttributes(display,gc,2,0,0,0);
  738.   DrawRectangle(X,Y,160,122);Line(X+80,Y,X+80,Y+122);
  739.   Line(X,Y+32,X+160,Y+32);Line(X,Y+62,X+160,Y+62);Line(X,Y+92,X+160,Y+92);
  740.   SetColor("white");Use_Font("7x14");
  741.   OutTextXY(X+16,Y+20,"Tempo #");OutTextXY(X+84,Y+20,"Instrument");
  742. }
  743.  
  744. void Draw_Mini_Staff(X,Y)
  745.   int X,Y;
  746. {
  747.   int i;
  748.  
  749.   SetColor("grey");XSetLineAttributes(display,gc,1,0,0,0);
  750.   for (i=0;i<5;i++) Line(X+15,i*8+Y,X+212,i*8+Y);
  751. }
  752.  
  753. void Draw_A_Staff(I,Y)
  754.   int I,Y;
  755. {
  756.   int j;
  757.  
  758.   SetColor("white");XSetLineAttributes(display,gc,1,0,0,0);
  759.   Line(6,I*Dist+Y+8,6,I*Dist+Y+121+V_Ht);
  760.   SetColor("DeepSkyBlue");HI_mark(I*Dist+Y+31);SetColor("white");   /* Voice */
  761.   for (j=0;j<=4;j++) Line(7,I*Dist+j*8+Y+8,1120,I*Dist+j*8+Y+8);
  762.  
  763.   SetColor("SkyBlue");HI_mark(I*Dist+Y+31+V_Ht);SetColor("ivory");  /* High */
  764.   for (j=0;j<=4;j++) Line(7,I*Dist+j*8+Y+8+V_Ht,1120,I*Dist+j*8+Y+8+V_Ht);
  765.  
  766.   SetColor("SkyBlue");LO_mark(I*Dist+Y+92+V_Ht);SetColor("grey");   /* Low */
  767.   for (j=0;j<=4;j++) Line(7,I*Dist+j*8+Y+88+V_Ht,1120,I*Dist+j*8+Y+88+V_Ht);
  768. }
  769.  
  770. void Staff(now,five,input)
  771.   int now,five,input;
  772. {
  773.   int i,y;
  774.  
  775.   Rub(0,33,1139,700,"NavyBlue");Rub(0,0,1139,32,"MediumBlue");
  776.   Rub(0,733,1139,132,"MediumBlue");XSetLineAttributes(display,gc,3,0,0,0);
  777.   SetColor("green");Use_Font("12x24");OutTextXY(6,26,"Name:");
  778.   OutTextXY(770,26,"Tim:    Speed:    Percent:");
  779.   SetColor("white");Line(0,31,1139,31);Line(0,733,1139,733);
  780.   if (now!=0) { SetColor("LightSkyBlue");Set_Table(2,738);Set_Table(969,738); }
  781.   y=76;XSetLineAttributes(display,gc,1,0,0,0);Use_Font("12x24");
  782.   if (five) 
  783.     {
  784.       SetColor("white");
  785.       if (now==0 && input==1) Line(200,y+24,1120,y+24);
  786.       else if (now>0) for (i=0;i<2;i++) Draw_A_Staff(i,y);
  787.     }
  788.   else OutTextXY(40,100,"1 =   ");
  789.   Showup(166,737,five);
  790. }
  791.  
  792. void Cat(x,y,dx,dy,bkcolor)
  793.   int *x,*y,dx,dy;
  794.   char *bkcolor;
  795. {
  796.   Rub(*x-10,*y-4,21,26,bkcolor);*x+=dx;*y+=dy;SetColor("magenta");
  797.   Line(*x,*y-4,*x-9,*y+20);Line(*x,*y-4,*x+9,*y+20);
  798.   Line(*x-10,*y+20,*x+11,*y+20);SetColor("green");
  799. }
  800.  
  801. void Square(n,k)
  802.   int n,k;
  803. {
  804.   if (k==0) Rub(n*80+70,173,n*80+90,182,"white");
  805.   else Rub(n*80+70,173,n*80+90,182,"magenta");
  806. }
  807.  
  808. void Mixup()
  809. {
  810.   int i,j,p,head,tail;
  811.   double d;
  812.  
  813.   for (j=0;j<=19;j++) br[j]=(122.0-tim_pt.freq[j])/120;
  814.   head=1;d=0.0;for (i=0;i<=9;i++) d+=br[i];d=0.05*d;
  815.   for (i=1; i<=20; i++) 
  816.     {
  817.       p=(int)floor(br[i-1]/d+0.5);tail=head+p-1;if (tail>40) tail=40;
  818.       for (j=head-1;j<tail;j++) mix[j]=i;head=tail+1;
  819.       if (head>40 && i<20) { head=40;d=br[i]; }
  820.     }
  821. }
  822.  
  823. void Fix_p(p,i,num)
  824.   int *p,i,num;
  825. {
  826.   int k,z;
  827.  
  828.   switch (num) 
  829.     {
  830.       case -1:if (*p-60<St_Start) { *p=St_Start;x=8; } else *p-=60;break;
  831.       case 1:if (*p+60>i) { way=(i-8)/30;x=(i-8)%30+1;*p=i; } else *p+=60;break;
  832.     }
  833.  
  834.   z=0;M_Bar_Num=0;
  835.   for (k=St_Start;k<*p;k++) 
  836.     {
  837.       if (z==0) M_Bar_Num++;
  838.       if (abs(St[M_Id][k][On_High].act)>0) z+=abs(St[M_Id][k][On_High].act);
  839.       if (z>=sum) z=0;
  840.     }
  841.   if (z==0) M_Bar_Num++;Renew_Bar_Num();
  842. }
  843.  
  844. void Tableout(k)
  845.   int k;
  846. {
  847.   int i,x_1,x_2,y;
  848.  
  849.   Use_Font("7x14");
  850.   for (i=1;i<4;i++) 
  851.     {
  852.       switch (i) 
  853.     {
  854.       case 1:x_1=10;x_2=977;y=779;break;
  855.       case 2:x_1=10;x_2=977;y=809;break;
  856.       case 3:x_1=10;x_2=977;y=839;break;
  857.     }
  858.       Rub(x_1-3,y-6,70,24,"MediumBlue");Rub(x_1+77,y-6,70,24,"MediumBlue");
  859.       Rub(x_2-3,y-6,70,24,"MediumBlue");Rub(x_2+77,y-6,70,24,"MediumBlue");
  860.       SetColor("gold");
  861.       if (St[k][0][1].nt[i]>0 && St[k][0][1].nt[i]!=200) 
  862.         {
  863.       Out_I_XY(x_1+23,y+13,St[k][0][1].nt[i]);
  864.       Out_I_XY(x_1+98,y+13,St[k][1][1].nt[i]);
  865.     }
  866.       if (St[k][0][2].nt[i]>0 && St[k][0][2].nt[i]!=200) 
  867.         {
  868.       
  869.       Out_I_XY(x_2+23,y+13,St[k][0][2].nt[i]);
  870.       Out_I_XY(x_2+98,y+13,St[k][1][2].nt[i]);
  871.     }
  872.     }
  873. }
  874.  
  875. void Figout()
  876. {
  877.   if (ny != 0) return;
  878.   switch (nx) 
  879.     {
  880.       case 8:nt=0;break;
  881.       case 9:
  882.       case 10:
  883.       case 11:nt=(nx-8)*2+48;break;
  884.       case 12: 
  885.       case 13:
  886.       case 14:
  887.       case 15:nt=(nx-11)*2+53;break;
  888.       case 16:if (at>0) at+=16;else at-=16;break;
  889.     }
  890.   if (nx==16) 
  891.     { if (now==0) tmp[M_Id][M_p-1].act=at;else St[M_Id][M_p-1][0].act=at; }
  892.   else 
  893.     { if (now==0) tmp[M_Id][M_p-1].note=nt;else St[M_Id][M_p-1][0].nt[0]=nt; }
  894.   Blank(x,z,1);highlight(x*36+40,z+34,26,37);
  895. }
  896.  
  897. void Pickup(x,way,n)
  898.   int x, way, n;
  899. {
  900.   SetColor("SpringGreen");
  901.   Line(x*36+n*18+18,way*Dist+50,x*36+n*18+18,way*Dist+360);
  902.   Line(x*36+n*18+19,way*Dist+50,x*36+n*18+19,way*Dist+360);
  903.   Line(x*36+n*18+18,way*Dist+50,x*36+n*7+18,way*Dist+50);
  904.   Line(x*36+n*18+19,way*Dist+359,x*36+n*7+19,way*Dist+359);
  905. }
  906.  
  907. void Pointout(x,y,z,ny,At_high)
  908.   int x,y,z,ny,At_high;
  909. {
  910.   if (five) 
  911.     {
  912.       Addline(x*36,y,z,At_high);Dot(x*36+14,z+y*4+32);
  913.       highlight(x*36+5,z+y*4-ny*20+28,26,37);return;
  914.     }
  915.   highlight(x*36+40,z+34,26,37);
  916. }
  917.  
  918.  
  919. void Get_Tempo(Mdy_Id,St_H_L)
  920.   int Mdy_Id,St_H_L;
  921. {
  922.   int i,Tempo_Id,Info;
  923.  
  924.   if (St_H_L>0) 
  925.     {
  926.       Tempo_Id=St[Mdy_Id][0][1].nt[St_H_L]-1;
  927.       for (i=2;i<30;i++)
  928.     {
  929.       if (tmp[Tempo_Id][i+1].note!=0) Info=tmp[Tempo_Id][i+1].act;
  930.           else Info=-tmp[Tempo_Id][i+1].act;
  931.       St[Mdy_Id][i][1].nt[St_H_L]=Info;
  932.     }
  933.     }
  934.   else 
  935.     {
  936.       Tempo_Id=St[Mdy_Id][0][2].nt[-St_H_L]-1;
  937.       for (i=2;i<30;i++)
  938.     {
  939.       if (tmp[Tempo_Id][i+1].note!=0) Info=tmp[Tempo_Id][i+1].act;
  940.           else Info=-tmp[Tempo_Id][i+1].act;
  941.       St[Mdy_Id][i][2].nt[-St_H_L]=Info;
  942.     }
  943.     }
  944. }
  945.  
  946. int Same_Tempo(Mdy_Id,St_H_L,Tempo_Id)
  947.   int Mdy_Id,St_H_L,Tempo_Id;
  948. {
  949.   int i;
  950.  
  951.   if (St_H_L>0)
  952.     {
  953.       for (i=2;i<27;i++)
  954.         { if (St[Mdy_Id][i][1].nt[St_H_L]!=tmp[Tempo_Id][i+1].act) return -1; }
  955.       return 1;
  956.     }
  957.   else
  958.     {
  959.       for (i=2;i<27;i++)
  960.         { if (St[Mdy_Id][i][2].nt[-St_H_L]!=tmp[Tempo_Id][i+1].act) return -1; }
  961.       return 1;
  962.     }
  963. }
  964.  
  965. void Add_To_Tempo(Mdy_Id,St_H_L)
  966.   int Mdy_Id,St_H_L;
  967. {
  968.   int i,k,Last_Pos,act,finish;
  969.  
  970.   k=content[0];Last_Pos=3;finish=0;
  971.   if (St_H_L>0)
  972.     {
  973.       tmp[k][1].note=St[Mdy_Id][1][0].nt[0];    /*   Timer    */
  974.       tmp[k][1].act=St[Mdy_Id][2][0].nt[0];     /*   Measure  */
  975.       for (i=3;i<30;i++) 
  976.     { 
  977.           act=St[Mdy_Id][i-1][1].nt[St_H_L];
  978.       if (act>0) tmp[k][i].note=71;else tmp[k][i].note=0;
  979.           tmp[k][i].act=abs(act);
  980.       if (tmp[k][i].act!=200 && finish==0) Last_Pos++;
  981.       else { finish=1;tmp[k][i].note=200; }
  982.     }
  983.       tmp[k][0].act=0;tmp[k][0].note=Last_Pos;content[0]+=1;tail=content[0];
  984.       names[tail-1]=(char *)malloc(50);*names[tail-1]='\0';
  985.  
  986.       S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%5ld",k+1);
  987.       strcpy(names[tail-1],S_bf);ch='.';
  988.       sprintf(names[tail-1]+strlen(names[tail-1]),"%c",ch);
  989.       if (now>9)
  990.     sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
  991.         Sub_Str(names[now*1000+Mdy_Id],0,10));
  992.       else
  993.     sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
  994.         Sub_Str(names[now*1000+Mdy_Id],1,10));
  995.       sprintf(names[tail-1]+strlen(names[tail-1])-1,"%s","-H-");
  996.       S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%1ld",St_H_L);
  997.       sprintf(names[tail-1]+strlen(names[tail-1]),"%s",S_bf);
  998.       sprintf(names[tail-1]+strlen(names[tail-1]),"%c",'\n');
  999.     }
  1000.   else
  1001.     {
  1002.       tmp[k][1].note=St[M_Id][1][0].nt[0];    /*   Timer    */
  1003.       tmp[k][1].act=St[M_Id][2][0].nt[0];     /*   Measure  */
  1004.       for (i=3;i<30;i++) 
  1005.     { 
  1006.       act=St[M_Id][i-1][2].nt[-St_H_L];
  1007.       if (act>0) tmp[k][i].note=71;else tmp[k][i].note=0;
  1008.           tmp[k][i].act=abs(act);
  1009.       if (tmp[k][i].act!=200 && finish==0) Last_Pos++;
  1010.       else { finish=1;tmp[k][i].note=200; }
  1011.     }
  1012.       tmp[k][0].act=0;tmp[k][0].note=Last_Pos;content[0]+=1;tail=content[0];
  1013.       names[tail-1]=(char *)malloc(50);*names[tail-1]='\0';
  1014.  
  1015.       S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%5ld",k+1);
  1016.       strcpy(names[tail-1],S_bf);ch='.';
  1017.       sprintf(names[tail-1]+strlen(names[tail-1]),"%c",ch);
  1018.  
  1019.       if (now>9)
  1020.     sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
  1021.         Sub_Str(names[now*1000+M_Id],0,10));
  1022.       else
  1023.     sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
  1024.         Sub_Str(names[now*1000+M_Id],1,10));
  1025.       sprintf(names[tail-1]+strlen(names[tail-1])-1,"%s","-L-");
  1026.       S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%1ld",-St_H_L);
  1027.       sprintf(names[tail-1]+strlen(names[tail-1]),"%s",S_bf);
  1028.       sprintf(names[tail-1]+strlen(names[tail-1]),"%c",'\n');
  1029.     }
  1030. }
  1031.  
  1032. void Check_Tempo()
  1033. {
  1034.   int i,j,Id,Save_St,Save_Tmp;
  1035.  
  1036.   Save_St=0;Save_Tmp=0;
  1037.  
  1038.   for (i=1;i<4;i++)                              /*  St_High  */
  1039.     {
  1040.       if (St[M_Id][0][1].nt[i]==0 || St[M_Id][0][1].nt[i]==200) continue;
  1041.       if (St[M_Id][0][1].nt[i]>content[now])
  1042.     {
  1043.       if (St[M_Id][2][1].nt[i]==200) continue;
  1044.       else  
  1045.         {
  1046.           Id=-1;
  1047.           for (j=0;j<content[0];j++) 
  1048.         if (Same_Tempo(M_Id,i,j)==1) { Id=j+1;break; }
  1049.           if (Id>0) { St[M_Id][0][1].nt[i]=Id;Save_St=1; }
  1050.           else       /*  Add new Tempo to Lib  */
  1051.         { 
  1052.                   if (content[0]>999) return;
  1053.           else 
  1054.             {
  1055.               Add_To_Tempo(M_Id,i);St[M_Id][0][1].nt[i]=content[0];
  1056.               Save_Tmp=1;Save_St=1;
  1057.             }
  1058.         }
  1059.         }
  1060.     }
  1061.       else
  1062.     {
  1063.       if (St[M_Id][2][1].nt[i]==200) { Get_Tempo(M_Id,i);Save_St=1; }
  1064.       else if (Same_Tempo(M_Id,i,St[M_Id][0][1].nt[i]-1)==1) continue;
  1065.                else 
  1066.          {
  1067.            Id=-1;
  1068.            for (j=0;j<content[0];j++)
  1069.              if (Same_Tempo(M_Id,i,j)==1) { Id=j+1;break; }
  1070.            if (Id>0) { St[M_Id][0][1].nt[i]=Id;Save_St=1; }
  1071.            else 
  1072.              { 
  1073.                Add_To_Tempo(M_Id,i);St[M_Id][0][1].nt[i]=content[0];
  1074.                Save_Tmp=1;Save_St=1;
  1075.              }
  1076.          }
  1077.     }
  1078.     }
  1079.   for (i=1;i<4;i++)                              /*  St_Low  */
  1080.     {
  1081.       if (St[M_Id][0][2].nt[i]==0 || St[M_Id][0][2].nt[i]==200) continue;
  1082.       if (St[M_Id][0][2].nt[i]>content[now])
  1083.     {
  1084.       if (St[M_Id][2][2].nt[i]==200) continue;
  1085.       else 
  1086.         {
  1087.           Id=-1;
  1088.           for (j=0;j<content[0];j++) 
  1089.         if (Same_Tempo(M_Id,-i,j)==1) { Id=j+1;break; }
  1090.           if (Id>0) { St[M_Id][0][2].nt[i]=Id;Save_St=1; }
  1091.           else      /*  Add new Tempo to Lib  */
  1092.         { 
  1093.           if (content[0]>999) return;
  1094.           else 
  1095.             {
  1096.               Add_To_Tempo(M_Id,-i);St[M_Id][0][2].nt[i]=content[0];
  1097.               Save_Tmp=1;Save_St=1;
  1098.             }
  1099.         }
  1100.         }
  1101.     }
  1102.       else
  1103.     {
  1104.       if (St[M_Id][2][2].nt[i]==200) { Get_Tempo(M_Id,-i);Save_St=1; }
  1105.       else if (Same_Tempo(M_Id,-i,St[M_Id][0][2].nt[i]-1)==1) continue;
  1106.                else 
  1107.          {
  1108.            Id=-1;
  1109.            for (j=0;j<content[0];j++)
  1110.              if (Same_Tempo(M_Id,-i,j)==1) { Id=j+1;break; }
  1111.            if (Id>0) { St[M_Id][0][2].nt[i]=Id;Save_St=1; }
  1112.            else 
  1113.              { 
  1114.                Add_To_Tempo(M_Id,-i);St[M_Id][0][2].nt[i]=content[0];
  1115.                Save_Tmp=1;Save_St=1;
  1116.              }
  1117.          }
  1118.     }
  1119.     }
  1120.   if (Save_Tmp==1) { Now_Bank=now;Del=-1;now=0;Save(1,tail);now=Now_Bank; }
  1121.   if (Save_St==1) { Del=-1;tail=content[now];Save(1,tail); }
  1122. }
  1123.  
  1124. void Clear_Chord_Bank()
  1125. {
  1126.   int i,j,k;
  1127.  
  1128.   for (i=0;i<320;i++)
  1129.     {
  1130.       Chord_Bank[i].Num=0;Chord_Bank[i].Next=-1;
  1131.       for (j=0;j<10;j++) for (k=0;k<3;k++) Chord_Bank[i].Nt[j][k]=0;
  1132.     }
  1133. }
  1134.