sig
  type buffer = float array
  val create : int -> Audio.Mono.buffer
  val blit :
    Audio.Mono.buffer -> int -> Audio.Mono.buffer -> int -> int -> unit
  val copy : Audio.Mono.buffer -> Audio.Mono.buffer
  val duration : Audio.Mono.buffer -> int
  val append : Audio.Mono.buffer -> Audio.Mono.buffer -> Audio.Mono.buffer
  val clear : Audio.Mono.buffer -> int -> int -> unit
  val amplify : float -> Audio.Mono.buffer -> int -> int -> unit
  val resample :
    ?mode:[ `Linear | `Nearest ] ->
    float -> Audio.Mono.buffer -> int -> int -> Audio.Mono.buffer
  val clip : Audio.Mono.buffer -> int -> int -> unit
  val add :
    Audio.Mono.buffer -> int -> Audio.Mono.buffer -> int -> int -> unit
  val mult :
    Audio.Mono.buffer -> int -> Audio.Mono.buffer -> int -> int -> unit
  module Ringbuffer_ext :
    sig
      type elt = float
      type buffer = elt array
      type t
      val create : int -> t
      val read_space : t -> int
      val write_space : t -> int
      val read_advance : t -> int -> unit
      val write_advance : t -> int -> unit
      val read : t -> buffer -> int -> int -> unit
      val peek : t -> buffer -> int -> int -> unit
      val write : t -> buffer -> int -> int -> unit
      val transmit : t -> (buffer -> int -> int -> int) -> int
    end
  module Ringbuffer :
    sig
      type elt = float
      type buffer = elt array
      type t
      val create : int -> t
      val read_space : t -> int
      val write_space : t -> int
      val read_advance : t -> int -> unit
      val write_advance : t -> int -> unit
      val read : t -> buffer -> int -> int -> unit
      val peek : t -> buffer -> int -> int -> unit
      val write : t -> buffer -> int -> int -> unit
      val transmit : t -> (buffer -> int -> int -> int) -> int
    end
  module Buffer_ext :
    sig
      type t
      val create : int -> Audio.Mono.Buffer_ext.t
      val duration : Audio.Mono.Buffer_ext.t -> int
      val prepare : Audio.Mono.Buffer_ext.t -> int -> Audio.Mono.buffer
    end
  module Analyze :
    sig
      val rms : Audio.Mono.buffer -> int -> int -> float
      module FFT :
        sig
          type t
          val init : int -> Audio.Mono.Analyze.FFT.t
          val duration : Audio.Mono.Analyze.FFT.t -> int
          val complex_create :
            Audio.Mono.buffer -> int -> int -> Stdlib.Complex.t array
          val fft :
            Audio.Mono.Analyze.FFT.t -> Stdlib.Complex.t array -> unit
          val band_freq : int -> Audio.Mono.Analyze.FFT.t -> int -> float
          module Window :
            sig
              val cosine : Stdlib.Complex.t array -> unit
              val hann : Stdlib.Complex.t array -> unit
              val hamming : Stdlib.Complex.t array -> unit
              val lanczos : Stdlib.Complex.t array -> unit
              val triangular : Stdlib.Complex.t array -> unit
              val bartlett_hann : Stdlib.Complex.t array -> unit
              val blackman :
                ?alpha:float ->
                Audio.Mono.Analyze.FFT.t -> Stdlib.Complex.t array -> unit
              val nuttall :
                Audio.Mono.Analyze.FFT.t -> Stdlib.Complex.t array -> unit
              val blackman_harris :
                Audio.Mono.Analyze.FFT.t -> Stdlib.Complex.t array -> unit
              val blackman_nuttall :
                Audio.Mono.Analyze.FFT.t -> Stdlib.Complex.t array -> unit
            end
          val notes :
            int ->
            Audio.Mono.Analyze.FFT.t ->
            ?window:(Stdlib.Complex.t array -> unit) ->
            ?note_min:int ->
            ?note_max:int ->
            ?volume_min:float ->
            ?filter_harmonics:bool ->
            float array -> int -> int -> (Audio.Note.t * float) list
          val loudest_note :
            (Audio.Note.t * float) list -> (Audio.Note.t * float) option
        end
    end
  module Effect :
    sig
      val compand_mu_law : float -> Audio.Mono.buffer -> int -> int -> unit
      class type t =
        object method process : Audio.Mono.buffer -> int -> int -> unit end
      class amplify : float -> t
      class clip : float -> t
      class biquad_filter :
        int ->
        [ `All_pass
        | `Band_pass
        | `High_pass
        | `High_shelf
        | `Low_pass
        | `Low_shelf
        | `Notch
        | `Peaking ] -> ?gain:float -> float -> float -> t
      module ADSR :
        sig
          type t
          val make :
            int -> float * float * float * float -> Audio.Mono.Effect.ADSR.t
          type state
          val init : unit -> Audio.Mono.Effect.ADSR.state
          val release :
            Audio.Mono.Effect.ADSR.state -> Audio.Mono.Effect.ADSR.state
          val dead : Audio.Mono.Effect.ADSR.state -> bool
          val process :
            Audio.Mono.Effect.ADSR.t ->
            Audio.Mono.Effect.ADSR.state ->
            Audio.Mono.buffer -> int -> int -> Audio.Mono.Effect.ADSR.state
        end
    end
  module Generator :
    sig
      class type t =
        object
          method dead : bool
          method fill : Audio.Mono.buffer -> int -> int -> unit
          method fill_add : Audio.Mono.buffer -> int -> int -> unit
          method release : unit
          method set_frequency : float -> unit
          method set_volume : float -> unit
        end
      class sine : int -> ?volume:float -> ?phase:float -> float -> t
      class square : int -> ?volume:float -> ?phase:float -> float -> t
      class saw : int -> ?volume:float -> ?phase:float -> float -> t
      class triangle : int -> ?volume:float -> ?phase:float -> float -> t
      class white_noise : ?volume:float -> int -> t
      class chain : Audio.Mono.Generator.t -> Audio.Mono.Effect.t -> t
      class add : Audio.Mono.Generator.t -> Audio.Mono.Generator.t -> t
      class mult : Audio.Mono.Generator.t -> Audio.Mono.Generator.t -> t
      class adsr : Audio.Mono.Effect.ADSR.t -> Audio.Mono.Generator.t -> t
    end
end