program stf2mid; uses SysUtils, Algemeen, MidiDoos, TextMidi; type strings = array of string; var Zang,Bron,Doel : string; STF : TextFile ; kanaal : integer; procedure Some_Help; begin Writeln('STF2MID'); Writeln; Writeln('Syllables & Notes => append Lyrics track'); Writeln; writeln('Syntax: [program] [IMF] [CH] [STF] [OMF]'); Writeln; Writeln('IMF = name of Input MidiFile'); Writeln('CH = channel number of singing'); Writeln('STF = name of input Song Text'); Writeln('OMF = name of Output MidiFile'); end; procedure Read_Parameters(var OK : boolean); var even : string; begin OK := true; if ParamCount <> 4 then begin OK := false; Some_Help; Exit; end; Bron := ParamStr(1); even := ParamStr(2); Zang := ParamStr(3); Doel := ParamStr(4); if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; Exit; end; if not Numeriek(even) then begin Writeln('CH (',even,') must be a numerical value'); OK := false; Exit; end; kanaal := getnum(even); if (kanaal < 0) or (kanaal > 15) then begin Writeln('Channel ',kanaal,' out of [0,15] range'); OK := false; Exit; end; if not FileExists(Zang) then begin Writeln(Zang + ': does Not exist'); OK := false; Exit; end; end; procedure HoofdRoutine; { Beginning of Main program } var p,punt,aantal,ch : integer; d,trk,k,L,t,i,N : integer; OK,stil,toon : boolean; regel : string; riedel : bytes; MF : Midi; greep,woord,alles : lijst; tijd : integers; 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; AssignFile(STF,Zang); Reset(STF); t := 0; while not EoF(STF) do begin Readln(STF,regel); if Length(regel) = 0 then Continue; if regel[1] = '%' then Continue; SetLength(woord,0); woord := Woorden(regel + CRLF); L := Length(woord); for k := 0 to L-1 do begin SetLength(greep,0); greep := Grepen(woord[k] + ' '); N := Length(greep); SetLength(alles,Length(alles)+N); for i := 0 to N-1 do begin alles[t] := vervang(greep[i],'_',''); alles[t] := vervang(alles[t],CRLF + ' ',CRLF); t := t + 1; end; end; end; Close(STF); punt := 14; SetLength(tijd,Length(MF.invoer)); t := 0; for trk := 0 to MF.Tracks-1 do begin MF.Check_Track_Header(punt,aantal,OK); p := punt; d := 0; while p < (punt+aantal) do begin d := d + MF.Get_Delta_Time(p); MF.Copy_Any_Event(p,riedel); if d = 0 then Continue; toon := ($7F < riedel[0]) and (riedel[0] < $A0); if not toon then Continue; stil := (riedel[2] = 0) or ((riedel[0] and $F0) = $80); if stil then Continue; ch := riedel[0] and $0F; if not (ch = kanaal) then Continue; tijd[t] := d; t := t + 1; d := 0; end; punt := punt + aantal; end; SetLength(tijd,t); L := Length(alles); if not (t = L) then begin Writeln('time = ',t,' ?=? song =',L); L := smallest(L,t); for k := 0 to L-1 do begin Writeln(tijd[k]); Writeln(alles[k]); end; Exit; end; L := Length(MF.invoer); N := grootte(alles) + Length(alles)*3; N := N + afmeting(tijd); SetLength(MF.invoer,L+N+8+4); MF.Put_Midi_Header(MF.Type01,MF.Tracks+1,MF.Ticks); punt := L; p := punt + 8; L := Length(alles); for k := 0 to L-1 do begin MF.Put_Delta_Time(tijd[k],p); MF.Put_Any_Event(plug(alles[k]),p); end; MF.Put_Delta_Time(0,p); SetLength(riedel,3); riedel[0] := $FF; riedel[1] := $2F; riedel[2] := $00; MF.Put_Any_Event(riedel,p); MF.Put_Track_Header(p-punt-8,punt); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.