begin process at 2012 02 13 15:03:27
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Direct X

 > DIRECTX TUTO 6 : DIRECTMUSIC JOUER DES FICHIERS MIDI

DIRECTX TUTO 6 : DIRECTMUSIC JOUER DES FICHIERS MIDI


 Information sur la source

Note :
Aucune note
Catégorie :Direct X Niveau :Débutant Date de création :01/07/2004 Vu / téléchargé :6 111 / 511

Auteur : ciberrique

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 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

  • 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é.
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

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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip TUTO DIRECT3D 1 : INITIALISATION
Source avec Zip Source avec une capture TUTO 11 DIRECTX : DIRECTSHOW LES VIDEO DANS VOS JEUX.
Source avec Zip Source avec une capture TUTO TILE 7 : PASSAGE À L'ISOMÉTRIQUE
Source avec Zip Source avec une capture LECTEUR DE FICHIER MS3D ASCII
Source avec Zip Source avec une capture METHODE SUPERMAP, TUTO TILES 6 !

 Sources de la même categorie

Source avec une capture HAPPY LAND - 3D VB6 GAME - OPEN SOURCE CODE par ZaidMarkabi
Source avec une capture METAL GEAR SOLID - 3D VB6 GAME - OPEN SOURCE par ZaidMarkabi
Source avec une capture FIGHT COMBAT II - 3D VB GAME - OPEN SOURCE par ZaidMarkabi
Source avec Zip Source avec une capture UTILISER LA CAMERA POUR DIRECTX par zulrigh
Source avec une capture STREET FIGHTER - 3D VB GAME - OPEN-SOURCE par ZaidMarkabi

Commentaires et avis

Commentaire de MadM@tt le 01/07/2004 19:17:21

tiens j'avais pas vu tous les tutos précédents, je trouve que c'est une super idée et c'est très sympa de ta part.
bravo !

@ +
MadMatt

Commentaire de ciberrique le 01/07/2004 20:41:22

Merci, pour ton commentaire, pour les tutos, ce n'est pas le dernier....

allé bon coding.

Commentaire de Patrice99 le 02/07/2004 08:33:42

Est-ce que l'on peut obtenir la hauteur et la durée de chaque note d'un fichier .mid de cette façon ? Un jour je ferais un reseau de neurones pour apprendre à jouer les accords à partir d'un fichier .mid

Commentaire de azerty25 le 02/07/2004 10:37:53

Pas mal une fois de plus ton tuto. ET les prochains, c'est pour quand et sur quel sujet ? :-)

Commentaire de ciberrique le 02/07/2004 11:00:54

Partice99, normalement je pense que c'est possible (en thérorie) de connaitre ce que tu demandes, mais pour cela il est nessecaire de  faire des calcul, sachant que je me suis pas interressé plus que sa à DirectMusic, car mon but et de jouer des fichiers dans mes jeux.

Par exemple : Ceci te donne le tempo de ton fichier :
dTempo = perf2.GetTempo(mtTime + 2000, 0)
lblTempo.Caption = "Tempo: " & Format(dTempo, "00.00")

donc je suppose que c'est possible.

Pourt azerty25, j'hesite entre 2 tuto, je ne sais pas encore lequels je choisirai :

- Jouer des MP3 (ce qui me prendrais du temps car je connais que trés peu)
- Faire des systemes de menu ( ce qui est difficile quand on ne connait pas la technique)

Donc je verrais.

Si vous avez besoin d'explication supplémentaire n'hésité pas.

Commentaire de azerty25 le 02/07/2004 12:36:12

Fait les 2 ;) :-D

Commentaire de ciberrique le 03/07/2004 11:14:28

Lol, je ferais les 2 ok, mais sa va mettre un certain temps, car deja il y en a 2 et en plus comme j'ai deja dis le mp3 je connais pas trop, donc pour commencer je vous fait un sur les menu, des que la technique que j'utilise est au point.

Bon coding

Commentaire de ciberrique le 05/07/2004 01:36:25

Chose promie chose du, je vous ai mis le tuto sur les mp3 .....

Commentaire de ciberrique le 05/07/2004 22:48:41

Héhé, et je viens d'ajouter celui sur le menu echap, pas mal en 2 jour non ??

Commentaire de Afyn le 15/01/2005 19:04:05

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

Commentaire de gribouillex le 25/01/2007 12:00:47

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

Commentaire de ciberrique le 25/01/2007 12:41:51

Je suis dsl mais j'ai jamais étudier cette partie de DirectMusic, penche toi sur l'aide de directx.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales