Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2010-01-30 22:15:13 proMidi

jerome
membre
Date d'inscription: 2008-03-04
Messages: 103
Site web

proMidi



Bonjour,
je réalise un piano roll en Processing et j'essaie d'utiliser le midi et donc proMidi.

Ca marche à peu près, mais je n'arrive pas à changer la durée des notes, ni a correctement enlever des notes de ma séquence.

Merci pour toute info.

JR

Hors ligne

 

#2 2010-01-30 22:53:33 Re : proMidi

human.koala
modérateur
Lieu: Paris
Date d'inscription: 2008-03-13
Messages: 35
Site web

Re: proMidi



tu utilise quoi comme structure de données pour stocker tes notes ?

HK


"If Pacman had affected us as kids we'd be running around in dark rooms, munching pills and listening to repetitive music."

Hors ligne

 

#3 2010-01-31 02:45:17 Re : proMidi

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: proMidi



Bonjour,

Il existe aussi rwmidi et themidibus pour utiliser du midi avec processing :
rwmidi : http://ruinwesen.com/blog?id=95
themidibus : http://smallbutdigital.com/themidibus.php

Sinon, un exemple intéressant avec promidi, Ring Ring de Kyle McDonald sur openprocessing, il utilise midiOut.sendNoteOn et midiOut.sendNoteOff pour la durée des notes (regarde dans Musician.pde : http://emoc.org/opcode/1167 ).

Comme structure de données, l'ArrayList est pratique pour ajouter et enlever des éléments.

Je ne sais pas si tout cela t'avancera, sinon tu peux aussi envoyer ton code ou les extraits "à problème"

Hors ligne

 

#4 2010-01-31 12:15:32 Re : proMidi

jerome
membre
Date d'inscription: 2008-03-04
Messages: 103
Site web

Re: proMidi



Merci pour les réponses.

L'exemple RingRing ne correspond plus à la nouvelle version de promidi.

Dans RingRing :

Note currentNote = new Note(channel,pitch,velocity); //channel,pitch,velocity
midiOut.sendNoteOn(currentNote );
delay(duree);
midiOut.sendNoteOff(currentNote );

De même la méthode openOutput(1) est remplacée par getMidiOut(1,1);

Maintenant avec le nouveau promidi, plus besoin de noteOff, la durée est mémorisée dans la classe Note :

import promidi.*;
MidiIO midiIO;
MidiOut midiOut;
void setup(){
  midiIO = MidiIO.getInstance(this);
  midiOut = midiIO.getMidiOut(1,1);
  midiOut.sendNote(new Note(100,120,10)); //pitch,velocity,duree
}
void draw(){}

MidiBus :
Extrêmement lent au démarrage (chez moi).
Je me souviens que quand j'ouvre le GlitchSequencer fait avec MidiBus, ça met le même temps, je ne comprenais pas pourquoi, il semblerait donc que c'est à cause de MidiBus.
http://www.glitch-sequencer.com/
Outre ce problème de lenteur au démarrage, le système noteOn + delay + noteOff n'est quand même pas très pratique.

Comment mettre ça en séquence polyphonique (avec accord de notes) dans Processing ?

C'est pourquoi je vois l'avantage d'un séquenceur déjà prêt dans proMidi, avec le système sequencer + songs + track :

  track = new Track("one", midiOut);
  track.setQuantization(Q._1_4);
  song = new Song("test", 200);
  song.addTrack(track);
  sequencer = new Sequencer();
  sequencer.setSong(song);
  sequencer.setLoopStartPoint(0);
  sequencer.setLoopEndPoint(SEQ_MAX);
  sequencer.setLoopCount(-1);

Mon programme pianoroll en cours : http://abel.jerome.free.fr/pianoroll/pi … _test9.zip

méthode :  createTabNotes()
Dans mon programme, rappelons que c'est un piano roll, je choisis de créer un tableau 2D de notes que je remplis au démarrage .

méthode : drawGrid()
Ensuite, quand la souris passe sur la grille, le clic gauche doit activer une note et le clic droit doit la désactiver. C'est à ce moment là que la note doit être ajoutée ou supprimée de la séquence. Au niveau graphique, ça fonctionne, avec sûrement des solutions fait à la va vite, mais bon ça marche. Au niveau Midi, la note s'ajoute, je la prend du tableau de notes créée auparavant, mais elle ne s'enlève pas de la "track" correctement.
Outre ce problème lié au séquenceur, la durée des notes n'est pas prise en compte, alors qu'on vient de voir en début de ce message que la méthode "midiOut.sendNote" marchait. J'en conclus que c'est à cause du séquenceur ?

En effet, si je n'utilise pas le tableau de notes créé auparavant comme ceci :

track.addEvent(tabNotes[i][j],j);

mais que je fais tout simplement :

track.addEvent(new Note(new Note(36+abs(i-CELL_HEIGHT_NB),120,50),j);

La durée de la note devrait être de 50 millisecondes, et bien, ça ne marche pas non plus.

J'essaie de voir avec jmetude (http://jmetude.dihardja.de), le wrapper de JMusic pour P5, mais c'est un système de phrases lié à un tableau de notes. Etant donné que mon tableau de notes change à chaque clic de souris, il faudrait supprimer la phrase et ajouter la nouvelle à chaque fois ... Peut-être que je vais être obligé de faire ça...

Sinon pour la structure de données, je pense avoir répondu, pas besoin d'ajout dynamique, un tableau 2D suffit, c'est une lecture en boucle.

Hors ligne

 

#5 2010-02-02 10:49:29 Re : proMidi

jerome
membre
Date d'inscription: 2008-03-04
Messages: 103
Site web

Re: proMidi



J'ai écris un message sur le forum de Processing, il semblerait que pour le problème de removeEvent, des personnes soient dans le même cas que moi :

http://processing.org/discourse/yabb2/Y … 2504/12#12

Hors ligne

 

#6 2010-02-02 11:45:52 Re : proMidi

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: proMidi



Bonjour,

J'ai commencé à regarder ton programme hier soir, en particulier l'ajout et la suppression de notes, et je bloquais aussi sur addEvent et removeEvent, la liste des évènements à pourtant l'air correcte, mais ça provoque une nullPointerException que je n'arrive pas à m'expliquer. Peut-être qu'en se penchant sur la classe TickMapEvents.java d'où vient l'erreur? A suivre, en tout cas

Hors ligne

 

#7 2010-02-02 12:23:32 Re : proMidi

jerome
membre
Date d'inscription: 2008-03-04
Messages: 103
Site web

Re: proMidi



sad La fonction removeEvent() a l'air "buggée", il faudrait rentrer dans le code Java mais je n'ai pas le temps.

Une des solutions, des plus stupides mais qui fonctionne, c'est d'utiliser une variable "step" qui déclenche une seule fois par "step", la méthode sendMidi(step);

Le déclenchement des notes se fait dans un tableau 2D d'entiers. Si la case est cochée la note est sélectionnée, la case vaut 1, sinon pas de notes, la case vaut 0.

Le tableau est de dimension 16 de largeur pour le nombre de pas du séquenceur et 24 de hauteur pour le nombre d'octave pour les hauteurs de notes.

mad
Le problème maintenant est qu'il faut envoyer une NoteOFF pour régler le problème de la durée !!!

citation :

Be aware that you have to take care to send note off commands to release the notes otherwise you get midi hang ons. http://creativecomputing.cc/p5libs/prom … ndnote.htm

Le noteOff ne semble venir que d'un contrôleur ?!!
http://creativecomputing.cc/p5libs/prom … oteoff.htm

Enfin, c'est bien lourd encore cette histoire.

Hors ligne

 

#8 2010-02-03 14:52:18 Re : proMidi

jerome
membre
Date d'inscription: 2008-03-04
Messages: 103
Site web

Re: proMidi



Une version de mon projet de piano roll disponible ici : http://codelab.fr/1508#p7102

Hors ligne

 

#9 2010-02-03 15:23:31 Re : proMidi

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: proMidi



Merci de partager ton programme!

J'ai essayé de comprendre l'erreur de RemoveEvent, mais j'ai vite atteint mes limites en java, il faudrait un peu plus qu'un temps raisonnable pour aller plus loin...

Sinon, concernant le noteOff, en regardant dans la source, on voit qu'un noteOff est automatiquement ajouté quand on déclenche la méthode sendNote, d'ailleurs en regardant le flux midi, on le voit. C'est en contradiction avec ce qui est indiqué dans la documentation, mais peut-être qu'elle n'est pas à jour?

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024