program nul2one; uses SysUtils, Algemeen, MidiDoos; var Bron,Doel : string; procedure Some_Help; begin Writeln('NUL2ONE'); Writeln; Writeln('Converts type 0 to type 1 MidiFile'); Writeln; writeln('Syntax: [program] [IMF] [OMF]'); Writeln; Writeln('IMF = name of 0-type MidiFile (Input)'); Writeln('OMF = name of 1-type MidiFile (Output)'); end; procedure Read_Parameters(var OK : boolean); var tel : integer; begin OK := true; tel := ParamCount; if tel <> 2 then begin Some_Help; OK := false; Exit; end; Bron := ParamStr(1); Doel := ParamStr(2); if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; end; end; procedure channels(IM : Midi); var punt,aantal,ch,tel : integer; p,q,d,delta,was : integer; OK : boolean; let : byte; riedel : bytes; OM : Midi; begin OM := Midi.Create; SetLength(OM.invoer,17*Length(IM.invoer)); punt := 14; IM.Check_Track_Header(punt,aantal,OK); q := 14; p := punt; delta := 0; was := q; q := q + 8; while (p < punt+aantal) do begin d := IM.Get_Delta_Time(p); delta := delta + d; IM.Copy_Any_Event(p,riedel); let := riedel[0]; if (let = $FF) then begin OM.Put_Delta_Time(delta,q); delta := 0; OM.Put_Any_Event(riedel,q); end; end; OM.Put_Track_Header(q-was-8,was); tel := 1; for ch := 0 to 15 do begin p := punt; delta := 0; was := q; q := q + 8; while (p < punt+aantal) do begin d := IM.Get_Delta_Time(p); delta := delta + d; IM.Copy_Any_Event(p,riedel); let := riedel[0]; if ($80 <= let) and (let <= $EF) then begin if let = ((let and $F0) or ch) then begin OM.Put_Delta_Time(delta,q); delta := 0; OM.Put_Any_Event(riedel,q); end; end; end; if (was = q-8) then begin q := was; Continue; end else tel := tel + 1; OM.Put_Delta_Time(0,q); SetLength(riedel,3); riedel[0] := $FF; riedel[1] := $2F; riedel[2] := $00; OM.Put_Any_Event(riedel,q); OM.Put_Track_Header(q-was-8,was); end; OM.Put_Midi_Header(1,tel,IM.Ticks); SetLength(OM.invoer,q); OM.Write_MidiFile(Doel); end; procedure HoofdRoutine; { Beginning of Main program } var IM : Midi; OK : boolean; begin Read_Parameters(OK); if not OK then Exit; IM := Midi.Create; IM.Read_MidiFile(Bron); IM.Check_Structure(OK); if not OK then Exit; OK := false; if IM.Type01 = 0 then OK := true; if not OK then Writeln('Wrong IMF type = 1'); if IM.Tracks = 1 then OK := true; if not OK then Writeln('Wrong # tracks > 1'); if not OK then begin Writeln; Some_Help; Exit; end; { We have a Go } channels(IM); end; BEGIN HoofdRoutine; END.