User talk:Demivec

From Rosetta Code


PureBasic

Metronome features:

  • A periodic graphical-metronomimic image.
  • The wav file is included within the resulting executable as raw data.
  • A milliseconds between each click field in order to assess accuracy.
  • Fine tuning of the click-rate judged via the milliseconds between each click field.
  • Volumn controls for when you just can't stand it anymore!
PureBasic output

<lang PureBasic>


i am glad there are no hard feelings!
i really liked what you did!
i was getting tired last night and i could'nt figure out how to
It allows negative selections, i.e. making a click and then moving left or up from the click to outline the selection.
alrighty then, i just posted the metronome solution and if you get a chance...
i am sure you can make improvements...
brianO


Structure METRONOMEs string_mil.i string_err.i string_bmp.i volumn.i window.i image_metronome.i EndStructure

Enumeration

  1. STRING_MIL
  2. STRING_ERR
  3. STRING_BMP
  4. BUTTON_ERRM
  5. BUTTON_ERRP
  6. BUTTON_VOLM
  7. BUTTON_VOLP
  8. TEXT_MIL
  9. TEXT_BMP
  10. BUTTON_START
  11. BUTTON_STOP
  12. WINDOW
  13. IMAGE_METRONOME

EndEnumeration


If Not InitSound() MessageRequester("Error", "Sound system is not available", 0) End EndIf

If Not CatchSound(0,?sClick,?eClick-?sClick) MessageRequester("Error", "Could not CatchSound", 0) End EndIf

If LoadFont(0,"tahoma",9,#PB_Font_HighQuality|#PB_Font_Bold) SetGadgetFont(#PB_Default, FontID(0)) EndIf

Procedure.i Metronome(*m.METRONOMEs) Protected j Protected iw =360 Protected ih =360 Protected radius =100 Protected originX =iw/2 Protected originY =ih/2 Protected BeatsPerMinute=*m\string_bmp.i Protected msError.i =*m\string_err.i Protected Milliseconds =int((60*1000)/BeatsPerMinute) Protected msDword.i =Milliseconds*2/12

If CreateImage(*m\image_metronome.i,iw,ih)

Repeat Restore sAngleA

st1=ElapsedMilliseconds() For j=1 to 6 st2=ElapsedMilliseconds() Read.f Angle.f If StartDrawing(ImageOutput(*m\image_metronome.i)) StartTime = ElapsedMilliseconds() Box(0,0,iw,ih,RGB(0,0,0)) CircleX=int(radius*cos(Radian(Angle))) CircleY=int(radius*sin(Radian(Angle))) LineXY(originX,originY, originX+CircleX,originY-CircleY,RGB(255,255,0)) Circle(originX+CircleX,originY-CircleY,10,RGB(255,0,0)) StopDrawing() SetGadgetState(*m\image_metronome.i,ImageID(*m\image_metronome.i)) Endif Delay(msDword-msError) Next While ElapsedMilliseconds()-st1<Milliseconds-msError.i Wend

SetGadgetText(*m\string_mil.i,str(ElapsedMilliseconds()-st1)) PlaySound(0)

st3=ElapsedMilliseconds():err2=0 For j=1 to 6 st4=ElapsedMilliseconds() Read.f Angle.f If StartDrawing(ImageOutput(*m\image_metronome.i))

 StartTime = ElapsedMilliseconds()
 Box(0,0,iw,ih,RGB(0,0,0))
 CircleX=int(radius*cos(Radian(Angle)))
 CircleY=int(radius*sin(Radian(Angle)))
 LineXY(originX,originY, originX+CircleX,originY-CircleY,RGB(255,255,0))
 Circle(originX+CircleX,originY-CircleY,10,RGB(255,0,0))
 StopDrawing()
 SetGadgetState(*m\image_metronome.i,ImageID(*m\image_metronome.i))
 Endif

Delay(msDword-msError) Next While ElapsedMilliseconds()-st3<Milliseconds-msError.i Wend

SetGadgetText(*m\string_mil.i,str(ElapsedMilliseconds()-st3)) PlaySound(0)

ForEver Endif ProcedureReturn i.i EndProcedure


width of image
height of image
allocate memory for our structure
the milliseconds StringGadget number
intial value adjustment for time accuracy [CPU speed]

w =360 h =360

  • m.METRONOMEs =Allocatememory(SizeOf(METRONOMEs))
  • m\string_mil.i =#STRING_MIL
  • m\image_metronome.i =#IMAGE_METRONOME
  • m\volumn.i =40

DelayVal =5

draw our initial metronome

radius =100 originX =w/2 originY =h/2 Angle.f =90 If CreateImage(#IMAGE_METRONOME,w,h) If StartDrawing(ImageOutput(#IMAGE_METRONOME)) StartTime = ElapsedMilliseconds() Box(0,0,w,h,RGB(0,0,0)) CircleX=int(radius*cos(Radian(Angle))) CircleY=int(radius*sin(Radian(Angle))) LineXY(originX,originY, originX+CircleX,originY-CircleY,RGB(255,255,0)) Circle(originX+CircleX,originY-CircleY,10,RGB(255,0,0)) StopDrawing() Endif Endif

SoundVolume(0,*m\volumn.i)

window style

style=#PB_Window_SystemMenu style|#PB_Window_Screencentered style|#PB_Window_MinimizeGadget

If Not OpenWindow(#WINDOW,0,0,w+200+12,h+4,"Metronome",style) MessageRequester("Error", "Not OpenWindow", 0) End EndIf

SetWindowColor(#Window,$505050)

metronome

stylet=#PB_Text_Center|#PB_Text_Border

  1. TEXT_TUNE=500
data strings

i=2:wp=18:gh=24 i+1:TextGadget(#TEXT_TUNE ,w+wp-10,gh*(i-1),200,gh,"Fine tuning",stylet) i+1 i+1:StringGadget(#STRING_ERR,w+wp+100,gh*(i-1),90,gh,"-5",#PB_String_ReadOnly) i+1 i+1:StringGadget(#STRING_MIL,w+wp+100,gh*(i-1),90,gh,"0",#PB_String_ReadOnly) i+1 i+1:StringGadget(#STRING_BMP,w+wp+100,gh*(i-1),90,gh,"120",#PB_String_Numeric)


control buttons

i=2:wp=10:gh=24 i+1 i+1 i+1:ButtonGadget(#BUTTON_ERRM ,w+wp,gh*(i-1),50,gh,"-") i+0:ButtonGadget(#BUTTON_ERRP ,w+wp+50,gh*(i-1),50,gh,"+") i+1 i+1:TextGadget(#TEXT_MIL ,w+wp,gh*(i-1),100,gh,"MilliSeconds ",stylet) i+1 i+1:TextGadget(#TEXT_BMP ,w+wp,gh*(i-1),100,gh,"BeatsPerMin ",stylet) i+1 i+1:ButtonGadget(#BUTTON_START,w+wp,gh*(i-1),200,gh,"Start",#PB_Button_Toggle) i+1 i+1:ButtonGadget(#BUTTON_VOLM ,w+wp,gh*(i-1),100,gh,"-Volumn") i+0:ButtonGadget(#BUTTON_VOLP ,w+wp+100,gh*(i-1),100,gh,"+Volumn")


the metronome image

stylei=#PB_Image_Border ImageGadget(#IMAGE_METRONOME,0,0,360,360,ImageID(#IMAGE_METRONOME),stylei)

SetGadgetState(#IMAGE_METRONOME,ImageID(#IMAGE_METRONOME))

Repeat ; the control loop for our application

msg= WindowEvent (): Sleep_ (1) wid= EventWindow () mid= EventMenu () gid= EventGadget () etp= EventType () ewp= EventwParam () elp= EventlParam ()

If msg=#PB_Event_CloseWindow  : End : EndIf

If GetAsyncKeyState_(#VK_ESCAPE) : End : EndIf ; remove when app is o.k.


Select msg

case #PB_Event_Gadget

Select gid

 Case #BUTTON_VOLP ; +volumn 
 If *m\volumn.i<100:*m\volumn.i+10
 SoundVolume(0,*m\volumn.i)
 EndIf

Case #BUTTON_VOLM ; -volumn

 If *m\volumn.i>0  :*m\volumn.i-10
 SoundVolume(0,*m\volumn.i)
 EndIf

Case #BUTTON_ERRP ; adjustment for time accuracy [CPU speed]

 DelayVal-1
 *m\string_err.i       =DelayVal
 SetGadgetText(#STRING_ERR,str(0-DelayVal))
 If GetGadgetState(#BUTTON_START)=1
   GoSub Stop
   GoSub Start
   EndIf

Case #BUTTON_ERRM ; adjustment for time accuracy [CPU speed]

 DelayVal+1
 *m\string_err.i       =DelayVal
 SetGadgetText(#STRING_ERR,str(0-DelayVal))
 If GetGadgetState(#BUTTON_START)=1
   GoSub Stop
   GoSub Start
   EndIf

Case #BUTTON_START ; the toggle button for start/stop

 Select GetGadgetState(#BUTTON_START)
 Case 1 :GoSub Stop : GoSub Start   :SetGadgetText(#BUTTON_START,"Stop")
 Case 0 :GoSub Stop                 :SetGadgetText(#BUTTON_START,"Start")
 EndSelect


EndSelect EndSelect ForEver End


Start:  ; start up the thread with new values

  • m\string_err.i =DelayVal
  • m\string_bmp.i =Val(GetGadgetText(#STRING_BMP))

If *m\string_bmp.i

 MetronomeThread=CreateThread(@Metronome(),*m)
 EndIf

Return

Stop:  ; if the thread is running: stop it If IsThread(MetronomeThread)

 KillThread(MetronomeThread)
 EndIf

Return

DataSection ; an array of angles to be read by: MetronomeThread sAngleA: Data.f 90, 75, 60, 45, 60, 75 ; click Data.f 90,105,120,135,120,105 ; click eAngleA: EndDataSection

DataSection ; a small wav file saved as raw data sClick: Data.a $52,$49,$46,$46,$2E,$08,$00,$00,$57,$41,$56,$45,$66,$6D,$74,$20 Data.a $10,$00,$00,$00,$01,$00,$01,$00,$44,$AC,$00,$00,$44,$AC,$00,$00 Data.a $01,$00,$08,$00,$64,$61,$74,$61,$02,$06,$00,$00,$83,$84,$84,$84 Data.a $85,$85,$86,$86,$88,$89,$8A,$8B,$8E,$91,$95,$9C,$A2,$A9,$B3,$C0 Data.a $CF,$CF,$D0,$CE,$D3,$9B,$47,$31,$31,$33,$32,$32,$32,$32,$33,$32 Data.a $33,$31,$42,$A1,$C9,$C4,$AE,$BD,$D4,$CD,$D1,$CF,$D0,$CF,$CF,$D0 Data.a $CB,$A9,$70,$37,$33,$32,$32,$32,$32,$32,$33,$32,$33,$31,$34,$2E Data.a $53,$AF,$CF,$CF,$CA,$CF,$D0,$CF,$D0,$CF,$D0,$CE,$D3,$AA,$83,$97 Data.a $A1,$8A,$44,$32,$33,$31,$33,$32,$33,$32,$32,$33,$32,$33,$30,$44 Data.a $83,$94,$7E,$7D,$AE,$CF,$D0,$CF,$D0,$CE,$D1,$BF,$B8,$C3,$B9,$B7 Data.a $98,$68,$47,$37,$30,$31,$33,$32,$33,$32,$33,$32,$3D,$49,$48,$3E Data.a $38,$43,$5C,$77,$87,$91,$95,$85,$78,$79,$7A,$80,$8D,$8F,$8A,$89 Data.a $8D,$8D,$88,$81,$83,$89,$7F,$73,$77,$7A,$71,$64,$55,$43,$31,$31 Data.a $34,$32,$34,$3A,$41,$36,$2F,$33,$37,$4D,$5C,$69,$73,$78,$7B,$82 Data.a $8A,$8F,$90,$91,$91,$94,$9B,$9C,$94,$86,$75,$67,$5A,$51,$50,$4D Data.a $45,$42,$41,$41,$43,$48,$51,$54,$59,$65,$75,$82,$87,$86,$83,$7B Data.a $6E,$67,$65,$63,$61,$5F,$5D,$56,$4E,$4B,$50,$57,$5F,$67,$71,$78 Data.a $7B,$7C,$7E,$82,$83,$80,$7C,$79,$76,$71,$6D,$6C,$68,$5E,$52,$4D Data.a $4A,$46,$43,$43,$47,$4B,$4B,$4D,$53,$59,$5D,$65,$6F,$79,$82,$8B Data.a $92,$93,$90,$8B,$88,$83,$7C,$7B,$7B,$76,$6F,$66,$5E,$59,$53,$51 Data.a $53,$55,$57,$59,$5B,$5B,$5A,$5A,$5B,$5E,$61,$67,$6D,$6E,$6C,$69 Data.a $6B,$6F,$72,$73,$75,$77,$79,$78,$79,$7B,$7C,$79,$76,$73,$72,$71 Data.a $6C,$64,$59,$51,$50,$52,$53,$50,$4A,$41,$3B,$3C,$46,$53,$61,$6B Data.a $6E,$6D,$70,$79,$83,$90,$9B,$A0,$9C,$94,$8C,$85,$7E,$7A,$76,$6F Data.a $62,$56,$4E,$48,$45,$48,$4D,$4D,$4C,$4E,$54,$5B,$64,$6F,$79,$80 Data.a $83,$82,$82,$85,$88,$88,$87,$84,$7D,$73,$69,$63,$60,$5D,$5A,$55 Data.a $51,$4E,$4E,$52,$58,$5F,$66,$6A,$6D,$73,$7D,$86,$8B,$8F,$8E,$87 Data.a $81,$80,$7F,$79,$72,$6B,$60,$54,$4D,$4C,$4E,$4E,$4F,$50,$52,$58 Data.a $5F,$67,$6F,$75,$79,$7A,$7B,$7E,$82,$81,$7F,$7C,$75,$6F,$6C,$6B Data.a $6C,$6E,$6F,$6C,$67,$65,$68,$6D,$73,$77,$77,$74,$70,$6C,$6B,$6E Data.a $72,$73,$6F,$67,$60,$5D,$5E,$61,$63,$64,$63,$61,$60,$63,$69,$70 Data.a $76,$79,$79,$7A,$7C,$7F,$81,$81,$80,$7E,$79,$72,$6E,$6B,$67,$65 Data.a $62,$5F,$5D,$5D,$5E,$5F,$62,$65,$6A,$6E,$71,$75,$78,$7B,$7C,$7D Data.a $7E,$7F,$7F,$7E,$7B,$77,$74,$6F,$6A,$67,$63,$5D,$56,$50,$49,$45 Data.a $43,$43,$46,$4B,$50,$55,$5A,$60,$69,$74,$81,$8E,$97,$9D,$9F,$9E Data.a $9C,$9B,$9A,$98,$93,$8A,$7D,$6E,$61,$58,$50,$4C,$49,$46,$45,$44 Data.a $46,$4C,$53,$5C,$66,$6F,$75,$7B,$80,$85,$88,$88,$87,$85,$82,$7E Data.a $7A,$75,$70,$6B,$66,$61,$5D,$5C,$5E,$61,$65,$69,$6B,$6B,$6B,$6A Data.a $6B,$6F,$73,$76,$76,$71,$6B,$64,$61,$62,$67,$6D,$71,$72,$72,$72 Data.a $74,$7A,$81,$85,$88,$87,$85,$82,$80,$7D,$79,$72,$6A,$63,$5F,$5F Data.a $60,$60,$5E,$5A,$58,$58,$5D,$64,$6D,$74,$77,$78,$77,$79,$7D,$82 Data.a $85,$86,$84,$80,$7C,$79,$78,$78,$75,$70,$6B,$66,$64,$66,$68,$6A Data.a $6B,$68,$64,$63,$66,$6C,$72,$76,$78,$78,$78,$78,$78,$7B,$7E,$80 Data.a $7F,$7D,$7B,$79,$74,$6F,$6A,$65,$63,$61,$5F,$5D,$5C,$5A,$58,$59 Data.a $5E,$66,$6D,$74,$79,$7C,$80,$84,$89,$8B,$8C,$8B,$87,$81,$7C,$77 Data.a $72,$6B,$63,$5B,$55,$52,$53,$55,$57,$59,$59,$5C,$62,$6B,$77,$82 Data.a $8B,$91,$93,$94,$97,$9A,$9B,$98,$92,$8A,$81,$77,$72,$6E,$6A,$65 Data.a $5E,$58,$56,$56,$57,$57,$54,$53,$53,$57,$5E,$67,$6D,$6F,$6E,$6E Data.a $74,$7F,$8D,$96,$98,$93,$8C,$89,$8B,$91,$97,$96,$8C,$7E,$71,$69 Data.a $67,$67,$65,$5D,$4F,$41,$39,$3B,$45,$51,$59,$5A,$56,$56,$5B,$69 Data.a $7B,$89,$90,$8F,$8A,$87,$86,$89,$8C,$8A,$84,$7B,$75,$75,$78,$7A Data.a $76,$6D,$63,$5E,$60,$68,$71,$74,$6F,$63,$57,$52,$58,$65,$73,$7B Data.a $7C,$77,$72,$72,$77,$81,$89,$8C,$88,$81,$7A,$76,$76,$76,$75,$70 Data.a $69,$62,$5F,$62,$68,$6D,$6D,$6A,$68,$68,$6C,$74,$7D,$84,$87,$86 Data.a $84,$84,$86,$89,$8A,$88,$85,$84,$83,$80,$7B,$74,$6B,$61,$5A,$58 Data.a $5A,$5C,$5C,$59,$55,$53,$55,$5B,$65,$72,$7D,$84,$86,$87,$89,$8C Data.a $92,$98,$9A,$99,$96,$90,$8C,$88,$83,$7F,$79,$72,$6C,$66,$63,$61 Data.a $5E,$59,$52,$4C,$4B,$4E,$55,$5E,$63,$66,$67,$69,$71,$7C,$88,$91 Data.a $93,$91,$8C,$88,$88,$8A,$8E,$8E,$88,$7E,$73,$6A,$67,$66,$66,$65 Data.a $62,$5B,$55,$52,$53,$58,$5F,$65,$69,$6B,$6F,$75,$7C,$83,$88,$8B Data.a $8B,$89,$8B,$8E,$8E,$8B,$85,$7E,$74,$6E,$6C,$6D,$6D,$6B,$67,$62 Data.a $5F,$60,$64,$67,$6A,$6B,$6C,$6C,$6F,$73,$75,$77,$78,$78,$79,$7C Data.a $82,$89,$8D,$8D,$8C,$8C,$8C,$8E,$91,$90,$8C,$85,$7C,$74,$6D,$68 Data.a $65,$62,$5E,$5B,$58,$58,$5C,$62,$68,$6C,$70,$75,$7C,$83,$8A,$90 Data.a $96,$98,$98,$96,$93,$8E,$8A,$84,$7F,$7A,$75,$6E,$67,$60,$59,$54 Data.a $52,$53,$57,$5B,$5D,$5E,$60,$65,$6C,$74,$7C,$87,$90,$98,$9D,$A1 Data.a $A2,$A1,$9F,$9C,$9A,$97,$92,$89,$7E,$70,$64,$5C,$57,$55,$53,$52 Data.a $50,$4F,$51,$56,$5D,$66,$6D,$73,$79,$7E,$82,$86,$89,$8B,$8D,$8D Data.a $8C,$89,$84,$7F,$7B,$79,$77,$77,$76,$73,$6E,$6A,$6A,$6F,$74,$78 Data.a $79,$78,$74,$72,$73,$76,$79,$7B,$7A,$75,$6F,$6A,$68,$69,$6B,$6C Data.a $6D,$6C,$6C,$6D,$6F,$74,$78,$7C,$80,$82,$85,$88,$8B,$8C,$8B,$88 Data.a $84,$81,$7F,$7D,$7B,$79,$75,$6F,$6A,$67,$65,$65,$68,$6B,$6D,$6F Data.a $70,$72,$74,$79,$7D,$81,$85,$87,$88,$89,$8A,$8C,$8D,$8D,$8B,$86 Data.a $82,$7F,$7D,$7C,$7A,$77,$73,$6F,$6A,$66,$65,$64,$65,$68,$6B,$6F Data.a $72,$74,$75,$76,$79,$7D,$83,$8A,$8D,$8C,$88,$82,$7D,$7A,$78,$76 Data.a $73,$6F,$69,$64,$60,$60,$62,$65,$68,$6B,$6F,$75,$7C,$84,$8A,$8E Data.a $90,$91,$92,$94,$94,$93,$90,$8D,$88,$80,$78,$6F,$68,$64,$62,$60 Data.a $5F,$5D,$5A,$58,$58,$5D,$68,$73,$7D,$83,$87,$89,$8C,$91,$96,$9B Data.a $9D,$9B,$95,$8C,$83,$7B,$76,$71,$6D,$68,$63,$5D,$58,$56,$57,$5B Data.a $62,$69,$6F,$75,$7B,$81,$86,$8C,$91,$95,$97,$97,$95,$93,$8F,$88 Data.a $80,$77,$6F,$69,$66,$63,$60,$5C,$58,$54,$53,$59,$62,$6D,$75,$7A Data.a $7C,$7E,$83,$8D,$98,$A0,$A2,$9E,$97,$90,$8E,$8F,$8F,$8D,$85,$79 Data.a $6E,$66,$65,$68,$6D,$6E,$6B,$65,$60,$60,$65,$6C,$74,$79,$7A,$79 Data.a $78,$79,$7C,$7E,$7F,$7F,$7F,$7F,$80,$82,$84,$84,$83,$82,$81,$83 Data.a $88,$8D,$91,$92,$8E,$88,$82,$7F,$7F,$7F,$7F,$7C,$75,$6A,$60,$59 Data.a $56,$56,$58,$59,$5A,$5A,$5E,$65,$6E,$79,$82,$8A,$91,$97,$9F,$A5 Data.a $AA,$AB,$A6,$9C,$93,$8A,$84,$7E,$76,$6B,$5E,$51,$48,$45,$45,$48 Data.a $4B,$4E,$51,$57,$60,$6E,$7C,$8A,$94,$9B,$A0,$A4,$A8,$AB,$AC,$A9 Data.a $A3,$98,$8C,$7F,$73,$6A,$62,$5A,$54,$4E,$4A,$48,$49,$4D,$55,$60 Data.a $6B,$77,$81,$8A,$92,$9A,$A1,$A9,$AD,$AF,$AD,$A7,$9F,$96,$8C,$84 Data.a $7B,$71,$67,$5C,$52,$4C,$49,$4B,$4F,$54,$5A,$60,$67,$71,$7D,$8A Data.a $96,$9F,$A4,$A6,$A6,$A5,$A4,$A2,$9C,$94,$89,$7F,$77,$70,$69,$62 Data.a $5A,$54,$4F,$50,$56,$5E,$65,$6B,$6E,$73,$79,$83,$8F,$98,$9F,$A1 Data.a $9F,$9C,$9A,$98,$96,$92,$8C,$84,$7A,$71,$6B,$67,$65,$64,$62,$61 Data.a $61,$62,$67,$6D,$73,$79,$7E,$80,$83,$85,$88,$8A,$8C,$8B,$89,$86 Data.a $84,$84,$84,$84,$82,$7E,$7A,$79,$7A,$7C,$7E,$7E,$7C,$7A,$77,$77 Data.a $79,$7C,$7E,$7D,$7B,$79,$79,$79,$7A,$7B,$7C,$7C,$7B,$7B,$7C,$7D Data.a $7D,$7C,$7B,$7A,$7B,$7C,$7D,$7D,$7B,$79,$77,$76,$77,$78,$79,$79 Data.a $78,$76,$75,$76,$79,$7A,$7A,$78,$76,$75,$77,$7C,$81,$80,$53,$41 Data.a $55,$52,$00,$02,$00,$00,$31,$2C,$20,$30,$2C,$20,$36,$2C,$20,$30 eClick: EndDataSection </lang>

--brianO