program Speedup; uses SysUtils, Algemeen, MidiDoos; var Hoe : double; Bron,Doel : string; procedure Some_Help; begin Writeln('SPEEDUP'); Writeln; Writeln('Speed up or slow down timing'); Writeln; writeln('Syntax: [program] [IMF] [OMF] [HOW]'); Writeln; Writeln('IMF = name of Input MidiFile'); Writeln('OMF = name of Output MidiFile'); Writeln('HOW = faster(<1) / slower(>1)'); end; procedure Read_Parameters(var OK : boolean); var woord : string; begin OK := true; if ParamCount <> 3 then begin Some_Help; OK := false; Exit; end; Bron := ParamStr(1); Doel := ParamStr(2); woord := ParamStr(3); Hoe := Getal(woord); if (Hoe <= 0) then begin Writeln('HOW = ',woord,' : not a positive real number'); OK := false; Exit; end; if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; Exit; end; end; procedure Overnemen(IMF,OMF : Midi; v,p : integer; var q : integer); var k : integer; begin for k := 0 to p-v-1 do OMF.invoer[q+k] := IMF.invoer[v+k]; q := q + (p-v); end; procedure Discreet(IMF,OMF : Midi; Hoe : double); var punt,aantal,plek,veel : integer; trk,p,q,dt,v : integer; OK : boolean; begin SetLength(OMF.invoer,Round(Hoe+1)*Length(IMF.invoer)); OMF.Put_Midi_Header(IMF.Type01,IMF.Tracks,IMF.Ticks); punt := 14; plek := punt; for trk := 0 to IMF.Tracks-1 do begin IMF.Check_Track_Header(punt,aantal,OK); p := punt; q := plek + 8; while (p < punt+aantal) do begin dt := IMF.Get_Delta_Time(p); dt := Round(Hoe*dt); OMF.Put_Delta_Time(dt,q); v := p; IMF.Skip_Any_Event(p); Overnemen(IMF,OMF,v,p,q); end; punt := punt + aantal; veel := q - plek - 8; OMF.Put_Track_Header(veel,plek); plek := q; end; SetLength(OMF.invoer,plek); end; procedure HoofdRoutine; { Beginning of Main program } var OK : boolean; IMF,OMF : Midi; begin Read_Parameters(OK); if not OK then Exit; IMF := Midi.Create; IMF.Read_MidiFile(Bron); IMF.Check_Structure(OK); if not OK then Exit; OMF := Midi.Create; Discreet(IMF,OMF,Hoe); OMF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.