class_docstr: Processor to get piano note activations from a CNN in a multi-task fashion
  which simultaneously detects onsets and intermediate note features.
  
  References
  ----------
  
  .. [1] Rainer Kelz, Sebastian Böck and Gerhard Widmer,
         "Deep Polyphonic ADSR Piano Note Transcription",
         Proceedings of the 44th International Conference on Acoustics,
         Speech and Signal Processing (ICASSP), 2019.
  
  Examples
  --------
  Create a CNNPianoNoteProcessor and pass a file through the processor
  to obtain a note activation function (sampled with 50 frames per second).
  
  >>> proc = CNNPianoNoteProcessor()
  >>> proc  # doctest: +ELLIPSIS
  <madmom.features.notes.CNNPianoNoteProcessor object at 0x...>
  >>> act = proc('tests/data/audio/stereo_sample.wav')
  
  The activations are returned as a 3-dimensional array, the first axis
  representing time, the second the MIDI notes, and the third dimension
  contains the (sounding) note and onset activations (first and second value,
  respectively).
  
  >>> act.shape
  (208, 88, 3)
  
  Sounding notes,
  
  >>> act[..., 0]  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
  array([[0., 0., ..., 0., 0.],
         [0., 0., ..., 0., 0.],
         ...,
         [0., 0., ..., 0., 0.],
         [0., 0., ..., 0., 0.]], dtype=float32)
  
  and onset activations.
  
  >>> act[..., 1]  # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
  array([[0.     , 0.00001, ..., 0.     , 0.     ],
         [0.     , 0.00002, ..., 0.     , 0.     ],
         ...,
         [0.     , 0.     , ..., 0.     , 0.     ],
         [0.     , 0.     , ..., 0.     , 0.     ]], dtype=float32)
code: def __init__(self, **kwargs):
      from ..audio.signal import SignalProcessor, FramedSignalProcessor
      from ..audio.stft import ShortTimeFourierTransformProcessor
      from ..audio.spectrogram import (
          FilteredSpectrogramProcessor,
          LogarithmicSpectrogramProcessor,
      )
      from ..models import NOTES_CNN
      from ..ml.nn import NeuralNetworkEnsemble
  
      # define pre-processing chain
      sig = SignalProcessor(num_channels=1, sample_rate=44100)
      frames = FramedSignalProcessor(frame_size=4096, fps=50)
      stft = ShortTimeFourierTransformProcessor()  # caching FFT window
      filt = FilteredSpectrogramProcessor(
          num_bands=24, fmin=30, fmax=10000
      )
      spec = LogarithmicSpectrogramProcessor(add=1)
      # pre-processes everything sequentially
      pre_processor = SequentialProcessor(
          (sig, frames, stft, filt, spec, _cnn_pad)
      )
      # process the pre-processed signal with a NN
      nn = NeuralNetworkEnsemble.load(NOTES_CNN)
      # instantiate a SequentialProcessor
      super(CNNPianoNoteProcessor, self).__init__((pre_processor, nn))
  
imports: from __future__ import absolute_import, division, print_function
  import numpy
  from .onsets import OnsetPeakPickingProcessor, peak_picking
  from ..processors import ParallelProcessor, Processor, SequentialProcessor
  from ..utils import combine_events
label_desc: Use image node_id 1 to create a new CNNPianoNoteProcessor object from inherited base classes: SequentialProcessor with example: obj = CNNPianoNoteProcessor()