J'utilise cet algo pour jouer une gamme chromatique. Je voudrais concevoir un logiciel d'arrangement. J'ai déjà la structure de l'arrangeur (testé en php). Par contre, quelqu'un pourrait-il me dire comment enregistrer au format midi les notes qui sont produites par cet algo ? Enfin, est-ce qu'on peut jouer plusieurs notes en même temps (accords), et qu'est-ce qu'il faut modifier dans l'algo pour y arriver (exemple, avec 2 notes ayant un intervalle de tierce mineure, soit un intervalle de 3 demi tons) ? Merci de vos réponses.
Normalement, en java pour enregistrer c'est :
recordEnable (Track track, int channel)
startRecording()...
recordDisable(Track track)
mais je ne sais pas comment le formaliser ici.


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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import javax.sound.midi.*;
import java.io.*;
 
public class MidiSynthe {
 
public static void main(String[] args) {
try {
new MidiSynthe();
}
catch (Exception e) {
e.printStackTrace();
}
while (true);
}
 
private Synthesizer synthesizer;
private Soundbank soundBank;
private Instrument [] instruments;
private MidiChannel [] channels;
 
public MidiSynthe() throws MidiUnavailableException {
 
// initialisation midi : on déclare et on ouvre un synthétiseur
synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
 
// utilisation de la banque de sons par défault
soundBank = synthesizer.getDefaultSoundbank();
if (soundBank == null) {
try {
soundBank = MidiSystem.getSoundbank(new File("../lib/soundbank.gm"));
}
catch (Exception e) {
e.printStackTrace();
}
}
// obtention d'une liste des instruments contenus dans cette banque de sons
instruments = soundBank.getInstruments();
 
// obtention des canaux MIDI contrôlés par ce synthétiseur
channels = synthesizer.getChannels();
 
synthesizer.loadAllInstruments(soundBank);
 
// la note est ensuite jouée
/* paramètres : le canal, le numéro de la note jouée, la velocité (la vitesse à laquelle on a pressée la touche , et enfin la durée (à remplacer par des threads) */
 
for (int i = 0 ; i < 12 ; i++) {
playNote(channels[0], 48+i, 50, 1000);
try {
Thread.sleep(1000);
}
 
 
catch (Exception e) {
}
}
}
 
 
 
// jouer une note
public void playNote(MidiChannel channel, int note, int velocite, int duree) {
/* la durée doit être au moins 1 (même si c'est trop court pour être audible) */
if (duree <= 0) duree = 1;
 
// la note est jouée pendant la durée choisie
for (int i = 0; i < duree; i++) {
channel.noteOn(note, velocite);
}
 
// puis elle est arrêtée.
channel.noteOff(note);
}
 
}