program kar2stf; uses SysUtils, Algemeen, MidiDoos, MidiText; var Bron,Doel : string; procedure Some_Help; begin Writeln('KAR2STF'); Writeln; Writeln('Extract Song Text Format from type 1 Karaoke file'); Writeln; writeln('Syntax: [program] [IMF] [OTF]'); Writeln; Writeln('IMF = Name of input Midi Karaoke file'); Writeln('OTF = Name of output Song Text Format file'); Writeln; Writeln('http://alternatievewiskunde.nl/was_UPC/delphi/stf_doc.htm'); 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 Tekst(zaken : bytes; var OTF : TextFile); var greep : string; i,j,k,nr,tel : integer; spatie : boolean; const streep : string = '_'; begin tel := Length(zaken); SetLength(greep,tel-2); for k := 2 to tel-1 do begin nr := zaken[k]; greep[k-1] := char(nr); end; tel := Length(greep); if (greep[1] = '@') and (greep[2]<>'T') then Exit; { Title material : } if (greep[1] = '@') then begin for k := 3 to tel do greep[k-2] := greep[k]; SetLength(greep,tel-2); Writeln(OTF,greep); Exit; end; spatie := (greep[tel] = ' '); if greep[1] = '\' then { New verse: } begin greep[1] := '/'; Writeln(OTF); end; if greep[1] = '/' then { New line: } begin for k := 2 to tel do greep[k-1] := greep[k]; Writeln(OTF); SetLength(greep,tel-1); Write(OTF,greep); streep := '_'; if spatie then streep := ''; Exit; end; { Escape sequence: } i := 1; for k := 2 to tel do begin i := i + 1; if not spatie then if (greep[i] = ' ') or (greep[i] = '-') then begin tel := tel + 1; SetLength(greep,tel); for j := i to tel-1 do greep[tel-j+i] := greep[tel-j+i-1]; greep[i] := '\'; i := i + 1; end; end; if (greep[1] = ' ') then Write(OTF,greep) else Write(OTF,streep + greep); streep := '_'; if spatie then streep := ''; end; procedure verwerk(MF : Midi; var OTF : TextFile); var punt,aantal,p : integer; zaken : bytes; OK : boolean; let : byte; begin punt := 14; { Tempo track } MF.Check_Track_Header(punt,aantal,OK); if not OK then Exit; punt := punt + aantal; MF.Check_Track_Header(punt,aantal,OK); if not OK then Exit; punt := punt + aantal; { Song track } MF.Check_Track_Header(punt,aantal,OK); if not OK then Exit; p := punt; while (p < punt+aantal) do begin MF.Skip_Delta_Time(p); let := MF.invoer[p]; if (let = $FF) then begin MF.Data_Any_Event(p,zaken); if (zaken[1] = $01) and (Length(zaken) > 2) then Tekst(zaken,OTF) else MF.Skip_Any_Event(p); end else MF.Skip_Any_Event(p); end; end; procedure HoofdRoutine; { Beginning of Main program } var MF : Midi; OK : boolean; OTF : TextFile; begin Read_Parameters(OK); if not OK then Exit; MF := Midi.Create; MF.Read_MidiFile(Bron); MF.Check_Structure(OK); if not OK then Exit; OK := (MF.Type01 = 1) and (MF.Tracks > 1); if not OK then begin Writeln('Midi Karaoke File is not type 1'); Exit; end; OK := (MF.Tracks > 2); if not OK then begin Writeln('Midi Karaoke File has # tracks < 3'); Exit; end; AssignFile(OTF,Doel); Rewrite(OTF); verwerk(MF,OTF); Writeln(OTF); CloseFile(OTF); end; BEGIN HoofdRoutine; END.