1
package org.herac.tuxguitar.io.exporter;
3
import java.io.FileNotFoundException;
4
import java.io.FileOutputStream;
5
import java.io.PrintStream;
6
import java.util.Iterator;
9
import org.eclipse.swt.graphics.Point;
10
import org.herac.tuxguitar.song.managers.MeasureManager;
11
import org.herac.tuxguitar.song.managers.SongManager;
12
import org.herac.tuxguitar.song.models.Component;
13
import org.herac.tuxguitar.song.models.Duration;
14
import org.herac.tuxguitar.song.models.InstrumentString;
15
import org.herac.tuxguitar.song.models.Measure;
16
import org.herac.tuxguitar.song.models.Note;
17
import org.herac.tuxguitar.song.models.Song;
18
import org.herac.tuxguitar.song.models.SongTrack;
20
public class ASCIITabOutputStream {
22
private static final String[] TONIC_NAMES = new String[]{"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
24
private static final int MAX_LINE_LENGTH = 80;
26
private SongManager manager;
27
private PrintStream stream;
28
private ASCIIOutputStream out;
31
public ASCIITabOutputStream(PrintStream stream){
35
public ASCIITabOutputStream(String fileName) throws FileNotFoundException{
36
this(new PrintStream( new FileOutputStream(fileName) ));
37
//this(new PrintStream(fileName));
40
public void writeSong(Song song){
41
this.manager = new SongManager();
42
this.manager.setSong(song);
43
out = new ASCIIOutputStream(this.stream);
50
private void drawSong(){
51
Song song = manager.getSong();
53
//Propiedades de cancion
54
out.drawStringLine("Title: " + song.getName());
55
out.drawStringLine("ALbum: " + song.getAlbum());
56
out.drawStringLine("Author: " + song.getAuthor());
57
out.drawStringLine("Interpret: " + song.getInterpret());
59
Iterator it = song.getTracks().iterator();
61
SongTrack track = (SongTrack)it.next();
70
private void drawTrack(SongTrack track){
71
//Propiedades de pista
73
out.drawStringLine("Track " + track.getNumber() + ": " + track.getName());
75
//Obtengo los nombres de la afinacion, y el ancho maximo que ocupa
76
String[] tunning = new String[track.getStrings().size()];
77
int maxTunningLength = 1;
78
for(int i = 0; i < track.getStrings().size();i++){
79
InstrumentString string = (InstrumentString)track.getStrings().get(i);
80
tunning[i] = TONIC_NAMES[(string.getValue() % TONIC_NAMES.length)];
81
maxTunningLength = Math.max(maxTunningLength,tunning[i].length());
88
int index = nextMeasure;
89
for(int i = 0; i < track.getStrings().size();i++){
90
InstrumentString string = (InstrumentString)track.getStrings().get(i);
92
//Dibujo la afinacion de la cuerda
93
out.drawTuneSegment(tunning[i],maxTunningLength);
95
for(int j = index; j < track.getMeasures().size(); j++){
96
Measure measure = (Measure)track.getMeasures().get(j);
97
drawMeasure(measure,string);
98
nextMeasure = (j + 1);
100
//Calculo si era el ultimo compas
101
eof = (manager.getTrackManager().isLastMeasure(track,measure));
103
//Si se supero el ancho maximo, bajo de linea
104
Point position = out.getPosition();
105
if(position.x > MAX_LINE_LENGTH){
109
//Cierro los compases
110
out.drawBarSegment();
118
private void drawMeasure(Measure measure,InstrumentString string){
119
MeasureManager measureManager = manager.getMeasureManager();
120
List components = measureManager.getComponents(measure);
121
measureManager.orderComponents(components);
124
out.drawBarSegment();
125
out.drawStringSegments(1);
126
Component component = next(components,measure.getStart(),string.getNumber());
127
while(component != null){
129
//Si es nota y en la misma cuerda, la dibujo
130
if(component instanceof Note && ((Note)component).getString() == string.getNumber()){
131
Note note = (Note)component;
132
outLength = (Integer.toString(note.getValue()).length() - 1);
133
out.drawNote(note.getValue());
137
out.drawStringSegments(1);
140
//Agrego espacios correspondientes hasta el proximo pulso.
141
out.drawStringSegments(getDurationScaping(component.getDuration()) - outLength);
143
component = next(components,component.getStart() + component.getDuration().getTime(),string.getNumber());
148
private Component next(List components,long start,int string){
149
Component next = null;
150
for(int i = 0;i < components.size();i++){
151
Component component = (Component)components.get(i);
153
if(component.getStart() >= start && (next == null || component.getStart() < next.getStart())){
155
}else if(component.getStart() >= start && (next == null || component.getStart() == next.getStart())){
156
if(component instanceof Note && ((Note)component).getString() == string){
164
private int getDurationScaping(Duration duration){
167
if(duration.getValue() >= Duration.SIXTEENTH){
170
else if(duration.getValue() >= Duration.EIGHTH){
173
else if(duration.getValue() >= Duration.QUARTER){
176
else if(duration.getValue() >= Duration.HALF){
179
else if(duration.getValue() >= Duration.WHOLE){