User talk:Demivec: Difference between revisions

From Rosetta Code
Content added Content deleted
(Blanked the page)
 
Line 1: Line 1:



=={{header|PureBasic}}==
<font face="Courier New">Metronome features: <br>
<br>
</font>
<ul>
<li><font face="Courier New">A periodic graphical-metronomimic image.</font></li>
<li><font face="Courier New">The wav file is included within the
resulting executable as raw data.</font></li>
<li><font face="Courier New">A milliseconds between each click field
in order to assess accuracy.</font></li>
<li><font face="Courier New">Fine tuning of the </font><font
face="Courier New">click</font><font face="Courier New">-rate judged
via the </font><font face="Courier New">milliseconds between each
click field.</font></li>
<li><font face="Courier New">Volumn controls for when you just can't
stand it anymore!</font></li>
</ul>
[[file:MetronomeScreenShot.png|PureBasic output|thumb|200px]]
<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
#STRING_MIL
#STRING_ERR
#STRING_BMP
#BUTTON_ERRM
#BUTTON_ERRP
#BUTTON_VOLM
#BUTTON_VOLP
#TEXT_MIL
#TEXT_BMP
#BUTTON_START
#BUTTON_STOP
#WINDOW
#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

#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>

--[[User:brianO|brianO]]

Latest revision as of 21:37, 28 August 2012