/* drawform.c */ /* Copyright 1990 Thomas E. Janzen All Rights Reserved */ /* ** FACILITY: ** ** AlgoRhythms music improviser on Commodore (TM) Amiga (TM) ** compiled with Lattice (TM) C 5.05 ** ** ABSTRACT: ** ** Algorhythms improvises music over the MIDI serial port. ** ** AUTHORS: Thomas E. Janzen ** ** CREATION DATE: 26-MAR-1990 ** ** MODIFICATION HISTORY: ** DATE NAME DESCRIPTION **-- */ #include #include #include #include #include #include struct Parameter { double CenterCycle; double CenterPhase; double SpreadCycle; double SpreadPhase; }; const static char PitchLabelString[16]="Pitch"; const static char RhythmLabelString[16]="Rhythm"; const static char DynamicsLabelString[16]="Dynamics"; const static char TextureLabelString[16]="Texture"; static struct IntuiText PitchLabelTxt= {1,1,JAM1,5,12,NULL,PitchLabelString,NULL}; static struct IntuiText RhythmLabelTxt= {1,1,JAM1,5,56,NULL,RhythmLabelString,&PitchLabelTxt}; static struct IntuiText DynamicsLabelTxt= {1,1,JAM1,5,100,NULL,DynamicsLabelString,&RhythmLabelTxt}; static struct IntuiText TextureLabelTxt= {1,1,JAM1,5,144,NULL,TextureLabelString,&DynamicsLabelTxt}; extern struct Window *w; extern struct RastPort *rp; extern struct GfxBase *GfxBase; extern struct IntuitionBase *IntuitionBase; extern struct DOSBase *DOSBase; extern struct MathBase *MathBase; void DrawForm(const double Duration, const struct Parameter *PitchForm, const struct Parameter *RhythmForm, const struct Parameter *DynamicsForm, const struct Parameter *TextureForm) { static int Xlim,Ylim; register int inttime=0; register double curtime = 0.0; double HeightRatio = 12.0; double timeratio; double Spreadfixed, Mean, Top, Bottom; register int intTop, intBottom; double phase; int intLength=631; register int intMean; register int Step=22; ClearScreen(rp); SetAPen(rp,0); /* Set foreground pen to white */ for (inttime=0;inttime<25;inttime++) { Move(rp,0,inttime); /*erase part of screen */ Draw(rp,631,inttime); /*that ClearScreen didn't clear*/ } Xlim = w->GZZWidth; Ylim = w->GZZHeight; intLength=Xlim; Step=Ylim/8; timeratio=((double)intLength)/(Duration); HeightRatio=12*Ylim/200; SetAPen(rp,3); /* Set foreground pen to white */ SetDrMd(rp,JAM1); /* Draw with foreground pen */ for (inttime=0;inttimeSpreadCycle)+ PitchForm->SpreadPhase))/4.0; Mean= sin(phase/(PitchForm->CenterCycle)+ PitchForm->CenterPhase); Top=Mean+(Spreadfixed); /*could be -1.5 to 1.5*/ Bottom=Mean-(Spreadfixed); intMean=Step; intBottom=-(Bottom*HeightRatio)+intMean; intTop=-(Top*HeightRatio)+intMean; Move(rp,inttime,intTop); Draw(rp,inttime,intBottom); Spreadfixed=(1+ sin(phase/(RhythmForm->SpreadCycle)+ RhythmForm->SpreadPhase))/4.0; Mean= sin(phase/(RhythmForm->CenterCycle)+ RhythmForm->CenterPhase); Top=Mean+(Spreadfixed); /*could be -1.5 to 1.5*/ Bottom=Mean-(Spreadfixed); intMean=Step*3; intBottom=-(Bottom*HeightRatio)+intMean; intTop=-(Top*HeightRatio)+intMean; Move(rp,inttime,intTop); Draw(rp,inttime,intBottom); Spreadfixed=(1+ sin(phase/(DynamicsForm->SpreadCycle)+ DynamicsForm->SpreadPhase))/4.0; Mean= sin(phase/(DynamicsForm->CenterCycle)+ DynamicsForm->CenterPhase); Top=Mean+(Spreadfixed); /*could be -1.5 to 1.5*/ Bottom=Mean-(Spreadfixed); intMean=Step*5; intBottom=-(Bottom*HeightRatio)+intMean; intTop=-(Top*HeightRatio)+intMean; Move(rp,inttime,intTop); Draw(rp,inttime,intBottom); Top=(1+ sin(phase/(TextureForm->SpreadCycle)+ TextureForm->SpreadPhase))/2.0; /*Top=SpreadFixed;*/ Bottom=-(Top); intMean=Step*7; intBottom=-(Bottom*HeightRatio)+intMean; intTop=-(Top*HeightRatio)+intMean; Move(rp,inttime,intTop); Draw(rp,inttime,intBottom); } SetAPen(rp,1); for(inttime=0;inttime<4;inttime++) { Move(rp,0,Step*((2*inttime)+1)); Draw(rp,Xlim,Step*((2*inttime)+1)); } PitchLabelTxt.TopEdge=Step*(1/2); RhythmLabelTxt.TopEdge=Step*(5/2); DynamicsLabelTxt.TopEdge=Step*(9/2); TextureLabelTxt.TopEdge=Step*(13/2); PrintIText(rp,&TextureLabelTxt,1,1); } void DrawTime(const double CurTime, const double Duration) { static int Xlim,Ylim; register int inttime=0; double timeratio; double HeightRatio=12; int intMean; SetAPen(rp,2); /* Set foreground pen to white */ Xlim = w->GZZWidth; Ylim = w->GZZHeight; intMean=Ylim/8; timeratio=((double)Xlim)/Duration; HeightRatio=(12.0*Ylim)/200.0; SetDrMd(rp,JAM1); /* Draw with foreground pen */ inttime=(int)(CurTime*timeratio); Move(rp,0,intMean); Draw(rp,inttime,intMean); SetAPen(rp,1); /* Set foreground pen to white */ Draw(rp,Xlim,intMean); }