hschumann2/TempleOS-Source-Code
0838
1 2 3 4 <1>/* Graphics Not Rendered in HTML */5 6 <2>/* Graphics Not Rendered in HTML */7 8 <3>/* Graphics Not Rendered in HTML */9 10 <4>/* Graphics Not Rendered in HTML */11 12 <5>/* Graphics Not Rendered in HTML */13 14 <6>/* Graphics Not Rendered in HTML */15 16 17 <7>/* Graphics Not Rendered in HTML */18 19 20 <8>/* Graphics Not Rendered in HTML */21 22 23 <9>/* Graphics Not Rendered in HTML */24 25 26 <10>/* Graphics Not Rendered in HTML */27 28 29 <11>/* Graphics Not Rendered in HTML */30 31 32 33 34 35 36 37 <12>/* Graphics Not Rendered in HTML */38 39 40 41 42 <13>/* Graphics Not Rendered in HTML */43 44 <14>/* Graphics Not Rendered in HTML */45 46 <15>/* Graphics Not Rendered in HTML */47 48 49 <16>/* Graphics Not Rendered in HTML */50 51#define PSM_NOTE_SPACING 952#define PSM_DURATIONS_NUM 1253 54F64 psm_durations[PSM_DURATIONS_NUM+1]={552*.25/3,.25,2*.5/3,.5,2.0/3.0,0.5*1.5,1.0,1.5,2.0,3.0,4.0,6.0,1000000.0};56U8 *psm_duration_lst="st\0s\0et\0e\0qt\0e.\0q\0q.\0h\0h.\0w\0w.\0";57U8 *psm_duration_imgs[PSM_DURATIONS_NUM]={58 <1>,<1>,<2>,<2>,<3>,<2>,<3>,<3>,<4>,<4>,<5>,<5>};59Bool psm_triplet_durations[PSM_DURATIONS_NUM]={TRUE,FALSE,TRUE,60 FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE};61 62Bool PsmBlink()63{64 if (Blink || psm.playing)65 return TRUE;66 else67 return FALSE;68}69 70Bool PsmHasWords(U8 *st)71{72 if (st && *st && (StrLen(st)>1 || *st!=CH_SPACE && *st!=CH_SHIFT_SPACE))73 return TRUE;74 else75 return FALSE;76}77 78Bool PsmIsDotted(I64 duration)79{80 U8 *st=LstSub(duration,psm_duration_lst);81 if (st[1]=='.')82 return TRUE;83 else84 return FALSE;85}86 87U0 PsmMarkSel(I64 x1,I64 x2,Bool sel)88{89 PsmNote *tmpn=psm.head.next;90 while (tmpn!=&psm.head) {91 if (sel) {92 if (x1<=tmpn->x<=x2)93 tmpn->flags|=PSMF_SEL;94 } else95 tmpn->flags&=~PSMF_SEL;96 tmpn=tmpn->next;97 }98}99 100U0 PsmSetWidth(PsmNote *tmpn)101{102 if (tmpn->type==PSMT_METER)103 tmpn->width=12;104 else {105 tmpn->width=PSM_NOTE_SPACING;106 if (PsmIsDotted(tmpn->duration))107 tmpn->width+=PSM_NOTE_SPACING/2;108 if (Bt(&tmpn->flags,PSMf_SHARP) || Bt(&tmpn->flags,PSMf_FLAT))109 tmpn->width+=PSM_NOTE_SPACING;110 }111}112 113U0 PsmSetOctave(I64 octave)114{115 I64 i;116 U8 buf[STR_LEN];117 CMenuEntry *tmpse;118 for (i=1;i<=7;i++) {119 StrPrint(buf,"Snd/Octave%d",i);120 if (tmpse=MenuEntryFind(Fs->cur_menu,buf)) {121 if (i==octave)122 tmpse->checked=TRUE;123 else124 tmpse->checked=FALSE;125 }126 }127}128 129U0 DrawNote(CDC *dc,I64 x,I64 y,I64 duration)130{131 if (0<=duration<=PSM_DURATIONS_NUM) {132 Sprite3(dc,x,y,0,psm_duration_imgs[duration]);133 if (psm_triplet_durations[duration])134 Sprite3(dc,x,y,0,<16>);135 if (PsmIsDotted(duration))136 Sprite3(dc,x,y,0,<15>);137 }138}139 140U0 DrawTimeSignature(CDC *dc,I64 x,I64 y,I64 top,I64 bottom)141{142 GrPrint(dc,x,y,"%d",top);143 GrPrint(dc,x,y+FONT_HEIGHT,"%d",bottom);144}145 146U0 PsmRecalcNoteXY()147{148 F64 measure_len=4,measure_left=measure_len;149 PsmNote *tmpn=psm.head.next;150 I64 x=8-psm.scrn_x,ona,note,octave;151 while (TRUE) {152 tmpn->x=x;153 tmpn->y=50;154 if (tmpn==&psm.head)155 break;156 else {157 if (tmpn->type!=PSMT_METER) {158 if (tmpn->ona!=ONA_REST) {159 ona=tmpn->ona;160 if (Bt(&tmpn->flags,PSMf_SHARP))161 ona--;162 if (Bt(&tmpn->flags,PSMf_FLAT))163 ona++;164 octave=Ona2Octave(ona);165 note =Ona2Note (ona);166 note=music.note_map[*LstSub(note,psm_note_lst)-'A'];167 if (note<3)168 octave++;169 tmpn->y=(15+(psm_note_map[note]-7*(octave-4)))*4;170 }171 }172 x+=tmpn->width;173 if (tmpn->type==PSMT_METER) {174 measure_len=tmpn->meter_top*4.0/tmpn->meter_bottom;175 measure_left=0;176 } else177 measure_left-=psm_durations[tmpn->duration];178 if (measure_left<0.001) {179 x+=PSM_NOTE_SPACING;180 measure_left=measure_len;181 }182 }183 tmpn=tmpn->next;184 }185}186 187U0 DrawIt(CTask *task,CDC *dc)188{189 PsmNote *tmpn;190 I64 i,x,y,191 w=task->pix_width;192 F64 measure_len=4,measure_left=measure_len;193 194 dc->color=BLACK;195 for (i=1;i<6;i++)196 GrLine(dc,0,i*8,w,i*8);197 for (i=7;i<12;i++)198 GrLine(dc,0,i*8,w,i*8);199 200 PsmRecalcNoteXY;201 if (psm.cur_note->x<64) {202 psm.scrn_x-=128;203 PsmRecalcNoteXY;204 }205 if (psm.cur_note->x>=GR_WIDTH-64) {206 psm.scrn_x+=128;207 PsmRecalcNoteXY;208 }209 210 tmpn=psm.head.next;211 while (tmpn!=&psm.head) {212 x=tmpn->x;213 y=tmpn->y;214 if (measure_left<0.001) {215 dc->color=BLACK;216 GrLine(dc,x-PSM_NOTE_SPACING,8,x-PSM_NOTE_SPACING,11*8);217 measure_left=measure_len;218 }219 if (tmpn->type==PSMT_METER) {220 if (tmpn==psm.cur_note && PsmBlink)221 dc->color=BROWN;222 else223 dc->color=BLACK;224 DrawTimeSignature(dc,x,5*8,tmpn->meter_top,tmpn->meter_bottom);225 measure_len=tmpn->meter_top*4.0/tmpn->meter_bottom;226 measure_left=0;227 } else {228 if (tmpn==psm.cur_note && PsmBlink) {229 dc->color=BROWN;230 GrPrint(dc,x+8,y,"%s",tmpn->word);231 } else if (tmpn->flags&PSMF_SEL)232 dc->color=RED;233 else {234 if (tmpn->ona!=ONA_REST)235 dc->color=BLACK;236 else237 dc->color=LTGRAY;238 if (PsmHasWords(tmpn->word))239 dc->color=GREEN;240 }241 DrawNote(dc,x,y,tmpn->duration);242 if (PsmIsDotted(tmpn->duration))243 x+=PSM_NOTE_SPACING/2;244 if (Bt(&tmpn->flags,PSMf_SHARP))245 Sprite3(dc,x,y,0,<13>);246 else if (Bt(&tmpn->flags,PSMf_FLAT))247 Sprite3(dc,x,y,0,<14>);248 measure_left-=psm_durations[tmpn->duration];249 }250 tmpn=tmpn->next;251 }252 253 if (psm.cur_note==&psm.head && PsmBlink)254 dc->color=BROWN;255 else256 dc->color=BLACK;257 Sprite3(dc,psm.head.x,50,0,<12>);258}259 260#define PSM_NOTE_BOX_X 220261#define PSM_NOTE_BOX_Y (13*FONT_HEIGHT+14)262U0 PsmSetPickNoteBoxX(I64 duration,I64 *x)263{264 I64 i;265 *x=PSM_NOTE_BOX_X;266 for (i=0;i<duration;i++) {267 if (PsmIsDotted(i))268 *x+=PSM_NOTE_SPACING/2;269 *x+=PSM_NOTE_SPACING+4;270 }271}272 273I64 PsmGetPickNoteBoxDuration(I64 xx,I64 yy)274{275 I64 i,x1,x2;276 if (PSM_NOTE_BOX_Y-14<=yy<PSM_NOTE_BOX_Y+6) {277 for (i=0;i<PSM_DURATIONS_NUM;i++) {278 PsmSetPickNoteBoxX(i,&x1);279 PsmSetPickNoteBoxX(i+1,&x2);280 if (x1<=xx+PSM_NOTE_SPACING/2<x2)281 return i;282 }283 }284 return -1;285}286 287U0 DrawPickNoteBox()288{289 I64 i,x;290 for (i=0;i<PSM_DURATIONS_NUM;i++) {291 PsmSetPickNoteBoxX(i,&x);292 if (PsmIsDotted(i))293 psm.dc2->color=RED;294 else if (psm_triplet_durations[i])295 psm.dc2->color=LTRED;296 else297 psm.dc2->color=BLACK;298 DrawNote(psm.dc2,x,PSM_NOTE_BOX_Y,i);299 }300}301 302#define PSM_TOOLS_X 450303#define PSM_TOOLS_Y 13*FONT_HEIGHT304 305U0 DrawPickTools()306{307 if (psm.tool==PSMTT_BOX_TOOL)308 psm.dc2->color=ROPF_DITHER+WHITE<<16+RED;309 else310 psm.dc2->color=ROPF_DITHER+WHITE<<16+BLACK;311 GrBorder(psm.dc2,PSM_TOOLS_X,PSM_TOOLS_Y,PSM_TOOLS_X+10,PSM_TOOLS_Y+10);312 313 if (psm.tool==PSMTT_PTR_TOOL)314 psm.dc2->color=RED;315 else316 psm.dc2->color=BLACK;317 (*gr.fp_draw_ms)(psm.dc2,PSM_TOOLS_X+15,PSM_TOOLS_Y);318 psm.dc2->color=BLACK;319}320 321Bool PsmGetPickToolBox(I64 xx,I64 yy)322{323 if (PSM_TOOLS_X<=xx<PSM_TOOLS_X+27 && PSM_TOOLS_Y<=yy<PSM_TOOLS_Y+15) {324 PsmMarkSel(0,0,FALSE);325 if (xx<PSM_TOOLS_X+13)326 psm.tool=PSMTT_BOX_TOOL;327 else328 psm.tool=PSMTT_PTR_TOOL;329 return TRUE;330 } else331 return FALSE;332}333 334#define PSM_METERS_NUM 7335I64 meter_tops[PSM_METERS_NUM] ={2,3,4,5,6,7,9},336 meter_bottoms[PSM_METERS_NUM]={4,4,4,4,8,8,8};337 338#define PSM_METER_X 485339#define PSM_METER_Y 13*FONT_HEIGHT340#define PSM_METER_W 12341Bool PsmGetPickMeterBox(I64 xx,I64 yy,I64 *top,I64 *bottom)342{343 I64 i;344 if (PSM_METER_X<=xx<PSM_METER_X+PSM_METER_W*PSM_METERS_NUM &&345 PSM_METER_Y<=yy<PSM_METER_Y+2*FONT_HEIGHT) {346 i=(xx-PSM_METER_X)/PSM_METER_W;347 *top=meter_tops[i];348 *bottom=meter_bottoms[i];349 return TRUE;350 } else351 return FALSE;352}353 354U0 DrawPickMeterBox()355{356 I64 i;357 psm.dc2->color=BLACK;358 for (i=0;i<PSM_METERS_NUM;i++)359 DrawTimeSignature(psm.dc2,PSM_METER_X+i*PSM_METER_W,PSM_METER_Y,360 meter_tops[i],meter_bottoms[i]);361}362 363U0 DrawDC2()364{365 DCFill;366 DrawPickNoteBox;367 DrawPickMeterBox;368 DrawPickTools;369}370 371 372<17>/* Graphics Not Rendered in HTML */373 374 375 376 377 378U0 PsmMenu(I64 psm_octave)379{380 DocClear;381 "$BG,WHITE$$FD,GREEN$$CM,0,12$\n";382 Sprite(<17>);383 '\n\n\n\n\n';384 385 DrawDC2;386 387 "$LTGREEN$<SPACE>$FG$\t\tRest\n"388 "$LTGREEN$<BACKSPACE>$FG$\tDeletes Last Note\n"389 "$LTGREEN$Left Mouse$FG$\tDrag note or shift word\n"390 "$LTGREEN$Right Mouse$FG$\tChange duration or set word\n";391 Sprite(<6>,"$SP+LIS,\"\","392 "LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_LEFT);\",BI=%d$");393 " ";394 if (psm.playing)395 Sprite(<9>,"$SP,\"\",LM=\"x\",BI=%d$");396 else397 Sprite(<8>,"$SP,\"\",LM=\"x\",BI=%d$");398 " ";399 if (psm.record_entry->checked) {400 psm.record_entry->checked=TRUE;401 Sprite(<10>,"$SP,\"\",LM=\"z\",BI=%d$");402 } else403 Sprite(<11>,"$SP,\"\",LM=\"z\",BI=%d$");404 " ";405 Sprite(<7>,"$SP+LIS,\"\","406 "LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_RIGHT);\",BI=%d$");407 "$CM+LX,0,6$";408 PsmSetOctave(psm_octave);409 Refresh(2);410}411 