1
package org.herac.tuxguitar.io.midi;
3
import java.io.DataOutputStream;
4
import java.io.IOException;
5
import java.io.OutputStream;
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;
12
public class MidiFileWriter implements MidiFileHeader{
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);
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);
28
private static int writeTrack(MidiTrack track,DataOutputStream out)throws IOException{
31
out.writeInt(TRACK_MAGIC);
34
out.writeInt( writeTrack(track, null) );
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);
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);
51
else if(message.getType() == MidiMessage.TYPE_META){
52
length += writeMetaMessage(message,out);
58
private static int writeShortMessage(MidiMessage message,OutputStream out)throws IOException{
59
byte[] data = message.getData();
60
int length = data.length;
62
out.write(message.getData(),0,length);
67
private static int writeMetaMessage(MidiMessage message,OutputStream out)throws IOException{
69
byte[] data = message.getData();
72
out.write(message.getCommand());
75
length += writeVariableLengthQuantity(data.length,out);
79
length += data.length;
83
private static int writeVariableLengthQuantity(long value, OutputStream out)throws IOException{
84
boolean started = false;
86
int data = (int) ((value >> 21) & 0x7f);
89
out.write(data | 0x80);
94
data = (int) ((value >> 14) & 0x7f);
95
if (data != 0 || started){
97
out.write(data | 0x80);
102
data = (int) ((value >> 7) & 0x7f);
103
if (data != 0 || started){
105
out.write(data | 0x80);
109
data = (int) (value & 0x7f);