<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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)