Code
#NoteOn = $90;
#MSEC=60000.0 ; = millisecs in 1 minute
Global _hMIDIout
Procedure midiinit()
For nDev=-1 To midiOutGetNumDevs_()-1
If midiOutGetDevCaps_(nDev,@midi.MIDIOUTCAPS,SizeOf(MIDIOUTCAPS))=0
If midi\wVoices>0
MidiPort=nDev
EndIf
EndIf
Next
midiOutOpen_(@_hMIDIout,MidiPort,0,0,0)
EndProcedure
Macro MMK ; mouse key state
Abs(GetAsyncKeyState_(#VK_LBUTTON) +GetAsyncKeyState_(#VK_RBUTTON)*2+GetAsyncKeyState_(#VK_MBUTTON)*3)/$8000
EndMacro
Macro PlayMIDINote(Chan, Note, Vol=100)
midiOutShortMsg_(_hMIDIout, #NoteOn | Chan | Note << 8 | Vol << 16) ;
EndMacro
Macro BPM_Msec(n) ; convert MilliSecs to Beats per Minute and vice versa
#MSEC/n
EndMacro
Structure Metronome
BPM.l
Msecs.l
Sound.B
Vol.B
count.l
EndStructure
Procedure ThreadMetron(*Param.Metronome)
With *Param
\Sound=35 ; 35=acoustic bass drum
Repeat
PlayMIDINote(9,\Sound,100) ; 9=perc MIDI channel
; \count+1 ; for beat count
Delay(\Msecs)
ForEver
EndWith
EndProcedure
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
If OpenWindow(0, 100, 100,400,80 ,"Test Metronome", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered)
StickyWindow(0,1)
_TB=TrackBarGadget(#PB_Any,40,10,300,30,50,500)
_InfoTB=TextGadget(#PB_Any,GadgetX(_TB),40,300,20,"",#PB_Text_Border)
SetGadgetState(_TB,100)
SetGadgetText(_InfoTB,"Beats per minute : "+Str(GetGadgetState(_TB)))
BPM.Metronome
BPM\Msecs=BPM_Msec(GetGadgetState(_TB))
midiinit()
Thread1=CreateThread(@ThreadMetron(),@BPM)
ThreadPriority(Thread1,31)
Repeat
If GetAsyncKeyState_(27) : End : EndIf
Ev=WaitWindowEvent()
Select Ev
Case #PB_Event_Gadget
Select EventGadget()
Case _TB
BPM\BPM=GetGadgetState(_TB)
BPM\Msecs=BPM_Msec(BPM\BPM)
SetGadgetText(_InfoTB,"Beats per minute : "+Str(BPM\BPM))
EndSelect
EndSelect
Until Ev=#WM_CLOSE
End
EndIf