sig
  class type t =
    object
      method fill_add : Audio.buffer -> int -> int -> unit
      method note_off : int -> float -> unit
      method note_on : int -> float -> unit
      method play : MIDI.buffer -> int -> Audio.buffer -> int -> int -> unit
      method play_add :
        MIDI.buffer -> int -> Audio.buffer -> int -> int -> unit
      method reset : unit
      method set_volume : float -> unit
    end
  type synth = Synth.t
  class create : (float -> float -> Audio.Generator.t) -> t
  class create_mono : (float -> float -> Audio.Mono.Generator.t) -> t
  class sine : ?adsr:Audio.Mono.Effect.ADSR.t -> int -> t
  class square : ?adsr:Audio.Mono.Effect.ADSR.t -> int -> t
  class saw : ?adsr:Audio.Mono.Effect.ADSR.t -> int -> t
  class monophonic : Audio.Generator.t -> t
  module Multitrack :
    sig
      class type t =
        object
          method play :
            MIDI.Multitrack.buffer ->
            int -> Audio.buffer -> int -> int -> unit
          method play_add :
            MIDI.Multitrack.buffer ->
            int -> Audio.buffer -> int -> int -> unit
        end
      class create : int -> (int -> Synth.synth) -> t
    end
end