Voici un petit programme pour les musiciens voulant s'entrainer à reconnaitre les intervalles.
Le programmes joue deux notes en même temps grace aux fonctions midi de la carte son, puis apres un petit délai la voix du synthétiseur vocal prononce le nom de l'intervalle.
Il faut au préalable télécharger une voix francaise pour que ce prog puisse marcher correctement :
celle ci par exemple : http://download.microsoft.com/download/ ... French.zip
EDIT : ah oui j'oubliais, il faut aussi la lib TTS....
la lib winlib.pb :
Code : Tout sélectionner
;
; PureBasic Visual Designer v3.92 build 1460
;- Window Constants
;
Enumeration
#Window_Options
#Window_main
EndEnumeration
;- Gadget Constants
;
Enumeration
; Options
#GroupBoxIntervalles
#CheckBox_SecondeMajeure
#CheckBox_SecondeMineure
#CheckBox_TierceMajeure
#CheckBox_TierceMineure
#CheckBox_QuarteJuste
#CheckBox_QuinteAugmentee
#CheckBox_SixteMajeure
#CheckBox_SeptiemeMineure
#CheckBox_Octave
#CheckBox_SeptiemeMajeure
#CheckBox_QuinteJuste
#CheckBox_QuarteAugmentee
#FondamentaleFixe
#RndDeuxiemeNote
#Liste
#LabelListe
#Button_valider
#Button_Annuler
#GroupBoxVoxSynth
; Fenêtre principale
#Button_startend
#Button_quitter
#Button_Options
#Hyperlink
;#Button_about
EndEnumeration
;- Fonts
Global FontID1, FontID2
FontID1 = LoadFont (1, "Arial", 8)
FontID2 = LoadFont (2, "Arial", 8, #PB_Font_Underline)
;#PB_Font_Bold : La police de caractère sera en gras
;#PB_Font_Italic : La police de caractère sera en italique
;#PB_Font_Underline : La police de caractère sera soulignée
;#PB_Font_StrikeOut : La police de caractère sera barrée
;#PB_Font_HighQuality: La police de caractère sera en qualité supérieure (plus lent)
; BalloonTip Constants
#TOOLTIP_NO_ICON = 0
#TOOLTIP_INFO_ICON = 1
#TOOLTIP_WARNING_ICON = 2
#TOOLTIP_ERROR_ICON = 3
Procedure BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)
ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID,0,GetModuleHandle_(0),0)
SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
Balloon\hWnd=GadgetID(Gadget)
Balloon\uId=GadgetID(Gadget)
Balloon\lpszText=@Text$
SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
If Title$ > ""
SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
EndIf
EndProcedure
Procedure Open_Window_Options ()
If OpenWindow (#Window_Options, 351, 148, 554, 300, "Options", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
If CreateGadgetList(WindowID (#Window_Options))
OpenPreferences (PreferencesFile$)
Frame3DGadget (#GroupBoxIntervalles, 10, 10, 390, 215, "Intervalles")
CheckBoxGadget (#CheckBox_SecondeMajeure, 160, 30, 120, 20, "Seconde majeure")
SetGadgetFont (#CheckBox_SecondeMajeure, FontID1)
Flag = ReadPreferenceLong ("SecondeMajeure", 0)
SetGadgetState(#CheckBox_SecondeMajeure, Flag)
CheckBoxGadget (#CheckBox_SecondeMineure, 20, 30, 120, 20, "Seconde mineure")
SetGadgetFont (#CheckBox_SecondeMineure, FontID1)
Flag = ReadPreferenceLong ("SecondeMineure", 0)
SetGadgetState(#CheckBox_SecondeMineure, Flag)
CheckBoxGadget (#CheckBox_TierceMajeure, 160, 50, 110, 20, "Tierce majeure")
SetGadgetFont (#CheckBox_TierceMajeure, FontID1)
Flag = ReadPreferenceLong ("TierceMajeure", 0)
SetGadgetState(#CheckBox_TierceMajeure, Flag)
CheckBoxGadget (#CheckBox_TierceMineure, 20, 50, 116, 20, "Tierce mineure")
SetGadgetFont (#CheckBox_TierceMineure, FontID1)
Flag = ReadPreferenceLong ("TierceMineure", 0)
SetGadgetState(#CheckBox_TierceMineure, Flag)
CheckBoxGadget (#CheckBox_QuarteJuste, 20, 70, 110, 20, "Quarte juste")
SetGadgetFont (#CheckBox_QuarteJuste, FontID1)
Flag = ReadPreferenceLong ("QuarteJuste", 0)
SetGadgetState(#CheckBox_QuarteJuste, Flag)
CheckBoxGadget (#CheckBox_QuinteAugmentee, 160, 90, 200, 20, "Quinte augmentée / Sixte mineure")
SetGadgetFont (#CheckBox_QuinteAugmentee, FontID1)
Flag = ReadPreferenceLong ("QuinteAugmentee", 0)
SetGadgetState(#CheckBox_QuinteAugmentee, Flag)
CheckBoxGadget (#CheckBox_SixteMajeure, 20, 110, 110, 20, "Sixte majeure")
SetGadgetFont (#CheckBox_SixteMajeure, FontID1)
Flag = ReadPreferenceLong ("SixteMajeure", 0)
SetGadgetState(#CheckBox_SixteMajeure, Flag)
CheckBoxGadget (#CheckBox_SeptiemeMineure, 20, 130, 110, 20, "Septième mineure")
SetGadgetFont (#CheckBox_SeptiemeMineure, FontID1)
Flag = ReadPreferenceLong ("SeptiemeMineure", 0)
SetGadgetState(#CheckBox_SeptiemeMineure, Flag)
CheckBoxGadget (#CheckBox_Octave, 20, 150, 110, 20, "Octave")
SetGadgetFont (#CheckBox_Octave, FontID1)
Flag = ReadPreferenceLong ("Octave", 0)
SetGadgetState(#CheckBox_Octave, Flag)
CheckBoxGadget (#CheckBox_SeptiemeMajeure, 160, 130, 110, 20, "Septième majeure")
SetGadgetFont (#CheckBox_SeptiemeMajeure, FontID1)
Flag = ReadPreferenceLong ("SeptiemeMajeure", 0)
SetGadgetState(#CheckBox_SeptiemeMajeure, Flag)
CheckBoxGadget (#CheckBox_QuinteJuste, 20, 90, 110, 20, "Quinte juste")
SetGadgetFont (#CheckBox_QuinteJuste, FontID1)
Flag = ReadPreferenceLong ("QuinteJuste", 0)
SetGadgetState(#CheckBox_QuinteJuste, Flag)
CheckBoxGadget (#CheckBox_QuarteAugmentee, 160, 70, 230, 20, "Quarte augmentée / Quinte diminuée")
SetGadgetFont (#CheckBox_QuarteAugmentee, FontID1)
Flag = ReadPreferenceLong ("QuarteAugmentee", 0)
SetGadgetState(#CheckBox_QuarteAugmentee, Flag)
CheckBoxGadget (#FondamentaleFixe, 20, 180, 200, 20, "Toujours la même fondamentale (C)")
SetGadgetFont (#FondamentaleFixe, FontID1)
Flag = ReadPreferenceLong ("FondamentaleFixe", 0)
SetGadgetState(#FondamentaleFixe, Flag)
CheckBoxGadget (#RndDeuxiemeNote, 20, 200, 200, 20, "Deuxième note : Octave au hasard")
SetGadgetFont (#RndDeuxiemeNote, FontID1)
Flag = ReadPreferenceLong ("RndDeuxiemeNote", 0)
SetGadgetState(#RndDeuxiemeNote, Flag)
ButtonGadget (#Button_valider, 410, 30, 110, 29, "Valider")
SetGadgetFont (#Button_valider, FontID1)
ButtonGadget (#Button_Annuler, 410, 70, 110, 30, "Annuler")
SetGadgetFont (#Button_Annuler, FontID1)
Frame3DGadget (#GroupBoxVoxSynth, 10, 230, 390, 50, "Synthétiseur vocal")
TextGadget (#LabelListe, 20, 252,125, 20, "Utiliser la voix suivante :")
ComboBoxGadget (#Liste, 145,250, 150, 150)
; liste des voix
For i = 0 To Voices
name$ = TTSEngName (i) ; Retrieve each voice name.
language$ = TTSEngLang (i) ; arg1.l = voice index
AddGadgetItem (#Liste , -1, language$ ) ; ajoute dans la liste les noms trouvé+nationalité
Next i
Voice = ReadPreferenceLong ("Voice", 0)
name$ = TTSEngName (Voice) ; cherche le nom
language$ = TTSEngLang (Voice) ; cherche le nom+nationalité
SetGadgetState (#Liste , Voice) ; active la voix lu par defaut dans la liste
ClosePreferences ()
EndIf
EndIf
EndProcedure
Procedure Open_Window_main()
If OpenWindow(#Window_main, 454, 268, 196, 170, "Pure ear trainer v0.1", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(#Window_main))
ButtonGadget(#Button_startend, 20, 20, 150, 30, "Lancer l'exercice")
SetGadgetFont(#Button_startend, FontID1)
ButtonGadget(#Button_Options, 20, 60, 150, 30, "Options...")
SetGadgetFont(#Button_Options, FontID1)
ButtonGadget(#Button_quitter, 20, 100, 152, 30, "Quitter")
SetGadgetFont(#Button_quitter, FontID1)
HyperLinkGadget(#Hyperlink, 60, 140,250,20,"Par Bombseb", RGB (0,0,255), #PB_Font_Underline)
SetGadgetFont(#Hyperlink, FontID2)
; ButtonGadget(#Button_about, 20, 100, 150, 30, "A propos....")
; SetGadgetFont(#Button_about, FontID1)
EndIf
EndIf
EndProcedure
Code : Tout sélectionner
; PureBasic Visual Designer v3.92 build 1460
Global PreferencesFile$
Global ExerciceEnCours
Global Voices
ExericeEnCours = 0
PreferencesFile$ = "PureEarTrainer.ini"
;{******** INIT DE LA LIB TTS ********
type = TTSInit(0,0,0) ; First we initialize the tts support.
;Debug type
Voices.l = TTSEngCount () ; Get the highest voice index.
If Voices > -1 ; If there are any voice installed...
; Debug "Il y a " + Str (voices + 1)+ " voix installées sur votre système"
;Remember that voice index starts from 0
For i=0 To Voices
name$ = TTSEngName(i) ; Retrieve each voice name.
; Debug "Voice index = " + Str (i)+ " , Voice name = " +name$
Next i
Else
MessageRequester ( "Erreur" , "Il n'y a pas de voix" + Chr (10)+ "installées sur votre système" , #PB_MessageRequester_Ok)
End
EndIf
;}***********************************
IncludeFile "winlib.pb"
Declare Options (WindowMain)
Declare Exercice ()
Declare GetRandomIntervalle ()
Declare GetRandomOctave ()
; **** Declarations pour le midi ****
Global m_hMidiOut,m_MIDIOpen.b
Declare SendMIDIMessage (nStatus.l,nCanal.l,nData1.l,nData2.l)
Declare MIDIOpen ()
Declare PlayNoteMidi (Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
Declare ChargeInstrument (Canal.b,Instrument.b)
; ***********************************
;{*** Création du .ini s'il n'existe pas ***
If FileSize(PreferencesFile$) < 0
CreatePreferences (PreferencesFile$)
WritePreferenceLong ("SecondeMajeure", 0)
WritePreferenceLong ("SecondeMineure", 0)
WritePreferenceLong ("TierceMajeure", 1)
WritePreferenceLong ("TierceMineure", 1)
WritePreferenceLong ("QuarteJuste", 0)
WritePreferenceLong ("QuinteAugmentee", 0)
WritePreferenceLong ("SixteMajeure", 0)
WritePreferenceLong ("SeptiemeMineure", 0)
WritePreferenceLong ("Octave", 0)
WritePreferenceLong ("SeptiemeMajeure", 0)
WritePreferenceLong ("QuinteJuste", 0)
WritePreferenceLong ("QuarteAugmentee", 0)
WritePreferenceLong ("FondamentaleFixe", 1)
WritePreferenceLong ("RndDeuxiemeNote", 0)
WritePreferenceLong ("Voice", 0)
ClosePreferences ()
EndIf
;}*******************************************
Open_Window_Main ()
;{ -------- Boucle d'evenement de la fenêtre principale ---------
Repeat
EventID = WaitWindowEvent ()
; ****************************
; **** Fenêtre principale ****
; ****************************
Select EventID
Case #PB_Event_Gadget
Select EventGadget ()
Case #Button_startend
If ExerciceEnCours = 0
;** On lance l'exercice **
SetGadgetText(#Button_startend, "Stopper l'exercice")
MIDIOpen ()
ChargeInstrument(0,0)
ExerciceEnCours = 1
CreateThread (@Exercice(), 0)
Else
; ** On arrete l'exercice **
SetGadgetText(#Button_startend, "Lancer l'exercice")
ExerciceEnCours = 0
EndIf
Case #Button_Options ; ***** Options *****
Open_Window_Options ()
Options (#Window_Main)
Case #Button_Quitter ; ***** Quit..*****
EventID = #PB_Event_CloseWindow
Case #Hyperlink
RunProgram("http:\\bombseb.free.fr")
EndSelect
EndSelect
Until EventID = #PB_Event_CloseWindow
;}-------- Boucle d'evennement de la fenêtre principale ---------
Procedure Options (ParentWindow)
EnableWindow_(WindowID (ParentWindow), #False)
Repeat
EventID = WaitWindowEvent ()
; ****************************
; **** Options ****
; ****************************
If EventID = #PB_Event_Gadget
Select EventGadget ()
Case #Button_Annuler ; ***** Quitter les options..*****
EventID = #PB_Event_CloseWindow
Case #Button_valider
; Sauvegarde dans le .ini
CreatePreferences (PreferencesFile$)
WritePreferenceLong ("SecondeMajeure", GetGadgetState (#CheckBox_SecondeMajeure))
WritePreferenceLong ("SecondeMineure", GetGadgetState (#CheckBox_SecondeMineure))
WritePreferenceLong ("TierceMajeure", GetGadgetState (#CheckBox_TierceMajeure))
WritePreferenceLong ("TierceMineure", GetGadgetState (#CheckBox_TierceMineure))
WritePreferenceLong ("QuarteJuste", GetGadgetState (#CheckBox_QuarteJuste))
WritePreferenceLong ("QuinteAugmentee", GetGadgetState (#CheckBox_QuinteAugmentee))
WritePreferenceLong ("SixteMajeure", GetGadgetState (#CheckBox_SixteMajeure))
WritePreferenceLong ("SeptiemeMineure", GetGadgetState (#CheckBox_SeptiemeMineure))
WritePreferenceLong ("Octave", GetGadgetState (#CheckBox_Octave))
WritePreferenceLong ("SeptiemeMajeure", GetGadgetState (#CheckBox_SeptiemeMajeure))
WritePreferenceLong ("QuinteJuste", GetGadgetState (#CheckBox_QuinteJuste))
WritePreferenceLong ("QuarteAugmentee", GetGadgetState (#CheckBox_QuarteAugmentee))
WritePreferenceLong ("FondamentaleFixe", GetGadgetState (#FondamentaleFixe))
WritePreferenceLong ("RndDeuxiemeNote", GetGadgetState (#RndDeuxiemeNote))
WritePreferenceLong ("Voice", GetGadgetState (#Liste))
ClosePreferences ()
EventID = #PB_Event_CloseWindow
EndSelect
EndIf
Until EventID = #PB_Event_CloseWindow
CloseWindow (#Window_Options)
EnableWindow_(WindowID (ParentWindow), #True)
SetActiveWindow (ParentWindow)
EndProcedure
Procedure Exercice ()
Dim IntervalleName$ (12)
IntervalleName$ (1) = "Seconde mineure"
IntervalleName$ (2) = "Seconde majeure"
IntervalleName$ (3) = "Tierce mineure"
IntervalleName$ (4) = "Tierce majeure"
IntervalleName$ (5) = "Quarte juste"
IntervalleName$ (6) = "Quarte augmentée"
IntervalleName$ (7) = "Quinte juste"
IntervalleName$ (8) = "Quinte augmentée"
IntervalleName$ (9) = "Sixte majeure"
IntervalleName$ (10) = "Septième mineure"
IntervalleName$ (11) = "Septième majeure"
IntervalleName$ (12) = "Octave"
note = 1
Repeat
OpenPreferences (PreferencesFile$)
Flag = ReadPreferenceLong ("FondamentaleFixe", 0)
If Flag = 1
Fondamentale = 0
Else
Fondamentale = Random (11)
EndIf
DeuxiemeNote = GetRandomIntervalle ()
NomNote$ = IntervalleName$ (DeuxiemeNote)
OpenPreferences (PreferencesFile$)
Flag = ReadPreferenceLong ("RndDeuxiemeNote", 0)
If Flag = 1
DeuxiemeNote = DeuxiemeNote + Random (1) * 12
EndIf
OpenPreferences (PreferencesFile$)
voix = ReadPreferenceLong ("Voice", 0)
ClosePreferences ()
;Debug "Intervalle :" + NomNote$ + " -> " + Str (DeuxiemeNote) + " demi tons"
PlayNoteMIDI (0, 48 + Fondamentale, 127,127)
PlayNoteMIDI (0, 48 + Fondamentale + DeuxiemeNote, 127,127)
Delay (2000)
TTSInit(0,0,0) ; First we initialize the tts support.
TTSSelect (voix)
TTSSetVolume (50)
TTSSetSpeed (0) ; vitesse de diction -50=lent ; +50= tres rapide
TTSSetPitch (0)
TTSSpeak (NomNote$) ; Speak!
Delay (2000)
Until ExerciceEnCours = 0
EndProcedure
Procedure GetRandomIntervalle ()
Dim IntervallesChoisies (12)
OpenPreferences (PreferencesFile$)
Index = 1
Flag = ReadPreferenceLong ("SecondeMineure", 0)
If Flag = 1:IntervallesChoisies (Index) = 1:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("SecondeMajeure", 0)
If Flag = 1:IntervallesChoisies (Index) = 2:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("TierceMineure", 0)
If Flag = 1:IntervallesChoisies (Index) = 3:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("TierceMajeure", 0)
If Flag = 1:IntervallesChoisies (Index) = 4:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("QuarteJuste", 0)
If Flag = 1:IntervallesChoisies (Index) = 5:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("QuarteAugmentee", 0)
If Flag = 1:IntervallesChoisies (Index) = 6:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("QuinteJuste", 0)
If Flag = 1:IntervallesChoisies (Index) = 7:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("QuinteAugmentee", 0)
If Flag = 1:IntervallesChoisies (Index) = 8:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("SixteMajeure", 0)
If Flag = 1:IntervallesChoisies (Index) = 9:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("SeptiemeMineure", 0)
If Flag = 1:IntervallesChoisies (Index) = 10:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("SeptiemeMajeure", 0)
If Flag = 1:IntervallesChoisies (Index) = 11:Index = Index + 1:EndIf
Flag = ReadPreferenceLong ("Octave", 0)
If Flag = 1:IntervallesChoisies (Index) = 12:Index = Index + 1:EndIf
ClosePreferences ()
ProcedureReturn IntervallesChoisies (Random (Index - 2) + 1)
EndProcedure
Procedure GetRandomOctave ()
ProcedureReturn Random (1)
EndProcedure
; ********************* Gestion du MIDI ****************************
Procedure SendMIDIMessage(nStatus.l,nCanal.l,nData1.l,nData2.l)
dwFlags.l = nStatus | nCanal | (nData1 << 8) | (nData2 << 16)
temp.l = midiOutShortMsg_(m_hMidiOut,dwFlags);
If temp<>0
MessageRequester("Problème", "Erreur dans l'envoi du message MIDI",0)
EndIf
EndProcedure
Procedure MIDIOpen()
If m_MIDIOpen = 0
If midiOutOpen_(@m_hMidiOut,MIDIMAPPER,0,0,0) <> 0
MessageRequester("Problème", "Impossible d'ouvrir le périphérique MIDI",0)
Else
SendMIDIMessage($C0,0,0,0)
m_MIDIOpen = 1
EndIf
EndIf
EndProcedure
Procedure PlayNoteMIDI(Canal.b,Note.b,VelociteDown.b,VelociteUp.b)
If m_MIDIOpen
SendMIDIMessage($80 | Canal,0,Note,VelociteDown)
SendMIDIMessage($90 | Canal,0,Note,VelociteUp)
EndIf
EndProcedure
Procedure ChargeInstrument(Canal.b,Instrument.b)
If m_MIDIOpen
SendMIDIMessage($C0 | Canal,0,Instrument,0)
EndIf
EndProcedure
; ******************************************************************
; *** Pour info : ***
;Dim Notes (36)
;Notes (1) = 48 ;C ---
;Notes (2) = 49 ;C#
;Notes (3) = 50 ;D
;Notes (4) = 51 ;D#
;Notes (5) = 52 ;E
;Notes (6) = 53 ;F
;Notes (7) = 54 ;F#
;Notes (8) = 55 ;G
;Notes (9) = 56 ;G#
;Notes (10) = 57 ;A
;Notes (11) = 58 ;A#
;Notes (12) = 59 ;B
;Notes (13) = 60 ;C ---
;Notes (14) = 61 ;C#
;Notes (15) = 62 ;D
;Notes (16) = 63 ;D#
;Notes (17) = 64 ;E
;Notes (18) = 65 ;F
;Notes (19) = 66 ;F#
;Notes (20) = 67 ;G
;Notes (21) = 68 ;G#
;Notes (22) = 69 ;A
;Notes (23) = 70 ;A#
;Notes (24) = 71 ;B
;Notes (25) = 72 ;C ---
;Notes (26) = 73 ;C#
;Notes (27) = 74 ;D
;Notes (28) = 75 ;D#
;Notes (29) = 76 ;E
;Notes (30) = 77 ;F
;Notes (31) = 78 ;F#
;Notes (32) = 79 ;G
;Notes (33) = 80 ;G#
;Notes (34) = 81 ;A
;Notes (35) = 82 ;A#
;Notes (36) = 83 ;B