AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -28%
Brandt LVE127J – Lave-vaisselle encastrable 12 ...
Voir le deal
279.99 €

 

 [scripts] Génération de fichiers midi

Aller en bas 
5 participants
AuteurMessage
onilink_
Modérateur
onilink_


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

[scripts] Génération de fichiers midi Empty
MessageSujet: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyJeu 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.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

_________________
[scripts] Génération de fichiers midi Runningpotato1[scripts] Génération de fichiers midi TvF6GED [scripts] Génération de fichiers midi MdetltS
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
[TheDarkTiger]


Messages : 7420
Localisation : Essonne

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyJeu 30 Déc 2010 - 23: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 ^^
[scripts] Génération de fichiers midi U3dfr2[scripts] Génération de fichiers midi Sign l'antique
Bienvenue au 2629eme utilisateur : Mike Jones !
Revenir en haut Aller en bas
http://www.tdms.fr
onilink_
Modérateur
onilink_


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

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

A mince, cay balot :/

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

_________________
[scripts] Génération de fichiers midi Runningpotato1[scripts] Génération de fichiers midi TvF6GED [scripts] Génération de fichiers midi MdetltS
Revenir en haut Aller en bas
[TheDarkTiger]
Modérateur
[TheDarkTiger]


Messages : 7420
Localisation : Essonne

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyVen 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 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 ^^
[scripts] Génération de fichiers midi U3dfr2[scripts] Génération de fichiers midi Sign l'antique
Bienvenue au 2629eme utilisateur : Mike Jones !
Revenir en haut Aller en bas
http://www.tdms.fr
onilink_
Modérateur
onilink_


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

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyVen 31 Déc 2010 - 0: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

_________________
[scripts] Génération de fichiers midi Runningpotato1[scripts] Génération de fichiers midi TvF6GED [scripts] Génération de fichiers midi MdetltS
Revenir en haut Aller en bas
Topaze22
*Excellent utilisateur*
Topaze22


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

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyVen 31 Déc 2010 - 9:36

Impressionnant gha

_________________
Topique pour le Projet Hello Mario en préparation.
Sorti du topique lorsque la première démo sera disponible.
[scripts] Génération de fichiers midi Projet13
Revenir en haut Aller en bas
Morwenn
Très bonne participation
Morwenn


Messages : 151
Projet Actuel : Icare

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyVen 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 ouh
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


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

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptySam 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é Smile

_________________
[scripts] Génération de fichiers midi Runningpotato1[scripts] Génération de fichiers midi TvF6GED [scripts] Génération de fichiers midi MdetltS
Revenir en haut Aller en bas
Morwenn
Très bonne participation
Morwenn


Messages : 151
Projet Actuel : Icare

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptySam 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.
Revenir en haut Aller en bas
techlie
Nouveau



Messages : 1

[scripts] Génération de fichiers midi Empty
MessageSujet: question   [scripts] Génération de fichiers midi EmptyVen 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.
Revenir en haut Aller en bas
onilink_
Modérateur
onilink_


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

[scripts] Génération de fichiers midi Empty
MessageSujet: Re: [scripts] Génération de fichiers midi   [scripts] Génération de fichiers midi EmptyMar 8 Nov 2016 - 21:54

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

_________________
[scripts] Génération de fichiers midi Runningpotato1[scripts] Génération de fichiers midi TvF6GED [scripts] Génération de fichiers midi MdetltS
Revenir en haut Aller en bas
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
[scripts] Génération de fichiers midi
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Charny Scripts [Beaucoup de scripts]
» MIDI en MP3
» Mes musiques MIDI
» Partagez vos midi
» MIDI vers MP3

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