class_docstr: A MidiAutoencoder that has additional z encoders.
  
  This is set up similar to the base MidiAutoencoder, except that there are
  many more places to learn encoding "z" variables to enable better
  reconstruction or better learnable representations.
docstr: Encode latents per a note with local pooling.
docstr_tok: ["Encode","latents","per","a","note","with","local","pooling","."]
code: def z_note_encode(self, features, q_pitch):
      """Encode latents per a note with local pooling."""
      z_notes = None
      if self.z_note_encoder is not None:
          z_notes = self.z_note_encoder(features)["z"]
          note_mask = nn.get_note_mask(q_pitch)
          z_notes = nn.pool_over_notes(z_notes, note_mask)
      return z_notes
  
imports: import ddsp
  from ddsp.training import nn
  from ddsp.training import preprocessing
  from ddsp.training.models.model import Model
  import tensorflow
label_desc: Use image node_id 4 for calling the ZMidiAutoencoder obj's underlying member method code with example usage: obj.z_note_encode(features, q_pitch) and returns: z_notes