program dtn2mid; uses ALgemeen, MidiDoos, TextMidi, SysUtils; type spoor = array of bytes; var Bron,Doel : string; ITF : textfile; procedure Some_Help; begin Writeln('DTN2MID'); Writeln; Writeln('Converts TextFile to MidiFile'); Writeln('Time Differences, Note differences'); Writeln; writeln('Syntax: [program] [ITF] [OMF]'); Writeln; Writeln('ITF = name of Input TextFile'); Writeln('Text behind timestamp allowed'); Writeln('OMF = name of Output MidiFile'); end; procedure Read_Parameters(var OK : boolean); begin OK := true; if ParamCount <> 2 then begin OK := false; Some_Help; Exit; end; Bron := ParamStr(1); if not FileExists(Bron) then begin Writeln(Bron, ' not found.'); OK := false; Exit; end; AssignFile(ITF,Bron); Reset(ITF); Doel := ParamStr(2); end; function Estimate(regel : string): integer; var L,E : integer; begin E := 3+1; L := Length(regel); case regel[1] of '0'..'9' : E := ((L+1) div 2) + 1; 'P' : E := 2+1; 'M' : E := L+1; 'H' : E := items(regel) + 2; 'T' : E := 8; 'F' : E := 14; end; Estimate := E; { Writeln(regel,' -> ',E); } end; procedure Pass_One(var sporen,totaal : integer); var s,t : integer; regel : string; begin s := 0; t := 0; Reset(ITF); while not EoF(ITF) do begin Readln(ITF, regel); if regel[1] = 'T' then s := s + 1; t := t + Estimate(regel); end; sporen := s; totaal := t; end; procedure Pass_Two(var plaats : integers); var tel,p : integer; regel : string; begin tel := 0; p := 0; plaats[tel] := 0; Reset(ITF); while not EoF(ITF) do begin p := p + 1; Readln(ITF, regel); if regel[1] = 'T' then begin plaats[tel] := p; tel := tel + 1; plaats[tel] := 0; end; end; plaats[tel] := p + 1; end; function korte(regel : string) : string; const cijfers : set of char = ['0','1','2','3','4','5','6','7','8','9',' ']; var i,R : integer; begin R := Length(regel) ; i := 1; while (regel[i] in cijfers) and (i < R) do i := i + 1; korte := Copy(regel,1,i); end; function is_time(regel : string) : boolean; const cijfers : set of char = ['0','1','2','3','4','5','6','7','8','9']; var i,R : integer; OK : boolean; begin R := Length(regel); OK := true; for i := 1 to R do begin if regel[i] in cijfers then Continue; if regel[i] = ' ' then Break; OK := false; Break; end; is_time := OK; end; procedure HoofdRoutine; var OK,tijdig : boolean; soort,sporen,tikken : integer; totaal,L,punt,onthou,delta : integer; plaats : integers; regel : string; k,trk,k0,k1 : integer; buffer : bytes; MF : Midi; begin Read_Parameters(OK); if not OK then Exit; Readln(ITF, regel); MidiFile_Header(regel,OK,soort,tikken); if not OK then Exit; Reset(ITF); Pass_One(sporen,totaal); OK := (sporen > 0); if not OK then begin Writeln('NO Tracks found'); Exit; end; { Writeln('type tracks ticks = ',soort,' ',sporen,' ',tikken); Writeln('Estimated filesize = ',totaal); } SetLength(plaats,sporen+1); Pass_Two(plaats); MF := Midi.Create; SetLength(MF.invoer,totaal); MF.Put_Midi_Header(soort,sporen,tikken); punt := 14; Reset(ITF); for k := 1 to plaats[0]-1 do Readln(ITF,regel); for trk := 0 to sporen-1 do begin Readln(ITF,regel); punt := punt + 8; onthou := punt; k0 := plaats[trk]; k1 := plaats[trk+1]; L := k1-k0-1; SetLength(buffer,0); tijdig := false; for k := 0 to L-1 do begin Readln(ITF,regel); if regel[1] = '*' then Continue; if is_time(regel) then begin if tijdig then MF.Put_Dummy_Event(punt); regel := korte(regel); delta := getnum(regel); MF.Put_Delta_Time(delta,punt); tijdig := true; end else begin if not tijdig then MF.Put_Delta_Time(0,punt); buffer := Verwerk_Event(regel); MF.Put_Any_Event(buffer,punt); tijdig := false; end; end; MF.Put_Track_Header(punt-onthou,onthou-8); end; SetLength(MF.invoer,punt); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.