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

« back to all changes in this revision

Viewing changes to TuxGuitar-jsa/src/org/herac/tuxguitar/player/impl/jsa/sequencer/MidiReceiverImpl.java

  • Committer: Bazaar Package Importer
  • Author(s): Philippe Coval
  • Date: 2008-06-19 00:30:30 UTC
  • mto: (5.1.2 sid)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20080619003030-h719szrhsngou7c6
Tags: upstream-1.0
ImportĀ upstreamĀ versionĀ 1.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.herac.tuxguitar.player.impl.jsa.sequencer;
 
2
 
 
3
import javax.sound.midi.MidiMessage;
 
4
import javax.sound.midi.Receiver;
 
5
import javax.sound.midi.ShortMessage;
 
6
 
 
7
import org.herac.tuxguitar.player.base.MidiPlayerException;
 
8
import org.herac.tuxguitar.player.base.MidiSequencer;
 
9
 
 
10
public class MidiReceiverImpl implements Receiver{
 
11
        
 
12
        private MidiSequencer sequencer;
 
13
        
 
14
        public MidiReceiverImpl(MidiSequencer sequencer){
 
15
                this.sequencer = sequencer;
 
16
        }
 
17
        
 
18
        public void send(MidiMessage message, long timeStamp) {
 
19
                try {
 
20
                        parseMessage(message.getMessage());
 
21
                } catch (MidiPlayerException e) {
 
22
                        e.printStackTrace();
 
23
                }
 
24
        }
 
25
        
 
26
        public void close(){
 
27
                //not implemented
 
28
        }
 
29
        
 
30
        private void parseMessage(byte[] data) throws MidiPlayerException{
 
31
                int length = data.length;
 
32
                
 
33
                //NOTE ON
 
34
                if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.NOTE_ON){
 
35
                        parseNoteOn(data);
 
36
                }
 
37
                //NOTE OFF
 
38
                else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.NOTE_OFF){
 
39
                        parseNoteOff(data);
 
40
                }
 
41
                //PROGRAM CHANGE
 
42
                else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.PROGRAM_CHANGE){
 
43
                        parseProgramChange(data);
 
44
                }
 
45
                //CONTROL CHANGE
 
46
                else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.CONTROL_CHANGE){
 
47
                        parseControlChange(data);
 
48
                }
 
49
                //PITCH BEND
 
50
                else if((((length > 0)?(data[0] & 0xFF):0) & 0xF0) == ShortMessage.PITCH_BEND){
 
51
                        parsePitchBend(data);
 
52
                }
 
53
        }
 
54
        
 
55
        private void parseNoteOn(byte[] data) throws MidiPlayerException{
 
56
                int length = data.length;
 
57
                int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):0;
 
58
                int value = (length > 1)?(data[1] & 0xFF):0;
 
59
                int velocity = (length > 2)?(data[2] & 0xFF):0;
 
60
                
 
61
                if(velocity == 0){
 
62
                        parseNoteOff(data);
 
63
                }else if(value > 0){
 
64
                        this.sequencer.getMidiPort().out().sendNoteOn(channel,value,velocity);
 
65
                }
 
66
        }
 
67
        
 
68
        private void parseNoteOff(byte[] data) throws MidiPlayerException{
 
69
                int length = data.length;
 
70
                
 
71
                int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):0;
 
72
                int value = (length > 1)?(data[1] & 0xFF):0;
 
73
                int velocity = (length > 2)?(data[2] & 0xFF):0;
 
74
                
 
75
                this.sequencer.getMidiPort().out().sendNoteOff(channel,value,velocity);
 
76
        }
 
77
        
 
78
        private void parseProgramChange(byte[] data) throws MidiPlayerException{
 
79
                int length = data.length;
 
80
                int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
 
81
                int instrument = (length > 1)?(data[1] & 0xFF):-1;
 
82
                if(channel != -1 && instrument != -1){
 
83
                        this.sequencer.getMidiPort().out().sendProgramChange(channel,instrument);
 
84
                }
 
85
        }
 
86
        
 
87
        private void parseControlChange(byte[] data) throws MidiPlayerException{
 
88
                int length = data.length;
 
89
                int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
 
90
                int control = (length > 1)?(data[1] & 0xFF):-1;
 
91
                int value = (length > 2)?(data[2] & 0xFF):-1;
 
92
                if(channel != -1 && control != -1 && value != -1){
 
93
                        this.sequencer.getMidiPort().out().sendControlChange(channel,control,value);
 
94
                }
 
95
        }
 
96
        
 
97
        private void parsePitchBend(byte[] data) throws MidiPlayerException{
 
98
                int length = data.length;
 
99
                int channel = (length > 0)?((data[0] & 0xFF) & 0x0F):-1;
 
100
                int value = (length > 2)?(data[2] & 0xFF):-1;
 
101
                if(channel != -1 && value != -1){
 
102
                        this.sequencer.getMidiPort().out().sendPitchBend(channel,value);
 
103
                }
 
104
        }
 
105
}