private void readNoteEffects(TGNoteEffect noteEffect) throws IOException {
   int flags1 = readUnsignedByte();
   int flags2 = readUnsignedByte();
   if ((flags1 & 0x01) != 0) {
     readBend(noteEffect);
   }
   if ((flags1 & 0x10) != 0) {
     readGrace(noteEffect);
   }
   if ((flags2 & 0x04) != 0) {
     readTremoloPicking(noteEffect);
   }
   if ((flags2 & 0x08) != 0) {
     noteEffect.setSlide(true);
     readByte();
   }
   if ((flags2 & 0x10) != 0) {
     readArtificialHarmonic(noteEffect);
   }
   if ((flags2 & 0x20) != 0) {
     readTrill(noteEffect);
   }
   noteEffect.setHammer(((flags1 & 0x02) != 0));
   noteEffect.setLetRing(((flags1 & 0x08) != 0));
   noteEffect.setVibrato(((flags2 & 0x40) != 0) || noteEffect.isVibrato());
   noteEffect.setPalmMute(((flags2 & 0x02) != 0));
   noteEffect.setStaccato(((flags2 & 0x01) != 0));
 }
  private void writeNoteEffect(TGNoteEffect effect) {
    int header = 0;

    header = (effect.isBend()) ? header |= EFFECT_BEND : header;
    header = (effect.isTremoloBar()) ? header |= EFFECT_TREMOLO_BAR : header;
    header = (effect.isHarmonic()) ? header |= EFFECT_HARMONIC : header;
    header = (effect.isGrace()) ? header |= EFFECT_GRACE : header;
    header = (effect.isTrill()) ? header |= EFFECT_TRILL : header;
    header = (effect.isTremoloPicking()) ? header |= EFFECT_TREMOLO_PICKING : header;
    header = (effect.isVibrato()) ? header |= EFFECT_VIBRATO : header;
    header = (effect.isDeadNote()) ? header |= EFFECT_DEAD : header;
    header = (effect.isSlide()) ? header |= EFFECT_SLIDE : header;
    header = (effect.isHammer()) ? header |= EFFECT_HAMMER : header;
    header = (effect.isGhostNote()) ? header |= EFFECT_GHOST : header;
    header = (effect.isAccentuatedNote()) ? header |= EFFECT_ACCENTUATED : header;
    header = (effect.isHeavyAccentuatedNote()) ? header |= EFFECT_HEAVY_ACCENTUATED : header;
    header = (effect.isPalmMute()) ? header |= EFFECT_PALM_MUTE : header;
    header = (effect.isStaccato()) ? header |= EFFECT_STACCATO : header;
    header = (effect.isTapping()) ? header |= EFFECT_TAPPING : header;
    header = (effect.isSlapping()) ? header |= EFFECT_SLAPPING : header;
    header = (effect.isPopping()) ? header |= EFFECT_POPPING : header;
    header = (effect.isFadeIn()) ? header |= EFFECT_FADE_IN : header;

    writeHeader(header, 3);

    // escribo el bend
    if (((header & EFFECT_BEND) != 0)) {
      writeBendEffect(effect.getBend());
    }

    // leo el tremolo bar
    if (((header & EFFECT_TREMOLO_BAR) != 0)) {
      writeTremoloBarEffect(effect.getTremoloBar());
    }

    // leo el harmonic
    if (((header & EFFECT_HARMONIC) != 0)) {
      writeHarmonicEffect(effect.getHarmonic());
    }

    // leo el grace
    if (((header & EFFECT_GRACE) != 0)) {
      writeGraceEffect(effect.getGrace());
    }

    // leo el trill
    if (((header & EFFECT_TRILL) != 0)) {
      writeTrillEffect(effect.getTrill());
    }

    // leo el tremolo picking
    if (((header & EFFECT_TREMOLO_PICKING) != 0)) {
      writeTremoloPickingEffect(effect.getTremoloPicking());
    }
  }
 private void readNoteEffects(TGNoteEffect noteEffect) throws IOException {
   int flags1 = readUnsignedByte();
   int flags2 = readUnsignedByte();
   noteEffect.setHammer(((flags1 & 0x02) != 0));
   noteEffect.setLetRing(((flags1 & 0x08) != 0));
   noteEffect.setVibrato(((flags2 & 0x40) != 0) || noteEffect.isVibrato());
   noteEffect.setPalmMute(((flags2 & 0x02) != 0));
   noteEffect.setStaccato(((flags2 & 0x01) != 0));
   if ((flags1 & 0x01) != 0) {
     readBend(noteEffect);
   }
   if ((flags1 & 0x10) != 0) {
     readGrace(noteEffect);
   }
   if ((flags2 & 0x04) != 0) {
     readTremoloPicking(noteEffect);
   }
   if ((flags2 & 0x08) != 0) {
     noteEffect.setSlide(true);
     readByte();
   }
   if ((flags2 & 0x10) != 0) {
     TGEffectHarmonic harmonic = getFactory().newEffectHarmonic();
     int type = readByte();
     if (type == 1) {
       harmonic.setType(TGEffectHarmonic.TYPE_NATURAL);
     } else if (type == 3) {
       harmonic.setType(TGEffectHarmonic.TYPE_TAPPED);
     } else if (type == 4) {
       harmonic.setType(TGEffectHarmonic.TYPE_PINCH);
     } else if (type == 5) {
       harmonic.setType(TGEffectHarmonic.TYPE_SEMI);
     } else if (type == 15) {
       harmonic.setType(TGEffectHarmonic.TYPE_ARTIFICIAL);
       harmonic.setData(2);
     } else if (type == 17) {
       harmonic.setType(TGEffectHarmonic.TYPE_ARTIFICIAL);
       harmonic.setData(3);
     } else if (type == 22) {
       harmonic.setType(TGEffectHarmonic.TYPE_ARTIFICIAL);
       harmonic.setData(0);
     }
     noteEffect.setHarmonic(harmonic);
   }
   if ((flags2 & 0x20) != 0) {
     byte fret = readByte();
     byte period = readByte();
     TGEffectTrill trill = getFactory().newEffectTrill();
     trill.setFret(fret);
     if (period == 1) {
       trill.getDuration().setValue(TGDuration.SIXTEENTH);
       noteEffect.setTrill(trill);
     } else if (period == 2) {
       trill.getDuration().setValue(TGDuration.THIRTY_SECOND);
       noteEffect.setTrill(trill);
     } else if (period == 3) {
       trill.getDuration().setValue(TGDuration.SIXTY_FOURTH);
       noteEffect.setTrill(trill);
     }
   }
 }