Directx tuto 6 : directmusic jouer des fichiers midi

Soyez le premier à donner votre avis sur cette source.

Vue 7 265 fois - Téléchargée 611 fois

Description

              • JE CONSIDÈRE QUE VOUS AVEZ LES CONNAISSANCES PRÉSENTES DANS MES PRÉCÉDENTS TUTAURIAUX **********


Précédemment dans mon dernier tutoriel je vous ai montré comment jouer un fichier wav, seulement les fichiers wav sont très lourds surtout lorsque ce sont des musiques.
D'où l'utilisation de fichier MIDI.

Source / Exemple :


DirectMusic fait parti de DirectX, donc pour utiliser DirectMusique il avoir précédemment déclaré DirectX.

Premièrement, nous déclarons les variables qui vont nous servir :

Dim dx As New DirectX7
' DirectX
Dim perf As DirectMusicPerformance
' Des informations sur  le fichier MIDI peuvent être recueillis dans cette variable
Dim seg As DirectMusicSegment
' Stockage du fichier MIDI
Dim segstate As DirectMusicSegmentState 
' Statut du fichier charger
Dim loader As DirectMusicLoader
' Chargement d'un fichier MIDI dans une variable DirectMusicSegment

Voici donc les quelques variables obligatoires.

Certaines initialisations sont obligatoires pour pouvoir lire un fichier MIDI.

Dans l'événement Form_Load de votre projet :

Set loader = Nothing
' Si une lecture est en cour le loader contient des informations, donc on le remet à 0

Set loader = dx.DirectMusicLoaderCreate()
' Nous disons que la variable loader et un système de DirectX, de type chargement 
' de musique

Set perf = dx.DirectMusicPerformanceCreate()
' Notre variable d'information du fichier est initialisée de même que le loader, avec la différence que celle-ci est de type Performance.

Call perf.Init(Nothing, 0)                        
' On associe la variable perf a un fichier MIDI, ici Nothing (donc aucun), et à 0 pour le handle.

perf.SetPort -1, 80   
' Un index ainsi qu'une définition des canaux utilisée doivent être donné.

Voila votre Form_Load est terminé.

Ensuite comme dans l'exemple, avec un bouton nous allons lancer la lecture du fichier.

D'abord, il nous faut charger le fichier.

' Pour cela il nous faut le chemin d'accès au fichier MIDI, dans l'exemple j'ai mis ' une variable qui ne change pas, car le fichier MIDI ne change pas.

FileName = App.path & "\Mystery.mid"

' Nous chargeons le fichier MIDI dans seg par le biais de loader
Set seg = loader.LoadSegment(FileName) 

'Une petite récupération du path sans le nom du fichier

Dim path As String
length = Len(FileName)
' Len renvoie le nombre de caractère d'une variable

Do While path <> "\"
  path = Mid(FileName, length, 1)
' Mid renvoi les caractères composant Filename étant compris dans l'intervalle 
' [0;length] 

  length = length - 1
' Nous enlevons 1 à length pour pouvoir ainsi arriver à supprimer le nom complet 
' du fichier MIDI et ne garder que son chemin

Loop

perf.SetMasterAutoDownload True
' permet le chargement automatique des instruments utilisés par le fichier MIDI

seg.SetStandardMidiFile 
' On dit que le fichier MIDI est de forme standard et non pas pour un fichier prévu 
' exprès pour DirectMusic

'Maintenant nous pouvons jouer le fichier MIDI
perf.SetMasterVolume 50 * 50                ' Définition du volume
Call perf.PlaySegment(seg, 0, 0)            ' On lance la lecture du fichier MIDI

Içi je multiplie le volume par 50 pour ne pas travailler sur des nombres trop grands.

Pour arrêter un fichier MIDI il suffit d'appeler la méthode stop:
Call perf.Stop(seg, segstate, 0, 0) 
            Arrêt (Fichier MIDI, Statut du fichier, temps, flags)

Et voilà maintenant le fichier MIDI peut être joué.

Conclusion :


Donc en quelque ligne de code nous arrivons à ouvrir un fichier MIDI et à le jouer, bien sûr il est possible de trouver le tempo et d'autre information sur le fichier MIDI, mais ce n'est pas le but de ce tutorial.

Pour d'autre information sur DirectMusic vous pouvez allé ici :
http://francis.dupont.free.fr/coindev/dm.htm

Autrement regarder le zip, celui-ci contient un projet jouant un fichier MIDI.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Je suis dsl mais j'ai jamais étudier cette partie de DirectMusic, penche toi sur l'aide de directx.
gribouillex
Messages postés
172
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
16 mai 2011
-
Bonjour, comment modifier ce code pour qu'un métronome suive précisément le tempo du fichier midi ?
Actuellement, j'ai un programme qui lit les fichiers mais dès que j'inclus ce que je crois être la solution, l'information arrive en décalé par rapport au tempo...

Dim msg As DMUS_NOTIFICATION_PMSG
Dim metronome As DMUS_NOTE_PMSG

Private Sub timer1_Timer()
If dmPerf.GetNotificationPMSG(msg) Then
metronome.midiValue = 77
metronome.mtDuration = 150
metronome.flags = DMUS_NOTEF_NOTEON
metronome.velocity = 127
Call dmPerf.SendNotePMSG(0, DMUS_PMSGF_REFTIME, 9, metronome)
end if
end sub
Afyn
Messages postés
613
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
22 décembre 2016
-
... Pour répondre à Patrice99

La hauteur d'une note c'est son numéro (de 0 à 127)
Pour calculer la durée ... c'est beaucoup plus compliqué
Il faut connaitre la résolution du fichier MIDI exprimé
en nombre de Tick par noire (par exemple 96)
Puis savoir le nombre de Tick de la Note_On, le nombre
de Tick de la Note_OFF et faire la différence ...
Et pour compliquer le tout ...
Le nombre de tick dans un fichier MIDI est exprimé par rapport à l'évènement précédent ... dans un mot à longuer variable (maximun 4 octets)
Bon ... si vraiment t'as envie fais moi signe ...

A+

Afyn
Navedac
ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Héhé, et je viens d'ajouter celui sur le menu echap, pas mal en 2 jour non ??
ciberrique
Messages postés
591
Date d'inscription
lundi 25 août 2003
Statut
Membre
Dernière intervention
18 juillet 2010
-
Chose promie chose du, je vous ai mis le tuto sur les mp3 .....

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.