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 >
Wrap
C/C++ Source or Header
|
1992-07-16
|
31KB
|
1,134 lines
/* ====== NM-Atom.c ======
*
* char *Get_Filename(Now,Full_Name)
* void Display_Array(Id,P_a,P_z,Now)
* void Save_Words()
* void Load_Words()
* int Get_Word_Id()
* void Get_Set_List()
* void Get_List()
* void Save_Set()
* void Save_Name()
* void Load_Name()
* void Load()
* void Save(k,Last_Id)
* void Delete_Set(Id)
* void Init()
* void Draw_Silent(X,Y)
* void Addot(x,z)
* void Blank(X,Z,At_high)
* void Semi_Blank(x,z,At_high)
* void Line_Sector(x,delt_x,z,At_high)
* void Repeat_Sector(x,z,twice,At_high)
* void Adjust_High_Low(fx,fy,Switch)
* void Adjust_Text(fx,fy,Switch)
* void Show_Text_Table(X,Y)
* void Draw_Wave(x,y)
* void Draw_Climax(x,y)
* void Draw_Rise(x,y)
* void Draw_Fall(x,y)
* void Draw_Arch(x,y)
* void Draw_Bowl(x,y)
* void Draw_R_Line(x,y)
* void Draw_Repeat(x,y)
* void Draw_F_Line(x,y)
* void Draw_H_Line(x,y)
* void Set_Table(X,Y)
* void Draw_Mini_Staff(X,Y)
* void Draw_A_Staff(I,Y)
* void Staff(now,five,input)
* void Cat(x,y,dx,dy,bkcolor)
* void Square(n,k)
* void Mixup()
* void Fix_p(p,i,num)
* void Tableout(k)
* void Figout()
* void Pickup(x,way,n)
* void Pointout(x,y,z,ny,At_high)
* void Get_Tempo(Mdy_Id,St_H_L)
* int Same_Tempo(Mdy_Id,St_H_L,Tempo_Id)
* void Add_To_Tempo(Mdy_Id,St_H_L)
* void Check_Tempo()
* void Clear_Chord_Bank()
*
*/
#include "NM.h"
two place={{2,5,1,4,7,3,6},{6,3,7,4,8,5,9}};
char *Get_Filename(Now,Full_Name)
int Now,Full_Name;
{
if (Full_Name==1)
{
strcpy(filname,"Dir_Song/im.");
if (*Old_name[Now]!='\0')
sprintf(filname+strlen(filname),"%s",
Sub_Str(Old_name[Now],0,strlen(Old_name[Now])-1));
else sprintf(filname+strlen(filname),"%s",
Sub_Str(In_name[Now],0,strlen(In_name[Now])-1));
return filname;
}
else return In_name[Now];
}
void Display_Array(Id,P_a,P_z,Now)
int Id,P_a,P_z,Now;
{
int i,j;
printf("\n============================================================");
if (Now==0)
{
printf("\n tmp=%i tmp.note tmp.act tmp_buf.note tmp_buf.act",Id);
printf("\n-----------------------------------------------------------\n");
for (i=P_a;i<30;i++)
printf(" <%2i> %4i %4i %4i %4i\n",i,
tmp[Id][i].note,tmp[Id][i].act,tmp_buf[Id][i].note,
tmp_buf[Id][i].act);
}
else
{
printf("===================================================");
printf("==================================================\n");
printf(" St=%i ",Id);
printf("V_nt[0] V_nt[1] V_nt[2] V_nt[3] V_act V_vol ");
printf("H_nt[0] H_nt[1] H_nt[2] H_nt[3] H_act H_vol ");
printf("L_nt[0] L_nt[1] L_nt[2] L_nt[3] L_act L_vol\n");
printf("---------------------------------------------------");
printf("---------------------------------------------------");
printf("-----------------------------------------------------------\n");
for (i=P_a;i<P_z;i++)
{
printf(" <%3i>",i);
for (j=0;j<4;j++) printf(" %4i",St[Id][i][0].nt[j]);
printf(" %4i %4i ",St[Id][i][0].act,St[Id][i][0].vol);
for (j=0;j<4;j++) printf(" %4i",St[Id][i][1].nt[j]);
printf(" %4i %4i ",St[Id][i][1].act,St[Id][i][1].vol);
for (j=0;j<4;j++) printf(" %4i",St[Id][i][2].nt[j]);
printf(" %4i %4i\n",St[Id][i][2].act,St[Id][i][2].vol);
}
printf("===================================================");
printf("==================================================");
}
printf("============================================================\n");
}
void Save_Words()
{
int i,Junk;
if ((filvar=fopen("Dir_Song/im.Words","w"))!=NULL)
{ setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
else filvar=tmpfile();
/* Kick out the junks */
S_bf=(char *)malloc(10);*S_bf='\0';*Word_Top='\0';Junk=0;
for (i=0;i<Word_Num;i++)
if (strlen(Words[i])<5 || Words_Array[i]==0) { Words_Array[i]=0;Junk++; }
sprintf(S_bf,"%4ld",Word_Num-Junk);strcat(Word_Top,S_bf);
for (i=0;i<Word_Num;i++)
if (Words_Array[i]>0)
{
S_bf=(char *)malloc(10);*S_bf='\0';
sprintf(S_bf,"%5ld",Words_Array[i]);strcat(Word_Top,S_bf); }
fprintf(filvar,"%s\n",Word_Top);
for (i=0;i<Word_Num;i++)
if (Words_Array[i]>0) fprintf(filvar,"%s\n",Words[i]);
if (filvar != NULL) fclose(filvar);filvar=NULL;
}
void Load_Words()
{
int i,j;
char *Word_Buf;
for (i=0;i<1000;i++)
{ Words[i]=(char *)malloc(3000);*Words[i]='\0';Words_Array[i]=0; }
Word_Buf=(char *)malloc(3000);*Word_Buf='\0';Word_Num=0;New_Word=0;
if ((filvar=fopen("Dir_Song/im.Words","r"))!=NULL)
{
setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar);
S_bf=(char *)malloc(10);*S_bf='\0';
fgets(Word_Top,5004,filvar);Word_Num=atoi(strncpy(S_bf,Word_Top,4));
for (i=0;i<Word_Num;i++)
{
S_bf=(char *)malloc(10);*S_bf='\0';
j=atoi(strncpy(S_bf,Word_Top+5*i+4,5));Words_Array[i]=j;
fgets(Word_Buf,3000,filvar);
sprintf(Words[i],"%s",Sub_Str(Word_Buf,0,strlen(Word_Buf)-1));
}
if (filvar != NULL) fclose(filvar);filvar=NULL;
}
}
int Get_Word_Id()
{
int i;
for (i=0;i<Word_Num;i++) { if (Words_Array[i]-1==now*1000+M_Id) return i; }
if (Motion==Input_On || Load_On==1)
{
New_Word=Word_Num;Words_Array[New_Word]=now*1000+M_Id+1;Word_Num++;
return New_Word;
}
else return -1;
}
void Get_Set_List()
{
int j;
if (content[Max_kind-1]>Max_num) Max_num=content[Max_kind-1];
for (j=0;j<Max_num+1;j++)
{
Atom_array[j][Max_kind]=(char *)malloc(50);*Atom_array[j][Max_kind]='\0';
}
for (j=0;j<content[Max_kind-1];j++)
strcpy(Atom_array[j][Max_kind]+strlen(Atom_array[j][Max_kind]),
cont[j].Set_name);
}
void Get_List()
{
int i,j,Number;
Table_Column_Num=Max_kind+1;Table_Row_Num=0;
for (i=0;i<Max_kind;i++)
{
Number=content[i];if (Number>Table_Row_Num) Table_Row_Num=Number;
Out_name[i]=(char *)malloc(50);*Out_name[i]='\0';
strcpy(Out_name[i],In_name[i]);S_bf=(char *)malloc(10);*S_bf='\0';
sprintf(S_bf,"%-4i",Number);
sprintf(Out_name[i]+strlen(Out_name[i])-1," = %s\n",S_bf);
}
for (j=0;j<Max_num+1;j++)
{
Atom_array[j][0]=(char *)malloc(50);*Atom_array[j][0]='\0';
sprintf(S_bf,"%-4i",j+1);strcpy(Atom_array[j][0],S_bf);
}
for (i=0;i<Max_kind;i++)
{
if (i<Max_kind-1)
{
for (j=0;j<Max_num+1;j++)
{ Atom_array[j][i+1]=(char *)malloc(50);*Atom_array[j][i+1]='\0'; }
Number=content[i];
for (j=0;j<Number;j++)
strcpy(Atom_array[j][i+1]+strlen(Atom_array[j][i+1]),
names[i*1000+j]);
}
else Get_Set_List();
}
}
void Save_Set()
{
int j,Num;
if ((confile=fopen("Dir_Song/IM.con","w"))!=NULL)
{ setvbuf(confile,buf,_IOFBF,2048);rewind(confile); }
else confile=tmpfile();
Num=content[Max_kind-1];
for (j=0;j<Num;j++) fwrite(&cont[j],sizeof(Tempo_Set),1,confile);
if (confile != NULL) fclose(confile);confile=NULL;
}
void Save_Name()
{
int i,j,p,Num;
char *F_Old,*F_New,*Command;
if ((filvar=fopen("Dir_Song/IM.Names","w"))!=NULL)
{ setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
else filvar=tmpfile();
fprintf(filvar,"%s",Table_Name);
for (i=0;i<Max_kind;i++)
{
fprintf(filvar,"%s",In_name[i]);
if (*Old_name[i]!='\0')
{
F_Old=(char *)malloc(50);*F_Old='\0';
sprintf(F_Old+strlen(F_Old),"Dir_Song/im.%s",
Sub_Str(Old_name[i],0,strlen(Old_name[i])-1));
if ((melodyfile=fopen(F_Old,"r"))!=NULL)
{
fclose(melodyfile);melodyfile=NULL;
F_New=(char *)malloc(50);*F_New='\0';
sprintf(F_New+strlen(F_New),"Dir_Song/im.%s",
Sub_Str(In_name[i],0,strlen(In_name[i])-1));
Command=(char *)malloc(200);*Command='\0';
sprintf(Command+strlen(Command),"mv %s %s",F_Old,F_New);
system(Command);Old_name[i]=(char *)malloc(50);*Old_name[i]='\0';
}
}
}
if (filvar != NULL) fclose(filvar);filvar=NULL;
if ((filvar=fopen("Dir_Song/im.lst","w"))!=NULL)
{ setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar); }
else filvar=tmpfile();
*top='\0';S_bf=(char *)malloc(10);*S_bf='\0';
for (i=0;i<Max_kind;i++) { sprintf(S_bf,"%4ld",content[i]);strcat(top,S_bf); }
fprintf(filvar,"%s\n",top);
for (i=0;i<Max_kind-1;i++)
{
Num=content[i];
for (j=0;j<Num;j++)
{ p=i*1000+j;if (*names[p]!='\0') fprintf(filvar,"%s",names[p]); }
}
if (filvar != NULL) fclose(filvar);filvar=NULL;
if (Word_Num<0) { Word_Num=-Word_Num;Save_Words(); }
}
void Load_Name()
{
int i,j,Num;
for (i=0;i<35000;i++) { names[i]=(char *)malloc(50);*names[i]='\0'; }
if ((filvar=fopen("Dir_Song/im.lst","r"))!=NULL)
{
setvbuf(filvar,buf,_IOFBF,2048);rewind(filvar);;
fgets(top,180,filvar);S_bf=(char *)malloc(10);*S_bf='\0';Max_num=-1;
for (i=0;i<Max_kind-1;i++)
{
j=atoi(strncpy(S_bf,top+4*i,4));Get_Filename(i,1);
if ((melodyfile=fopen(filname,"r"))!=NULL)
{
fclose(melodyfile);melodyfile=NULL;content[i]=j;
for (Num=0;Num<j;Num++) { fgets(names[i*1000+Num],50,filvar); }
}
else content[i]=0;
if (content[i]>Max_num) Max_num=content[i];
total+=content[i];
}
if (filvar != NULL) fclose(filvar);filvar=NULL;
}
for (i=0;i<1000;i++)
{
*cont[i].Set_name='\0';S_bf=(char *)malloc(10);*S_bf='\0';
sprintf(S_bf,"%5ld",i+1);strcpy(cont[i].Set_name,S_bf);ch='.';
sprintf(cont[i].Set_name+strlen(cont[i].Set_name),"%c",ch);
sprintf(cont[i].Set_name+strlen(cont[i].Set_name),"%s\n","???");
for (j=0;j<6;j++) { cont[i].tempo[j]=-1;cont[i].instru[j]=-1; }
}
if ((confile=fopen("Dir_Song/IM.con","r"))!=NULL)
{
setvbuf(confile,buf,_IOFBF,2048);rewind(confile);Num=0;
do {
fread(&cont[Num],sizeof(Tempo_Set),1,confile);Num++;
} while (!feof(confile));
content[Max_kind-1]=Num;if (Num>Max_num) Max_num=Num;
if (confile != NULL) fclose(confile);confile=NULL;
}
else content[i]=0;
Load_Words();
}
void Load()
{
int i,j,Nt_V,Nt_H,Nt_L,FORLIM;
Get_Filename(now,1);FORLIM=content[now];
melodyfile=fopen(filname,"r");rewind(melodyfile);
for (j=0;j<FORLIM;j++)
{
i=0;Nt_L=Nt_V=200;
do {
if (now>0)
{
fread(&St[j][i][0],sizeof(Chord),1,melodyfile);
fread(&St[j][i][1],sizeof(Chord),1,melodyfile);
fread(&St[j][i][2],sizeof(Chord),1,melodyfile);
Nt_V=St[j][i][0].nt[0];
Nt_H=St[j][i][1].nt[0];Nt_L=St[j][i][2].nt[0];
}
else
{
fread(&tmp[j][i],sizeof(Tempo_Unit),1,melodyfile);
Nt_H=tmp[j][i].note;
}
i++;
} while ((Nt_V!=200 || Nt_H!=200 || Nt_L!=200) &&
((now>0 && i<M_Len-7) || (now==0 && i<29)));
do {
if (now>0) St[j][i][0].nt[0]=St[j][i][1].nt[0]=St[j][i][2].nt[0]=200;
else tmp[j][i].note=200;
i++;
} while ((now>0 && i<M_Len) || (now==0 && i<29));
}
if (melodyfile != NULL) fclose(melodyfile);melodyfile=NULL;
}
void Save(k,Last_Id)
int k,Last_Id;
{
int i,j,Nt_V,Nt_H,Nt_L,Num,FORLIM;
if (Del>-1)
{
if (Del != content[now]-1)
{
FORLIM=content[now]-Del-k;
for (j=0;j<FORLIM;j++)
{
i=-1;
do {
Num=Del+j;i++;
if (now>0)
{
St[Num][i][0]=St[Num+k][i][0];
St[Num][i][1]=St[Num+k][i][1];
St[Num][i][2]=St[Num+k][i][2];
}
else tmp[Num][i]=tmp[Num+k][i];
} while ((now>0 && i<M_Len) || (now==0 && i<29));
sprintf(names[now*1000+Num]+6,"%s",Sub_Str(names[now*1000+Num+k],
6,44));
}
}
else { names[now*1000+Del]=(char *)malloc(50);*names[now*1000+Del]='\0'; }
content[now]-=k;Last_Id=content[now];
}
Get_Filename(now,1);melodyfile=fopen(filname,"w");
if (melodyfile != NULL) rewind(melodyfile);else melodyfile=tmpfile();
for (j=0;j<Last_Id;j++)
{
if (Debug==20) Display_Array(j,20,35,now);
i=0;Nt_V=Nt_L=200;
do {
if (now>0)
{
fwrite(&St[j][i][0],sizeof(Chord),1,melodyfile);
fwrite(&St[j][i][1],sizeof(Chord),1,melodyfile);
fwrite(&St[j][i][2],sizeof(Chord),1,melodyfile);
Nt_V=St[j][i][0].nt[0];
Nt_H=St[j][i][1].nt[0];Nt_L=St[j][i][2].nt[0];
}
else
{
if (i>26) tmp[j][i].act=200;
fwrite(&tmp[j][i],sizeof(Tempo_Unit),1,melodyfile);
Nt_H=tmp[j][i].note;
}
i++;
} while ((Nt_V!=200 || Nt_H!=200 || Nt_L!=200) &&
((now>0 && i<M_Len) || (now==0 && i<29)));
}
if (Last_Id>Max_num) Max_num=Last_Id;
if (melodyfile != NULL) fclose(melodyfile);melodyfile=NULL;
content[now]=Last_Id;Save_Name();Get_List();
}
void Delete_Set(Id)
int Id;
{
int i,k,Num;
Num=content[Max_kind-1];
for (i=Id+1;i<Num;i++)
{
sprintf(cont[i-1].Set_name+6,"%s",Sub_Str(cont[i].Set_name,6,44));
for (k=0;k<6;k++)
{
cont[i-1].tempo[k]=cont[i].tempo[k];
cont[i-1].instru[k]=cont[i].instru[k];
}
}
*cont[Num-1].Set_name='\0';sprintf(S_bf,"%5ld",Num);
strcpy(cont[Num-1].Set_name,S_bf);ch='.';
sprintf(cont[Num-1].Set_name+strlen(cont[Num-1].Set_name),"%c",ch);
sprintf(cont[Num-1].Set_name+strlen(cont[Num-1].Set_name),"%s\n","???");
for (k=0;k<6;k++) { cont[Num-1].tempo[k]=0;cont[Num-1].instru[k]=0; }
if (Num>0) content[Max_kind-1]--;
}
void Init()
{
int k;
next=total=Signal=unite=On_Text=Column_On=Row_On=Table_Width=Table_Height=0;
Piano_X=40;Piano_Y=660;Atom_On=1;Tour_On=0;Back_Id=0;Debug=100;
Map_Row_Id=Map_Column_Id=Text_Row_Id=Text_Column_Id=Row_Id=Column_Id=-10;
Row_Aim=-1;Column_Aim=-1;Word_Pos=Word_X=Text_Base;Word_Y=0;Text_SY=743;
Show_Column_Line=1;Show_Row_Line=1;Column_Pointer=1;Row_Pointer=0;Load_On=0;
Volumn=100;At_Value=0;Value_H_X=72;Value_H_Y=30;Value_H_W=50;Value_H_H=20;
Print_pt=0;V_Ht=128;Dist=222+V_Ht;
Find_Filename();Load_Name();
if (content[0]>0) Load();
if ((timfile=fopen("Dir_Song/IM.tim","r"))!=NULL)
{
rewind(timfile);Timbre_num=0;
do {
tim[Timbre_num]=(more *)malloc(sizeof(more));
fread(tim[Timbre_num],sizeof(more),1,timfile);Timbre_num++;
} while (!feof(timfile));
if (timfile != NULL) fclose(timfile);timfile=NULL;
}
else Timbre_num=0;
if ((unifile=fopen("Dir_Song/IM.uit","r"))!=NULL)
{
rewind(unifile);contain=0;
do {
for (k=0;k<11;k++) fread(&uniset[contain][k],sizeof(long),1,unifile);
contain++;
} while (!feof(unifile));
if (unifile != NULL) fclose(unifile);unifile=NULL;
}
else contain=0;
Get_List();
}
void Draw_Silent(X,Y)
int X,Y;
{
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);
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);
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);
Line(X-3,Y-7,X-1,Y-2);Line(X-2,Y-6,X-1,Y-2);
}
void Addot(x,z)
int x,z;
{
if (x<0) { x=-x;SetColor("blue"); }
if (nt<36) DrawEllipse(x*36+8,z+51,1,1,0,360*64);
else if (nt>47)
{
DrawEllipse(x*36+8,z+31,1,1,0,360*64);
if (nt>59) DrawEllipse(x*36+12,z+31,1,1,0,360*64);
}
SetColor("white");
}
void Blank(X,Z,At_high)
int X,Z,At_high;
{
int i,Dy,Dz,Dh;
if (now>0)
{
switch (At_high)
{
case 0:Dy=164+V_Ht;Dz=157+V_Ht;Dh=97;break;
case 1:Dy=84+V_Ht;Dz=33+V_Ht;Dh=124;break;
case 2:Dy=84;Dz=33;Dh=115;break;
}
Rub(X*36+5,Z+Dz,36,Dh,"NavyBlue");
if (At_high==2) SetColor("white");
else if (At_high==1) SetColor("ivory");
else if (At_high==0) SetColor("grey");
for (i=0;i<=4;i++) Line(X*36+5,Z+i*8+Dy,X*36+41,Z+i*8+Dy);
}
else if (now==0)
{
Rub(X*36+5,Z+69,36,60,"NavyBlue");SetColor("white");
Line(X*36+5,Z+100,X*36+41,Z+100);
}
}
void Semi_Blank(x,z,At_high)
int x,z,At_high;
{
int i,Dy,Dz,Dh;
switch (At_high)
{
case 0:Dy=164+V_Ht;Dz=157+V_Ht;Dh=97;break;
case 1:Dy=84+V_Ht;Dz=33+V_Ht;Dh=124;break;
case 2:Dy=84;Dz=33;Dh=115;break;
}
Rub(x*36+5,z+Dz,25,Dh,"NavyBlue");
if (At_high==2) SetColor("white");
else if (At_high==1) SetColor("ivory");
else if (At_high==0) SetColor("grey");
for (i=0;i<=4;i++) Line(x*36+5,z+i*8+Dy,x*36+32,z+i*8+Dy);
}
void Line_Sector(x,delt_x,z,At_high)
int x,delt_x,z,At_high;
{
int Sy,Ey;
switch (At_high)
{
case 0:Sy=V_Ht+165;Ey=V_Ht+196;break;
case 1:Sy=V_Ht+85;Ey=V_Ht+116;break;
case 2:Sy=85;Ey=116;break;
}
SetColor("SpringGreen");Line(x*36+34+delt_x,z+Sy,x*36+34+delt_x,z+Ey);
}
void Repeat_Sector(x,z,Twice,At_high)
int x,z,Twice,At_high;
{
int Sy,Ey;
switch (At_high)
{
case 0:Sy=V_Ht+165;Ey=V_Ht+196;break;
case 1:Sy=V_Ht+85;Ey=V_Ht+116;break;
case 2:Sy=85;Ey=116;break;
}
SetColor("SpringGreen");
if (x==1)
{
if (z!=0)
{
Line(31*36+Twice*4-4,z-Dist+Sy,31*36+Twice*4-4,z-Dist+Ey);
FillEllipse(31*36-Twice*6,z-Dist+Sy+9,3,4,0,360*64);
FillEllipse(31*36-Twice*6,z-Dist+Ey-14,3,4,0,360*64);
}
}
else
{
Line(x*36+Twice*4-4,z+Sy,x*36+Twice*4-4,z+Ey);
FillEllipse(x*36-Twice*6,z+Sy+9,3,4,0,360*64);
FillEllipse(x*36-Twice*6,z+Ey-14,3,4,0,360*64);
}
}
void Adjust_High_Low(fx,fy,Switcher)
int fx,fy,Switcher;
{
if (Switcher==1)
switch (On_High)
{
case 0:On_High=2;OutTextXY(fx+760,fy+30,"Vois");break;
case 1:On_High=0;OutTextXY(fx+764,fy+30,"Low");break;
case 2:On_High=1;OutTextXY(fx+760,fy+30,"High");break;
}
else switch (On_High)
{
case 0:OutTextXY(fx+764,fy+30,"Low");break;
case 1:OutTextXY(fx+760,fy+30,"High");break;
case 2:OutTextXY(fx+760,fy+30,"Vois");break;
}
XSetLineAttributes(display,gc,1,0,0,0);
}
void Adjust_Text(fx,fy,Switch)
int fx,fy,Switch;
{
SetColor("cyan");XSetLineAttributes(display,gc,2,0,0,0);Use_Font("7x14");
DrawRectangle(fx+756,fy+45,38,35);SetColor("magenta");
DrawRectangle(fx+758,fy+47,34,31);Rub(fx+761,fy+51,28,23,"NavyBlue");
SetColor("white");
if (Switch==1)
{
if (On_Text==0) { On_Text=1;OutTextXY(fx+760,fy+70,"Text"); }
else { On_Text=0;OutTextXY(fx+760,fy+70," ** "); }
}
else
{
if (On_Text==0) OutTextXY(fx+760,fy+70," ** ");
else OutTextXY(fx+760,fy+70,"Text");
}
XSetLineAttributes(display,gc,1,0,0,0);
}
void Show_Text_Table(X,Y)
int X,Y;
{
int i,j;
Rub(X-2,Y-1,233,75,"MediumBlue");XSetLineAttributes(display,gc,2,0,0,0);
SetColor("DeepSkyBlue");DrawRectangle(X,Y,229,73);
XSetLineAttributes(display,gc,1,0,0,0);SetColor("ivory");
for (i=1;i<12;i++) Line(X+19*i,Y+1,X+19*i,Y+72);
for (i=1;i<4;i++) Line(X+1,Y+18*i,X+228,Y+18*i);SetColor("khaki");
S_bf=(char *)malloc(10);*S_bf='\0';
for (i=0;i<4;i++)
for (j=0;j<12;j++)
{ sprintf(S_bf,"%c",Map_Letter(j,i));OutTextXY(X+6+19*j,Y+14+18*i,S_bf); }
}
void Draw_Wave(x,y)
int x,y;
{
DrawEllipse(x,y,12,8,0,180);DrawEllipse(x+13,y,12,8,0,-180);
DrawEllipse(x+26,y,12,8,0,180);DrawEllipse(x+39,y,12,8,0,-180);
DrawEllipse(x+52,y,12,8,0,180);
}
void Draw_Climax(x,y)
int x,y;
{
DrawEllipse(x+5,y+3,12,8,0,180);DrawEllipse(x+18,y+3,12,8,0,-180);
DrawEllipse(x+31,y+3,12,8,0,180);DrawEllipse(x+39,y-21,20,30,0,-120);
OutTextXY(x+57,y-9,"*");
}
void Draw_Rise(x,y)
int x,y;
{
DrawEllipse(x+1,y+1,10,10,10,-180);DrawEllipse(x+11,y-2,13,13,10,-180);
DrawEllipse(x+24,y-5,16,16,10,-180);DrawEllipse(x+39,y-21,20,30,0,-160);
OutTextXY(x+57,y-9,"*");
}
void Draw_Fall(x,y)
int x,y;
{
DrawEllipse(x-4,y+2,16,12,0,90);DrawEllipse(x+12,y+4,16,12,0,160);
DrawEllipse(x+28,y+6,16,12,0,160);DrawEllipse(x+44,y+8,16,12,0,160);
OutTextXY(x+5,y,"*");
}
void Draw_Arch(x,y)
int x,y;
{
DrawEllipse(x+2,y+3,60,20,0,180);OutTextXY(x+30,y,"*");
}
void Draw_Bowl(x,y)
int x,y;
{
DrawEllipse(x+19,y-2,26,16,0,-180);OutTextXY(x+30,y+10,"*");
DrawEllipse(x+2,y,16,12,0,180);DrawEllipse(x+46,y,16,12,0,180);
}
void Draw_R_Line(x,y)
int x,y;
{
Line(x+3,y+2,x+60,y-6);
}
void Draw_Repeat(x,y)
int x,y;
{
Line(x+8,y-5,x+8,y+15);Line(x+12,y-5,x+12,y+15);Draw_Dot(x+17,y);
Draw_Dot(x+17,y+6);Line(x+50,y-5,x+50,y+15);Line(x+54,y-5,x+54,y+15);
Draw_Dot(x+45,y);Draw_Dot(x+45,y+6);
}
void Draw_F_Line(x,y)
int x,y;
{
Line(x+3,y+2,x+60,y+10);
}
void Draw_H_Line(x,y)
int x,y;
{
Line(x+3,y+2,x+60,y+2);
}
void Set_Table(X,Y)
int X,Y;
{
SetColor("LightSkyBlue");XSetLineAttributes(display,gc,2,0,0,0);
DrawRectangle(X,Y,160,122);Line(X+80,Y,X+80,Y+122);
Line(X,Y+32,X+160,Y+32);Line(X,Y+62,X+160,Y+62);Line(X,Y+92,X+160,Y+92);
SetColor("white");Use_Font("7x14");
OutTextXY(X+16,Y+20,"Tempo #");OutTextXY(X+84,Y+20,"Instrument");
}
void Draw_Mini_Staff(X,Y)
int X,Y;
{
int i;
SetColor("grey");XSetLineAttributes(display,gc,1,0,0,0);
for (i=0;i<5;i++) Line(X+15,i*8+Y,X+212,i*8+Y);
}
void Draw_A_Staff(I,Y)
int I,Y;
{
int j;
SetColor("white");XSetLineAttributes(display,gc,1,0,0,0);
Line(6,I*Dist+Y+8,6,I*Dist+Y+121+V_Ht);
SetColor("DeepSkyBlue");HI_mark(I*Dist+Y+31);SetColor("white"); /* Voice */
for (j=0;j<=4;j++) Line(7,I*Dist+j*8+Y+8,1120,I*Dist+j*8+Y+8);
SetColor("SkyBlue");HI_mark(I*Dist+Y+31+V_Ht);SetColor("ivory"); /* High */
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);
SetColor("SkyBlue");LO_mark(I*Dist+Y+92+V_Ht);SetColor("grey"); /* Low */
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);
}
void Staff(now,five,input)
int now,five,input;
{
int i,y;
Rub(0,33,1139,700,"NavyBlue");Rub(0,0,1139,32,"MediumBlue");
Rub(0,733,1139,132,"MediumBlue");XSetLineAttributes(display,gc,3,0,0,0);
SetColor("green");Use_Font("12x24");OutTextXY(6,26,"Name:");
OutTextXY(770,26,"Tim: Speed: Percent:");
SetColor("white");Line(0,31,1139,31);Line(0,733,1139,733);
if (now!=0) { SetColor("LightSkyBlue");Set_Table(2,738);Set_Table(969,738); }
y=76;XSetLineAttributes(display,gc,1,0,0,0);Use_Font("12x24");
if (five)
{
SetColor("white");
if (now==0 && input==1) Line(200,y+24,1120,y+24);
else if (now>0) for (i=0;i<2;i++) Draw_A_Staff(i,y);
}
else OutTextXY(40,100,"1 = ");
Showup(166,737,five);
}
void Cat(x,y,dx,dy,bkcolor)
int *x,*y,dx,dy;
char *bkcolor;
{
Rub(*x-10,*y-4,21,26,bkcolor);*x+=dx;*y+=dy;SetColor("magenta");
Line(*x,*y-4,*x-9,*y+20);Line(*x,*y-4,*x+9,*y+20);
Line(*x-10,*y+20,*x+11,*y+20);SetColor("green");
}
void Square(n,k)
int n,k;
{
if (k==0) Rub(n*80+70,173,n*80+90,182,"white");
else Rub(n*80+70,173,n*80+90,182,"magenta");
}
void Mixup()
{
int i,j,p,head,tail;
double d;
for (j=0;j<=19;j++) br[j]=(122.0-tim_pt.freq[j])/120;
head=1;d=0.0;for (i=0;i<=9;i++) d+=br[i];d=0.05*d;
for (i=1; i<=20; i++)
{
p=(int)floor(br[i-1]/d+0.5);tail=head+p-1;if (tail>40) tail=40;
for (j=head-1;j<tail;j++) mix[j]=i;head=tail+1;
if (head>40 && i<20) { head=40;d=br[i]; }
}
}
void Fix_p(p,i,num)
int *p,i,num;
{
int k,z;
switch (num)
{
case -1:if (*p-60<St_Start) { *p=St_Start;x=8; } else *p-=60;break;
case 1:if (*p+60>i) { way=(i-8)/30;x=(i-8)%30+1;*p=i; } else *p+=60;break;
}
z=0;M_Bar_Num=0;
for (k=St_Start;k<*p;k++)
{
if (z==0) M_Bar_Num++;
if (abs(St[M_Id][k][On_High].act)>0) z+=abs(St[M_Id][k][On_High].act);
if (z>=sum) z=0;
}
if (z==0) M_Bar_Num++;Renew_Bar_Num();
}
void Tableout(k)
int k;
{
int i,x_1,x_2,y;
Use_Font("7x14");
for (i=1;i<4;i++)
{
switch (i)
{
case 1:x_1=10;x_2=977;y=779;break;
case 2:x_1=10;x_2=977;y=809;break;
case 3:x_1=10;x_2=977;y=839;break;
}
Rub(x_1-3,y-6,70,24,"MediumBlue");Rub(x_1+77,y-6,70,24,"MediumBlue");
Rub(x_2-3,y-6,70,24,"MediumBlue");Rub(x_2+77,y-6,70,24,"MediumBlue");
SetColor("gold");
if (St[k][0][1].nt[i]>0 && St[k][0][1].nt[i]!=200)
{
Out_I_XY(x_1+23,y+13,St[k][0][1].nt[i]);
Out_I_XY(x_1+98,y+13,St[k][1][1].nt[i]);
}
if (St[k][0][2].nt[i]>0 && St[k][0][2].nt[i]!=200)
{
Out_I_XY(x_2+23,y+13,St[k][0][2].nt[i]);
Out_I_XY(x_2+98,y+13,St[k][1][2].nt[i]);
}
}
}
void Figout()
{
if (ny != 0) return;
switch (nx)
{
case 8:nt=0;break;
case 9:
case 10:
case 11:nt=(nx-8)*2+48;break;
case 12:
case 13:
case 14:
case 15:nt=(nx-11)*2+53;break;
case 16:if (at>0) at+=16;else at-=16;break;
}
if (nx==16)
{ if (now==0) tmp[M_Id][M_p-1].act=at;else St[M_Id][M_p-1][0].act=at; }
else
{ if (now==0) tmp[M_Id][M_p-1].note=nt;else St[M_Id][M_p-1][0].nt[0]=nt; }
Blank(x,z,1);highlight(x*36+40,z+34,26,37);
}
void Pickup(x,way,n)
int x, way, n;
{
SetColor("SpringGreen");
Line(x*36+n*18+18,way*Dist+50,x*36+n*18+18,way*Dist+360);
Line(x*36+n*18+19,way*Dist+50,x*36+n*18+19,way*Dist+360);
Line(x*36+n*18+18,way*Dist+50,x*36+n*7+18,way*Dist+50);
Line(x*36+n*18+19,way*Dist+359,x*36+n*7+19,way*Dist+359);
}
void Pointout(x,y,z,ny,At_high)
int x,y,z,ny,At_high;
{
if (five)
{
Addline(x*36,y,z,At_high);Dot(x*36+14,z+y*4+32);
highlight(x*36+5,z+y*4-ny*20+28,26,37);return;
}
highlight(x*36+40,z+34,26,37);
}
void Get_Tempo(Mdy_Id,St_H_L)
int Mdy_Id,St_H_L;
{
int i,Tempo_Id,Info;
if (St_H_L>0)
{
Tempo_Id=St[Mdy_Id][0][1].nt[St_H_L]-1;
for (i=2;i<30;i++)
{
if (tmp[Tempo_Id][i+1].note!=0) Info=tmp[Tempo_Id][i+1].act;
else Info=-tmp[Tempo_Id][i+1].act;
St[Mdy_Id][i][1].nt[St_H_L]=Info;
}
}
else
{
Tempo_Id=St[Mdy_Id][0][2].nt[-St_H_L]-1;
for (i=2;i<30;i++)
{
if (tmp[Tempo_Id][i+1].note!=0) Info=tmp[Tempo_Id][i+1].act;
else Info=-tmp[Tempo_Id][i+1].act;
St[Mdy_Id][i][2].nt[-St_H_L]=Info;
}
}
}
int Same_Tempo(Mdy_Id,St_H_L,Tempo_Id)
int Mdy_Id,St_H_L,Tempo_Id;
{
int i;
if (St_H_L>0)
{
for (i=2;i<27;i++)
{ if (St[Mdy_Id][i][1].nt[St_H_L]!=tmp[Tempo_Id][i+1].act) return -1; }
return 1;
}
else
{
for (i=2;i<27;i++)
{ if (St[Mdy_Id][i][2].nt[-St_H_L]!=tmp[Tempo_Id][i+1].act) return -1; }
return 1;
}
}
void Add_To_Tempo(Mdy_Id,St_H_L)
int Mdy_Id,St_H_L;
{
int i,k,Last_Pos,act,finish;
k=content[0];Last_Pos=3;finish=0;
if (St_H_L>0)
{
tmp[k][1].note=St[Mdy_Id][1][0].nt[0]; /* Timer */
tmp[k][1].act=St[Mdy_Id][2][0].nt[0]; /* Measure */
for (i=3;i<30;i++)
{
act=St[Mdy_Id][i-1][1].nt[St_H_L];
if (act>0) tmp[k][i].note=71;else tmp[k][i].note=0;
tmp[k][i].act=abs(act);
if (tmp[k][i].act!=200 && finish==0) Last_Pos++;
else { finish=1;tmp[k][i].note=200; }
}
tmp[k][0].act=0;tmp[k][0].note=Last_Pos;content[0]+=1;tail=content[0];
names[tail-1]=(char *)malloc(50);*names[tail-1]='\0';
S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%5ld",k+1);
strcpy(names[tail-1],S_bf);ch='.';
sprintf(names[tail-1]+strlen(names[tail-1]),"%c",ch);
if (now>9)
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
Sub_Str(names[now*1000+Mdy_Id],0,10));
else
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
Sub_Str(names[now*1000+Mdy_Id],1,10));
sprintf(names[tail-1]+strlen(names[tail-1])-1,"%s","-H-");
S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%1ld",St_H_L);
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",S_bf);
sprintf(names[tail-1]+strlen(names[tail-1]),"%c",'\n');
}
else
{
tmp[k][1].note=St[M_Id][1][0].nt[0]; /* Timer */
tmp[k][1].act=St[M_Id][2][0].nt[0]; /* Measure */
for (i=3;i<30;i++)
{
act=St[M_Id][i-1][2].nt[-St_H_L];
if (act>0) tmp[k][i].note=71;else tmp[k][i].note=0;
tmp[k][i].act=abs(act);
if (tmp[k][i].act!=200 && finish==0) Last_Pos++;
else { finish=1;tmp[k][i].note=200; }
}
tmp[k][0].act=0;tmp[k][0].note=Last_Pos;content[0]+=1;tail=content[0];
names[tail-1]=(char *)malloc(50);*names[tail-1]='\0';
S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%5ld",k+1);
strcpy(names[tail-1],S_bf);ch='.';
sprintf(names[tail-1]+strlen(names[tail-1]),"%c",ch);
if (now>9)
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
Sub_Str(names[now*1000+M_Id],0,10));
else
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",
Sub_Str(names[now*1000+M_Id],1,10));
sprintf(names[tail-1]+strlen(names[tail-1])-1,"%s","-L-");
S_bf=(char *)malloc(10);*S_bf='\0';sprintf(S_bf,"%1ld",-St_H_L);
sprintf(names[tail-1]+strlen(names[tail-1]),"%s",S_bf);
sprintf(names[tail-1]+strlen(names[tail-1]),"%c",'\n');
}
}
void Check_Tempo()
{
int i,j,Id,Save_St,Save_Tmp;
Save_St=0;Save_Tmp=0;
for (i=1;i<4;i++) /* St_High */
{
if (St[M_Id][0][1].nt[i]==0 || St[M_Id][0][1].nt[i]==200) continue;
if (St[M_Id][0][1].nt[i]>content[now])
{
if (St[M_Id][2][1].nt[i]==200) continue;
else
{
Id=-1;
for (j=0;j<content[0];j++)
if (Same_Tempo(M_Id,i,j)==1) { Id=j+1;break; }
if (Id>0) { St[M_Id][0][1].nt[i]=Id;Save_St=1; }
else /* Add new Tempo to Lib */
{
if (content[0]>999) return;
else
{
Add_To_Tempo(M_Id,i);St[M_Id][0][1].nt[i]=content[0];
Save_Tmp=1;Save_St=1;
}
}
}
}
else
{
if (St[M_Id][2][1].nt[i]==200) { Get_Tempo(M_Id,i);Save_St=1; }
else if (Same_Tempo(M_Id,i,St[M_Id][0][1].nt[i]-1)==1) continue;
else
{
Id=-1;
for (j=0;j<content[0];j++)
if (Same_Tempo(M_Id,i,j)==1) { Id=j+1;break; }
if (Id>0) { St[M_Id][0][1].nt[i]=Id;Save_St=1; }
else
{
Add_To_Tempo(M_Id,i);St[M_Id][0][1].nt[i]=content[0];
Save_Tmp=1;Save_St=1;
}
}
}
}
for (i=1;i<4;i++) /* St_Low */
{
if (St[M_Id][0][2].nt[i]==0 || St[M_Id][0][2].nt[i]==200) continue;
if (St[M_Id][0][2].nt[i]>content[now])
{
if (St[M_Id][2][2].nt[i]==200) continue;
else
{
Id=-1;
for (j=0;j<content[0];j++)
if (Same_Tempo(M_Id,-i,j)==1) { Id=j+1;break; }
if (Id>0) { St[M_Id][0][2].nt[i]=Id;Save_St=1; }
else /* Add new Tempo to Lib */
{
if (content[0]>999) return;
else
{
Add_To_Tempo(M_Id,-i);St[M_Id][0][2].nt[i]=content[0];
Save_Tmp=1;Save_St=1;
}
}
}
}
else
{
if (St[M_Id][2][2].nt[i]==200) { Get_Tempo(M_Id,-i);Save_St=1; }
else if (Same_Tempo(M_Id,-i,St[M_Id][0][2].nt[i]-1)==1) continue;
else
{
Id=-1;
for (j=0;j<content[0];j++)
if (Same_Tempo(M_Id,-i,j)==1) { Id=j+1;break; }
if (Id>0) { St[M_Id][0][2].nt[i]=Id;Save_St=1; }
else
{
Add_To_Tempo(M_Id,-i);St[M_Id][0][2].nt[i]=content[0];
Save_Tmp=1;Save_St=1;
}
}
}
}
if (Save_Tmp==1) { Now_Bank=now;Del=-1;now=0;Save(1,tail);now=Now_Bank; }
if (Save_St==1) { Del=-1;tail=content[now];Save(1,tail); }
}
void Clear_Chord_Bank()
{
int i,j,k;
for (i=0;i<320;i++)
{
Chord_Bank[i].Num=0;Chord_Bank[i].Next=-1;
for (j=0;j<10;j++) for (k=0;k<3;k++) Chord_Bank[i].Nt[j][k]=0;
}
}