$ID,8$
$SP,"<1>",BI=1$

$SP,"<2>",BI=2$

$SP,"<3>",BI=3$

$SP,"<4>",BI=4$

$SP,"<5>",BI=5$

$SP,"<6>",BI=6$


$SP,"<7>",BI=7$

	
$SP,"<8>",BI=8$


$SP,"<9>",BI=9$


$SP,"<10>",BI=10$


$SP,"<11>",BI=11$







$SP,"<12>",BI=12$


	

$SP,"<13>",BI=13$

$SP,"<14>",BI=14$

$SP,"<15>",BI=15$


$SP,"<16>",BI=16$
$ID,-8$
#define PSM_NOTE_SPACING	9
#define PSM_DURATIONS_NUM	12

F64 psm_durations[PSM_DURATIONS_NUM+1]={
2*.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};
U8 *psm_duration_lst="st\0s\0et\0e\0qt\0e.\0q\0q.\0h\0h.\0w\0w.\0";
U8 *psm_duration_imgs[PSM_DURATIONS_NUM]={
	$IB,"<1>",BI=1$,$IB,"<1>",BI=1$,$IB,"<2>",BI=2$,$IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<2>",BI=2$,$IB,"<3>",BI=3$,$IB,"<3>",BI=3$,$IB,"<4>",BI=4$,$IB,"<4>",BI=4$,$IB,"<5>",BI=5$,$IB,"<5>",BI=5$};
Bool psm_triplet_durations[PSM_DURATIONS_NUM]={TRUE,FALSE,TRUE,
	FALSE,TRUE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE};

Bool PsmBlink()
{
  if (Blink || psm.playing)
    return TRUE;
  else
    return FALSE;
}

Bool PsmHasWords(U8 *st)
{
  if (st && *st && (StrLen(st)>1 || *st!=CH_SPACE && *st!=CH_SHIFT_SPACE))
    return TRUE;
  else
    return FALSE;
}

Bool PsmIsDotted(I64 duration)
{
  U8 *st=LstSub(duration,psm_duration_lst);
  if (st[1]=='.')
    return TRUE;
  else
    return FALSE;
}

U0 PsmMarkSel(I64 x1,I64 x2,Bool sel)
{
  PsmNote *tmpn=psm.head.next;
  while (tmpn!=&psm.head) {
    if (sel) {
      if (x1<=tmpn->x<=x2)
	tmpn->flags|=PSMF_SEL;
    } else
      tmpn->flags&=~PSMF_SEL;
    tmpn=tmpn->next;
  }
}

U0 PsmSetWidth(PsmNote *tmpn)
{
  if (tmpn->type==PSMT_METER)
    tmpn->width=12;
  else {
    tmpn->width=PSM_NOTE_SPACING;
    if (PsmIsDotted(tmpn->duration))
      tmpn->width+=PSM_NOTE_SPACING/2;
    if (Bt(&tmpn->flags,PSMf_SHARP) || Bt(&tmpn->flags,PSMf_FLAT))
      tmpn->width+=PSM_NOTE_SPACING;
  }
}

U0 PsmSetOctave(I64 octave)
{
  I64 i;
  U8 buf[STR_LEN];
  CMenuEntry *tmpse;
  for (i=1;i<=7;i++) {
    StrPrint(buf,"Snd/Octave%d",i);
    if (tmpse=MenuEntryFind(Fs->cur_menu,buf)) {
      if (i==octave)
	tmpse->checked=TRUE;
      else
	tmpse->checked=FALSE;
    }
  }
}

U0 DrawNote(CDC *dc,I64 x,I64 y,I64 duration)
{
  if (0<=duration<=PSM_DURATIONS_NUM) {
    Sprite3(dc,x,y,0,psm_duration_imgs[duration]);
    if (psm_triplet_durations[duration])
      Sprite3(dc,x,y,0,$IB,"<16>",BI=16$);
    if (PsmIsDotted(duration))
      Sprite3(dc,x,y,0,$IB,"<15>",BI=15$);
  }
}

U0 DrawTimeSignature(CDC *dc,I64 x,I64 y,I64 top,I64 bottom)
{
  GrPrint(dc,x,y,"%d",top);
  GrPrint(dc,x,y+FONT_HEIGHT,"%d",bottom);
}

U0 PsmRecalcNoteXY()
{
  F64 measure_len=4,measure_left=measure_len;
  PsmNote *tmpn=psm.head.next;
  I64 x=8-psm.scrn_x,ona,note,octave;
  while (TRUE) {
    tmpn->x=x;
    tmpn->y=50;
    if (tmpn==&psm.head)
      break;
    else {
      if (tmpn->type!=PSMT_METER) {
	if (tmpn->ona) {
	  ona=tmpn->ona;
	  if (Bt(&tmpn->flags,PSMf_SHARP))
	    ona--;
	  if (Bt(&tmpn->flags,PSMf_FLAT))
	    ona++;
	  octave=Ona2Octave(ona);
	  note	=Ona2Note  (ona);
	  note=music.note_map[*LstSub(note,psm_note_lst)-'A'];
	  if (note<3)
	    octave++;
	  tmpn->y=(15+(psm_note_map[note]-7*(octave-4)))*4;
	}
      }
      x+=tmpn->width;
      if (tmpn->type==PSMT_METER) {
	measure_len=tmpn->meter_top*4.0/tmpn->meter_bottom;
	measure_left=0;
      } else
	measure_left-=psm_durations[tmpn->duration];
      if (measure_left<0.001) {
	x+=PSM_NOTE_SPACING;
	measure_left=measure_len;
      }
    }
    tmpn=tmpn->next;
  }
}

U0 DrawIt(CTask *task,CDC *dc)
{
  PsmNote *tmpn;
  I64 i,x,y,
	w=task->pix_width;
  F64 measure_len=4,measure_left=measure_len;

  dc->color=BLACK;
  for (i=1;i<6;i++)
    GrLine(dc,0,i*8,w,i*8);
  for (i=7;i<12;i++)
    GrLine(dc,0,i*8,w,i*8);

  PsmRecalcNoteXY;
  if (psm.cur_note->x<64) {
    psm.scrn_x-=128;
    PsmRecalcNoteXY;
  }
  if (psm.cur_note->x>=GR_WIDTH-64) {
    psm.scrn_x+=128;
    PsmRecalcNoteXY;
  }

  tmpn=psm.head.next;
  while (tmpn!=&psm.head) {
    x=tmpn->x;
    y=tmpn->y;
    if (measure_left<0.001) {
      dc->color=BLACK;
      GrLine(dc,x-PSM_NOTE_SPACING,8,x-PSM_NOTE_SPACING,11*8);
      measure_left=measure_len;
    }
    if (tmpn->type==PSMT_METER) {
      if (tmpn==psm.cur_note && PsmBlink)
	dc->color=BROWN;
      else
	dc->color=BLACK;
      DrawTimeSignature(dc,x,5*8,tmpn->meter_top,tmpn->meter_bottom);
      measure_len=tmpn->meter_top*4.0/tmpn->meter_bottom;
      measure_left=0;
    } else {
      if (tmpn==psm.cur_note && PsmBlink) {
	dc->color=BROWN;
	GrPrint(dc,x+8,y,"%s",tmpn->word);
      } else if (tmpn->flags&PSMF_SEL)
	dc->color=RED;
      else {
	if (tmpn->ona)
	  dc->color=BLACK;
	else
	  dc->color=LTGRAY;
	if (PsmHasWords(tmpn->word))
	  dc->color=GREEN;
      }
      DrawNote(dc,x,y,tmpn->duration);
      if (PsmIsDotted(tmpn->duration))
	x+=PSM_NOTE_SPACING/2;
      if (Bt(&tmpn->flags,PSMf_SHARP))
	Sprite3(dc,x,y,0,$IB,"<13>",BI=13$);
      else if (Bt(&tmpn->flags,PSMf_FLAT))
	Sprite3(dc,x,y,0,$IB,"<14>",BI=14$);
      measure_left-=psm_durations[tmpn->duration];
    }
    tmpn=tmpn->next;
  }

  if (psm.cur_note==&psm.head && PsmBlink)
    dc->color=BROWN;
  else
    dc->color=BLACK;
  Sprite3(dc,psm.head.x,50,0,$IB,"<12>",BI=12$);
}

#define PSM_NOTE_BOX_X	220
#define PSM_NOTE_BOX_Y	(13*FONT_HEIGHT+14)
U0 PsmSetPickNoteBoxX(I64 duration,I64 *x)
{
  I64 i;
  *x=PSM_NOTE_BOX_X;
  for (i=0;i<duration;i++) {
    if (PsmIsDotted(i))
      *x+=PSM_NOTE_SPACING/2;
    *x+=PSM_NOTE_SPACING+4;
  }
}

I64 PsmGetPickNoteBoxDuration(I64 xx,I64 yy)
{
  I64 i,x1,x2;
  if (PSM_NOTE_BOX_Y-14<=yy<PSM_NOTE_BOX_Y+6) {
    for (i=0;i<PSM_DURATIONS_NUM;i++) {
      PsmSetPickNoteBoxX(i,&x1);
      PsmSetPickNoteBoxX(i+1,&x2);
      if (x1<=xx+PSM_NOTE_SPACING/2<x2)
	return i;
    }
  }
  return -1;
}

U0 DrawPickNoteBox()
{
  I64 i,x;
  for (i=0;i<PSM_DURATIONS_NUM;i++) {
    PsmSetPickNoteBoxX(i,&x);
    if (PsmIsDotted(i))
      psm.dc2->color=RED;
    else if (psm_triplet_durations[i])
      psm.dc2->color=LTRED;
    else
      psm.dc2->color=BLACK;
    DrawNote(psm.dc2,x,PSM_NOTE_BOX_Y,i);
  }
}

#define PSM_TOOLS_X	450
#define PSM_TOOLS_Y	13*FONT_HEIGHT

U0 DrawPickTools()
{
  if (psm.tool==PSMTT_BOX_TOOL)
    psm.dc2->color=ROPF_DITHER+WHITE<<16+RED;
  else
    psm.dc2->color=ROPF_DITHER+WHITE<<16+BLACK;
  GrBorder(psm.dc2,PSM_TOOLS_X,PSM_TOOLS_Y,PSM_TOOLS_X+10,PSM_TOOLS_Y+10);

  if (psm.tool==PSMTT_PTR_TOOL)
    psm.dc2->color=RED;
  else
    psm.dc2->color=BLACK;
  (*gr.fp_draw_ms)(psm.dc2,PSM_TOOLS_X+15,PSM_TOOLS_Y);
  psm.dc2->color=BLACK;
}

Bool PsmGetPickToolBox(I64 xx,I64 yy)
{
  if (PSM_TOOLS_X<=xx<PSM_TOOLS_X+27 && PSM_TOOLS_Y<=yy<PSM_TOOLS_Y+15) {
    PsmMarkSel(0,0,FALSE);
    if (xx<PSM_TOOLS_X+13)
      psm.tool=PSMTT_BOX_TOOL;
    else
      psm.tool=PSMTT_PTR_TOOL;
    return TRUE;
  } else
    return FALSE;
}

#define PSM_METERS_NUM	7
I64 meter_tops[PSM_METERS_NUM]	={2,3,4,5,6,7,9},
   meter_bottoms[PSM_METERS_NUM]={4,4,4,4,8,8,8};

#define PSM_METER_X	485
#define PSM_METER_Y	13*FONT_HEIGHT
#define PSM_METER_W	12
Bool PsmGetPickMeterBox(I64 xx,I64 yy,I64 *top,I64 *bottom)
{
  I64 i;
  if (PSM_METER_X<=xx<PSM_METER_X+PSM_METER_W*PSM_METERS_NUM &&
	PSM_METER_Y<=yy<PSM_METER_Y+2*FONT_HEIGHT) {
    i=(xx-PSM_METER_X)/PSM_METER_W;
    *top=meter_tops[i];
    *bottom=meter_bottoms[i];
    return TRUE;
  } else
    return FALSE;
}

U0 DrawPickMeterBox()
{
  I64 i;
  psm.dc2->color=BLACK;
  for (i=0;i<PSM_METERS_NUM;i++)
    DrawTimeSignature(psm.dc2,PSM_METER_X+i*PSM_METER_W,PSM_METER_Y,
	  meter_tops[i],meter_bottoms[i]);
}

U0 DrawDC2()
{
  DCFill;
  DrawPickNoteBox;
  DrawPickMeterBox;
  DrawPickTools;
}


$SP,"<17>",BI=17$
 




U0 PsmMenu(I64 psm_octave)
{
  DocClear;
  "$$BG,WHITE$$$$FD,GREEN$$$$CM,0,12$$\n";
  Sprite($IB,"<17>",BI=17$);
  '\n\n\n\n\n';

  DrawDC2;

  "$$LTGREEN$$<SPACE>$$FG$$\t\tRest\n"
	"$$LTGREEN$$<BACKSPACE>$$FG$$\tDeletes Last Note\n"
	"$$LTGREEN$$Left Mouse$$FG$$\tDrag note or shift word\n"
	"$$LTGREEN$$Right Mouse$$FG$$\tChange duration or set word\n";
  Sprite($IB,"<6>",BI=6$,"$$SP+LIS,\"\","
	"LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_LEFT);\",BI=%d$$");
  "";
  if (psm.playing)
    Sprite($IB,"<9>",BI=9$,"$$SP,\"\",LM=\"x\",BI=%d$$");
  else
    Sprite($IB,"<8>",BI=8$,"$$SP,\"\",LM=\"x\",BI=%d$$");
  "";
  if (psm.record_entry->checked) {
    psm.record_entry->checked=TRUE;
    Sprite($IB,"<10>",BI=10$,"$$SP,\"\",LM=\"z\",BI=%d$$");
  } else
    Sprite($IB,"<11>",BI=11$,"$$SP,\"\",LM=\"z\",BI=%d$$");
  "";
  Sprite($IB,"<7>",BI=7$,"$$SP+LIS,\"\","
	"LM=\"Msg(MSG_KEY_DOWN,0,SCF_CTRL|SC_CURSOR_RIGHT);\",BI=%d$$");
  "$$CM+LX,0,6$$";
  PsmSetOctave(psm_octave);
  Refresh(2);
}
��������"�����
��������������
�������
�������
�������
�������
�������	�������
�������
�������
����������������
���������������
��������������
���������������
��������������
����������������
���������������
��������������
���������������
����������������
���������������
�����������������������������
�������
�������
��������������
��������������
����������������
���������������
��������������
���������������
��������������
����������������
���������������
��������������
���������������
����������������
���������������
������������������������������
����������������
���������������
��������������
���������������
��������������
����������������
���������������
��������������
���������������
����������������
���������������
�����������������������V������
����������������
���������������
��������������
���������������
����������������������E������
����������������
���������������
��������������
�����������������������a������
������������������������������
������������
������������
��������������������a������
������������������������������
������������
������������
���������������������������
������������������������������

������
������
������
������
������
������

������
���������������������������
������
���
���	������	������	������	����������������
������������
���������������������������
���������
���������
���	������
���������
���������

���	���������
������	������
���
���
������
���
���	���	���
���
������
���
������������
���
������
���

������
������
���
������
���
���
������
�����������?������
���������������������������
���������
���	�����������#������
������������&���
����������&����
�������E������
�������������
�������
������
��������������
��������������������V������
	�������������
������
������

������
������

������
������

��������������������������������������������E������
����������������
����������������
����������������
�������������������������������
���������$���
 ���$��� �������
0���$���0������
,������4������
4������4�������
,������,�������
@���$���@������
<������D������
D������D�������
<������<�������
|�������������
���������������
|������|�������
l������t������
t������t�������
l������l�������
���$�������$���
������������
�������������
���������������������A�$������S�4������D�D������F�T������G�d������H�t������J��������K��������L��������;��������'�,������E�<������R�L������T�l������U�|������I��������P��������[��������]�
P������P������
L������T������
T������T�������
L������L�������
`���$���`�������
p���$���p������
����$����������
����$�����������
����$����������
����$����������
����$����������
��������������
���������������
���������������
��������������
���������������
���������������
��������������
���������������
���������������
P���$���P������0������@������P������p����������������������������������@���
���~����������
����	�������P������
������������������������������


������
������
	������	�������