sig
  type ('a, 'b, 'c) fields = { audio : 'a; video : 'b; midi : 'c; }
  type multiplicity = Variable | Zero | Succ of Frame.multiplicity
  type content_kind =
      (Frame.multiplicity, Frame.multiplicity, Frame.multiplicity)
      Frame.fields
  type content_type = (int, int, int) Frame.fields
  type content =
      (Frame.audio_t array, Frame.video_t array, Frame.midi_t array)
      Frame.fields
  and audio_t = Audio.Mono.buffer
  and video_t = Video.buffer
  and midi_t = MIDI.buffer
  val blit_content :
    Frame.content -> int -> Frame.content -> int -> int -> unit
  val copy : Frame.content -> Frame.content
  type metadata = (string, string) Hashtbl.t
  type t = {
    mutable breaks : int list;
    mutable metadata : (int * Frame.metadata) list;
    mutable contents : (int * Frame.content) list;
  }
  val create : Frame.content_kind -> Frame.t
  val position : Frame.t -> int
  val is_partial : Frame.t -> bool
  val clear : Frame.t -> unit
  val clear_from : Frame.t -> int -> unit
  val advance : Frame.t -> unit
  val breaks : Frame.t -> int list
  val set_breaks : Frame.t -> int list -> unit
  val add_break : Frame.t -> int -> unit
  exception No_metadata
  val set_metadata : Frame.t -> int -> Frame.metadata -> unit
  val get_metadata : Frame.t -> int -> Frame.metadata option
  val free_metadata : Frame.t -> int -> unit
  val free_all_metadata : Frame.t -> unit
  val get_all_metadata : Frame.t -> (int * Frame.metadata) list
  val set_all_metadata : Frame.t -> (int * Frame.metadata) list -> unit
  val get_past_metadata : Frame.t -> Frame.metadata option
  val content : Frame.t -> int -> int * Frame.content
  val content_of_type :
    ?force:Frame.content ->
    Frame.t -> int -> Frame.content_type -> Frame.content
  val hide_contents : Frame.t -> unit -> unit
  type content_layer = {
    content : Frame.content;
    start : int;
    length : int;
  }
  val get_content_layers : Frame.t -> Frame.content_layer list
  exception No_chunk
  val get_chunk : Frame.t -> Frame.t -> unit
  val mul_sub_mul : Frame.multiplicity -> Frame.multiplicity -> bool
  val int_sub_mul : int -> Frame.multiplicity -> bool
  val mul_eq_int : Frame.multiplicity -> int -> bool
  val kind_sub_kind : Frame.content_kind -> Frame.content_kind -> bool
  val type_has_kind : Frame.content_type -> Frame.content_kind -> bool
  val content_has_type : Frame.content -> Frame.content_type -> bool
  val type_of_content : Frame.content -> Frame.content_type
  val type_of_kind : Frame.content_kind -> Frame.content_type
  val mul_of_int : int -> Frame.multiplicity
  val add_mul :
    Frame.multiplicity -> Frame.multiplicity -> Frame.multiplicity
  val string_of_content_kind : Frame.content_kind -> string
  val string_of_content_type : Frame.content_type -> string
  val allow_lazy_config_eval : unit -> unit
  val audio_channels : int Lazy.t
  val video_channels : int Lazy.t
  val midi_channels : int Lazy.t
  val video_width : int Lazy.t
  val video_height : int Lazy.t
  val audio_rate : int Lazy.t
  val video_rate : int Lazy.t
  val midi_rate : int Lazy.t
  val master_rate : int Lazy.t
  val size : int Lazy.t
  val duration : float Lazy.t
  val audio_of_master : int -> int
  val video_of_master : int -> int
  val midi_of_master : int -> int
  val master_of_audio : int -> int
  val master_of_video : int -> int
  val master_of_midi : int -> int
  val master_of_seconds : float -> int
  val audio_of_seconds : float -> int
  val video_of_seconds : float -> int
  val seconds_of_master : int -> float
  val seconds_of_audio : int -> float
  val seconds_of_video : int -> float
end