/* * 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()); } }