Le MIDI et l'API mciSendString_, la doc ne rend pas happy !

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Le MIDI et l'API mciSendString_, la doc ne rend pas happy !

Message par Huitbit »

Re-hello!
Ca fait un bout de temps que je faisais des recherches sur les sons en général.
Je m'étais mis en tête de faire bruitages et musiques en MIDI uniquement.
Puis, j'ai découvert :cry: que le séquenceur ne pouvait lire qu'une piste à la fois !
C'est pour ça que depuis 15 jours, je me suis attaqué au pure_ADSR (voir section :applications).

Avec l'API "mciSendString_" impossible de trouver une documentation claire(pour moi, bien sûr :roll: ). C'est la première fois que j'utilise les API!
Je voudrai simplement lire un fichier quand je veux et autant de fois que je veux dans une application.

Puisque mon objectif est de choisir le MIDI pour la musique et les wav pour les effets sonores et tout ça sans fichiers joints.

Voilà mon travail:

Code : Tout sélectionner

  ;data to midi
  ;auteur huitbit
  ;pb4.30 
  SetCurrentDirectory(GetTemporaryDirectory());travail dans le répertoire temporaire
  CreateFile(1,"musique.mid")
  length=942
  Restore musique
  For i=0 To length
  Read.c donnee
    WriteByte(1,donnee)
  Next i
  CloseFile(1)
  
mciSendString_("open  musique.mid  type sequencer  alias musique", 0,0,0)
OpenWindow ( 0 ,10,10,200,200, "Play" , #PB_Window_SystemMenu ) 
mciSendString_ ( "play musique" ,0,0,0)
Repeat 


    event= WaitWindowEvent () 
Until Event = #PB_Event_CloseWindow
mciSendString_ ( "close musique" ,0,0,0) 

DataSection
musique: ; 942 octets de données
Data.c 77,84,104,100,0,0,0,6,0,0,0,1,1,224,77,84,114,107,0,0,3,152,0,255,3,6,84,121,112,101,32,48,0,255,81,3,4,142,11,0,255
Data.c 88,4,4,2,24,8,0,255,1,13,66,121,32,77,97,116,116,32,82,97,117,112,112,0,255,2,44,67,111,112,121,114,105,103,104,116,32,169,32,49
Data.c 57,57,55,32,98,121,32,78,111,116,101,87,111,114,116,104,121,32,65,114,116,87,97,114,101,44,32,73,110,99,46,0,255,2,19,65,108,108,32,82
Data.c 105,103,104,116,115,32,82,101,115,101,114,118,101,100,0,255,1,32,71,101,110,101,114,97,116,101,100,32,98,121,32,78,111,116,101,87,111,114,116,104
Data.c 121,32,67,111,109,112,111,115,101,114,0,255,33,1,0,0,176,7,127,0,10,64,0,192,68,0,255,33,1,0,0,177,7,127,0,10,64,0,193,58
Data.c 0,177,10,20,0,255,33,1,0,0,178,7,127,0,10,64,0,194,49,0,255,33,1,0,0,179,7,127,0,10,64,0,195,46,0,179,10,127,135,64
Data.c 144,72,110,0,145,48,60,0,146,69,92,0,147,72,45,134,72,144,72,0,0,145,48,0,0,146,69,0,0,147,72,0,120,144,77,110,0,145,41,60
Data.c 0,146,72,92,0,147,77,45,133,0,144,77,0,0,147,77,0,80,144,72,110,0,147,72,45,120,145,41,0,0,146,72,0,115,144,72,0,0,147,72
Data.c 0,5,144,74,110,0,145,43,60,0,146,70,92,0,147,74,45,131,16,144,74,0,0,147,74,0,80,144,70,110,0,147,70,45,130,104,145,43,0,0
Data.c 146,70,0,40,144,70,0,0,147,70,0,80,144,67,110,0,145,48,60,0,146,67,92,0,147,67,45,134,72,144,67,0,0,145,48,0,0,146,67,0
Data.c 0,147,67,0,120,144,72,110,0,145,48,60,0,146,65,92,0,147,72,45,132,127,144,72,0,0,147,72,0,81,144,69,110,0,147,69,45,120,145,48
Data.c 0,0,146,65,0,114,144,69,0,0,147,69,0,6,144,65,110,0,145,41,60,0,146,69,92,0,147,65,45,131,15,144,65,0,0,147,65,0,81,144
Data.c 69,110,0,147,69,45,130,104,145,41,0,0,146,69,0,40,144,69,0,0,147,69,0,80,144,67,110,0,145,43,60,0,146,67,92,0,147,67,45,134
Data.c 72,144,67,0,0,145,43,0,0,146,67,0,0,147,67,0,120,145,48,60,0,146,60,92,129,107,145,48,0,5,46,60,129,107,46,0,5,144,67,110
Data.c 0,145,45,60,0,147,67,45,115,144,67,0,0,147,67,0,5,144,69,110,0,147,69,45,115,145,45,0,0,144,69,0,0,147,69,0,5,144,70,110
Data.c 0,145,43,60,0,147,70,45,115,144,70,0,0,147,70,0,5,146,60,0,0,144,71,110,0,147,71,45,115,145,43,0,0,144,71,0,0,147,71,0
Data.c 5,144,72,110,0,145,53,60,0,146,77,92,0,147,72,45,134,72,144,72,0,0,145,53,0,0,146,77,0,0,147,72,0,120,144,77,110,0,145,51
Data.c 60,0,146,75,92,0,147,77,45,133,0,144,77,0,0,147,77,0,80,144,72,110,0,147,72,45,120,145,51,0,0,146,75,0,115,144,72,0,0,147
Data.c 72,0,5,144,74,110,0,145,50,60,0,146,74,92,0,147,74,45,131,16,144,74,0,0,147,74,0,80,144,70,110,0,147,70,45,130,104,145,50,0
Data.c 0,146,74,0,40,144,70,0,0,147,70,0,80,144,67,110,0,145,49,60,0,146,73,92,0,147,67,45,134,72,144,67,0,0,145,49,0,0,146,73
Data.c 0,0,147,67,0,120,144,72,110,0,145,48,60,0,146,69,92,0,147,72,45,133,0,144,72,0,0,147,72,0,80,144,69,110,0,147,69,45,120,145
Data.c 48,0,0,146,69,0,115,144,69,0,0,147,69,0,5,144,70,110,0,145,40,60,0,146,72,92,0,147,70,45,131,16,144,70,0,0,147,70,0,80
Data.c 144,64,110,0,147,64,45,130,104,145,40,0,0,146,72,0,40,144,64,0,0,147,64,0,80,144,65,110,0,145,41,60,0,146,65,92,0,147,65,45
Data.c 134,72,144,65,0,0,145,41,0,0,146,65,0,0,147,65,0,0,255,47,0,0
Pour les datas, j'ai bricolé une petite application:

Code : Tout sélectionner

;midi_to_data
;auteur huitbit 
;pb4.30 
  file$ = OpenFileRequester("Sélectionnez un fichier","","*.mid",0)
If file$
  If ReadFile(0, file$) 
    length = Lof(0)                            ; Lit la taille en octets du fichier 
    *MemoryID = AllocateMemory(length)         ; alloue un bloc mémoire de la taille du fichier
    If *MemoryID
      bytes = ReadData(0, *MemoryID, length)   ; Lit les données du fichier et les place dans le bloc mémoire
    EndIf
    CloseFile(0)
  EndIf
  
EndIf

 If *MemoryID
 musique$="Datasection"+Chr(13)+"musique: ; "+Str(length)+" octets de donn"+Chr(233)+"es"+Chr(13)+"Data.c "
  For i=0 To length
  If i%40=0 And i<>0 
  code_separation.s=Chr(13)+"data.c "
  Else
     code_separation.s=","
  EndIf;     i%40=0 And i<>0 
  If i=length
  code_separation.s=""
  EndIf
  musique$=musique$+Str(PeekC(*MemoryID+i))+code_separation
    Next i
  
FreeMemory(*MemoryID)
EndIf ;    If *MemoryID
SetClipboardText(musique$)
Debug "Vos datas se trouvent dans le presse-papier !"
Si vous avez des infos sur cette API, ça m'intéresse!

Hasta la vista !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Fais une simple recherche sur midi dans le forum anglais, il y a des tonnes de trucs!
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Ben, j'ai déjà essayé car je voulais faire la même chose que pour les wav, mettre directement en mémoire les fichiers.
Finalement, j'ai opté pour le dossier temporaire de window car d'après la doc :GetTemporaryDirectory()
Renvoie le chemin de répertoire temporaire. Tous les fichiers temporaires doivent être créés dans ce répertoire, car les droits en lecture et écriture sont garantis.
Sur le forum anglais, je me suis rendu compte que ça fait des années que les utilisateurs demandent le traitement du MIDI en natif. La plupart des posts s'éteignent en douceur après abandon pour un autre format !

L'API mciSendString, j'ai du mal. Il y a des paramètres optionnels, "ils" mélange les commandes et le texte,pour la commande "close", on trouve toutes sortes de choses...
Voilà le genre de doc qu'on peut trouver:
; · mciSendString sends a command string To an MCI device. The device that the command is sent To is specified in the command string.
;
; Parameters
;
; ¨ lpszCommand
; Pointer To a null-terminated string that specifies an MCI command string.
;
; ¨ lpszReturnString
; Pointer To a buffer that receives Return information. If no Return information is needed, this parameter can be NULL.
;
; ¨ cchReturn
; Size, in characters, of the Return buffer specified by the lpszReturnString parameter.
;
; ¨ hwndCallback
; Handle To a callback window If the "notify" flag was specified in the command string.
Comparé à la doc de purebasic :roll: on lit et on comprend!
C'est vrai que pour un habitué de l'API ça doit le faire mais pour moi, ça ne me parle pas du tout !

Ce que je souhaite, c'est qu'un fichier MIDI serve de fond sonore au bon moment dans un jeu :cry: :cry: !

Hasta la vista !
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Le mci permet d'utiliser des tas de périphériques différents. Et puis le midi n'est déjà pas si simple; il y a des tas de commandes, des extensions, plus ou moins bien gérées par les cartes audio. Leur rendu est d'ailleurs parfois un peu -hum-, c'est un peu pour ça qu'on baisse un peu les bras quand il s'agit de l'utiliser. J'utilisais souvent quicktime pour son rendu midi pas trop moche. Ah oui, tiens, je me rappelle aussi que j'avais trouvé il y a une dizaine d'années un prog qui avait une très belle banque de sons et qui permettait de rejouer les midifiles avec un très beau rendu. Je ne sais pas si ça existe encore... Mais je m'égare! De toutes façons pourquoi se prendre la tête maintenant que la taille des fichiers n'est plus vraiment un problème? Sinon il y a toujours les modules, et les synthés virtuels comme celui de Farbrausch.
Sinon la doc en ligne : http://msdn.microsoft.com/en-us/library ... S.85).aspx
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

djes a écrit : Ah oui, tiens, je me rappelle aussi que j'avais trouvé il y a une dizaine d'années un prog qui avait une très belle banque de sons et qui permettait de rejouer les midifiles avec un très beau rendu. Je ne sais pas si ça existe encore...
il s'agit d VSC (Virtual Sound Canva ) , c'est en fait un petit expandeur virtuel
, il ne quitte jamais mon pc !! :)

faut dire que allié a "Band in a Box" c'est vraiment le top ;)
Dernière modification par Backup le jeu. 12/févr./2009 20:11, modifié 1 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Excellent, manque plus qu'un petit HuitBit_Tracker pour créer les morceaux et je te ferait une statue en or à ton effigie :P

---EDIT---

Bizarre, ton exemple marche mais lorsque je converti un midi en data et que j'essaye, je n'ai aucun son .. 8O (j'ai essayé avec 3 morceaux différents.
~~~~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
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Désolé, mais mon PC est HS.
Vu la situation actuelle en Guadeloupe, c'est pas près de s'améliorer!

@Ar-S
J'ai fait de nombreux tests sans problème, ça devrait marcher.
N'oublie pas de mettre la nouvelle longueur du fichier dans la variable "length".
De plus, le fichier midi est crée dans le dossier temporaire, ça a peut être une influence sur l'exécution de ton programme.

Hasta la je sais pas!?
(on m'a prêté un pc pour l'après-midi!)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'avais fais une Lib avec TailBite. Je pense que c'est pour la version 3.9x de PB. Quoiqu'il en soit la source est avec et le code est très court et lisible.
La lib est disponible ici

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Très pratique ta lib Lio, je l'ai recompilé en 4.30, pas eu de soucis.
~~~~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
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci lionel_om, ça à l'air très complet !

Je m'y colle dès que j'aurai fini mes améliorations sur pure_ADSR !

@Ar-S
Ton problème est-il réglé ?

Hasta la vista !

PS: un excellent éditeur midi gratuit (c'est le seul que j'ai pû utiliser sans lire la notice :oops: ) à l'adresse www.AnvilStudio.com
Répondre