~ubuntu-branches/ubuntu/oneiric/tuxguitar/oneiric

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);
		}
	}
}