program ctn2mid; uses ALgemeen, MidiDoos, TextMidi, SysUtils; type spoor = array of bytes; var Bron,Doel : string; ITF : textfile; alfabet : set of char; procedure Some_Help; begin Writeln('CTN2MID'); Writeln; Writeln('Converts TextFile to MidiFile'); Writeln('Cumulative Times, Note differences and chords'); Writeln; writeln('Syntax: [program] [ITF] [OMF]'); Writeln; Writeln('ITF = name of Input TextFile'); Writeln('Comment lines begin with ''*'''); 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 E,M : integer; begin E := 3; M := Event_At(regel); case regel[M] of 'P' : E := 2; 'M' : E := Length(regel); 'H' : E := items(regel) + 1; 'T' : E := 8; 'F' : E := 14; end; Estimate := E + ((M+1) div 2); end; procedure maak_alfabet; const ABC : string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; { 12345678901234567890123456 } { ABC : string = 'abcdefghijklmnopqrstuvwxyz'; } var i : integer; begin alfabet := []; for i := 1 to 26 do alfabet := alfabet + [ ABC[i] ]; 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] = '*' then Continue; if regel[1] = 'T' then s := s + 1; if regel[1] in alfabet then Continue; 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; procedure HoofdRoutine; var OK : boolean; soort,sporen,tikken : integer; totaal,L,punt,onthou,delta : integer; plaats : integers; regel : string; k,trk,k0,k1,M,tijd,A,B : integer; buffer : bytes; MF : Midi; getal : string; 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); maak_alfabet; 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); tijd := 0; for k := 0 to L-1 do begin Readln(ITF,regel); if regel[1] = '*' then Continue; if regel[1] in alfabet then Continue; M := Event_At(regel)-1; getal := Copy(regel,1,M); delta := getnum(getal) - tijd; tijd := getnum(getal); MF.Put_Delta_Time(delta,punt); A := Event_At(regel); B := Length(regel)-A+1; buffer := Verwerk_Event(Copy(regel,A,B)); MF.Put_Any_Event(buffer,punt); end; MF.Put_Track_Header(punt-onthou,onthou-8); end; SetLength(MF.invoer,punt); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.