onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: [scripts] Génération de fichiers midi Jeu 30 Déc 2010 - 22: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.htmlhttp://www.sonicspot.com/guide/midifiles.htmlUn fichier d'exemple est dispo dans GMscr a Exemples\Audio GMscr : rar http://www.host-a.net/u/onilink_/GMscr.rar7zip (3x plus leger) http://www.host-a.net/u/onilink_/GMscr.7z |
|
[TheDarkTiger] Modérateur
Messages : 7420 Localisation : Essonne
| Sujet: Re: [scripts] Génération de fichiers midi Jeu 30 Déc 2010 - 23:14 | |
| Criss, j'étais en train de le faire ... Tant pi ... Je m'en vais tester ça |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [scripts] Génération de fichiers midi Jeu 30 Déc 2010 - 23:23 | |
| A mince, cay balot :/
Remarque y manque encore pas mal de chose, comme les effets. |
|
[TheDarkTiger] Modérateur
Messages : 7420 Localisation : Essonne
| Sujet: Re: [scripts] Génération de fichiers midi Ven 31 Déc 2010 - 0: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 Ceci dit, ça marche sans encombre tes codes. C'est chouette |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [scripts] Génération de fichiers midi Ven 31 Déc 2010 - 0:49 | |
| Merci 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 |
|
Topaze22 *Excellent utilisateur*
Messages : 6213 Localisation : Sur la Lune Projet Actuel : Projet HELLO/TOPAZE22 Mario Bros World
| Sujet: Re: [scripts] Génération de fichiers midi Ven 31 Déc 2010 - 9:36 | |
| Impressionnant |
|
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: [scripts] Génération de fichiers midi Ven 31 Déc 2010 - 18: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 |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [scripts] Génération de fichiers midi Sam 1 Jan 2011 - 15: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é |
|
Morwenn Très bonne participation
Messages : 151 Projet Actuel : Icare
| Sujet: Re: [scripts] Génération de fichiers midi Sam 1 Jan 2011 - 18: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. |
|
techlie Nouveau
Messages : 1
| Sujet: question Ven 4 Nov 2016 - 5: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. |
|
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: [scripts] Génération de fichiers midi Mar 8 Nov 2016 - 21:54 | |
| |
|
Contenu sponsorisé
| Sujet: Re: [scripts] Génération de fichiers midi | |
| |
|