FluidSynth takes soundfonts and MIDI data as input, and gives rendered audio samples as output. On the surface, this might sound simple, but doing it with hard real-time guarantees, perfect timing, and in a thread safe way, is difficult. This paper discusses the different approaches that have been used in FluidSynth to solve that problem both in the past, present, as well as suggestions for the future.