AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [scripts] Génération de fichiers midi

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: [scripts] Génération de fichiers midi   Jeu 30 Déc 2010 - 21:42

Voici une série de fonctions permettant de générer un midi. J'ai fait ça a la base pour Morwenn, donc j'espère que ça lui permettra de finir son bipComposer.

Voici le fichier gml
Code:
#define mid_init
//mid_ini(file)
file_text_close( file_text_open_write(argument0) )
global._cMidiFile = file_bin_open(argument0, 1)
#define mid_end
file_bin_close(global._cMidiFile)
#define mid_MThd
//mid_MThd(divisions)

//Header Chunk
//the literal string MThd, or in hexadecimal notation: 0x4d546864.
//These four characters at the start of the MIDI file indicate that this is a MIDI file.
// header_chunk = "MThd" + <header_length> + <format> + <n> + <division>
file_bin_write_byte(global._cMidiFile,77)
file_bin_write_byte(global._cMidiFile,84)
file_bin_write_byte(global._cMidiFile,104)
file_bin_write_byte(global._cMidiFile,100)
//<header_length> 4 bytes
//length of the header chunk (always 6 bytes long--the size of the next
//three fields which are considered the header chunk).
file_bin_write_byte(global._cMidiFile,0)
file_bin_write_byte(global._cMidiFile,0)
file_bin_write_byte(global._cMidiFile,0)
file_bin_write_byte(global._cMidiFile,6)
//<format> 2 bytes
//0 = single track file format
//1 = multiple track file format
//2 = multiple song file format (i.e., a series of type 0 files)
file_bin_write_byte(global._cMidiFile,0)
file_bin_write_byte(global._cMidiFile,1)
//<n> 2 bytes
//number of track chunks that follow the header chunk
file_bin_write_byte(global._cMidiFile,0)
file_bin_write_byte(global._cMidiFile,1)
//<division> 2 bytes
//unit of time for delta timing. If the value is positive, then it represents
//the units per beat. For example, +96 would mean 96 ticks per beat.
//If the value is negative, delta times are in SMPTE compatible units.
file_bin_write_byte(global._cMidiFile, argument0>>8)
file_bin_write_byte(global._cMidiFile, argument0&255)

#define mid_MTrk
//mid_MTrk(tempo size, instrument size, note on, note off, note off all, end)
//Track Chunk
//A track chunk consists of a literal identifier string, a length indicator
//specifying the size of the track, and actual event data making up the track.
//track_chunk = "MTrk" + <length> + <track_event> [+ <track_event> ...]
//"MTrk" 4 bytes
//the literal string MTrk. This marks the beginning of a track.
file_bin_write_byte(global._cMidiFile,77)
file_bin_write_byte(global._cMidiFile,84)
file_bin_write_byte(global._cMidiFile,114)
file_bin_write_byte(global._cMidiFile,107)
size=5*(argument2+argument3+argument4+argument5)+argument0*8+argument1*4+argument6
//<length> 4 bytes
//the number of bytes in the track chunk following this number.
file_bin_write_byte(global._cMidiFile, size>>24)
file_bin_write_byte(global._cMidiFile, (size>>16)&255)
file_bin_write_byte(global._cMidiFile, (size>>8)&255)
file_bin_write_byte(global._cMidiFile, size&255)

//...
//<track_event> : a sequenced track event.
#define mid_MTrk_tempo
//mid_MTrk_tempo(delta time, tempo)

//Tempo
dtime = argument0
dtime += 0.00001

file_bin_write_byte(global._cMidiFile, $80+floor(dtime/128))
file_bin_write_byte(global._cMidiFile, ((dtime/128)-floor(dtime/128))*128)
file_bin_write_byte(global._cMidiFile, $FF)
file_bin_write_byte(global._cMidiFile, $51)
file_bin_write_byte(global._cMidiFile, $03)

file_bin_write_byte(global._cMidiFile, argument1>>16)
file_bin_write_byte(global._cMidiFile, (argument1>>8)&255)
file_bin_write_byte(global._cMidiFile, argument1 & 255)
#define mid_MTrk_instrument
//mid_MTrk_instrument(delta time, chanel, instrument)
dtime = argument0
dtime += 0.00001
file_bin_write_byte(global._cMidiFile, $80+floor(dtime/128))
file_bin_write_byte(global._cMidiFile, ((dtime/128)-floor(dtime/128))*128)
file_bin_write_byte(global._cMidiFile, $C0+argument1)
file_bin_write_byte(global._cMidiFile, argument2)
#define mid_MTrk_play_note
//mid_MTrk_play_note(delta time, chanel, note, volume)
dtime = argument0
dtime += 0.00001
file_bin_write_byte(global._cMidiFile, $80+floor(dtime/128))
file_bin_write_byte(global._cMidiFile, ((dtime/128)-floor(dtime/128))*128)
file_bin_write_byte(global._cMidiFile, $90 + argument1)
file_bin_write_byte(global._cMidiFile, argument2)
file_bin_write_byte(global._cMidiFile, argument3)

#define mid_MTrk_stop_note
//mid_MTrk_stop_note(delta time, chanel)
dtime = argument0
dtime += 0.00001
file_bin_write_byte(global._cMidiFile, $80+floor(dtime/128))
file_bin_write_byte(global._cMidiFile, ((dtime/128)-floor(dtime/128))*128)
file_bin_write_byte(global._cMidiFile, $80 + argument1)
file_bin_write_byte(global._cMidiFile, argument2)
file_bin_write_byte(global._cMidiFile, 0)
#define mid_MTrk_end
dtime = argument0
dtime += 0.00001
file_bin_write_byte(global._cMidiFile, $80+floor(dtime/128))
file_bin_write_byte(global._cMidiFile, ((dtime/128)-floor(dtime/128))*128)
file_bin_write_byte(global._cMidiFile, $FF)
file_bin_write_byte(global._cMidiFile, $2F)
file_bin_write_byte(global._cMidiFile, 0)

Et un exemple, a mettre dans le create d'un objet.
Code:
nbNotes = 30

mid_init("out.mid")
mid_MThd(900)
mid_MTrk(1,1,nbNotes,nbNotes,0,1)

mid_MTrk_tempo(0,500000)
mid_MTrk_instrument(0,0, M_PIANO) //M_PIANO = 0

for(i=0; i<nbNotes; i+=1)
{
note = 60 + (i*i mod 20)
note = round(note)
mid_MTrk_play_note(0,0,note,90)
mid_MTrk_stop_note(900,0,note)
}

mid_MTrk_end(0)
mid_end()

sound = sound_add('out.mid', 1, 1)
sound_loop(sound)


Et voici les liens des sites ou je me suis documenté :
http://improv.sapp.org/doc/misc/MidiFileFormat.html
http://www.sonicspot.com/guide/midifiles.html

Un fichier d'exemple est dispo dans GMscr a Exemples\Audio

GMscr :
rar
http://www.host-a.net/u/onilink_/GMscr.rar
7zip (3x plus leger)
http://www.host-a.net/u/onilink_/GMscr.7z

_________________
                 
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
avatar

Messages : 7377
Localisation : Essonne

MessageSujet: Re: [scripts] Génération de fichiers midi   Jeu 30 Déc 2010 - 22:14

Criss, j'étais en train de le faire ...

Tant pi ...

Je m'en vais tester ça Wink

_________________
Bonne chance pour vos projets actuels ! Prêt à aider ceux qui en ont besoin ^^
l'antique http://www.membres.lycos.fr/thedarkminousite/
Bienvenue au 2531eme utilisateur : fffffff !
Revenir en haut Aller en bas
http://www.membres.lycos.fr/thedarkminousite/
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [scripts] Génération de fichiers midi   Jeu 30 Déc 2010 - 22:23

A mince, cay balot :/

Remarque y manque encore pas mal de chose, comme les effets.

_________________
                 
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
avatar

Messages : 7377
Localisation : Essonne

MessageSujet: Re: [scripts] Génération de fichiers midi   Jeu 30 Déc 2010 - 23:42

Bha en fait, je voyait plus un truc du genre on fait ce qu'on veux (genre mettre les instruments qu'on veux aux pistes qu'on veux, dans l'ordre qu'on veux) et ensuite écrire le fichier.
Donc, ce n'est pas nécessairement mal que je continue mon développement Wink

Ceci dit, ça marche sans encombre tes codes. C'est chouette Wink

_________________
Bonne chance pour vos projets actuels ! Prêt à aider ceux qui en ont besoin ^^
l'antique http://www.membres.lycos.fr/thedarkminousite/
Bienvenue au 2531eme utilisateur : fffffff !
Revenir en haut Aller en bas
http://www.membres.lycos.fr/thedarkminousite/
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [scripts] Génération de fichiers midi   Jeu 30 Déc 2010 - 23:49

Merci Smile
Sinon j'ai fait le plus simple possible, mais je compte bien faire des ajouts. Enfin quand j'aurais le temps.
L'essentiel déjà c'est que ça marche :p

_________________
                 
Revenir en haut Aller en bas
Topaze22
*Excellent utilisateur*
avatar

Messages : 6213
Localisation : Sur la Lune
Projet Actuel : Projet HELLO/TOPAZE22 Mario Bros World

MessageSujet: Re: [scripts] Génération de fichiers midi   Ven 31 Déc 2010 - 8:36

Impressionnant gha

_________________
Topique pour le Projet Hello Mario en préparation.
Sorti du topique lorsque la première démo sera disponible.
Revenir en haut Aller en bas
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: [scripts] Génération de fichiers midi   Ven 31 Déc 2010 - 17:11

Eh ben merci beaucoup, j'en suis tout retourné oO

Je testerai ça dès que je pourrai (probablement demain), en tout cas, ça me touche beaucoup. Et ça m'impressionne que tu aies réussi à faire ça aussi vite, vraiment bravo ouh
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [scripts] Génération de fichiers midi   Sam 1 Jan 2011 - 14:33

J'avais un peu de temps a perdre, puis les midi ça m'a toujours intéresse.

En tout cas niveau implémentation tu devrais pas avoir de problèmes vu que les fonctions sont toutes basiques la.
Y auras les effets, les pistes multi instruments, mais j'ai cru comprendre que c'était pas la priorité Smile

_________________
                 
Revenir en haut Aller en bas
Morwenn
Très bonne participation
avatar

Messages : 151
Projet Actuel : Icare

MessageSujet: Re: [scripts] Génération de fichiers midi   Sam 1 Jan 2011 - 17:34

En fait, je ne vais pas faire de pistes multi-instruments, étant donné que je ne peux faire jouer qu'une seule note à la fois. C'est pour ça que j'essayais aussi, basiquement, de faire des pistes midi avec le format 0, plutôt qu'avec les formats 1 et 2 =)

Par contre, pour les effets, il faudra forcément que je m'y intéresse.
Revenir en haut Aller en bas
techlie
Nouveau


Messages : 1

MessageSujet: question   Ven 4 Nov 2016 - 4:52

Bonjour.
En fait j'ai essayé de générer un fichier .midi monotrack avec 3 chanels et 1 instrument pour chaque chanel.
quand je lit le fichier .mid généré sur mon téléphone ça marche sans aucun problème mais quand j'essaie de l'ouvrir avec Le lecteur windows media (PC) il y a une erreur, j'ai utilisé un programme pour le vérifier et il y a une erreur "Undefined chunk ID çç?A". est ce que quelqu'un pourrait m'aider svp. merci
désolé d'avoir déterrer cette discussion qui date, je n'ai trouvé aucune autre info sur le net.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8926
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [scripts] Génération de fichiers midi   Mar 8 Nov 2016 - 20:54

Salut, poste ton .mid ici avec http://wyvup.com/ histoire de voir le soucis.

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [scripts] Génération de fichiers midi   

Revenir en haut Aller en bas
 
[scripts] Génération de fichiers midi
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» fusionner 2 fichiers heredis
» P902 Libération
» Docteurs ONE et bureau FNTE : Délibération projet loi 40-09
» Opération réussi - geslaagde operatie
» 9ème Congrès de la Fédération CGT services publics

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Scripts GML-
Sauter vers: