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
101
102
103
104
105
|
package org.herac.tuxguitar.player.impl.jsa.sequencer;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.Receiver;
import javax.sound.midi.ShortMessage;
import org.herac.tuxguitar.player.base.MidiPlayerException;
import org.herac.tuxguitar.player.base.MidiSequencer;
public class MidiReceiverImpl implements Receiver{
private MidiSequencer sequencer;
public MidiReceiverImpl(MidiSequencer sequencer){
this.sequencer = sequencer;
}
public void send(MidiMessage message, long timeStamp) {
try {
parseMessage(message.getMessage());
} catch (MidiPlayerException e) {
e.printStackTrace();
}
}
public void close(){
//not implemented
}
private void parseMessage(byte[] data) throws MidiPlayerException{
int length = data.length;
//NOTE ON
if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.NOTE_ON){
parseNoteOn(data);
}
//NOTE OFF
else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.NOTE_OFF){
parseNoteOff(data);
}
//PROGRAM CHANGE
else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.PROGRAM_CHANGE){
parseProgramChange(data);
}
//CONTROL CHANGE
else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.CONTROL_CHANGE){
parseControlChange(data);
}
//PITCH BEND
else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.PITCH_BEND){
parsePitchBend(data);
}
}
private void parseNoteOn(byte[] data) throws MidiPlayerException{
int length = data.length;
int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):0;
int value = (length > 1)?(data[1] & 0xFF):0;
int velocity = (length > 2)?(data[2] & 0xFF):0;
if(velocity == 0){
parseNoteOff(data);
}else if(value > 0){
this.sequencer.getMidiPort().out().sendNoteOn(channel,value,velocity);
}
}
private void parseNoteOff(byte[] data) throws MidiPlayerException{
int length = data.length;
int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):0;
int value = (length > 1)?(data[1] & 0xFF):0;
int velocity = (length > 2)?(data[2] & 0xFF):0;
this.sequencer.getMidiPort().out().sendNoteOff(channel,value,velocity);
}
private void parseProgramChange(byte[] data) throws MidiPlayerException{
int length = data.length;
int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
int instrument = (length > 1)?(data[1] & 0xFF):-1;
if(channel != -1 && instrument != -1){
this.sequencer.getMidiPort().out().sendProgramChange(channel,instrument);
}
}
private void parseControlChange(byte[] data) throws MidiPlayerException{
int length = data.length;
int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
int control = (length > 1)?(data[1] & 0xFF):-1;
int value = (length > 2)?(data[2] & 0xFF):-1;
if(channel != -1 && control != -1 && value != -1){
this.sequencer.getMidiPort().out().sendControlChange(channel,control,value);
}
}
private void parsePitchBend(byte[] data) throws MidiPlayerException{
int length = data.length;
int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
int value = (length > 2)?(data[2] & 0xFF):-1;
if(channel != -1 && value != -1){
this.sequencer.getMidiPort().out().sendPitchBend(channel,value);
}
}
}
|