with Ada.Text_Io; use Ada; package body Libsens.Data is use Step_Vectors; function Beat(Word16 : in Word16_Type; Index : in Natural) return Boolean is begin return (Word16 and 2**(Index mod 16)) > 0; end Beat; type Step_Seq_Type is array (0..15) of Step_Vectors.Vector; procedure Pattern(From : in Sentence_Type; Channel : in Channel_Type; Seq : in out Seq_Vectors.Vector) is Step_Seq : Step_Seq_Type; begin for I in 1..Seq_Vectors.Last_Index(Seq) loop Step_Seq(I) := Seq_Vectors.Element(Seq, I); exit when I = Step_Seq'Last; end loop; for I in Step_Seq'range loop for J in From'Range loop if Beat(From(J).Sentence, I) then Step_Seq(I) := Step_Seq(I) & To_Long(Note_On(Channel, From(J).key, From(J).sens)); Step_Seq(Integer'Min(Integer(I+Integer(From(J).Length)) mod (Step_Seq'Length-1), Integer(Step_Seq'Last))) := Step_Seq(Integer'Min(Integer(I+Integer(From(J).Length)) mod (Step_Seq'length-1), Integer(Step_Seq'Last))) & To_Long(Note_Off(Channel, From(J).key)); end if; end loop; end loop; Seq := Seq_Vectors.Empty_Vector; for I in Step_Seq_Type'Range loop Seq := Seq_Vectors."&"(Seq, Step_Seq(I)); end loop; end Pattern; end Libsens.Data;