class_docstr: Generic abstract class for the graphers
class_docstr_tok: ["Generic","abstract","class","for","the","graphers"]
code: def setup(
      self,
      channels=None,
      samplerate=None,
      blocksize=None,
      totalframes=None,
  ):
      super(Grapher, self).setup(
          channels, samplerate, blocksize, totalframes
      )
      self.sample_rate = samplerate
      self.higher_freq = self.sample_rate / 2
      self.block_size = blocksize
      self.total_frames = totalframes
      self.image = Image.new(
          "RGBA", (self.image_width, self.image_height), self.bg_color
      )
      self.samples_per_pixel = self.total_frames / float(
          self.image_width
      )
      self.buffer_size = int(round(self.samples_per_pixel, 0))
      self.pixels_adapter = FixedSizeInputAdapter(
          self.buffer_size, 1, pad=False
      )
      self.pixels_adapter_totalframes = self.pixels_adapter.blocksize(
          self.total_frames
      )
      self.spectrum = Spectrum(
          self.fft_size,
          self.sample_rate,
          self.block_size,
          self.total_frames,
          self.lower_freq,
          self.higher_freq,
          numpy.hanning,
      )
      self.pixel = self.image.load()
      self.draw = ImageDraw.Draw(self.image)
  
imports: import math
  import numpy
  from timeside.core import Processor, implements, interfacedoc, abstract
  from timeside.core.processor import FixedSizeInputAdapter
  from timeside.core.api import IGrapher
  from timeside.plugins.grapher.utils import smooth, im_watermark, normalize
  import timeside.plugins.analyzer
label_desc: Use image node_id 5 for calling the Grapher obj's underlying member method code with example usage: obj.setup(channels, samplerate, blocksize, totalframes) without return types