/*
* Created on 29-nov-2005
*
* TODO To change the template for this generated file go to Window -
* Preferences - Java - Code Style - Code Templates
*/
package org.herac.tuxguitar.gui.editors.tab;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.herac.tuxguitar.gui.editors.TGPainter;
import org.herac.tuxguitar.gui.editors.tab.layout.ViewLayout;
import org.herac.tuxguitar.gui.editors.tab.painters.TGKeySignaturePainter;
import org.herac.tuxguitar.gui.editors.tab.painters.TGNotePainter;
import org.herac.tuxguitar.song.models.Accidental;
import org.herac.tuxguitar.song.models.Clef;
import org.herac.tuxguitar.song.models.Direction;
import org.herac.tuxguitar.song.models.TGBeat;
import org.herac.tuxguitar.song.models.TGDuration;
import org.herac.tuxguitar.song.models.TGNote;
import org.herac.tuxguitar.song.models.TGNoteEffect;
import org.herac.tuxguitar.song.models.TGVoice;
/**
* @author julian
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TGNoteImpl extends TGNote {
private Accidental accidental;
private Rectangle noteOrientation = new Rectangle(0, 0, 0, 0);
private int scorePosY;
private int tabPosY;
public TGBeatImpl getBeatImpl() {
return getVoiceImpl().getBeatImpl();
}
public TGMeasureImpl getMeasureImpl() {
return getBeatImpl().getMeasureImpl();
}
/**
* Encuentra la nota a la que esta ligada
*/
private TGNote getNoteForTie() {
for (int i = getMeasureImpl().countBeats() - 1; i >= 0; i--) {
TGBeat beat = getMeasureImpl().getBeat(i);
TGVoice voice = beat.getVoice(getVoice().getIndex());
if (beat.getStart() < getBeatImpl().getStart() && !voice.isRestVoice()) {
for (final TGNote note : voice.getNotes()) {
if (note.getString() == getString()) {
return note;
}
}
}
}
return null;
}
public int getPaintPosition(int index) {
return getMeasureImpl().getTs().getPosition(index);
}
public int getPosX() {
return getBeatImpl().getPosX();
}
public int getRealValue() {
return (getValue() + getMeasureImpl().getTrack().getString(getString())
.getValue());
}
public int getScorePosY() {
return this.scorePosY;
}
public int getTabPosY() {
return this.tabPosY;
}
public TGVoiceImpl getVoiceImpl() {
return (TGVoiceImpl) super.getVoice();
}
/**
* Pinta la nota
*/
public void paint(ViewLayout layout, TGPainter painter, int fromX, int fromY) {
int spacing = getBeatImpl().getSpacing();
paintScoreNote(layout, painter, fromX, fromY
+ getPaintPosition(TGTrackSpacing.POSITION_SCORE_MIDDLE_LINES), spacing);
if (!layout.isPlayModeEnabled()) {
paintOfflineEffects(layout, painter, fromX, fromY, spacing);
}
paintTablatureNote(layout, painter, fromX, fromY
+ getPaintPosition(TGTrackSpacing.POSITION_TABLATURE), spacing);
}
private void paintAccentuated(ViewLayout layout, TGPainter painter,
int fromX, int fromY) {
float scale = layout.getScale();
float x = fromX;
float y = fromY + (2f * scale);
painter.initPath();
painter.moveTo(x, y);
painter.lineTo(x + (6.0f * scale), y + (2.5f * scale));
painter.lineTo(x, y + (5.0f * scale));
painter.closePath();
}
private void paintBend(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
float scale = layout.getScale();
float x = (fromX + (1.0f * scale));
float y = (fromY - (2.0f * scale));
layout.setTabEffectStyle(painter);
painter.initPath();
painter.moveTo(x, y);
painter.lineTo(x + (1.0f * scale), y);
painter.cubicTo(x + (1.0f * scale), y, x + (3.0f * scale), y, x
+ (3.0f * scale), y - (2.0f * scale));
painter.lineTo(x + (3.0f * scale), y - (12.0f * scale));
painter.lineTo(x + (1.0f * scale), y - (10.0f * scale));
painter.moveTo(x + (3.0f * scale), y - (12.0f * scale));
painter.lineTo(x + (5.0f * scale), y - (10.0f * scale));
painter.closePath();
}
/**
* Pinta los efectos
*/
private void paintEffects(ViewLayout layout, TGPainter painter, int fromX,
int fromY, int spacing) {
int x = fromX + getPosX() + spacing;
int y = fromY + getTabPosY();
TGNoteEffect effect = getEffect();
if (effect.isGrace()) {
layout.setTabGraceStyle(painter);
String value = Integer.toString(effect.getGrace().getFret());
Point gracePoint = painter.getStringExtent(value);
painter.drawString(value, (this.noteOrientation.x - gracePoint.x - 2),
this.noteOrientation.y);
}
if (effect.isBend()) {
paintBend(layout, painter,
(this.noteOrientation.x + this.noteOrientation.width), y);
} else if (effect.isTremoloBar()) {
paintTremoloBar(layout, painter,
(this.noteOrientation.x + this.noteOrientation.width), y);
} else if (effect.isSlide() || effect.isHammer()) {
int nextFromX = fromX;
TGNoteImpl nextNote = (TGNoteImpl) layout.getSongManager()
.getMeasureManager().getNextNote(getMeasureImpl(),
getBeatImpl().getStart(), getVoice().getIndex(), getString());
if (effect.isSlide()) {
paintSlide(layout, painter, nextNote, x, y, nextFromX);
} else if (effect.isHammer()) {
paintHammer(layout, painter, nextNote, x, y, nextFromX);
}
}
}
private void paintFadeIn(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
float scale = layout.getScale();
float x = fromX;
float y = fromY + (4.0f * scale);
float width = getVoiceImpl().getWidth();
painter.initPath();
painter.moveTo(x, y);
painter.cubicTo(x, y, x + width, y, x + width, y - (4.0f * scale));
painter.moveTo(x, y);
painter.cubicTo(x, y, x + width, y, x + width, y + (4.0f * scale));
painter.closePath();
}
private void paintGrace(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
float scale = (layout.getScoreLineSpacing() / 2.25f);
float x = fromX - (2f * scale);
float y = fromY + (scale / 3);
layout.setScoreEffectStyle(painter);
painter.initPath(TGPainter.PATH_FILL);
TGNotePainter.paintFooter(painter, x, y, -1, scale);
painter.closePath();
painter.initPath();
painter.moveTo(x, y - (2f * scale));
painter.lineTo(x, y + (2f * scale) - (scale / 4f));
painter.closePath();
painter.initPath(TGPainter.PATH_DRAW | TGPainter.PATH_FILL);
TGNotePainter.paintNote(painter, x - scale * 1.33f, y + scale
+ (scale / 4f), scale);
painter.closePath();
painter.initPath();
painter.moveTo(x - scale, y);
painter.lineTo(x + scale, y - scale);
painter.closePath();
}
private void paintHammer(ViewLayout layout, TGPainter painter,
TGNoteImpl nextNote, int fromX, int fromY, int nextFromX) {
float xScale = layout.getScale();
float yScale = (layout.getStringSpacing() / 10.0f);
float x = (fromX + (7.0f * xScale));
float y = (fromY - (5.0f * yScale));
float width = (nextNote != null) ? ((nextNote.getPosX() + nextFromX + nextNote
.getBeatImpl().getSpacing())
- (4.0f * xScale) - x)
: (10.0f * xScale);
float height = (15.0f * yScale);
layout.setTabEffectStyle(painter);
painter.initPath();
painter.addArc(x, y, width, height, 45, 90);
painter.closePath();
}
private void paintHeavyAccentuated(ViewLayout layout, TGPainter painter,
int fromX, int fromY) {
float scale = layout.getScale();
float x = fromX;
float y = fromY;
painter.initPath();
painter.moveTo(x, y + (5.0f * scale));
painter.lineTo(x + (3.0f * scale), y + (1.0f * scale));
painter.lineTo(x + (6.0f * scale), y + (5.0f * scale));
painter.closePath();
}
private void paintOfflineEffects(ViewLayout layout, TGPainter painter,
int fromX, int fromY, int spacing) {
TGSpacing bs = getBeatImpl().getBs();
TGSpacing ts = getMeasureImpl().getTs();
TGNoteEffect effect = getEffect();
int tsY = (fromY + ts.getPosition(TGTrackSpacing.POSITION_EFFECTS));
int bsY = (tsY + (ts.getSize(TGTrackSpacing.POSITION_EFFECTS) - bs
.getSize()));
layout.setOfflineEffectStyle(painter);
if (effect.isAccentuatedNote()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_ACCENTUATED_EFFECT));
paintAccentuated(layout, painter, x, y);
}
if (effect.isHeavyAccentuatedNote()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs
.getPosition(TGBeatSpacing.POSITION_HEAVY_ACCENTUATED_EFFECT));
paintHeavyAccentuated(layout, painter, x, y);
}
if (effect.isFadeIn()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_FADE_IN));
paintFadeIn(layout, painter, x, y);
}
if (effect.isHarmonic()
&& (layout.getStyle() & ViewLayout.DISPLAY_SCORE) == 0) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_HARMONIC_EFFEC));
painter.drawString(effect.getHarmonic().getLabel(), x, y);
}
if (effect.isTapping()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_TAPPING_EFFEC));
painter.drawString("T", x, y);
}
if (effect.isSlapping()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_SLAPPING_EFFEC));
painter.drawString("S", x, y);
}
if (effect.isPopping()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_POPPING_EFFEC));
painter.drawString("P", x, y);
}
if (effect.isPalmMute()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_PALM_MUTE_EFFEC));
painter.drawString("P.M", x, y);
}
if (effect.isLetRing()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_LET_RING_EFFEC));
painter.drawString("L.R", x, y);
}
if (effect.isVibrato()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_VIBRATO_EFFEC));
paintVibrato(layout, painter, x, y);
}
if (effect.isTrill()) {
int x = fromX + getPosX() + spacing;
int y = (bsY + bs.getPosition(TGBeatSpacing.POSITION_TRILL_EFFEC));
paintTrill(layout, painter, x, y);
}
}
/**
* Pinta la nota en la partitura
*/
private void paintScoreNote(ViewLayout layout, TGPainter painter, int fromX,
int fromY, int spacing) {
if ((layout.getStyle() & ViewLayout.DISPLAY_SCORE) != 0) {
float scale = layout.getScoreLineSpacing();
Direction direction = getVoiceImpl().getBeatGroup().getDirection();
int key = getMeasureImpl().getKeySignature();
Clef clef = getMeasureImpl().getClef();
int x = (fromX + getPosX() + spacing);
int y1 = (fromY + getScorePosY());
// -------------foreground--------------------------------------
boolean playing = (layout.isPlayModeEnabled() && getBeatImpl().isPlaying(
layout));
layout.setScoreNoteStyle(painter, playing);
// ----------ligadura---------------------------------------
if (isTiedNote()) {
TGNoteImpl noteForTie = (TGNoteImpl) getNoteForTie();
float tScale = (scale / 8.0f);
float tX = x - (20.0f * tScale);
float tY = y1 - (2.0f * tScale);
float tWidth = (20.0f * tScale);
float tHeight = (30.0f * tScale);
if (noteForTie != null) {
int tNoteX = (fromX + noteForTie.getPosX() + noteForTie.getBeatImpl()
.getSpacing());
int tNoteY = (fromY + getScorePosY());
tX = tNoteX + (6.0f * tScale);
tY = tNoteY - (3.0f * tScale);
tWidth = (x - tNoteX) - (3.0f * tScale);
tHeight = (35.0f * tScale);
}
painter.initPath();
painter.addArc(tX, tY, tWidth, tHeight, 45, 90);
painter.closePath();
}
// ----------sostenido--------------------------------------
if (this.accidental == Accidental.NATURAL) {
painter.initPath(TGPainter.PATH_FILL);
TGKeySignaturePainter.paintNatural(painter,
(x - (scale - (scale / 4))), (y1 + (scale / 2)), scale);
painter.closePath();
} else if (this.accidental == Accidental.SHARP) {
painter.initPath(TGPainter.PATH_FILL);
TGKeySignaturePainter.paintSharp(painter, (x - (scale - (scale / 4))),
(y1 + (scale / 2)), scale);
painter.closePath();
} else if (this.accidental == Accidental.FLAT) {
painter.initPath(TGPainter.PATH_FILL);
TGKeySignaturePainter.paintFlat(painter, (x - (scale - (scale / 4))),
(y1 + (scale / 2)), scale);
painter.closePath();
}
// ----------fin sostenido--------------------------------------
if (getEffect().isHarmonic()) {
if (layout.isBufferEnabled()) {
painter.drawImage(layout.getResources().getHarmonicNote(
getVoice().getDuration().getValue(), playing), x, y1);
} else {
boolean full = (getVoice().getDuration().getValue() >= TGDuration.QUARTER);
painter.initPath((full ? TGPainter.PATH_DRAW | TGPainter.PATH_FILL
: TGPainter.PATH_DRAW));
TGNotePainter.paintHarmonic(painter, x, y1 + 1, (layout
.getScoreLineSpacing() - 2));
painter.closePath();
}
} else {
if (layout.isBufferEnabled()) {
painter.drawImage(layout.getResources().getScoreNote(
getVoice().getDuration().getValue(), playing), x, y1);
} else {
boolean full = (getVoice().getDuration().getValue() >= TGDuration.QUARTER);
painter.initPath((full ? TGPainter.PATH_FILL : TGPainter.PATH_DRAW));
TGNotePainter.paintNote(painter, x, y1 + 1, ((full ? layout
.getScoreLineSpacing() + 1 : layout.getScoreLineSpacing()) - 2));
painter.closePath();
}
}
if (!layout.isPlayModeEnabled()) {
if (getEffect().isGrace()) {
paintGrace(layout, painter, x, y1);
}
// PUNTILLO y DOBLE PUNTILLO
if (getVoice().getDuration().isDotted()
|| getVoice().getDuration().isDoubleDotted()) {
getVoiceImpl().paintDot(layout, painter,
(x + (12.0f * (scale / 8.0f))),
(y1 + (layout.getScoreLineSpacing() / 2)), (scale / 10.0f));
}
// dibujo el pie
if (getVoice().getDuration().getValue() >= TGDuration.HALF) {
layout.setScoreNoteFooterStyle(painter);
int xMove = (direction == Direction.UP ? layout
.getResources().getScoreNoteWidth() : 0);
int y2 = fromY
+ getVoiceImpl().getBeatGroup().getY2(layout,
getPosX() + spacing, key, clef);
// staccato
if (getEffect().isStaccato()) {
int size = 3;
int sX = x + xMove;
int sY = (y2 + (4 * ((direction == Direction.UP) ? -1
: 1)));
layout.setScoreEffectStyle(painter);
painter.initPath(TGPainter.PATH_FILL);
painter.moveTo(sX - (size / 2), sY - (size / 2));
painter.addOval(sX - (size / 2), sY - (size / 2), size, size);
painter.closePath();
}
// tremolo picking
if (getEffect().isTremoloPicking()) {
layout.setScoreEffectStyle(painter);
painter.initPath();
int tpY = fromY;
if ((direction == Direction.UP)) {
tpY += (getVoiceImpl().getBeatGroup().getMaxNote().getScorePosY()
- layout.getScoreLineSpacing() - 4);
} else {
tpY += (getVoiceImpl().getBeatGroup().getMinNote().getScorePosY()
+ layout.getScoreLineSpacing() + 4);
}
for (int i = TGDuration.EIGHTH; i <= getEffect()
.getTremoloPicking().getDuration().getValue(); i += i) {
painter.moveTo(x + xMove - 3, tpY + 1);
painter.lineTo(x + xMove + 4, tpY - 1);
tpY += 4;
}
painter.setLineWidth(2);
painter.closePath();
painter.setLineWidth(1);
}
} else {
// staccato
if (getEffect().isStaccato()) {
int size = 3;
int sX = x + (layout.getResources().getScoreNoteWidth() / 2);
int sY = (fromY
+ getVoiceImpl().getBeatGroup().getMinNote().getScorePosY() + layout
.getScoreLineSpacing()) + 2;
layout.setScoreEffectStyle(painter);
painter.initPath(TGPainter.PATH_FILL);
painter.moveTo(sX - (size / 2), sY - (size / 2));
painter.addOval(sX - (size / 2), sY - (size / 2), size, size);
painter.closePath();
}
// tremolo picking
if (getEffect().isTremoloPicking()) {
layout.setScoreEffectStyle(painter);
painter.initPath();
int tpX = (x + (layout.getResources().getScoreNoteWidth() / 2));
int tpY = fromY
+ (getVoiceImpl().getBeatGroup().getMaxNote().getScorePosY()
- layout.getScoreLineSpacing() - 4);
for (int i = TGDuration.EIGHTH; i <= getEffect()
.getTremoloPicking().getDuration().getValue(); i += i) {
painter.moveTo(tpX - 3, tpY + 1);
painter.lineTo(tpX + 4, tpY - 1);
tpY += 4;
}
painter.setLineWidth(2);
painter.closePath();
painter.setLineWidth(1);
}
}
}
}
}
private void paintSlide(ViewLayout layout, TGPainter painter,
TGNoteImpl nextNote, int fromX, int fromY, int nextFromX) {
float xScale = layout.getScale();
float yScale = (layout.getStringSpacing() / 10.0f);
float yMove = (3.0f * yScale);
float x = fromX;
float y = fromY;
layout.setTabEffectStyle(painter);
if (nextNote != null) {
float nextX = nextNote.getPosX() + nextFromX
+ nextNote.getBeatImpl().getSpacing();
float nextY = y;
if (nextNote.getValue() < getValue()) {
y -= yMove;
nextY += yMove;
} else if (nextNote.getValue() > getValue()) {
y += yMove;
nextY -= yMove;
} else {
y -= yMove;
nextY -= yMove;
}
painter.initPath();
painter.moveTo(x + (6.0f * xScale), y);
painter.lineTo(nextX - (3.0f * xScale), nextY);
painter.closePath();
} else {
painter.initPath();
painter.moveTo(x + (6.0f * xScale), y - yMove);
painter.lineTo(x + (17.0f * xScale), y - yMove);
painter.closePath();
}
}
/**
* Pinta la nota en la tablatura
*/
public void paintTablatureNote(ViewLayout layout, TGPainter painter,
int fromX, int fromY, int spacing) {
int style = layout.getStyle();
if ((style & ViewLayout.DISPLAY_TABLATURE) != 0) {
int stringSpacing = layout.getStringSpacing();
int x = fromX + getPosX() + spacing + 2;
int y = fromY + getTabPosY();
this.noteOrientation.x = x;
this.noteOrientation.y = y;
this.noteOrientation.width = 1;
this.noteOrientation.height = 1;
layout.setTabNoteStyle(painter,
(layout.isPlayModeEnabled() && getBeatImpl().isPlaying(layout)));
// -------------ligadura--------------------------------------
if (isTiedNote() && (style & ViewLayout.DISPLAY_SCORE) == 0) {
float tX = 0;
float tY = 0;
float tWidth = 0;
float tHeight = (stringSpacing * 3);
TGNoteImpl noteForTie = (TGNoteImpl) getNoteForTie();
if (noteForTie != null) {
tX = (fromX + noteForTie.getPosX() + noteForTie.getBeatImpl()
.getSpacing());
tY = (fromY + noteForTie.getTabPosY() + stringSpacing);
tWidth = (x - tX);
} else {
Rectangle r = layout.getNoteOrientation(painter, x, y, this);
tX = r.x - (stringSpacing * 2);
tY = (fromY + getTabPosY() + stringSpacing);
tWidth = (stringSpacing * 2);
}
painter.initPath();
painter.addArc(tX, (tY - tHeight), tWidth, tHeight, 225, 90);
painter.closePath();
// -------------nota--------------------------------------
} else if (!isTiedNote()) {
Rectangle r = layout.getNoteOrientation(painter, x, y, this);
this.noteOrientation.x = r.x;
this.noteOrientation.y = r.y;
this.noteOrientation.width = r.width;
this.noteOrientation.height = r.height;
String visualNote = (getEffect().isDeadNote()) ? "X" : Integer
.toString(getValue());
visualNote = (getEffect().isGhostNote()) ? "(" + visualNote + ")"
: visualNote;
painter.drawString(visualNote, this.noteOrientation.x,
this.noteOrientation.y);
}
// -------------efectos--------------------------------------
if (!layout.isPlayModeEnabled()) {
paintEffects(layout, painter, fromX, fromY, spacing);
if ((style & ViewLayout.DISPLAY_SCORE) == 0) {
int y1 = (fromY + getMeasureImpl().getTrackImpl().getTabHeight() + (stringSpacing / 2));
int y2 = (fromY + getMeasureImpl().getTrackImpl().getTabHeight() + ((stringSpacing / 2) * 5));
// -------------tremolo picking--------------------------------------
if (getEffect().isTremoloPicking()) {
layout.setTabEffectStyle(painter);
painter.initPath();
int posy = (y1 + ((y2 - y1) / 2));
for (int i = TGDuration.EIGHTH; i <= getEffect()
.getTremoloPicking().getDuration().getValue(); i += i) {
painter.moveTo(x - 3, posy - 1);
painter.lineTo(x + 4, posy + 1);
posy += 4;
}
painter.setLineWidth(2);
painter.closePath();
painter.setLineWidth(1);
}
}
}
}
}
private void paintTremoloBar(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
float scale = layout.getScale();
float x1 = fromX + (1.0f * scale);
float x2 = x1 + (8.0f * scale);
float y1 = fromY;
float y2 = y1 + (9.0f * scale);
layout.setTabEffectStyle(painter);
painter.initPath();
painter.moveTo(x1, y1);
painter.lineTo(x1 + ((x2 - x1) / 2), y2);
painter.lineTo(x2, y1);
painter.closePath();
}
private void paintTrill(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
String string = "Tr";
Point stringSize = painter.getStringExtent(string);
float scale = layout.getScale();
float x = fromX + stringSize.x;
float y = fromY + ((stringSize.y - (5.0f * scale)) / 2.0f);
float width = (getVoiceImpl().getWidth() - stringSize.x - (2.0f * scale));
int loops = (int) (width / (6.0f * scale));
if (loops > 0) {
painter.drawString(string, fromX, fromY);
layout.setTabEffectStyle(painter);
painter.initPath(TGPainter.PATH_FILL);
painter.moveTo((x + (2.0f * scale)), (y + (1.0f * scale)));
for (int i = 0; i < loops; i++) {
x = (fromX + stringSize.x + ((6.0f * scale) * i));
painter.lineTo((x + (2.0f * scale)), (y + (1.0f * scale)));
painter
.cubicTo((x + (2.0f * scale)), (y + (1.0f * scale)),
(x + (3.0f * scale)), y, (x + (4.0f * scale)),
(y + (1.0f * scale)));
painter.lineTo((x + (6.0f * scale)), (y + (3.0f * scale)));
}
painter.lineTo((x + (7.0f * scale)), (y + (2.0f * scale)));
painter.cubicTo((x + (7.0f * scale)), (y + (2.0f * scale)),
(x + (8.0f * scale)), (y + (2.0f * scale)), (x + (7.0f * scale)),
(y + (3.0f * scale)));
for (int i = (loops - 1); i >= 0; i--) {
x = (fromX + stringSize.x + ((6.0f * scale) * i));
painter.lineTo((x + (6.0f * scale)), (y + (4.0f * scale)));
painter.cubicTo((x + (6.0f * scale)), (y + (4.0f * scale)),
(x + (5.0f * scale)), (y + (5.0f * scale)), (x + (4.0f * scale)),
(y + (4.0f * scale)));
painter.lineTo((x + (2.0f * scale)), (y + (2.0f * scale)));
painter.lineTo((x + (1.0f * scale)), (y + (3.0f * scale)));
}
painter.cubicTo((x + (1.0f * scale)), (y + (3.0f * scale)), x,
(y + (3.0f * scale)), (x + (1.0f * scale)), (y + (2.0f * scale)));
painter.lineTo((x + (2.0f * scale)), (y + (1.0f * scale)));
painter.closePath();
}
}
private void paintVibrato(ViewLayout layout, TGPainter painter, int fromX,
int fromY) {
float scale = layout.getScale();
float x = fromX;
float y = fromY + (2.0f * scale);
float width = (getVoiceImpl().getWidth() - (2.0f * scale));
int loops = (int) (width / (6.0f * scale));
if (loops > 0) {
layout.setTabEffectStyle(painter);
painter.initPath(TGPainter.PATH_FILL);
painter.moveTo((x + ((2.0f) * scale)), (y + (1.0f * scale)));
for (int i = 0; i < loops; i++) {
x = (fromX + ((6.0f * scale) * i));
painter.lineTo((x + (2.0f * scale)), (y + (1.0f * scale)));
painter
.cubicTo((x + (2.0f * scale)), (y + (1.0f * scale)),
(x + (3.0f * scale)), y, (x + (4.0f * scale)),
(y + (1.0f * scale)));
painter.lineTo((x + (6.0f * scale)), (y + (3.0f * scale)));
}
painter.lineTo((x + (7.0f * scale)), (y + (2.0f * scale)));
painter.cubicTo((x + (7.0f * scale)), (y + (2.0f * scale)),
(x + (8.0f * scale)), (y + (2.0f * scale)), (x + (7.0f * scale)),
(y + (3.0f * scale)));
for (int i = (loops - 1); i >= 0; i--) {
x = (fromX + ((6.0f * scale) * i));
painter.lineTo((x + (6.0f * scale)), (y + (4.0f * scale)));
painter.cubicTo((x + (6.0f * scale)), (y + (4.0f * scale)),
(x + (5.0f * scale)), (y + (5.0f * scale)), (x + (4.0f * scale)),
(y + (4.0f * scale)));
painter.lineTo((x + (2.0f * scale)), (y + (2.0f * scale)));
painter.lineTo((x + (1.0f * scale)), (y + (3.0f * scale)));
}
painter.cubicTo((x + (1.0f * scale)), (y + (3.0f * scale)), x,
(y + (3.0f * scale)), (x + (1.0f * scale)), (y + (2.0f * scale)));
painter.lineTo((x + (2.0f * scale)), (y + (1.0f * scale)));
painter.closePath();
}
}
/**
* Actualiza los valores para dibujar
*/
public void update(ViewLayout layout) {
this.accidental = getMeasureImpl().getNoteAccidental(getRealValue());
this.tabPosY = ((getString() * layout.getStringSpacing()) - layout
.getStringSpacing());
this.scorePosY = getVoiceImpl().getBeatGroup().getY1(layout, this,
getMeasureImpl().getKeySignature(), getMeasureImpl().getClef());
}
}