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-Input.c < prev    next >
C/C++ Source or Header  |  1992-07-16  |  45KB  |  1,606 lines

  1. /*                           ===  NM-Input.c  ===
  2.  *
  3.  * void Copy_Chord(From_Num,To_Num,At_high)
  4.  * void Get_Nt_At(Num,At_high,Nt,At)
  5.  * void Get_The_Set(M_Id,Id)
  6.  * int  MS_Input(button,Ms_x,Ms_y,Mdy_Id,nx,ny,At_high)
  7.  * void Adjust_Cursor(button,Val)
  8.  * int  Get_Input_Info(Melody_Id)
  9.  * void Select_Sample(ch)
  10.  * void Move_Left()
  11.  * void Move_Right()
  12.  * void Move_Up() 
  13.  * void Move_Down() 
  14.  * void Insert_Note()
  15.  * void Lock()
  16.  * void Page_Up()
  17.  * void Page_Down()
  18.  * void Delete_Note()
  19.  * void End()
  20.  * void Return()
  21.  * void Get_Timbre(ch)
  22.  * void Play_Note()
  23.  * void Do_KeyPress(ch)
  24.  * void Input(Melody_Id)
  25.  *
  26.  */
  27.  
  28. #include "NM.h"
  29.  
  30. int y,bk,twice,kp,kw,kx,fine[3],insert,finish,onto,c_nm,FORLIM;
  31. int V_way,V_pg,V_i,V_p,V_nx,V_ny,V_x,V_y,V_z,V_Bar_Num;
  32. int H_way,H_pg,H_i,H_p,H_nx,H_ny,H_x,H_y,H_z,H_Bar_Num;
  33. int L_way,L_pg,L_i,L_p,L_nx,L_ny,L_x,L_y,L_z,L_Bar_Num;
  34.  
  35. char STR1[256];
  36.  
  37. void Copy_Chord(From_Num,To_Num,At_high)
  38.   int From_Num,To_Num,At_high;
  39. {
  40.   St[M_Id][To_Num][At_high].nt[0]=St[M_Id][From_Num][At_high].nt[0];
  41.   St[M_Id][To_Num][At_high].nt[1]=St[M_Id][From_Num][At_high].nt[1];
  42.   St[M_Id][To_Num][At_high].nt[2]=St[M_Id][From_Num][At_high].nt[2];
  43.   St[M_Id][To_Num][At_high].nt[3]=St[M_Id][From_Num][At_high].nt[3];
  44.   St[M_Id][To_Num][At_high].act=St[M_Id][From_Num][At_high].act;
  45.   St[M_Id][To_Num][At_high].vol=St[M_Id][From_Num][At_high].vol;
  46. }
  47.  
  48. void Get_Nt_At(Num,At_high,Nt,At)
  49.   int Num,At_high,Nt,At;
  50. {
  51.   St[M_Id][Num][At_high].nt[0]=Nt;St[M_Id][Num][At_high].nt[1]=0;
  52.   St[M_Id][Num][At_high].nt[2]=0;St[M_Id][Num][At_high].nt[3]=0;
  53.   St[M_Id][Num][At_high].act=At;
  54. }
  55.  
  56. void Get_The_Set(M_Id,Id)
  57.   int M_Id,Id;
  58. {
  59.   int i;
  60.  
  61.   for (i=1;i<7;i++) 
  62.     { 
  63.       if (i<4)
  64.     {
  65.       if (0<cont[Id].tempo[i-1] && cont[Id].tempo[i-1]<=content[0]) 
  66.         { St[M_Id][0][1].nt[i]=cont[Id].tempo[i-1];Get_Tempo(M_Id,i); }
  67.       if (0<cont[Id].instru[i-1] && cont[Id].instru[i-1]<=Timbre_num) 
  68.         St[M_Id][1][1].nt[i]=cont[Id].instru[i-1];
  69.     }
  70.       else
  71.     {
  72.       if (0<cont[Id].tempo[i-1] && cont[Id].tempo[i-1]<=content[0]) 
  73.         { St[M_Id][0][2].nt[i-3]=cont[Id].tempo[i-1];Get_Tempo(M_Id,3-i); }
  74.       if (0<cont[Id].instru[i-1] && cont[Id].instru[i-1]<=Timbre_num) 
  75.         St[M_Id][1][2].nt[i-3]=cont[Id].instru[i-1];
  76.         
  77.     }
  78.     }
  79.   Tableout(M_Id);
  80. }
  81.  
  82. int MS_Input(button,Ms_x,Ms_y,Mdy_Id,nx,ny,At_high)
  83.   int button,Ms_x,Ms_y,Mdy_Id,nx,ny,At_high;
  84. {
  85.   int story,z,x,y,P,New_Note,Add,bk,way,Num,Low_Y,High_Y;
  86.  
  87.   Num=0;way=story=(Ms_y-35)/Dist;z=story*Dist;x=Ms_x/36;
  88.   y=((Ms_y-35)%Dist)/4;New_Note=Y_Nt(y,At_high);
  89.   P=Count(Mdy_Id,(page*2+story)*30+x,&story,At_high);
  90.   if (At_high==2) { Low_Y=-1;High_Y=27; }
  91.   else if (At_high==1) { Low_Y=V_Ht/4-1;High_Y=V_Ht/4+30; }
  92.        else if (At_high==0) { Low_Y=V_Ht/4+22;High_Y=V_Ht/4+54; }
  93.  
  94.   for (bk=0;bk<4;bk++) 
  95.     if (0<St[Mdy_Id][P][At_high].nt[bk] && St[Mdy_Id][P][At_high].nt[bk]<600) 
  96.       Num++;
  97.   M_i=St[Mdy_Id][0][At_high].nt[0]+1;
  98.   if (St_Start-1<P && P<St[Mdy_Id][0][At_high].nt[0]+1 && Low_Y<y && y<High_Y)
  99.     {
  100.       if (button==Button1) Add=1;
  101.       else if (button==Button2) Add=0;
  102.            else if (button==Button3)
  103.           {
  104.             Add=-1;
  105.             if (insert) 
  106.               {
  107.             for (bk=M_i;bk>=P;bk--) Copy_Chord(bk-1,bk,At_high);
  108.             Get_Nt_At(P,At_high,600,0);
  109.             St[Mdy_Id][P][At_high].act=Volumn;
  110.             M_i++;St[Mdy_Id][0][At_high].nt[0]=M_i-1;
  111.               }
  112.           }
  113.       if (Re_Order_Notes(Mdy_Id,P,New_Note,Add,nx,ny,At_high)==1) 
  114.     { 
  115.       Semi_Blank(x,z,At_high);if (At_high!=2) Semi_Blank(x,z,1-At_high);
  116.  
  117.       if (Add==-1 || (Add==1 && Num==0))
  118.         {
  119.           if (At_high==2) Showpage(Mdy_Id,page,way*30+x,0,2,1);
  120.           else Showpage(Mdy_Id,page,way*30+x,0,1,-1);
  121.           if (P<M_p) return 3000;   /* Show Cursor */
  122.         }
  123.       else 
  124.         {
  125.           Display_Note(Mdy_Id,P,z,x,0,At_high);
  126.           if (At_high!=2 && P<St[Mdy_Id][0][1-At_high].nt[0]+1) 
  127.         Display_Note(Mdy_Id,P,z,x,0,1-At_high);
  128.         }
  129.       return P;
  130.     }
  131.     }
  132.   else if (P<St_Start && button==Button3)
  133.      {
  134.        switch (x)
  135.          {
  136.            case 1:St[Mdy_Id][St_Start-3][At_high].nt[1]=200;break;
  137.            case 2:St[Mdy_Id][St_Start-2][At_high].nt[1]=200;break;
  138.            case 3:St[Mdy_Id][St_Start-2][At_high].nt[2]=200;break;
  139.            case 4:St[Mdy_Id][St_Start-2][At_high].nt[3]=200;break;
  140.            case 5:St[Mdy_Id][St_Start-1][At_high].nt[1]=200;break;
  141.            case 6:St[Mdy_Id][St_Start-1][At_high].nt[2]=200;break;
  142.            case 7:St[Mdy_Id][St_Start-1][At_high].nt[3]=200;break;
  143.          }
  144.        Semi_Blank(x,z,At_high);
  145.      }
  146.   return -100;
  147. }
  148.  
  149. void Adjust_Cursor(button,Val)
  150.   int button,Val;
  151. {
  152.   if (-1<Val && (Val==M_p || Val==3000 || (Val<M_p && (button==Button3))))
  153.     {
  154.       Dot(x*36+14,z+y*4+32);Addline(x*36,y,z,On_High);
  155.       highlight(x*36+5,z+y*4-ny*20+28,26,37);
  156.     }
  157.   else switch (Val)
  158.          {
  159.        case -1:Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37);
  160.                highlight(nx*40+173,ny*42+740,26,37);
  161.                if (On_High==2)
  162.              {
  163.                if (page!=V_pg) Showpage(M_Id,V_pg,1,0,2,-1);
  164.                L_pg=page;L_way=way;L_x=x;L_y=y;L_z=z;L_nx=nx;L_ny=ny;
  165.                L_i=M_i;L_p=M_p;L_Bar_Num=M_Bar_Num;
  166.                page=V_pg;way=V_way;x=V_x;y=V_y;z=V_z;
  167.                nx=V_nx;ny=V_ny;M_i=V_i;M_p=V_p;M_Bar_Num=V_Bar_Num;
  168.                Rub(820,3,40,25,"MediumBlue");Use_Font("12x24");
  169.                SetColor("gold");
  170.                Out_I_XY(820,26,St[M_Id][7][On_High].nt[0]);
  171.              }
  172.            else if (On_High==0)
  173.              {
  174.                if (page!=L_pg) Showpage(M_Id,L_pg,1,0,2,-1);
  175.                H_pg=page;H_way=way;H_x=x;H_y=y;H_z=z;H_nx=nx;H_ny=ny;
  176.                H_i=M_i;H_p=M_p;H_Bar_Num=M_Bar_Num;
  177.                page=L_pg;way=L_way;x=L_x;y=L_y;z=L_z;
  178.                nx=L_nx;ny=L_ny;M_i=L_i;M_p=L_p;M_Bar_Num=L_Bar_Num;
  179.                Rub(820,3,40,25,"MediumBlue");Use_Font("12x24");
  180.                SetColor("gold");
  181.                Out_I_XY(820,26,St[M_Id][7][On_High].nt[0]);
  182.              }
  183.            else if (On_High==1)
  184.              {
  185.                if (page!=H_pg) Showpage(M_Id,H_pg,1,0,2,-1);
  186.                V_pg=page;V_way=way;V_x=x;V_y=y;V_z=z;V_nx=nx;V_ny=ny;
  187.                V_i=M_i;V_p=M_p;V_Bar_Num=M_Bar_Num;
  188.                page=H_pg;way=H_way;x=H_x;y=H_y;z=H_z;
  189.                nx=H_nx;ny=H_ny;M_i=H_i;M_p=H_p;M_Bar_Num=H_Bar_Num;
  190.                Rub(820,3,40,25,"MediumBlue");Use_Font("12x24");
  191.                SetColor("gold");
  192.                Out_I_XY(820,26,St[M_Id][7][On_High].nt[0]);
  193.              }
  194.                Dot(x*36+14,z+y*4+32);Addline(x*36,y,z,On_High);
  195.                highlight(x*36+5,z+y*4-ny*20+28,26,37);
  196.                highlight(nx*40+173,ny*42+740,26,37);Renew_Bar_Num();
  197.          break;
  198.        case -2:highlight(nx*40+173,ny*42+740,26,37);
  199.          break;
  200.      }
  201. }
  202.  
  203. int Get_Input_Info(Melody_Id)
  204.   int Melody_Id;
  205. {
  206.   int i;
  207.  
  208.   Rub(0,480,1139,400,"MediumBlue");Rub(0,480,1139,2,"yellow");SetColor("green");
  209.   Use_Font("12x24");OutTextXY(430,540,"--- Input a melody ---");
  210.   tail=content[next];
  211.   if (Melody_Id==-1)
  212.     {
  213.       OutTextXY(310,630,"Input new one (Y/N) ?");ch=GetKey();
  214.       if (ch != 'N') ch='Y';sprintf(STR1,"%c",ch);OutTextXY(590,630,STR1);
  215.       if (ch!='N') M_Id=content[next];
  216.       else 
  217.     { OutTextXY(400,680,"Melody number:");readat(620,680,3,&M_Id);M_Id--; }
  218.       if (M_Id>1000)
  219.     { 
  220.       OutTextXY(400,700,"No more than 1000 melodys !");
  221.       do { } while ((ch=GetKey())!='!');
  222.       return -1;
  223.     }
  224.     }
  225.   else M_Id=Melody_Id;
  226.   if (now != next) { now=next;if (content[now]>0) Load(); }
  227.   marker=0;c_nm=0;
  228.   if (M_Id>content[now]-1) { tail=content[now]+1;M_Id=tail-1; } else marker=1;
  229.   S_bf=(char *)malloc(10);*S_bf='\0';i=now*1000+M_Id;sprintf(S_bf,"%5ld",i+1);
  230.   if (M_Id<content[now])   /*  Edit old one  */
  231.     {
  232.       SetColor("green");OutTextXY(436,730,"Change name ?");ch=GetKey();
  233.       if (ch=='Y') c_nm=1;else ch='N';
  234.       sprintf(STR1,"%c",ch);OutTextXY(678,730,STR1);
  235.     }
  236.   if (ch!='N') 
  237.     {
  238.       OutTextXY(310,780,"Melody name:");strcpy(names[i],S_bf);ch='.';j=0;
  239.       OutTextXY(j*12+457,780,S_bf);
  240.       do {
  241.            sprintf(names[i]+strlen(names[i]),"%c",ch);
  242.        sprintf(STR1,"%c",ch);OutTextXY(j*12+522,780,STR1);j++;ch=getkey();
  243.          } while (ch != '!' && j != 34);
  244.       if (j==1) sprintf(names[i]+strlen(names[i]),"%s","New");
  245.       sprintf(names[i]+strlen(names[i]),"%c",'\n');
  246.     }
  247.  
  248. /*
  249.   OutTextXY(420,600,"Five-line ?");ch=GetKey();
  250.   if (ch=='N' || ch=='Y') { sprintf(STR1,"%c",ch);OutTextXY(584,600,STR1); }
  251.   if (ch!='N') five=1;else five=0;
  252. */
  253.   five=1;
  254.   if (now>0) 
  255.     {
  256.       if (marker != 1) 
  257.     {   
  258.       Clear_Array(M_Id,now);St[M_Id][3][1].nt[0]=76;St[M_Id][4][1].nt[0]=80;
  259.       St[M_Id][7][2].nt[0]=St[M_Id][8][2].nt[0]=0;  /* V_Timbre V_Page # */
  260.       St[M_Id][7][1].nt[0]=St[M_Id][8][1].nt[0]=0;  /* H_Timbre H_Page # */
  261.       St[M_Id][7][0].nt[0]=St[M_Id][8][0].nt[0]=0;  /* L_Timbre L_Page # */
  262.     }
  263.       speed=(double)St[M_Id][3][1].nt[0];pct=St[M_Id][4][1].nt[0];
  264.       SetColor("white");OutTextXY(382,830,"Timer=");readat(460,830,1,&Timer);
  265.       if (Timer==0) 
  266.     {
  267.       if (marker==1) Timer=St[M_Id][1][1].nt[0];else Timer=4;
  268.       SetColor("magenta");Out_I_XY(460,830,Timer);
  269.     }
  270.       St[M_Id][1][1].nt[0]=Timer;SetColor("white");
  271.       OutTextXY(580,830,"Measure=");readat(690,830,1,&Measure);
  272.       if (Measure==0) 
  273.     {
  274.       if (marker==1) Measure=St[M_Id][2][1].nt[0];else Measure=4;
  275.       SetColor("magenta");Out_I_XY(690,830,Measure);
  276.     }
  277.       St[M_Id][2][1].nt[0]=Measure;
  278.     } 
  279.   else
  280.     {
  281.       if (marker != 1) Clear_Array(M_Id,now);
  282.       SetColor("white");OutTextXY(382,830,"Timer=");readat(460,830,1,&Timer);
  283.       if (Timer==0) { Timer=4;SetColor("magenta");Out_I_XY(460,830,Timer); }
  284.       tmp[M_Id][1].note=tmp_buf[M_Id][1].note=Timer;SetColor("white");
  285.       OutTextXY(580,830,"Measure=");
  286.       readat(690,830,1,&Measure);
  287.       if (Measure==0)
  288.     { Measure=4;SetColor("magenta");Out_I_XY(690,830,Measure); } 
  289.       tmp[M_Id][1].act=tmp_buf[M_Id][1].act=Measure;
  290.     }
  291.   if (Timer<2 || Measure<2) return -1;
  292.   XClearWindow(display,win);On_High=2;Staff(now,five,1);
  293.   Use_Font("12x24");SetColor("gold");OutTextXY(600,26,Race);
  294.  
  295.   if (marker!=1) 
  296.     {
  297.       if (now>0) 
  298.     {
  299.       OutTextXY(67,26,names[i]);Out_I_XY(820,26,St[M_Id][7][1].nt[0]);
  300.       Out_I_XY(940,26,(int)speed);Out_I_XY(1084,26,pct);SetColor("green");
  301.       Line(12,V_Ht+34,35,V_Ht+34);Out_I_XY(17,V_Ht+29,Timer);
  302.       Out_I_XY(17,V_Ht+60,Measure);Line(12,Dist+162,35,Dist+162);
  303.       Out_I_XY(17,Dist+157,Timer);Out_I_XY(17,Dist+188,Measure);
  304.     } 
  305.       else 
  306.     { 
  307.       OutTextXY(80,26,"Tempo--");Out_I_XY(180,26,M_Id+1);SetColor("green");
  308.       Line(115,100,138,100);Out_I_XY(120,95,Timer);
  309.       Out_I_XY(120,125,Measure);
  310.     }
  311.     }
  312.   SetColor("magenta");DrawRectangle(547,1,38,27);Rub(549,3,35,24,"DodgerBlue");
  313.   SetColor("white");V_pg=H_pg=L_pg=page=0;Out_I_XY(561,25,page);
  314.   SetColor("green");XSetLineAttributes(display,gc,2,0,0,0);
  315.   DrawRectangle(166,826,799,34);XSetLineAttributes(display,gc,1,0,0,0);
  316.   if (marker==1) Tableout(M_Id);Use_Font("7x14");SetColor("gold");
  317.   OutTextXY(179,850,"Ins : Off   Bar-play   L-listen   V-save      : Speed      : Pct    F1_F6 - tempo   >< - timbre   Home : Off");
  318.   Use_Font("12x24");L_Arrow(486,841);R_Arrow(498,850);U_Arrow(577,840);
  319.   D_Arrow(586,852);sum=Timer*64/Measure;lock=0;
  320.   if (now==0) x=6;else if (five) x=1;else x=4;
  321.   V_x=H_x=L_x=x;Word_Pos=Word_X=Text_Base;Word_Y=0;return 1;
  322. }
  323.  
  324. void Select_Sample(ch)
  325.   char ch;
  326. {
  327.   switch (ch)
  328.     {
  329.       case 'C':
  330.       case 'Z':highlight(nx*40+173,ny*42+740,26,37);
  331.            if (M_p<St_Start && now>0) 
  332.          {
  333.            if (five) 
  334.              {
  335.                M_p=St_Start;Dot(x*36+14,z+y*4+32);
  336.                highlight(x*36+5,z+y*4-ny*20+28,26,37);
  337.                x=8;if (ch=='C') nx=16;else nx=3;Dot(x*36+14,z+y*4+32);
  338.                highlight(x*36+5,z+y*4-ny*20+28,26,37);
  339.              } 
  340.            else 
  341.              {
  342.                highlight(x*36+5,z+34,26,37);
  343.                if (ch=='C') { if (nx<7) nx++;else nx=0; }
  344.                else if (nx>0) nx--;else nx=7;
  345.                highlight(x*36+5,z+34,26,37);
  346.              }
  347.          }
  348.            else if (five) 
  349.               {
  350.             if (now==0) 
  351.               {
  352.                 if (ch=='C') 
  353.                   switch (nx) 
  354.                 {
  355.                   case 14:nx=17;ny=1;break;
  356.                   case 17:nx=0;break;
  357.                   default:if (nx<=13) nx++;break;
  358.                 }
  359.                 else switch (nx) 
  360.                        {   
  361.                      case 0:nx=17;ny=1;break;
  362.                      case 17:nx=14;break;
  363.                      default:if (nx>=1 && nx<=14) nx--;break;
  364.                    }
  365.               } 
  366.             else 
  367.               {
  368.                 if (ch=='C') { if (nx<18) nx++;else nx=0; }
  369.                 else if (nx>0) nx--;else nx=18;
  370.               }
  371.               }
  372.                 else 
  373.               {
  374.             if (now==0) 
  375.               switch (ny) 
  376.                 {
  377.                   case 0:if (nx==8) nx=9;else nx=8;break;
  378.                   case 1:if (ch=='C') { if (nx<16) nx++;else nx=9; }
  379.                          else if (nx>9) nx--;else nx=16;
  380.                 break;
  381.                 }
  382.             else 
  383.               {
  384.                 if (ch=='C') { if (nx<18) nx++;else nx=8; }
  385.                 else if (ny==0 && nx>8 || ny==1 && nx>7) nx--;
  386.                      else nx=18;
  387.               }
  388.             Figout();
  389.               }
  390.            highlight(nx*40+173,ny*42+740,26,37);
  391.     break;
  392.       case 'X':highlight(nx*40+173,ny*42+740,26,37);
  393.            if (five)
  394.          { 
  395.            Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37);
  396.          }
  397.            ny=1-ny;if (now==0) nx=9;
  398.            if (!five && M_p<St_Start+1) 
  399.          {
  400. /*
  401.            back=XGetImage(display,win,nx*40+173,ny*42+740,26,37,8,
  402.                   ZPixmap);
  403.            XPutImage(display,win,gc,back,0,0,x*36+40,z+34,26,37);
  404. */
  405.          } 
  406.            else if (!five && nx<18) Figout();
  407.            highlight(nx*40+173,ny*42+740,26,37);
  408.            if (five) Pointout(x,y,z,ny,On_High);
  409.     break;
  410.     }
  411. }
  412.  
  413. void Move_Left()
  414. {
  415.   if (lock)
  416.     {
  417.       if (speed>20.0) speed--;else speed=160.0;
  418.       St[M_Id][3][1].nt[0]=(int)floor(speed+0.5);Rub(940,3,40,25,"MediumBlue");
  419.       Use_Font("12x24");SetColor("gold");Out_I_XY(940,26,St[M_Id][3][1].nt[0]);
  420.     } 
  421.   else 
  422.     {
  423.       if (five) 
  424.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  425.       else highlight(x*36+5,z+y*4+28,26,37);
  426.       if (delt[On_High]==0 && rpter[On_High]==1 && (five || M_p!=St_Start)) 
  427.     {
  428.       if (x>1) 
  429.         {
  430.           x--;M_p=Count(M_Id,way*30+x,&n,On_High);Renew_Bar_Num();
  431.           if (M_p<St_Start && now>0) 
  432.         {
  433.           highlight(nx*40+173,ny*42+740,26,37);
  434.           if (five) nx=15;else { nx=7;ny=0;x=4;M_Bar_Num=0; }
  435.           highlight(nx*40+173,ny*42+740,26,37);
  436.           if (!five)
  437.             {
  438. /*
  439.                       XSetFunction(display,gc,GXcopy);
  440.               XPutImage(display,win,gc,pure,0,0,x*36+4,z+34,26,37);
  441. */
  442.             }
  443.         }
  444.         } 
  445.       else if (way>0)
  446.              {
  447.            if ((way % 2)==0)
  448.              {
  449.                way--;page=way/2;Showpage(M_Id,page,1,0,2,-1);x=30;
  450.                M_p=Count(M_Id,way*30+x,&n,On_High);
  451.              }
  452.            else { way--;x=30;M_p=Count(M_Id,way*30+x,&n,On_High); }
  453.            z=(way-page*2)*Dist;M_p=52+30*way;Renew_Bar_Num();
  454.          }
  455.     }
  456.       Pointout(x,y,z,ny,On_High);
  457.     }
  458. }
  459.  
  460. void Move_Right()
  461. {
  462.   if (lock)              
  463.     {
  464.       if (speed<160.0) speed++;else speed=20.0;
  465.       St[M_Id][3][1].nt[0]=(int)floor(speed+0.5);Rub(940,3,40,25,"MediumBlue");
  466.       Use_Font("12x24");SetColor("gold");Out_I_XY(940,26,St[M_Id][3][1].nt[0]);
  467.     }
  468.   else 
  469.     {
  470.       if (five) 
  471.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  472.       else highlight(x*36+5,z+y*4+28,26,37);
  473.       if ((M_p<M_i && delt[On_High]==0 && rpter[On_High]==1) && (now>0 || (now==0 && x<29)))
  474.     {
  475.       if (x<30) x++;
  476.       else 
  477.         {
  478.           if (((way+1)%2)==0) 
  479.         { way++;page=way/2;Showpage(M_Id,page,1,0,2,-1);x=1; }
  480.           else { way++;x=1; }
  481.           z=(way-page*2)*Dist;
  482.         }
  483.       M_p=Count(M_Id,way*30+x,&n,On_High);Renew_Bar_Num();
  484.       if (M_p==St_Start) 
  485.         {
  486.           if (five) 
  487.         {
  488.           highlight(nx*40+173,ny*42+740,26,37);nx=2;
  489.           highlight(nx*40+173,ny*42+740,26,37);
  490.         } 
  491.           else { nx=9;ny=0; }
  492.         }
  493.     }
  494.        Pointout(x,y,z,ny,On_High);
  495.     }
  496. }
  497.  
  498. void Move_Up() 
  499. {
  500.   int Y_A,Y_B;
  501.  
  502.   if (lock)
  503.     {
  504.       if (pct<100) pct++;else pct=10;
  505.       St[M_Id][4][1].nt[0]=pct;Rub(1084,3,40,25,"MediumBlue");
  506.       SetColor("gold");Use_Font("12x24");Out_I_XY(1084,26,pct);
  507.     } 
  508.   else 
  509.     {
  510.       if (five) 
  511.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  512.       else highlight(x*36+5,z+y*4+28,26,37);
  513.       if (five && now>0) 
  514.     {
  515.       switch (On_High)
  516.         {
  517.           case 0:Y_A=23+V_Ht/4;Y_B=53+V_Ht/4;break;
  518.           case 1:Y_A=V_Ht/4;Y_B=29+V_Ht/4;break;
  519.           case 2:Y_A=0;Y_B=26;break;
  520.         }
  521.       if (y==Y_A)
  522.         {
  523.           if (way>0 && delt[On_High]==0 && rpter[On_High]==1) 
  524.         {
  525.           if ((way % 2)==0) 
  526.             {
  527.               way--;page=way/2;Showpage(M_Id,page,1,0,2,-1);y=Y_B;
  528.               M_p=Count(M_Id,way*30+x,&n,On_High);
  529.             }
  530.           else 
  531.             { 
  532.               way--;y=Y_B;M_p=Count(M_Id,way*30+x,&n,On_High);
  533.               if (M_p<St_Start+1) 
  534.             {
  535.               highlight(nx*40+173,ny*42+740,26,37);nx=15;
  536.               highlight(nx*40+173,ny*42+740,26,37);M_Bar_Num=0;
  537.             }
  538.             }
  539.           Renew_Bar_Num();
  540.         }
  541.         }
  542.       else y--;
  543.     } 
  544.       else if (way>0 && delt[On_High]==0 && rpter[On_High]==1) 
  545.          {
  546.            if ((way % 2)==0) 
  547.          {
  548.            way--;page=way/2;Showpage(M_Id,page,1,0,2,-1);
  549.            M_p=Count(M_Id,way*30+x,&n,On_High);
  550.          }
  551.            else
  552.          {
  553.            way--;M_p=Count(M_Id,way*30+x,&n,On_High);
  554.            if (M_p<3 && now==0) 
  555.              {
  556. /*
  557.                        XSetFunction(display,gc,GXcopy);
  558.                XPutImage(display,win,gc,pure,0,0,nx*40+173,
  559.                          ny*42+740,26,37);
  560. */
  561.                nx=9;ny=0;M_p=3;x=1;
  562. /*
  563.                        pure=XGetImage(display,win,nx*40+173,ny*42+740,
  564.                               26,37,8,ZPixmap);
  565. */
  566.                highlight(nx*40+173,ny*42+740,26,37);
  567.                if (!five)
  568.              {
  569. /*
  570.                            XSetFunction(display,gc,GXcopy);
  571.                XPutImage(display,win,gc,pure,0,0,x*36+40,
  572.                      z+34,26,37);
  573. */
  574.              }
  575.              }
  576.          }
  577.            Renew_Bar_Num();
  578.          }
  579.       z=(way-page*2)*Dist;Pointout(x,y,z,ny,On_High);
  580.     }
  581. }
  582.  
  583. void Move_Down()
  584. {
  585.   int Y_A,Y_B;
  586.  
  587.   if (lock)
  588.     {
  589.       if (pct>10) pct--;else pct=100;
  590.       St[M_Id][4][1].nt[0]=pct;Rub(1084,3,40,25,"MediumBlue");
  591.       SetColor("gold");Use_Font("12x24");Out_I_XY(1084,26,pct);
  592.     }  
  593.   else 
  594.     { 
  595.       if (five)
  596.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  597.       else highlight(x*36+5,z+y*4+28,26,37);
  598.       if (five && now>0) 
  599.     {
  600.       switch (On_High)
  601.         {
  602.           case 0:Y_A=23+V_Ht/4;Y_B=53+V_Ht/4;break;
  603.           case 1:Y_A=V_Ht/4;Y_B=29+V_Ht/4;break;
  604.           case 2:Y_A=0;Y_B=26;break;
  605.         }
  606.       if (y==Y_B)
  607.         {
  608.           if (M_i-M_p>=30 && delt[On_High]==0 && rpter[On_High]==1) 
  609.         {
  610.           if (((way+1) % 2)==0) 
  611.             {
  612.               way++;page=way/2;Showpage(M_Id,page,1,0,2,-1);y=Y_A;
  613.               M_p=Count(M_Id,way*30+x,&n,On_High);
  614.             }
  615.           else { way++;y=Y_A;M_p=Count(M_Id,way*30+x,&n,On_High); }
  616.           Renew_Bar_Num();
  617.         }
  618.         }
  619.       else y++;
  620.     } 
  621.       else if (M_i-M_p>=30 && delt[On_High]==0 && rpter[On_High]==1) 
  622.          {
  623.            if (((way+1) % 2)==0) 
  624.          {
  625.            way++;page=way/2;Showpage(M_Id,page,1,0,2,-1);
  626.            M_p=Count(M_Id,way*30+x,&n,On_High);
  627.          }
  628.            else { way++;M_p=Count(M_Id,way*30+x,&n,On_High); }
  629.            Renew_Bar_Num();
  630.          }
  631.       z=(way-page*2)*Dist;Pointout(x,y,z,ny,On_High);
  632.     }
  633. }
  634.  
  635. void Insert_Note()
  636. {
  637.   if (M_i<M_Len-1)
  638.     {
  639.       dis(&insert);Rub(221,835,30,17,"MediumBlue");
  640.       SetColor("gold");Use_Font("7x14");
  641.       if (insert) OutTextXY(221,850,"On ");else OutTextXY(221,850,"Off");
  642.     }
  643. }
  644.  
  645. void Lock()
  646. {
  647.   dis(&lock);Rub(915,835,30,17,"MediumBlue");
  648.   SetColor("gold");Use_Font("7x14");
  649.   if (lock) OutTextXY(915,850,"On ");else OutTextXY(915,850,"Off");
  650. }
  651.  
  652. void Page_Up()
  653. {
  654.   if (now>0 && page!=0)
  655.     {
  656.       if (five)
  657.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  658.       page--;way-=2;Showpage(M_Id,page,1,0,2,-1);
  659.       z=(way-page*2)*Dist;Fix_p(&M_p,M_i,-1);Pointout(x,y,z,ny,On_High);
  660.     }
  661. }
  662.  
  663. void Page_Down()
  664. {
  665.   if (now>0 && page<St[M_Id][8][On_High].nt[0])
  666.     {
  667.       if (five)
  668.     { Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37); }
  669.       page++;Showpage(M_Id,page,1,0,2,-1);Fix_p(&M_p,M_i,1);
  670.       if (M_p<=M_i) way+=2;z=(way-page*2)*Dist;Pointout(x,y,z,ny,On_High);
  671.     }
  672. }
  673.  
  674. void Delete_Note()
  675. {
  676.   if (M_p<St_Start && now>0) 
  677.     { 
  678.       St[M_Id][y-5][On_High].act=0;Blank(x,z,On_High);
  679.       Pointout(x,y,z,ny,On_High); 
  680.     }
  681.   else if (M_p<M_i) 
  682.          {
  683.            if (now==0) n-=tmp[M_Id][M_p].act;else n-=St[M_Id][M_p][On_High].act;
  684.        for (bk=M_p;bk<M_i;bk++) 
  685.          {
  686.            if (now==0)
  687.          {
  688.            tmp[M_Id][bk]=tmp[M_Id][bk+1];
  689.            tmp_buf[M_Id][bk]=tmp_buf[M_Id][bk+1];
  690.          }
  691.            else Copy_Chord(bk+1,bk,On_High);
  692.          }
  693.        if (now==0) { tmp[M_Id][M_i-1].note=tmp_buf[M_Id][M_i-1].note=200; }
  694.        else Get_Nt_At(M_i-1,On_High,200,0);
  695.        M_i--;
  696.        if (On_High==2) Showpage(M_Id,page,(way*30+x)%60,0,2,1);
  697.        else Showpage(M_Id,page,(way*30+x)%60,0,1,-1);
  698.        Pointout(x,y,z,ny,On_High);
  699.        if (now>0) St[M_Id][8][1].nt[On_High]=(M_i-8)/60;  /*  # of pages  */
  700.      }
  701. }
  702.  
  703. void End()
  704. {
  705.   if (!five && ((ny==0 && (nx==16 || nx==17))||(ny==1 && (nx==7 || nx==9
  706.       || nx==10 || nx==11 || nx==12 || nx==13 || nx==14 || nx==15 || nx==17))))
  707.     {
  708.       dis(&onto);XSetFunction(display,gc,GXcopy);
  709.       switch (nx) 
  710.     {
  711.       case 7:readat(x*36,z+24,2,&bk);
  712.              if (insert)  { nt=-bk;at=0; } 
  713.              else { St[M_Id][M_p-1][1].nt[0]=-bk;St[M_Id][M_p-1][1].act=0; }
  714.         break;
  715.       case 9:
  716.       case 10:
  717.       case 11:if (onto) 
  718.                 {
  719.               if (insert) at/=(int)floor(exp((nx-8)*log(2.0))+0.5);
  720.               else 
  721.             {
  722.               if (now>0) 
  723.                 St[M_Id][M_p][1].act/=(int)floor(exp((nx-8)*
  724.                                    log(2.0))+0.5);
  725.               else tmp[M_Id][M_p].act=tmp_buf[M_Id][M_p].act=
  726.                            16/(int)floor(exp((nx-8)*log(2.0))+0.5);
  727.             }
  728.               Underline(x,z,nx-8);
  729.             } 
  730.               else 
  731.             {
  732.               if (insert) at=(int)floor(at*exp((nx-8)*log(2.0))+0.5);
  733.               else 
  734.             {
  735.               if (now>0)
  736.                 St[M_Id][M_p-1][1].act=(int)floor(St[M_Id][M_p-
  737.                                             1][1].act*exp((nx-8)*log(2.0))+0.5);
  738.               else tmp[M_Id][M_p-1].act=tmp_buf[M_Id][M_p].act
  739.                     =(int)floor(tmp[M_Id][M_p-1].act*
  740.                                 exp((nx-8)*log(2.0))
  741.                                 +0.5);
  742.             }
  743.               Underline(x,z,8-nx);
  744.             }
  745.         break;
  746.       case 13:if (onto) 
  747.                 {    
  748.               if (insert) at=(int)floor(1.5*at+0.5);
  749.               else 
  750.             {
  751.               if (now>0)
  752.                 St[M_Id][M_p-1][1].act=(int)floor(1.5*
  753.                         St[M_Id][M_p-1][1].act+0.5);
  754.               else tmp[M_Id][M_p-1].act=tmp_buf[M_Id][M_p-1].act=
  755.                          (int)floor(1.5*tmp[M_Id][M_p-1].act+0.5);
  756.             }
  757.               Dot(x*36+17,z+39);
  758.             } 
  759.               else 
  760.             {
  761.               if (insert) at=at*2/3;
  762.               else 
  763.             {
  764.               if (now>0) 
  765.                 St[M_Id][M_p-1][1].act=St[M_Id][M_p-1][1].act*2/3;
  766.               else tmp[M_Id][M_p-1].act=tmp_buf[M_Id][M_p-1].act=
  767.                        tmp[M_Id][M_p-1].act*2/3;
  768.             }
  769.               Dot(x*36+17,-z-39);
  770.             }
  771.         break;
  772.       case 12:
  773.       case 14:if (now>0) 
  774.                 {
  775.               if (nt>35 && nt<48) onto=1;else onto=0;
  776.               if (onto) 
  777.             {
  778.               if (insert) nt+=(13-nx)*12;
  779.               else 
  780.                 {
  781.                   St[M_Id][M_p-1][1].nt[0]+=(13-nx)*12;
  782.                   nt=St[M_Id][M_p-1][1].nt[0];
  783.                 }
  784.               Addot(x,z);
  785.             } 
  786.               else 
  787.             {
  788.               if (!insert) nt=St[M_Id][M_p-1][1].nt[0];Addot(-x,z);
  789.               if (nt>47) nt-=12;else nt+=12;
  790.               if (!insert) St[M_Id][M_p-1][1].nt[0]=nt;
  791.             }
  792.             }
  793.         break;
  794.       case 15:fine[On_High]=1;
  795.               if (now>0)
  796.             { 
  797.               St[M_Id][5][On_High].nt[0]=M_p;
  798.               n=sum-St[M_Id][M_p-1][On_High].act;
  799.             }
  800.           else 
  801.             { 
  802.               tmp[M_Id][1].act=tmp_buf[M_Id][1].act=M_p;
  803.               n=sum-tmp[M_Id][M_p-1].act;
  804.             }
  805.               Blank(x,z,On_High);Line(x*36+8,z+109,x*36+8,z+140);
  806.         break;
  807.       case 16:if (onto && (insert && at<64 || (!insert && (now==0 && 
  808.              tmp[M_Id][M_p-1].act<64 || now>0 && 
  809.                         St[M_Id][M_p-1][1].act<64))))
  810.                 {
  811.               if (x<30) x++;
  812.               else 
  813.             {
  814.               way++;x=1;
  815.               if ((way % 2)==0) 
  816.                 { page=way/2;Showpage(M_Id,page,1,0,2,1); }
  817.               z=(way-page*2)*Dist;
  818.             }
  819.               Underline(x,z-6,1);
  820.               if (insert) at+=16;
  821.               else 
  822.             {
  823.               if (now==0)
  824.                 { 
  825.                   tmp[M_Id][M_p-1].act+=16;
  826.                   tmp_buf[M_Id][M_p-1].act+=16;
  827.                 }
  828.               else St[M_Id][M_p-1][1].act+=16;
  829.             }
  830.             } 
  831.               else if (insert && at>16 || !insert && now==0 && 
  832.                tmp[M_Id][M_p-1].act>16 || now>0 && 
  833.                St[M_Id][M_p-1][1].act>16) 
  834.                  {
  835.                if (insert) at -= 16;
  836.                else 
  837.                  {
  838.                    if (now== 0) 
  839.                  { 
  840.                    tmp[M_Id][M_p-1].act-=16;
  841.                    tmp_buf[M_Id][M_p-1].act-=16;
  842.                    at=tmp[M_Id][M_p-1].act;
  843.                  }
  844.                    else 
  845.                  { 
  846.                    St[M_Id][M_p-1][1].act-=16;
  847.                    at=St[M_Id][M_p-1][1].act;
  848.                  }
  849.                  }
  850.                FORLIM=at/16;
  851.                for (bk=1;bk<=FORLIM;bk++) 
  852.                  {
  853.                    if (x>1) x--;
  854.                    else 
  855.                  {
  856.                    if ((way % 2)==0) 
  857.                      {
  858.                        way--;page=way/2;
  859.                        Showpage(M_Id,page,1,0,2,1);
  860.                        x=30;
  861.                      }
  862.                    else { way--;x=30; }
  863.                    z=(way-page*2)*Dist;
  864.                  }
  865.                  }
  866.                Showpage(M_Id,page,way*30+x,0,2,1);
  867.              }
  868.         break;
  869.       case 17:if (now>0) 
  870.                 {
  871.               if (ny==0) 
  872.             {
  873.               if (onto) 
  874.                 {
  875.                   if (insert) nt++;else St[M_Id][M_p-1][1].nt[0]++;
  876.                   Sharp(x*36-4,z+33);
  877.                 } 
  878.               else 
  879.                 {
  880.                   if (insert) nt--;else St[M_Id][M_p-1][1].nt[0]--;
  881.                   Sharp(x*36-4,-z-33);
  882.                 }
  883.             } 
  884.               else 
  885.             {
  886.               if (onto) 
  887.                 {
  888.                   if (insert) nt++;else St[M_Id][M_p-1][1].nt[0]--;
  889.                   Flat(x*36-4,z+32);
  890.                 } 
  891.               else 
  892.                 {
  893.                   if (insert) nt--;else St[M_Id][M_p-1][1].nt[0]++;
  894.                   Flat(x*36-4,-z-32);
  895.                 }
  896.             }
  897.             }
  898.         break;
  899.     }
  900.       highlight(x*36+5,z+34,26,37);
  901.     }
  902. }
  903.  
  904. void Return()
  905. {
  906.   int Ry;
  907.  
  908.   if (M_p<St_Start && now>0) insert=0;onto=0;
  909.   if (now>0) M_p=Count(M_Id,way*30+x,&n,On_High);
  910.   if (five) 
  911.     {
  912.       Dot(x*36+14,z+y*4+32);if (nx<11 || nx>14) Addline(x*36,y,z,On_High);
  913.       highlight(x*36+5,z+y*4-ny*20+28,26,37);
  914.       if (M_p<St_Start && nx==15) 
  915.     { 
  916.       switch (x)
  917.         {
  918.           case 1:St[M_Id][St_Start-3][On_High].nt[1]=y;break;
  919.           case 2:St[M_Id][St_Start-2][On_High].nt[1]=y;break;
  920.           case 3:St[M_Id][St_Start-2][On_High].nt[2]=y;break;
  921.           case 4:St[M_Id][St_Start-2][On_High].nt[3]=y;break;
  922.           case 5:St[M_Id][St_Start-1][On_High].nt[1]=y;break;
  923.           case 6:St[M_Id][St_Start-1][On_High].nt[2]=y;break;
  924.           case 7:St[M_Id][St_Start-1][On_High].nt[3]=y;break;
  925.         }
  926.       St[M_Id][6][On_High].nt[0]=1-2*ny;
  927.     }
  928.       else if (M_p>St_Start-1 || now==0) 
  929.          {
  930.            switch (nx) 
  931.          {
  932.            case 11:
  933.            case 12:
  934.            case 13:
  935.            case 14:nt=0;
  936.                    if (On_High==2) y=16;else y=16+20*(1-On_High)+V_Ht/4;
  937.                    switch (nx) 
  938.                  {
  939.                    case 11:if (ny==0) at=96;else at=48;break;
  940.                    case 12:if (ny==0) at=64;else at=32;break;
  941.                    case 13:if (ny==0) at=16;else at=8;break;
  942.                    case 14:if (ny==0) at=4;else at=2;break;
  943.                  }
  944.                    at*= rpter[On_High];rpter[On_High]=1;
  945.              break;
  946.            case 15:if (ny==0) delt[On_High]=1; else delt[On_High]=-1;break;
  947.            case 16:if (ny==1) 
  948.                      {
  949.                    if (n==0) rpter[On_High]=-1;
  950.                    else
  951.                  {
  952.                    Dot(x*36+14,z+y*4+32);
  953.                    if (nx<11||nx>14) Addline(x*36,y,z,On_High);
  954.                    highlight(x*36+5,z+y*4-ny*20+28,26,37);
  955.                    return;
  956.                  }
  957.                  }
  958.              break;
  959.            case 17:if (ny==1) { finish=1;nt=200; } 
  960.                    else if (!fine[On_High]) 
  961.                       {
  962.                     fine[On_High]=-1;
  963.                     if (now>0) 
  964.                       {
  965.                     St[M_Id][5][On_High].nt[0]=M_p-1;x--;
  966.                     n=sum-abs(St[M_Id][M_p-1][On_High].act);
  967.                       } 
  968.                     else 
  969.                       {
  970.                     tmp[M_Id][1].act=M_p-1;x--;
  971.                     tmp_buf[M_Id][1].act=M_p-1;
  972.                     n=sum-tmp[M_Id][M_p-1].act;
  973.                       }
  974.                   }
  975.                         else 
  976.                   {
  977.                     Dot(x*36+14,z+y*4+32);
  978.                     Addline(x*36,y,z,On_High);
  979.                     highlight(x*36+5,z+y*4-ny*20+28,26,37);
  980.                     return;
  981.                   }
  982.              break;
  983.            case 18:if (ny==0) { Blank(x,z,On_High);nt=600;at=0; } 
  984.                    else delt[On_High]=200;
  985.              break;
  986.            default:if (nx<=10) 
  987.                      {
  988.                    highlight(nx*40+173,ny*42+740,26,37);
  989.                    if (now==0) nt=71;else nt=Y_Nt(y,On_High);
  990.                    switch (nx) 
  991.                  {
  992.                    case 0:if (ny==0) at=64;else at=96;break;
  993.                    case 1:
  994.                    case 2:
  995.                    case 3:
  996.                    case 4:
  997.                    case 5:at=32/(int)floor(exp((nx-1)*log(2.0))
  998.                                +0.5);
  999.                           if (y<17) ny=0;else ny=1;
  1000.                      break;
  1001.                    case 6:
  1002.                    case 7:
  1003.                    case 8:
  1004.                    case 9:
  1005.                    case 10:at=48/(int)floor(exp((nx-6)*log(2.0))
  1006.                                 +0.5);
  1007.                            if (y<17) ny=0;else ny=1;
  1008.                      break;
  1009.                  }
  1010.                    if (delt[On_High]!=0) nt+=delt[On_High];delt[On_High]=0;at*=rpter[On_High];rpter[On_High]=1;
  1011.                    highlight(nx*40+173,ny*42+740,26,37);
  1012.                  }
  1013.              break;
  1014.          }
  1015.            if (((0<=nx) && (nx<=14)) || (nx==17 && ny==1) || 
  1016.            (nx==18 && ny==0))
  1017.          {
  1018.            if (insert) 
  1019.              {
  1020.                if (now==0) 
  1021.              {
  1022.                for (bk=M_i;bk>=M_p;bk--)
  1023.                  {
  1024.                    tmp[M_Id][bk]=tmp[M_Id][bk-1];
  1025.                    tmp_buf[M_Id][bk]=tmp_buf[M_Id][bk-1];
  1026.                  }
  1027.                tmp[M_Id][M_p].note=nt;tmp[M_Id][M_p].act=at;
  1028.                tmp_buf[M_Id][M_p].note=nt;tmp_buf[M_Id][M_p].act=at;
  1029.              } 
  1030.                else
  1031.              {
  1032.                for (bk=M_i;bk>=M_p;bk--) 
  1033.                  Copy_Chord(bk-1,bk,On_High);
  1034.                Get_Nt_At(M_p,On_High,nt,at);
  1035.              }
  1036.              } 
  1037.            else 
  1038.              {
  1039.                if (now==0)
  1040.              { 
  1041.                tmp[M_Id][M_p].note=nt;tmp[M_Id][M_p].act=at;
  1042.                tmp_buf[M_Id][M_p].note=nt;tmp_buf[M_Id][M_p].act=at;
  1043.              }
  1044.                else Get_Nt_At(M_p,On_High,nt,at);
  1045.              }
  1046.          }
  1047.          }
  1048.       if (nx==16) 
  1049.     {
  1050.       if (ny==0) 
  1051.         {
  1052.           Blank(x,z,On_High);SetColor("yellow");Use_Font("7x14");
  1053.           switch (On_High)
  1054.         {
  1055.               case 0:Ry=z+V_Ht+185;break;
  1056.           case 1:Ry=z+V_Ht+105;break;
  1057.           case 2:Ry=z+105;break;
  1058.         }
  1059.           OutTextXY(x*36+12,Ry,"/");Rub(x*36+6,Ry-42,30,15,"NavyBlue");
  1060.           readat(x*36+6,Ry-30,2,&bk);
  1061.           if (bk<1) { bk=1;SetColor("cyan");Out_I_XY(x*36+6,Ry-30,1); }
  1062.           St[M_Id][M_p][On_High].nt[0]=-bk;St[M_Id][M_p][On_High].act=0;
  1063.         }
  1064.     }
  1065.       else if (nx<=15 || (nx==18 && ny==1)) 
  1066.          {
  1067.            if (now==0 || M_p<St_Start+1 || 
  1068.            White_Key(St[M_Id][M_p][On_High].nt[0],On_High)==1)
  1069.          { Blank(x,z,On_High);Addline(x*36,y,z,On_High); }
  1070.            if (now==0) y=16;
  1071.            if (M_p>St_Start-1 && (nx==15 || (nx==18 && ny==1)))
  1072.          Draw_Note(nx,ny,z,x,y-3,1,1,1,On_High);
  1073.            else if (M_p<St_Start || now==0) 
  1074.               Draw_Note(nx,ny,z,x,y,1,1,1,On_High);
  1075.                 else if (Re_Order_Notes(M_Id,M_p,nt,1,nx,ny,On_High)==1)
  1076.                        {
  1077.                  Blank(x,z,On_High);
  1078.                  if (On_High!=2) Semi_Blank(x,z,1-On_High);
  1079.                  Display_Note(M_Id,M_p,z,x,0,On_High);
  1080.                  if (On_High!=2 && 
  1081.                  M_p<St[M_Id][0][1-On_High].nt[0]+1)
  1082.                    Display_Note(M_Id,M_p,z,x,0,1-On_High);
  1083.                }
  1084.          }
  1085.     } 
  1086.   else 
  1087.     {
  1088. /*      XSetFunction(display,gc,GXcopy);
  1089.       XPutImage(display,win,gc,back,0,0,x*36+40,z+84,26,37);
  1090. */
  1091.       if (M_p<St_Start+1 && now>0) 
  1092.     {
  1093.       for (bk=0;bk<=8;bk++) St[M_Id][bk][1].act=0;
  1094.       if (nx==7) step=0;
  1095.       else 
  1096.         {
  1097.           for (bk=0;bk<=nx;bk++) St[M_Id][place[ny][bk]-1][1].act=1-ny*2;
  1098.           if (ny==0) step=nx+1;else step=-nx-1;
  1099.         }
  1100.       x=7;St[M_Id][St_Start][1].nt[0]=Nx_nt(step)+36;
  1101.       St[M_Id][St_Start][1].act=St_Start+1;nt=St[M_Id][St_Start][1].nt[0];
  1102.     } 
  1103.       else 
  1104.     {
  1105.       if (insert) 
  1106.         {
  1107.           if (now==0) 
  1108.         {
  1109.           for (bk=M_i;bk>=M_p;bk--)
  1110.             {
  1111.               tmp[M_Id][bk]=tmp[M_Id][bk-1];
  1112.               tmp_buf[M_Id][bk]=tmp_buf[M_Id][bk-1];
  1113.             }
  1114.           tmp[M_Id][M_p].note=nt;tmp[M_Id][M_p].act=at;
  1115.           tmp_buf[M_Id][M_p].note=nt;tmp_buf[M_Id][M_p].act=at;
  1116.         } 
  1117.           else 
  1118.         {
  1119.           for (bk=M_i;bk>=M_p;bk--)
  1120.             St[M_Id][bk][On_High]=St[M_Id][bk-1][On_High];
  1121.           St[M_Id][M_p][1].nt[0]=nt;St[M_Id][M_p][1].act=at;
  1122.         }
  1123.         } 
  1124.       else 
  1125.         {
  1126.           switch (nx) 
  1127.         {
  1128.           case 8:if (ny==1 && n==0) rpter[On_High]=-1;break;
  1129.           case 15:if (ny==1 && !fine[On_High]) 
  1130.                     {
  1131.                   fine[On_High]=1;x--;
  1132.                   if (now>0)
  1133.                 {
  1134.                   M_p--;St[M_Id][5][1].nt[0]=M_p;
  1135.                   n=sum-abs(St[M_Id][M_p][1].act);
  1136.                 } 
  1137.                   else 
  1138.                 { 
  1139.                   M_p--;
  1140.                   tmp[M_Id][1].act=tmp_buf[M_Id][1].act=M_p;
  1141.                   n=sum-tmp[M_Id][M_p].act;
  1142.                 }
  1143.                 }
  1144.             break;
  1145.           case 16:if (ny==1) 
  1146.                     {
  1147.                   finish=1;
  1148.                   if (now>0) 
  1149.                 { 
  1150.                   St[M_Id][M_p][1].nt[0]=200;
  1151.                   St[M_Id][M_p][1].act=0;
  1152.                 }
  1153.                   else 
  1154.                 { 
  1155.                   tmp[M_Id][M_p].note=tmp_buf[M_Id][M_p].note
  1156.                     =200;
  1157.                   tmp[M_Id][M_p].act=tmp_buf[M_Id][M_p].act=200;
  1158.                 }
  1159.                 }
  1160.             break;
  1161.           case 17:x--;break;
  1162.         }
  1163.         }
  1164.     }
  1165.     }
  1166.   if (five && (nx==15 || (nx==18 && ny==1)) && M_p>St_Start-1) x--;
  1167.   if ((M_p>St_Start-1 || now==0) && ((five && (((0<=nx) && (nx<=14)) || 
  1168.        (nx==17 && ny==0))) ||(!five && rpter[On_High]==1 && ((8<=nx) && (nx>=17)))))
  1169.     {
  1170.       if (fine[On_High]==-1 || St[M_Id][5][On_High].nt[0]==M_p) 
  1171.     { fine[On_High]=1;n=sum; }
  1172.       else if (now>0) n+=abs(St[M_Id][M_p][On_High].act);
  1173.            else n+=tmp[M_Id][M_p].act;
  1174.       if (n>=sum && !finish) 
  1175.     {
  1176.       if (n>sum) {/*  sound(888);delay(500);nosound(); */ }
  1177.       M_Bar_Num++;kp=page;kw=way;kx=x;n=0;fine[On_High]=1;
  1178.       Line_Sector(x,0,z,On_High);
  1179.     }
  1180.     }
  1181.  
  1182.   if (rpter[On_High]==-1) 
  1183.     {
  1184.       bk=St_Start;twice=0;
  1185.       do { 
  1186.        if (St[M_Id][bk-1][On_High].act<0) twice=1-twice;bk++; 
  1187.      } while (bk!=M_p);
  1188.       if (twice != 0) 
  1189.     { 
  1190.       rpter[On_High]=1;
  1191.       St[M_Id][M_p-1][On_High].act=-abs(St[M_Id][M_p-1][On_High].act);
  1192.     }
  1193.       M_p--;Repeat_Sector(x,z,twice,On_High);
  1194.       highlight(nx*40+173,ny*42+740,26,37);
  1195.       nx=3;highlight(nx*40+173,ny*42+740,26,37);
  1196.     }
  1197.   else
  1198.     {
  1199.       if (finish || (now>0 && M_p>=M_Len-10) || (now==0 && M_p>=26))
  1200.     {
  1201.       if (kp != page) 
  1202.         { 
  1203.           page=kp;way=kw;z=(way-page*2)*Dist;x=30;
  1204.           Showpage(M_Id,page,1,0,2,-1);
  1205.         }
  1206.       else 
  1207.         { 
  1208.           if (finish) { Blank(x,z,On_High);x--; }
  1209.               Line_Sector(x,0,z,On_High);Line_Sector(x,4,z,On_High);
  1210.         }
  1211.  
  1212.       Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+y*4-ny*20+28,26,37);
  1213.  
  1214.       if ((now>0 && M_p==M_Len-10) || (now==0 && M_p==26))
  1215.         {
  1216.           /* sound(3200);delay(170);nosound(); */
  1217.           insert=0;Rub(213,835,30,17,"MediumBlue");SetColor("green");
  1218.           Use_Font("10x20");OutTextXY(213,850,"Off");finish=1;
  1219.         } 
  1220.     }
  1221.       else if (((now>0 && M_i!=M_Len-9) || (now==0 && M_i!=27)) || M_p!= M_i) 
  1222.          {
  1223.            if (x<30) x++;
  1224.            else 
  1225.          {
  1226.            way++;x=1;
  1227.            if ((way % 2)==0) 
  1228.              { 
  1229.                page=way/2;St[M_Id][8][On_High].nt[0]=page;
  1230.                Showpage(M_Id,page,1,0,2,-1);
  1231.              }
  1232.            z=(way-page*2)*Dist;
  1233.          }
  1234.            if (M_p<M_i-1 && (now==0 || M_p>St_Start-1))
  1235.          {
  1236.            if (On_High==2) Showpage(M_Id,page,(way*30+x) % 60,0,2,1);
  1237.            else Showpage(M_Id,page,(way*30+x) % 60,0,1,-1);
  1238.          }
  1239.          }
  1240.     }
  1241.  
  1242.   if (Debug==20)
  1243.     { 
  1244.       if (now==0)
  1245.     printf("tmp[%i][%i].note=%i   tmp[%i][%i].act=%i   M_p=%i    M_i=%i\n",
  1246.           M_Id,M_p,tmp[M_Id][M_p].note,M_Id,M_p,tmp[M_Id][M_p].act,M_p,M_i);
  1247.       else
  1248.     printf("M_p=%i M_i=%i St[%i][%i][%i].nt[0]=%i  St[%i][%i][%i].act=%i\n",
  1249.            M_p,M_i,M_Id,M_p,On_High,St[M_Id][M_p][On_High].nt[0],M_Id,M_p,
  1250.            On_High,St[M_Id][M_p][On_High].act);
  1251.     }
  1252.  
  1253.   if (now>0) 
  1254.     {
  1255.       if (M_i<M_Len-10 && delt[On_High]==0 && (insert || M_p==M_i)) M_i++;
  1256.       St[M_Id][0][On_High].nt[0]=M_i-1;St[M_Id][M_i][On_High].nt[0]=200;
  1257.       St[M_Id][M_i][On_High].act=200;
  1258.       St[M_Id][M_i+1][On_High].nt[0]=200;St[M_Id][M_i+1][On_High].act=0;
  1259.  
  1260.       if (M_p<M_i && delt[On_High]==0 && (M_p>St_Start-1 || (M_p==St_Start-1 && x==8))) 
  1261.     M_p++;
  1262.     }
  1263.   else 
  1264.     {
  1265.       if (M_i<28 && delt[On_High]==0 && (insert || M_p==M_i)) M_i++;
  1266.       tmp[M_Id][0].note=tmp_buf[M_Id][0].note=M_i-1;
  1267.       tmp[M_Id][M_i].note=tmp_buf[M_Id][M_i].note=200;
  1268.       if (M_p<M_i && delt[On_High]==0) M_p++;
  1269.     }
  1270.  
  1271.   if (five) 
  1272.     {
  1273.       if (!finish)
  1274.     {
  1275.       Dot(x*36+14,z+y*4+32);if (nx<11 || nx>14) Addline(x*36,y,z,On_High);
  1276.       highlight(x*36+5,z+y*4-ny*20+28,26,37);
  1277.     }
  1278.     } 
  1279.   else if (M_p>St_Start-1 || now==0) 
  1280.          {
  1281. /*
  1282.        XSetFunction(display,gc,GXcopy);
  1283.        XPutImage(display,win,gc,pure,0,0,nx*40+173,ny*42+740,26,37);
  1284. */
  1285.        nx=9;ny=0;
  1286. /*
  1287.        pure=XGetImage(display,win,nx*40+173,ny*42+740,26,37,8,ZPixmap);
  1288. */
  1289.        highlight(nx*40+173,ny*42+740,26,37);
  1290.        if (!finish) 
  1291.          {
  1292. /*
  1293.            XSetFunction(display,gc,GXxor);
  1294.            XPutImage(display,win,gc,pure,0,0,x*36+40,z+34,26,37);
  1295.            back=XGetImage(display,win,x*36+40,z+34,26,37,8,ZPixmap);
  1296. */
  1297.            Dot(x*36+14,z+y*4+32);highlight(x*36+5,z+34,26,37);
  1298.          }
  1299.        if (M_p==M_i && !finish) 
  1300.          {
  1301.            if (rpter[On_High]==1)
  1302.          {
  1303.            if (now>0) 
  1304.              { 
  1305.                St[M_Id][M_p][1].nt[0]=Nx_nt(step)+36;
  1306.                St[M_Id][M_p][1].act=16; 
  1307.              }
  1308.            else 
  1309.              { 
  1310.                tmp[M_Id][M_p].note=tmp_buf[M_Id][M_p].note=36;
  1311.                tmp[M_Id][M_p].act=tmp_buf[M_Id][M_p].act=16;
  1312.              }
  1313.            if (now>0) nt=St[M_Id][M_p][1].nt[0];
  1314.            else nt=tmp[M_Id][M_p].note;
  1315.          } 
  1316.            else 
  1317.          {
  1318.            if (now>0) St[M_Id][M_p][1].act=-St[M_Id][M_p][1].act;
  1319.            else 
  1320.              {
  1321.                tmp[M_Id][M_p].act=-tmp[M_Id][M_p].act;
  1322.                tmp_buf[M_Id][M_p].act=-tmp_buf[M_Id][M_p].act;
  1323.              }
  1324.            rpter[On_High]=1;
  1325.          }
  1326.          }
  1327.      }
  1328.   Renew_Bar_Num();
  1329. }
  1330.  
  1331. void Get_Timbre(ch)
  1332.   char ch;
  1333. {
  1334.   if (now>0) 
  1335.     {
  1336.       Rub(820,3,40,25,"MediumBlue");Use_Font("12x24");SetColor("gold");
  1337.       bk=St[M_Id][7][On_High].nt[0];if (bk<0) bk=0;
  1338.       if (ch==',') { if (bk==0) bk=100;else bk--; }
  1339.       else if (bk==100) bk=0;else bk++;
  1340.       St[M_Id][7][On_High].nt[0]=bk;Out_I_XY(820,26,St[M_Id][7][On_High].nt[0]);
  1341.     }     
  1342. }
  1343.  
  1344. void Play_Note()
  1345. {
  1346.   twice=(int)floor(speed+0.5);speed=1/(2*speed);
  1347.   if (now>0) 
  1348.     {
  1349.       if (St[M_Id][M_p-2][1].nt[0]>=31 && St[M_Id][M_p-2][1].nt[0]<=62) 
  1350.     {
  1351.       switch (St[M_Id][M_p-2][1].nt[0]) 
  1352.         {
  1353.           case 55:
  1354.           case 43:
  1355.           case 31:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][(int)
  1356.                              ((int)floor(3.5*St[M_Id][6][1].nt[0]+0.5))][1].act;
  1357.         break;
  1358.           case 53:
  1359.           case 41:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+
  1360.             St[M_Id][(int)floor(3.5*St[M_Id][6][1].nt[0]+0.5)+1][1].act;
  1361.         break;
  1362.           case 52:
  1363.           case 40:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][2][1].act;
  1364.         break;
  1365.           case 50:
  1366.           case 62:
  1367.           case 38:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][3][1].act;
  1368.         break;
  1369.           case 48:
  1370.           case 60:
  1371.           case 36:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][4][1].act;
  1372.         break;
  1373.           case 47:
  1374.           case 59:
  1375.           case 35:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][5][1].act;
  1376.         break;
  1377.           case 45:
  1378.           case 57:
  1379.           case 33:ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0]+St[M_Id][6][1].act;
  1380.         break;
  1381.         }
  1382.     }
  1383.       else ptr_.nt[0]=St[M_Id][M_p-2][1].nt[0];
  1384.       if (ptr_.nt[0]>0) 
  1385.     {
  1386.       d=freq;FORLIM=ptr_.nt[0];for (bk=31;bk<FORLIM;bk++) d*=1.0594631;
  1387.       ptr_.nt[0]=(int)floor(d+0.5);
  1388.     }
  1389.       rlact=9.375*Measure*St[M_Id][M_p-2][1].act*speed;
  1390.       ptr_.at=(int)floor(rlact*pct+0.5);ptr_.cm=(int)floor(rlact*(100-pct)+0.5);
  1391.     } 
  1392.   else 
  1393.     {
  1394.       ptr_.nt[0]=-1;rlact=9.375*Measure*tmp[M_Id][M_p-2].act*speed;
  1395.       ptr_.at=(int)floor(rlact*pct+0.5);ptr_.cm=(int)floor(rlact*(100-pct)+0.5);
  1396.     }
  1397.   if (St[M_Id][7][1].nt[0] != 0) { tim_pt=*tim[St[M_Id][7][1].nt[0]-1];Mixup(); }
  1398.   Play();speed=twice;
  1399. }
  1400.  
  1401. void Do_KeyPress(ch)
  1402.   char ch;
  1403. {
  1404.   switch (ch) 
  1405.     {
  1406.       case 'C':
  1407.       case 'Z':
  1408.       case 'X':Select_Sample(ch);break;
  1409.       case '<':Move_Left();break;
  1410.       case '>':Move_Right();break;
  1411.       case '?':Move_Up();break;
  1412.       case '@':Move_Down();break;
  1413.       case '{':Insert_Note();break;
  1414.       case '#':Lock();break;                        /* Home */
  1415.       case '$':Page_Up();break;                     /* PgUp */
  1416.       case '^':Page_Down();break;                   /* PgDn */
  1417.       case '}':Delete_Note();break;
  1418.       case '*':                                     /*  F1  */
  1419.       case '/':                                     /*  F2  */
  1420.       case '+':                                     /*  F3  */
  1421.       case '=':                                     /*  F4  */
  1422.       case '[':                                     /*  F5  */
  1423.       case ']':Use_Font("12x24");
  1424.            if (!lock && (ch=='*' || ch=='/'))   /*  F1  F2  */
  1425.          {
  1426.            if (M_Id!=0)
  1427.              {
  1428.               _LA:Rub(67,3,477,25,"MediumBlue");SetColor("gold");page=0;
  1429.                   if (ch=='*') 
  1430.                 { if (M_Id>0) M_Id--;else M_Id=content[now]-1; } 
  1431.                   else { if (M_Id<content[now]-1) M_Id++;else M_Id=0; }
  1432.               if (now>0) OutTextXY(67,26,names[now*1000+M_Id]);
  1433.               else 
  1434.                 { 
  1435.                   OutTextXY(80,26,"Tempo--");
  1436.                   Out_I_XY(170,26,M_Id+1);
  1437.                 }
  1438.               do {
  1439.                    ch=GetKey();if (ch=='*' || ch=='/') goto _LA;
  1440.                  } while (ch != '!' && ch != '&');
  1441.               marker=1;
  1442.               if (ch=='&') return;
  1443.               else { head=M_Id+1;Save(M_Id+1,tail); }
  1444.               Showpage(M_Id,0,1,0,2,-1);M_p=St_Start;x=8;z=0;
  1445.               if (On_High==2) y=21;else y=21+V_Ht/4;
  1446.                   Dot(x*36+14,z+y*4+32);
  1447.                   highlight(x*36+5,z+y*4-ny*20+28,26,37);
  1448.               }
  1449.          }
  1450.            else if (now>0)     /*  Input Instrument & Melody #  */
  1451.               {
  1452.             switch (ch) 
  1453.               {
  1454.                 case '*':lf=10;hf=779;rn=1;break;   /*  F1  */
  1455.                 case '/':lf=10;hf=809;rn=2;break;   /*  F2  */
  1456.                 case '+':lf=10;hf=839;rn=3;break;   /*  F3  */
  1457.                 case '=':lf=977;hf=779;rn=-1;break;  /*  F4  */
  1458.                 case '[':lf=977;hf=809;rn=-2;break;  /*  F5  */
  1459.                 case ']':lf=977;hf=839;rn=-3;break;  /*  F6  */
  1460.               }
  1461.             Use_Font("7x14");Rub(lf-3,hf-6,70,24,"MediumBlue");
  1462.             Rub(lf+77,hf-6,70,24,"MediumBlue");
  1463.             for (twice=1;twice<=2;twice++) 
  1464.               {
  1465.                 if (twice==1)
  1466.                   {
  1467.                 readat(lf+6,hf+16,4,&bk);
  1468.                 if (bk<0) { Get_The_Set(M_Id,-(bk+1));break; }
  1469.                 if (rn>0) St[M_Id][0][1].nt[rn]=bk;
  1470.                 else St[M_Id][0][2].nt[-rn]=bk;
  1471.                   }
  1472.                 else if (twice==2)
  1473.                        {
  1474.                      readat(lf+100,hf+16,2,&bk);
  1475.                      if (rn>0) St[M_Id][1][1].nt[rn]=bk;
  1476.                      else St[M_Id][1][2].nt[-rn]=bk;
  1477.                                      if (0<bk && bk<=content[0])
  1478.                        Get_Tempo(M_Id,rn);
  1479.                    }
  1480.               }
  1481.               }
  1482.     break;
  1483.       case '%':End();break;
  1484.       case '!':if (M_p<M_Len-10) Return();break;
  1485.       case ',':
  1486.       case '.':Get_Timbre(ch);break;
  1487. /*
  1488.       case ' ':Play_Note();break;
  1489.       case 'L':if (now==0) Signal=0;else Signal=1;Sing(M_Id+1);break;
  1490. */
  1491.     }
  1492. }
  1493.  
  1494. void Input(Melody_Id)
  1495.   int Melody_Id;
  1496. {
  1497.   XEvent report;
  1498.   KeySym ks;
  1499.   int button,Ms_x,Ms_y,old_Ms_x,old_Ms_y,dx,dy,Value;
  1500.  
  1501.   old_Ms_x=200;old_Ms_y=200;Ms_x=old_Ms_x;Ms_y=old_Ms_y;kp=0;kw=0;n=0;
  1502.   if (Get_Input_Info(Melody_Id)==-1) return;
  1503.   if (now==0) { M_i=4;M_p=3; } 
  1504.   else 
  1505.     { 
  1506.       M_i=St_Start;M_p=St_Start-1;New_Word=Get_Word_Id();
  1507.       if (strlen(Words[New_Word])>0) Show_Word(New_Word,0);
  1508.     }
  1509.  
  1510.   if (marker==1) 
  1511.     {
  1512.       nx=-1;ny=-1;Showpage(M_Id,0,1,0,2,-1);
  1513.       if (now>0) 
  1514.     {
  1515.       M_i=St[M_Id][0][On_High].nt[0]+1;
  1516.       speed=(double)St[M_Id][3][1].nt[0];pct=St[M_Id][4][1].nt[0];
  1517.     }
  1518.       else M_i=tmp[M_Id][0].note+1;
  1519.     }
  1520.  
  1521.   if (five) { if (now==0) nx=3;else nx=15; } 
  1522.   else { if (now==0) nx=9;else nx=7; }
  1523.  
  1524.   V_i=H_i=L_i=M_i;V_p=H_p=L_p=M_p;V_way=H_way=L_way=way=0;V_z=H_z=L_z=z=0;
  1525.   fine[0]=fine[1]=fine[2]=0;insert=0;delt[0]=delt[1]=delt[2]=0;
  1526.   rpter[0]=rpter[1]=rpter[2]=1;V_Bar_Num=H_Bar_Num=L_Bar_Num=M_Bar_Num=0;
  1527.   V_nx=H_nx=L_nx=nx;onto=0;finish=0;
  1528.   V_ny=H_ny=L_ny=ny=0;V_y=y=16;H_y=16+V_Ht/4;L_y=36+V_Ht/4;
  1529.  
  1530.   highlight(nx*40+173,ny*42+740,26,37);
  1531.  
  1532.   if (five) 
  1533.     {
  1534.       Dot(x*36+14,z+y*4+32);Addline(x*36,y,z,On_High);
  1535.       highlight(x*36+5,z+y*4-ny*20+28,26,37);
  1536.     }
  1537.   else 
  1538.     {
  1539. /*
  1540.       XSetFunction(display,gc,GXcopy);
  1541.       XPutImage(display,win,gc,pure,0,0,x*36+40,z+34,26,37);
  1542.       back=XGetImage(display,win,x*36+40,z+34,26,37,8,ZPixmap);
  1543. */
  1544.       highlight(x*36+40,z+34,26,37);
  1545.     }
  1546.   _LR:do {
  1547.            if (now==0) tmp[M_Id][0].note=tmp_buf[M_Id][0].note=M_i-1;
  1548.        else St[M_Id][0][On_High].nt[0]=M_i-1;
  1549.        XNextEvent(display,&report);
  1550.        switch(report.type) 
  1551.          {
  1552.                case MotionNotify:Ms_x=report.xmotion.x;Ms_y=report.xmotion.y;
  1553.                          dx=Ms_x-old_Ms_x;dy=Ms_y-old_Ms_y;
  1554.                              if (On_Text==1)
  1555.                    DoMotionEvent(report,Ms_x,Ms_y,dx,dy);
  1556.          break;
  1557.            case ButtonPress:button=report.xbutton.button;
  1558.                         Ms_x=report.xbutton.x;Ms_y=report.xbutton.y;
  1559.                         Value=DoButtonEvent(report,button,Ms_x,Ms_y,
  1560.                             M_Id,nx,ny);
  1561.                         if (On_Text==0) Adjust_Cursor(button,Value);
  1562.          break;
  1563.            case KeyPress:ks=XLookupKeysym(report,0);
  1564.                      switch(ks)
  1565.                    {
  1566.                      case XK_F1:ch='*';break;
  1567.                  case XK_F2:ch='/';break;
  1568.                  case XK_F3:ch='+';break;
  1569.                  case XK_F4:ch='=';break;
  1570.                  case XK_F5:ch='[';break;
  1571.                  case XK_F6:ch=']';break;
  1572.                  case XK_Return:ch='!';break;
  1573.                  case XK_Escape:ch='&';break;
  1574.                  case XK_Left:ch='<';break;
  1575.                  case XK_Right:ch='>';break;
  1576.                  case XK_Up:ch='?';break;
  1577.                  case XK_Down:ch='@';break;
  1578.                  case 65496:ch='#';break;          /*  Home  */
  1579.                  case 65502:ch='%';break;          /*  End   */
  1580.                  case 65498:ch='$';break;          /*  PgUp  */
  1581.                  case 65504:ch='^';break;          /*  PgDn  */
  1582.                  case XK_Num_Lock:ch='|';break;
  1583.                  case XK_Insert:ch='{';break;
  1584.                  case XK_Delete:ch='}';break;
  1585.                  default:XLookupString(report,tmpstr,128,&ks,0);
  1586.                          if (isalpha(tmpstr[0])) 
  1587.                        ch=toupper(tmpstr[0]);
  1588.                      else ch=tmpstr[0];
  1589.                    break;
  1590.                    }
  1591.                      if (On_Text==0) Do_KeyPress(ch);
  1592.          break;
  1593.          }
  1594.      } while (!(ch=='V' || finish || ch=='&')); 
  1595.   if (ch=='&') return;
  1596.   if (ch=='V') 
  1597.     { 
  1598.       if (now==0) { tmp[M_Id][0].note+=1;tmp_buf[M_Id][0].note+=1; }
  1599.       else St[M_Id][0][On_High].nt[0]+=1;
  1600.     }
  1601.   head=M_Id+1;Save(M_Id+1,tail);finish=0;goto _LR;
  1602.  
  1603.  
  1604. /*  Note ==31  in Play_Note should be changed  */
  1605.