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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
| package sound.model;
import java.util.ArrayList;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Track;
import javax.sound.midi.Transmitter;
import main.model.Volume;
public class SoundGenerator {
private final int PPQS = 16;
private final int STAKKATO = 4;
private Volume volumeclass;
private long currentTick = 0;
// Sequencer und Synthesizer initialisieren
private Sequencer sequencer = null;
private Transmitter transmitter = null;
private Synthesizer synthesizer = null;
private Receiver receiver = null;
private int tone[][] = null;
private ShortMessage message = null;
private Sequence sequence = null;
private Track track = null;
public void midiSound(ArrayList<Double> doubleList) throws Exception {
// Partitur {{Tonhoehe, DauerInViertelNoten, AnzahlWdh},...}
int index = (doubleList.size());
tone = new int[index][3];
System.out.println(index);
for (int i = 0; i < (index); i++) {
tone[i][0] = (doubleList.get(i).intValue() - 50 );
tone[i][1] = 1;
tone[i][2] = 1;
}
doubleList = null;
sequence = new Sequence(Sequence.PPQ, PPQS);
track = sequence.createTrack();
// Kanal 0 auf "EnsembleStrings" umschalten
message = new ShortMessage();
message.setMessage(ShortMessage.PROGRAM_CHANGE, 0, 48, 0);
track.add(new MidiEvent(message, currentTick));
// Partiturdaten hinzufügen
volumeclass = Volume.getInstance();
for (int i = 0; i < tone.length; ++i) {
for (int j = 0; j < tone[i][2]; ++j) { // Anzahl Wdh. je Note
message = new ShortMessage();
message.setMessage(ShortMessage.NOTE_ON, 0, tone[i][0], volumeclass.getVolume());
track.add(new MidiEvent(message, currentTick));
currentTick += PPQS * tone[i][1] - STAKKATO;
message = new ShortMessage();
message.setMessage(ShortMessage.NOTE_OFF, 0, tone[i][0], 0);
track.add(new MidiEvent(message, currentTick));
currentTick += STAKKATO;
}
}
// Sequencer und Synthesizer initialisieren
sequencer = MidiSystem.getSequencer();
transmitter = sequencer.getTransmitter();
synthesizer = MidiSystem.getSynthesizer();
receiver = synthesizer.getReceiver();
// Beide öffnen und verbinden
synthesizer.open();
sequencer.open();
transmitter.setReceiver(receiver);
// Sequence abspielen
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(145);
sequencer.start();
int count = 0;
while (true) {
System.out.println(count);
count++;
try {
Thread.sleep(400);
} catch (Exception e) {
// nothing
}
if (!sequencer.isRunning()) {
break;
}
}
// Sequencer anhalten und Geräte schließen
sequencer.stop();
sequencer.close();
synthesizer.close();
}
} |