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

« back to all changes in this revision

Viewing changes to TuxGuitar-midi/src/org/herac/tuxguitar/io/midi/MidiFileWriter.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.io.midi;
 
2
 
 
3
import java.io.DataOutputStream;
 
4
import java.io.IOException;
 
5
import java.io.OutputStream;
 
6
 
 
7
import org.herac.tuxguitar.io.midi.base.MidiEvent;
 
8
import org.herac.tuxguitar.io.midi.base.MidiMessage;
 
9
import org.herac.tuxguitar.io.midi.base.MidiSequence;
 
10
import org.herac.tuxguitar.io.midi.base.MidiTrack;
 
11
 
 
12
public class MidiFileWriter implements MidiFileHeader{
 
13
        
 
14
        public void write(MidiSequence sequence,int type,OutputStream stream)throws IOException{
 
15
                DataOutputStream out = new DataOutputStream(stream);
 
16
                out.writeInt(HEADER_MAGIC);
 
17
                out.writeInt(HEADER_LENGTH);
 
18
                out.writeShort(type);
 
19
                out.writeShort(sequence.countTracks());
 
20
                out.writeShort(  (sequence.getDivisionType() == MidiSequence.PPQ)?(sequence.getResolution() & 0x7fff):0   );
 
21
                for (int i = 0; i < sequence.countTracks(); i++){
 
22
                        writeTrack(sequence.getTrack(i),out);
 
23
                }
 
24
                out.flush();
 
25
                out.close();
 
26
        }
 
27
        
 
28
        private static int writeTrack(MidiTrack track,DataOutputStream out)throws IOException{
 
29
                int length = 0;
 
30
                if (out != null){
 
31
                        out.writeInt(TRACK_MAGIC);
 
32
                }
 
33
                if (out != null){
 
34
                        out.writeInt( writeTrack(track, null) );
 
35
                }
 
36
                MidiEvent previous = null;
 
37
                for (int i = 0; i < track.size(); i++){
 
38
                        MidiEvent event = track.get(i);
 
39
                        length += writeEvent(event,previous,out);
 
40
                        previous = event;
 
41
                }
 
42
                return length;
 
43
        }
 
44
        
 
45
        private static int writeEvent(MidiEvent event,MidiEvent previous,OutputStream out)throws IOException{
 
46
                int length = writeVariableLengthQuantity(((previous != null)?(event.getTick() - previous.getTick()):0), out);
 
47
                MidiMessage     message = event.getMessage();
 
48
                if(message.getType() == MidiMessage.TYPE_SHORT){
 
49
                        length += writeShortMessage(message,out);
 
50
                }
 
51
                else if(message.getType() == MidiMessage.TYPE_META){
 
52
                        length += writeMetaMessage(message,out);
 
53
                }
 
54
                
 
55
                return length;
 
56
        }
 
57
        
 
58
        private static int writeShortMessage(MidiMessage message,OutputStream out)throws IOException{
 
59
                byte[] data = message.getData();
 
60
                int     length = data.length;
 
61
                if (out != null){
 
62
                        out.write(message.getData(),0,length);
 
63
                }
 
64
                return length;
 
65
        }
 
66
        
 
67
        private static int writeMetaMessage(MidiMessage message,OutputStream out)throws IOException{
 
68
                int     length = 0;
 
69
                byte[] data = message.getData();
 
70
                if (out != null){
 
71
                        out.write(0xFF);
 
72
                        out.write(message.getCommand());
 
73
                }
 
74
                length += 2;
 
75
                length += writeVariableLengthQuantity(data.length,out);
 
76
                if (out != null){
 
77
                        out.write(data);
 
78
                }
 
79
                length += data.length;
 
80
                return length;
 
81
        }
 
82
        
 
83
        private static int writeVariableLengthQuantity(long value, OutputStream out)throws IOException{
 
84
                boolean started = false;
 
85
                int length = 0;
 
86
                int data = (int) ((value >> 21) & 0x7f);
 
87
                if (data != 0){
 
88
                        if (out != null){
 
89
                                out.write(data | 0x80);
 
90
                        }
 
91
                        length++;
 
92
                        started = true;
 
93
                }
 
94
                data = (int) ((value >> 14) & 0x7f);
 
95
                if (data != 0 || started){
 
96
                        if (out != null){
 
97
                                out.write(data | 0x80);
 
98
                        }
 
99
                        length++;
 
100
                        started = true;
 
101
                }
 
102
                data = (int) ((value >> 7) & 0x7f);
 
103
                if (data != 0 || started){
 
104
                        if (out != null){
 
105
                                out.write(data | 0x80);
 
106
                        }
 
107
                        length++;
 
108
                }
 
109
                data = (int) (value & 0x7f);
 
110
                if (out != null){
 
111
                        out.write(data);
 
112
                }
 
113
                length++;
 
114
                return length;
 
115
        }
 
116
}