docs: def start(self, driver=None, device=None, midi_driver=None):
          """Start audio output driver in separate background thread
  
          Call this function any time after creating the Synth object.
          If you don't call this function, use get_samples() to generate
          samples.
  
          Optional keyword argument:
          driver : which audio driver to use for output
          Possible choices:
          'alsa', 'oss', 'jack', 'portaudio'
          'sndmgr', 'coreaudio', 'Direct Sound'
          device: the device to use for audio output
  
          Not all drivers will be available for every platform, it
          depends on which drivers were compiled into FluidSynth for
          your platform.
  
          """
          if driver is not None:
              assert (driver in ['alsa', 'oss', 'jack', 'portaudio', 'sndmgr', 'coreaudio', 'Direct Sound', 'pulseaudio']) 
              fluid_settings_setstr(self.settings, b'audio.driver', driver.encode())
              if device is not None:
                  fluid_settings_setstr(self.settings, str('audio.%s.device' % (driver)).encode(), device.encode())
              self.audio_driver = new_fluid_audio_driver(self.settings, self.synth)
          if midi_driver is not None:
              assert (midi_driver in ['alsa_seq', 'alsa_raw', 'oss', 'winmidi', 'midishare', 'coremidi'])
              fluid_settings_setstr(self.settings, b'midi.driver', midi_driver.encode())
              self.router = new_fluid_midi_router(self.settings, fluid_synth_handle_midi_event, self.synth)
              fluid_synth_set_midi_router(self.synth, self.router)
              self.midi_driver = new_fluid_midi_driver(self.settings, fluid_midi_router_handle_midi_event, self.router)