program Velocity; uses SysUtils, Algemeen, MidiDoos; var { At which & midi-channels, Old and New velocities: } chO,Was,Now : integer; Bron,Doel : string; procedure Some_Help; begin Writeln('VELOCITY'); Writeln; Writeln('Change (default) velocities at a midi-channel'); Writeln; writeln('Syntax: [program] [IMF] [OMF] [CH] [WAS] [NOW]'); Writeln; Writeln('IMF = name of Input MidiFile'); Writeln('OMF = name of Output MidiFile'); Writeln(' CH = channel-number [0,15]'); Writeln('WAS = velocity to be changed'); Writeln('NOW = velocity after change'); end; procedure Read_Parameters(var OK : boolean); var woord : string; begin OK := true; if ParamCount <> 5 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); Was := getnum(woord); if (Was < 0) or (Was > 127) then begin Writeln('Velocity ',Was,' out of range'); OK := false; Exit; end; woord := ParamStr(5); Now := getnum(woord); if (Now < 0) or (Now > 127) then begin Writeln('Velocity ',Now,' out of range'); OK := false; Exit; end; if not FileExists(Bron) then begin Writeln(Bron + ': does Not exist'); OK := false; Exit; end; end; procedure Snelheid(MF : Midi; chO,Was,Now : integer); var punt,aantal : integer; trk,p,q : integer; OK : boolean; let,ch : 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 ($90 <= let) and (let <= $9F) and (ch = chO) and (riedel[2] = Was) then begin if p-q = 3 then q := q+1; MF.invoer[q+1] := Now; 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; Snelheid(MF,chO,Was,Now); MF.Write_MidiFile(Doel); end; BEGIN HoofdRoutine; END.