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.
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 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(); } } }
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!
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(); } } }
Merci d'avance,
F.B.
Partager