1
package org.herac.tuxguitar.io.ascii;
3
import java.io.FileNotFoundException;
4
import java.io.FileOutputStream;
5
import java.io.OutputStream;
6
import java.io.PrintStream;
7
import java.util.Iterator;
9
import org.herac.tuxguitar.song.managers.TGSongManager;
10
import org.herac.tuxguitar.song.models.TGBeat;
11
import org.herac.tuxguitar.song.models.TGDuration;
12
import org.herac.tuxguitar.song.models.TGMeasure;
13
import org.herac.tuxguitar.song.models.TGNote;
14
import org.herac.tuxguitar.song.models.TGSong;
15
import org.herac.tuxguitar.song.models.TGString;
16
import org.herac.tuxguitar.song.models.TGTrack;
18
public class ASCIITabOutputStream {
20
private static final String[] TONIC_NAMES = new String[]{"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
22
private static final int MAX_LINE_LENGTH = 80;
24
private TGSongManager manager;
25
private PrintStream stream;
26
private ASCIIOutputStream out;
28
public ASCIITabOutputStream(PrintStream stream){
32
public ASCIITabOutputStream(OutputStream stream){
33
this(new PrintStream(stream));
36
public ASCIITabOutputStream(String fileName) throws FileNotFoundException{
37
this(new FileOutputStream(fileName));
40
public void writeSong(TGSong song){
41
this.manager = new TGSongManager();
42
this.manager.setSong(song);
43
this.out = new ASCIIOutputStream(this.stream);
49
private void drawSong(){
50
TGSong song = this.manager.getSong();
52
//Propiedades de cancion
53
this.out.drawStringLine("Title: " + song.getName());
54
this.out.drawStringLine("Artist: " + song.getArtist());
55
this.out.drawStringLine("Album: " + song.getAlbum());
56
this.out.drawStringLine("Author: " + song.getAuthor());
58
Iterator it = song.getTracks();
60
TGTrack track = (TGTrack)it.next();
67
private void drawTrack(TGTrack track){
68
//Propiedades de pista
70
this.out.drawStringLine("Track " + track.getNumber() + ": " + track.getName());
72
//Obtengo los nombres de la afinacion, y el ancho maximo que ocupa
73
String[] tuning = new String[track.getStrings().size()];
74
int maxTuningLength = 1;
75
for(int i = 0; i < track.getStrings().size();i++){
76
TGString string = (TGString)track.getStrings().get(i);
77
tuning[i] = TONIC_NAMES[(string.getValue() % TONIC_NAMES.length)];
78
maxTuningLength = Math.max(maxTuningLength,tuning[i].length());
85
int index = nextMeasure;
86
for(int i = 0; i < track.getStrings().size();i++){
87
TGString string = (TGString)track.getStrings().get(i);
89
//Dibujo la afinacion de la cuerda
90
this.out.drawTuneSegment(tuning[i],maxTuningLength);
91
int measureCount = track.countMeasures();
92
for(int j = index; j < measureCount; j++){
93
TGMeasure measure = track.getMeasure(j);
94
drawMeasure(measure,string);
95
nextMeasure = (j + 1);
97
//Calculo si era el ultimo compas
98
eof = (this.manager.getTrackManager().isLastMeasure(measure));
100
//Si se supero el ancho maximo, bajo de linea
101
if(this.out.getPosX() > MAX_LINE_LENGTH){
105
//Cierro los compases
106
this.out.drawBarSegment();
114
private void drawMeasure(TGMeasure measure,TGString string){
116
this.out.drawBarSegment();
117
this.out.drawStringSegments(1);
118
TGBeat beat = this.manager.getMeasureManager().getFirstBeat( measure.getBeats() );
122
//Si hay una nota en la misma cuerda, la dibujo
123
TGNote note = this.manager.getMeasureManager().getNote(beat, string.getNumber());
125
outLength = (Integer.toString(note.getValue()).length() - 1);
126
this.out.drawNote(note.getValue());
130
this.out.drawStringSegments(1);
133
//Agrego espacios correspondientes hasta el proximo pulso.
134
this.out.drawStringSegments(getDurationScaping(beat.getDuration()) - outLength);
136
beat = this.manager.getMeasureManager().getNextBeat( measure.getBeats() , beat);
141
private int getDurationScaping(TGDuration duration){
144
if(duration.getValue() >= TGDuration.SIXTEENTH){
147
else if(duration.getValue() >= TGDuration.EIGHTH){
150
else if(duration.getValue() >= TGDuration.QUARTER){
153
else if(duration.getValue() >= TGDuration.HALF){
156
else if(duration.getValue() >= TGDuration.WHOLE){