IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Multimédia Java Discussion :

pbm avec setMessage() dans javax.sound.midi


Sujet :

Multimédia Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 5
    Points
    5
    Par défaut pbm avec setMessage() dans javax.sound.midi
    Bonjour,
    j'utilise l'API midi de Java pour créer et jouer deux notes de musique (un La suivi d'un Si). Dans le premier code ci-dessous, tout est fait de façon classique et fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    import javax.sound.midi.*;
     
    public class PremierCode {
     
    	public static void main(String[] args) {
    		PremierCode premCode = new PremierCode();
    		premCode.play();
    	}
    	public void play(){
    		try{
    			Sequencer seq = MidiSystem.getSequencer();
    			seq.open();
    			Sequence s = new Sequence(Sequence.PPQ,1);  // 120 bpm par défaut et 1 tick par beat donc 2 ticks/s
    			Track t = s.createTrack();
     
     
    			ShortMessage note1On = new ShortMessage();
    			note1On.setMessage(ShortMessage.NOTE_ON, 1, 57, 100);
    			MidiEvent me1 = new MidiEvent(note1On, 1);
    			t.add(me1);
    			ShortMessage note1Off = new ShortMessage();
    			note1Off.setMessage(ShortMessage.NOTE_OFF, 1, 57, 100);
    			MidiEvent me2 = new MidiEvent(note1Off, 3);
    			t.add(me2);
     
    			ShortMessage note2On = new ShortMessage();
    			note2On.setMessage(ShortMessage.NOTE_ON, 1, 59, 100);
    			MidiEvent me3 = new MidiEvent(note2On, 3);
    			t.add(me3);
    			ShortMessage note2Off = new ShortMessage();
    			note2Off.setMessage(ShortMessage.NOTE_OFF, 1, 59, 100);
    			MidiEvent me4 = new MidiEvent(note2Off, 5);
    			t.add(me4);
     
    			seq.setSequence(s);
    			seq.start();
     
    		}
    		catch (Exception ex) {
    			ex.printStackTrace();
    		}		
     
    	}
    }
    Par contre le deuxième code ci-dessous, qui vise à simplifier le premier en réutilisant deux objets de la classe ShortMessage déjà créés, ne fonctionne plus. Plus exactement on entend deux fois la même note.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    import javax.sound.midi.MidiEvent;
    import javax.sound.midi.MidiSystem;
    import javax.sound.midi.Sequence;
    import javax.sound.midi.Sequencer;
    import javax.sound.midi.ShortMessage;
    import javax.sound.midi.Track;
     
    public class DeuxiemeCode {
     
    	public static void main(String[] args) {
    		DeuxiemeCode deuxCode = new DeuxiemeCode();
    		deuxCode.play();
    	}
    	public void play(){
    		try{
    			Sequencer seq = MidiSystem.getSequencer();
    			seq.open();
    			Sequence s = new Sequence(Sequence.PPQ,1);  // 120 bpm par défaut et 1 tick par beat donc 2 ticks/s
    			Track t = s.createTrack();
     
     
    			ShortMessage note1On = new ShortMessage();
    			note1On.setMessage(ShortMessage.NOTE_ON, 1, 57, 100);
    			MidiEvent me1 = new MidiEvent(note1On, 1);
    			t.add(me1);
    			ShortMessage note1Off = new ShortMessage();
    			note1Off.setMessage(ShortMessage.NOTE_OFF, 1, 57, 100);
    			MidiEvent me2 = new MidiEvent(note1Off, 3);
    			t.add(me2);
     
    			note1On.setMessage(ShortMessage.NOTE_ON, 1, 59, 100);
    			MidiEvent me3 = new MidiEvent(note1On, 3);
    			t.add(me3);
    			note1Off.setMessage(ShortMessage.NOTE_OFF, 1, 59, 100);
    			MidiEvent me4 = new MidiEvent(note1Off, 5);
    			t.add(me4);
     
    			seq.setSequence(s);
    			seq.start();
     
    		}
    		catch (Exception ex) {
    			ex.printStackTrace();
    		}		
     
    	}
    }
    J'ai tout de suite pensé à un problème de passage d'argument, mais en l'occurence la méthode setMessage() est bien censée modifier le contenu de l'objet ShortMessage. Je sèche vraiment et suis preneur de toute aide!
    Merci d'avance,
    F.B.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Bah, garde ta première solution car ton deuxième code c'est normal a mon avis qu'il joue la même note puisque c'est le meme ShortMessage qui lui est passé 2 fois.

    Il faut donc ne pas réutiliser le même objet ShortMessage et créer a chaque fois un nouveau (sauf si c'est la même note évidemment).
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2015
    Messages : 4
    Points : 5
    Points
    5
    Par défaut [Résolu] pbm avec setMEssage() dans javax.sound.midi
    Merci pour la réponse.
    Entre temps j'ai réfléchi à mon problème et je pense avoir compris ce qui se passe.

    Un MidiEvent est un objet comprenant deux champs: un MidiMessage (en l'occurence un ShortMessage dans mon cas), donc un objet Java, qui contient une référence vers le contenu de l'objet,
    et une variable entière, donc un type primitif, qui contient l'entier lui-même.

    Lorsque je réutilise le premier ShortMessage note1On pour faire la deuxième note, ce ShortMessage est effectivement modifié par setMessage (ses champs sont modifiés).
    Mais comme les MidiEvent déjà créés me1 et me2 (utilisés pour faire la première note) ne contiennent que des RÉFÉRENCES aux MidiMessage (note1On et note1Off) qui les composent,
    ces MidiEvent sont eux aussi modifiés, c'est à dire ils contiennent des références vers le nouveau ShortMessage, c'est à dire vers la deuxième note.

    Il faut donc créer autant de ShortMessage que nécesaires.

    Merci encore pour l'aide, cdlt,
    F.B.

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Tu sembles avoir en effet bien compris ce qu'il se passait. Bon amusement.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Audio] [javax.sound]ou[MIDI]Jouer des sons "à la volée"
    Par Claythest dans le forum Multimédia
    Réponses: 8
    Dernier message: 12/12/2008, 16h12
  2. [Débutant] pbm avec un .js dans unfichier séparé
    Par jazer dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/10/2006, 15h54
  3. [VB6] Multiselection avec CTRL dans une msflexgrid
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/04/2003, 10h57
  4. PB avec "self" dans une dll
    Par DiJiRiDouS dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 09h32
  5. Pbm avec les '&'...
    Par AmaX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/08/2002, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo