program Octaves; uses SysUtils, Algemeen, MidiDoos; var { At which & midi-channels, How many octaves: } chO, Okt : integer; Bron,Doel : string; procedure Some_Help; begin Writeln('OCTAVES'); Writeln; Writeln('Octave lower or higher at a midi-channel'); Writeln; writeln('Syntax: [program] [IMF] [OMF] [CH] [OCT]'); Writeln; Writeln('IMF = name of Input MidiFile'); Writeln('OMF = name of Output MidiFile'); Writeln(' CH = channel-number [0,15]'); Writeln('OCT = number of octaves [-9,+9]'); end; procedure Read_Parameters(var OK : boolean); var woord : string; begin OK := true; if ParamCount <> 4 then begin Some_Help; OK := false; Exit; end; Bron := ParamStr(1); Doel := ParamStr(2); woord := ParamStr(3); chO := getnum(woord); if (chO < 0) or (chO > 15) then begin Writeln('Channel ',chO,' out of [0,15] range'); OK := false; Exit; end; woord := ParamStr(4); Okt := getnum(woord); if (Okt < -9) or (Okt > +9) then begin Writeln('Octaves ',Okt,' out of [-9,+9] range'); OK := false; Exit; end; if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; Exit; end; end; procedure Octaves_(MF : Midi; chO,Okt : integer); var punt,aantal : integer; trk,p,q : integer; OK : boolean; let,ch,note : 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; if ($80 <= let) and (let <= $9F) and (ch = chO) then begin note := riedel[1] + Okt*12; if p-q = 3 then q := q+1; MF.invoer[q] := note; 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; Octaves_(MF,chO,Okt); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.