[5.20 LTS] BPM, mesure et temps

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

[5.20 LTS] BPM, mesure et temps

Message par blendman »

salut

Un petit utilitaire plutôt pour musiciens :
- permet de connaître le nombre de mesure, en fonction du BPM, et d'une durée fournie.
- permet de connaître le temps que dure une mesure en fonction du BPM.
- petit zoom au passage sur un canvas lol.

Sinon, je n'ai pas ajouté la gestion des temps (4/4,3/4, etc...) mais bon.

J'avais besoin de ce code pour une petite application que j'ai réalisée, je me suis dit que ça pourrait pitet intéressé quelqu'un ^^.

Code : Tout sélectionner

Enumeration 
  #Gadget_Bpm
  #Gadget_Mesure
  #MarkerRegion
  #Gadget_Zoom  
  #TimeForMesure
  #MesureByTime
  #SetTiming
EndEnumeration

Procedure UpdateMarker()
  
  bpm = GetGadgetState(#Gadget_Bpm)
  zoom = GetGadgetState(#Gadget_Zoom)

  z.d = Zoom/100
  g.d = 100 * BPM/60
  
  If StartDrawing(CanvasOutput(#MarkerRegion))
    
    Box(0,0,480,50,RGB(200,200,200))
    DrawingMode(#PB_2DDrawing_Transparent)
    ; the secondes
    For i = 0 To (480/(g * z))
      X = i * g * z
      Line(x,0,1,4,RGB(100,100,100))
      DrawText(x + 2, 5,Str(i),0)
    Next i
    ; the bpm
    For i = 0 To (480/(100 * z))
      X = i *  100 * z
      Line(x,0,1,40,RGB(255,0,0))
      DrawText(x + 2, 35,Str(i),RGB(255,0,0))
    Next i
    
    
    StopDrawing()
  EndIf
  
  TimeForOneMesure = 1000*BPM/60
  SetGadgetText(#TimeForMesure,"Temps par mesure (en milliseconde) : "+Str(TimeForOneMesure))

  timing = Val(GetGadgetText(#SetTiming))
  
  MesureByTime.d = timing * (bpm/60)
  SetGadgetText(#MesureByTime,Str(MesureByTime))
  
  
  ProcedureReturn TimeForOneMesure
EndProcedure


If OpenWindow(0, 0,0,500,300,"Mesure/temps",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  SpinGadget(#Gadget_Bpm,10,10,50,20,40,200,#PB_Spin_Numeric)
  SetGadgetState(#Gadget_Bpm,80)
  GadgetToolTip(#Gadget_Bpm,"BPM")
  
  TrackBarGadget(#Gadget_Zoom,70,10,200,20,20,200)
  SetGadgetState(#Gadget_Zoom,100)
  GadgetToolTip(#Gadget_Zoom,"Zoom")
  
  CanvasGadget(#MarkerRegion,10,40,480,50)
  
  TextGadget(#PB_Any, 10,100,250,40,"En noir : le temps en seconde, en fonction du BPM."+Chr(13)+"En rouge : les mesures")
  
  TextGadget(#TimeForMesure, 10, 140,350,20,"Temps par mesure (en milliseconde) : ")
  txt$="Durée (en secondes): "
  TextGadget(#PB_Any, 10,200,Len(txt$)*6,20,txt$)
  SpinGadget(#SetTiming,Len(txt$)*6,198,50,20,0,20000,#PB_Spin_Numeric)
  SetGadgetText(#SetTiming,"240")
  TextGadget(#PB_Any, 10, 230,320,20,"Nombre de mesure (arrondi sup) pour le temps imparti (au BPM) : ")
  TextGadget(#MesureByTime,330,230,250,20,"")
  
  UpdateMarker()

EndIf

Repeat
  
  Event = WaitWindowEvent()
    
  Select event
      
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        Case #Gadget_Bpm,#Gadget_Zoom,#SetTiming
          UpdateMarker()
                    
      EndSelect
      
  EndSelect
    
Until Event = #PB_Event_CloseWindow
PS : Hélas, je ne fais plus de musique, depuis que je suis devenu hyperacousique et accouphénique. Mais ça n'empêche pas de coder des utilitaires pour musiciens ^^.
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [5.20 LTS] BPM, mesure et temps

Message par Ar-S »

Merci pour ce partage.

Ni aurait-il pas un soucis d'affichage avec les spingadgets ou suis-je mal réveillé ?

Image

Code : Tout sélectionner

Enumeration 
	#Gadget_Bpm
	#Gadget_Mesure
	#MarkerRegion
	#Gadget_Zoom  
	#TimeForMesure
	#MesureByTime
	#SetTiming
EndEnumeration

Procedure UpdateMarker()
	
	bpm = GetGadgetState(#Gadget_Bpm)
	zoom = GetGadgetState(#Gadget_Zoom)

	z.d = Zoom/100
	g.d = 100 * BPM/60
	
	If StartDrawing(CanvasOutput(#MarkerRegion))
		
		Box(0,0,480,50,RGB(200,200,200))
		DrawingMode(#PB_2DDrawing_Transparent)
		; the secondes
		For i = 0 To (480/(g * z))
			X = i * g * z
			Line(x,0,1,4,RGB(100,100,100))
			DrawText(x + 2, 5,Str(i),0)
		Next i
		; the bpm
		For i = 0 To (480/(100 * z))
			X = i *  100 * z
			Line(x,0,1,40,RGB(255,0,0))
			DrawText(x + 2, 35,Str(i),RGB(255,0,0))
		Next i
		
		
		StopDrawing()
	EndIf
	
	TimeForOneMesure = 1000*BPM/60
	SetGadgetText(#TimeForMesure,"Temps par mesure (en milliseconde) : "+Str(TimeForOneMesure))

	timing = Val(GetGadgetText(#SetTiming))
	
	MesureByTime.d = timing * (bpm/60)
	SetGadgetText(#MesureByTime,Str(MesureByTime))
	
	
	ProcedureReturn TimeForOneMesure
EndProcedure


If OpenWindow(0, 0,0,500,300,"Mesure/temps",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
	
	SpinGadget(#Gadget_Bpm,10,10,50,20,40,200,#PB_Spin_Numeric)
	SetGadgetState(#Gadget_Bpm,80)
	GadgetToolTip(#Gadget_Bpm,"BPM")
	
	TrackBarGadget(#Gadget_Zoom,70,10,200,20,20,200)
	SetGadgetState(#Gadget_Zoom,100)
	GadgetToolTip(#Gadget_Zoom,"Zoom")
	
	CanvasGadget(#MarkerRegion,10,40,480,50)
	
	TextGadget(#PB_Any, 10,100,250,40,"En noir : le temps en seconde, en fonction du BPM."+Chr(13)+"En rouge : les mesures")
	
	TextGadget(#TimeForMesure, 10, 140,350,20,"Temps par mesure (en milliseconde) : ")
	txt$="Durée (en secondes): "
	TextGadget(#PB_Any, 10,200, 200,20,txt$)
	SpinGadget(#SetTiming,120,198,80,20,0,20000,#PB_Spin_Numeric)
	SetGadgetText(#SetTiming,"240")
	TextGadget(#PB_Any, 10, 230,320,20,"Nombre de mesure (arrondi sup) pour le temps imparti (au BPM) : ")
	TextGadget(#MesureByTime,330,230,250,20,"")
	
	UpdateMarker()

EndIf

Repeat
	
	Event = WaitWindowEvent()
		
	Select event
			
		Case #PB_Event_Gadget
			
			Select EventGadget()
					
				Case #Gadget_Bpm,#Gadget_Zoom,#SetTiming
					UpdateMarker()
										
			EndSelect
			
	EndSelect
		
Until Event = #PB_Event_CloseWindow

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [5.20 LTS] BPM, mesure et temps

Message par blendman »

Sur win8 pb5.20 LTS b17, je n'ai pas de soucis, je vais tester sur la beta18 pour voir.
Torp
Messages : 360
Inscription : lun. 22/nov./2004 13:05

Re: [5.20 LTS] BPM, mesure et temps

Message par Torp »

Le problème a été signalé et corrigé pour la prochaine beta :
http://www.purebasic.fr/english/viewtop ... =4&t=56565
:wink:
Répondre