So, nun habe ich mal versucht den Code in Turbo Pascal zu übertragen. Leider tritt schon bei der Compilierung in Zeile 53 ein Fehler auf (Fehler 53). Auch ansonsten ist mir noch einiges unklar: den Variablen t und c habe ich zwar Werte zugewiesen, aber diese muss ich noch irgendwie zur Sounderzeugung nutzen, oder sehe ich das falsch?
Program PCWMUSIC;
TYPE arr = ARRAY[0..24] OF INTEGER;
oktaven = ARRAY[0..14] OF INTEGER;
CONST tval : arr =(3324,3132,2961,2789,2636,2485,2350,2227,
2098,1994,1863,1770,1655,1564,1473,1391,
1311,1258,1167,1101,1039,979,924,877,819);
cps : arr =(131,139,147,156,165,175,185,196,
208,220,233,247,262,277,294,311,
330,349,370,392,415,440,466,493,524);
note1 : oktaven=(0,2,4,5,7,9,11,12,14,16,17,19,21,23,24);
duration1: oktaven=(4,1,1,1,1,1,1,4,1,1,1,1,1,1,4);
Var i,j,scale,pause: Integer;
note,duration: Integer;
t,c: Integer;
tune: String[60];
Procedure Noten;
Var p,r,rest,oct,Code: Integer;
n: Char;
Begin
p:=0;
While p<Length(tune) Do Begin
n:=Copy(tune,p+1,1);
If n='R' Then Begin
p:=p+1;
Val(Copy(tune,p+1,1),rest,Code);
For r:=0 To rest*25 Do Begin End; (* evtl. durch Delay ersetzen *)
End
Else If n='O' Then Begin
p:=p+1;
Val(Copy(tune,p+1,1),oct,Code);
End
Else Begin
note:=Pos(n,'D_EF_G_A_BC')-1;
If oct=2 Then note:=note+12;
IF Copy(tune,p+2,1)='#' Then note:=note+1;
IF Copy(tune,p+2,1)='b' Then note:=note-1;
p:=p+1;
Val(Copy(tune,p+1,1),duration,Code);
t:=tval[note];
c:=cps[note] DIV 10 * duration;
(*CALL psound(t%,c%)*)
End;
p:=p+1;
End;
End;
Procedure Maschinencode;
Var
Begin
Inline($e5/$d5/$c5/$dd/$e5/$4e/$23/$46/$eb/$5e/$23/
$56/$69/$60/$cd/$1b/$cb/$3e/$0c/$d3/$f8/$dd/
$e1/$c1/$d1/$e1/$c9/$f3/$7d/$cb/$3d/$cb/$3d/
$2f/$e6/$03/$4f/$06/$00/$dd/$21/$30/$cb/$dd/
$09/$3e/$0b/$00/$00/$00/$04/$0c/$0d/$20/$fd/
$0e/$3f/$05/$20/$f8/$3c/$fe/$0d/$20/$02/$3d/
$3d/$d3/$f8/$44/$4f/$fe/$0b/$20/$09/$7a/$b3/
$28/$09/$79/$4d/$1b/$dd/$e9/$4d/$0c/$dd/$e9/
$fb/$c9/$0d/$0a/$43/$42/$34/$32/$20/$6d/$6f/
$64/$75/$6c/$61/$09/$43/$42/$35/$33/$20/$6c/
$70/$32/$09/$43/$42/$35/$37/$20/$65/$78/$69/
$74/$09/$1a/$c9/$74/$09/$1a/$00/$00/$00/$00);
(*address:=&HCB00;
FOR i=1 TO 12 Do Begin
sum:=0;*)
(*READ mcode$,check$*)
(*j:=1;
While j<21 Do Begin
Val('&H'+Copy(mcode,j,2),byt,Code);
mem[address]:=byt;
sum:=sum+byt;
address:=address+1;
j:=j+2;
End;
End;*)
(*520 psound=&HCB00 *)
End;
Begin
Procedure Maschinencode;
WriteLN('Die zwei Oktaven');
For scale:=0 to 14 Do Begin
t:=tval[note1[scale]];
c:=cps[note1[scale]] DIV 8 * duration1[scale];
(*150 CALL psound(t%,c%)*)
End;
For pause:=0 to 500 Do Begin End; (* evtl. durch Delay ersetzen *)
WriteLN;
WriteLN('Melodie:');
WriteLN('Rule Britannia!');
For repaat:=0 to 1 Do Begin
tune:='O2E8E3F3F6E3F4E1D3O1C3B9B3O2G5F5E1D1E1F1G3F3E6D6O1C9';
Procedure Noten;
End;
End.
Alles anzeigen