program Transpo; uses SysUtils, Algemeen, MidiDoos; var { At which & midi-channels, How many intervals: } Half : integer; Bron,Doel : string; procedure Some_Help; begin Writeln('TRANSPO'); Writeln; Writeln('Pitch lower or higher at all midi-channels'); Writeln('Exception is the STANDARD drum channel = 9'); Writeln('Key Signatures are adapted accordingly'); Writeln; writeln('Syntax: [program] [IMF] [OMF] [HOW]'); Writeln; Writeln('IMF = name of Input MidiFile'); Writeln('OMF = name of Output MidiFile'); Writeln('HOW = number of semitones [-12..+12]'); 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); Half := getnum(woord); if (Half < -12) or (Half > +12) then begin Writeln('Transpo ',Half,' out of [-12..+12] range'); OK := false; Exit; end; if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; Exit; end; end; procedure Transpo_(MF : Midi; Half : integer); const voorteken : array[0..11] of integer = ( 0,-5,+2,-3,+4,-1,+6,+1,-4,+3,-2,+5 ); { c c# d d# e f f# g g# a a# b } omgekeerd : array[-7..+7] of integer = { -7 -6 -5 -4 -3 -2 -1 0 +1 +2 +3 +4 +5 +6 +7 } ( 11, 6, 1, 8, 3,10, 5, 0, 7, 2, 9, 4,11, 6, 1 ); { b f# c# g# d# a# f c g d a e b f# c# } var punt,aantal : integer; trk,p,q,getal : integer; OK : boolean; let,note,ch,sf : byte; riedel : bytes; begin punt := 14; for trk := 0 to MF.Tracks-1 do begin MF.Check_Track_Header(punt,aantal,OK); p := punt; while (p < punt+aantal) do begin MF.Skip_Delta_Time(p); q := p; MF.Copy_Any_Event(p,riedel); let := riedel[0]; ch := let and $0F; { Notes } if ($80 <= let) and (let <= $9F) and not (ch = 9) then begin note := riedel[1] + Half; if p-q = 3 then q := q+1; MF.invoer[q] := note; end; { Key Signatures } if (let = $FF) and (Length(riedel) = 5) then if (riedel[1] = $59) and (riedel[2] = 2) then begin sf := riedel[3]; getal := integer(sf); if (sf and $F0) > 0 then getal := integer(sf)-$FF-1; getal := omgekeerd[getal]; getal := (getal + Half + 12) mod 12; getal := voorteken[getal]; if getal >= 0 then riedel[3] := byte(getal) else riedel[3] := byte(getal+$FF+1); MF.Put_Any_Event(riedel,q); end; end; punt := punt+aantal; end; end; procedure HoofdRoutine; { Beginning of Main program } var OK : boolean; MF : Midi; 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; Transpo_(MF,Half); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.