' Der Kapellmeister antwortet nicht

'Mit Paddle steuern
'Jeder Level darf max 5 Noten verpassen
'Drei Level nicht geschafft ist Spielende
'1 Punkt für jede berührte Note

' Grafik setzen
GRAPHICS 1:S=DPEEK(88)
' Adresse des ersten Zeichens im Zeichensatz
D=$E008
' Arrays initialisieren für die Noten
DIM R(16),M(16),U(255)
' kompakte Speicheradresse für Player/Missile und Zeichensatz
M=32768
' PM initialisieren
POKE 559,46
POKE 54279,128
POKE 53277,3
' 1K Speicher löschen
POKE M,0
MOVE M,M+1,1023
' Farbe des players
POKE 704,88
'Cursor unsichbar machen
POKE 752,1
' Horizontalregister Player 0
H=53248
' Einen Strich für Player 0
POKE M+512+95,255
' Player Breite x4
POKE 53256,3
' Die Begleitungsnoten lesen und merken
FOR I=0 TO 15
  READ A
  R(I)=A
NEXT I
' Die Noten lesen und merken
FOR I=1 TO 7
  READ A
  M(I)=A
NEXT I
' Zeichensatz aus dem Rom kopieren
MOVE $E000,32768,512
' Das Zeichen anpassen, das kommt, wenn man 1 in den Bildschirmspeicher per POKE schreibt (Es ist das Ausrufungszeichen) Dies wird zu einer Note umgewandelt
' for I = 0 to 7
'   read A
'   poke 32776+I,A
' next I
' DATA 32,48,40,32,96,224,224,64   <- nach ganz hinten verschieben
' Neu und kürzer: Die Bytes der fallenden Note einfach aus einem String kopieren
' Das ist nur hier mit den \20 etc für das Programm basicParser. Im Atari sind das dann einzelne Zeichen wie mit CHR$($20);CHR$($30);CHR$($28);CHR$($20) etc generiert
MOVE ADR("\20\30\28\20\60\E0\E0\40"),32776,8
' Den neuen Zeichensatz (mit verändertem Ausrufungszeichen) aktivieren
poke 756,128
' Level 1
X=1
' Levelart und Geschwindigkeitsindex holen
READ A,W
' Name des Spiels
J=ADR("Der Kapellmeister antwortet nicht")
3
' Farben setzen (für 708 und 709 gelichzeitig per DPOKE)
DPOKE 708,$0F00
POKE 710,178
POKE 712,15
' Atract setzen, weil sonst irgendwann der Bildschirm die Farben wechelt
POKE 77,0
Z=0
' Punkte auf 0
P=0
'Position der Noten merken
D0=D
? "LEVEL ";X:?:?
PAUSE 99
4 
FOR N=0 TO 15
  ' Ton der Begleitung holen
  T=R(N)
  ' Note laut spielen
  L=15
  ' Keine Note spielen
  C=0
  ' Vielleicht doch einen Note spielen (je nach Modus in bestimmten Zeilen)
  IF (N&A)=0 AND Z<190
    C=PEEK(D) MOD 7+1
    ' Noten zählen
    D=D+1
  ENDIF 
  ' 20 Zeilen später die neue Note speichern
  U(Z+20)=C
  ' Die aktuelle Note holen
  Q=U(Z)
  ' Lautstärke auf 0, wenn keine Note gespielt werden soll
  IF Q=0 
    L=0
  endif
  ' Die Note und Begleitung spielen und dabei den Drehregler abfragen
  FOR I=15 TO 1 STEP -3
    SOUND 0,T,10,I
    SOUND 1,M(Q),10,L
    SOUND 2,M(Q)/2,10,L
    FOR Y=0 TO W:NEXT Y
    POKE H,228-PADDLE(0)
  NEXT I
  ' Wenn der Spieler mit einer Note kollidierte, dann gibt es einen Punkt
  IF PEEK(53252)>0
    ' Punkte zählen
    P=P+1
  endif
  ' Bildschirm runterscrollen
  -MOVE S,S+20,380
  ' Kollisionsregister zurücksetzen
  POKE 53278,1
  ' Oberste Zeile löschen
  MOVE S,S+1,19
  ' Note setzen, wenn eine Note gespielt werden muss
  POKE S+1+C+C,C>0
  ' Zeilen/Noten zählen
  Z=Z+1
NEXT N
' Ende des Levels, wenn mindestens 220 Zeilen gespielt wurden, sonst weiter machen
IF Z<220
  goto 4
endif
' Gesamtpunkte zählen
PU=PU+P
' Bei genügend Punkten den nächsten Level
IF P>D-D0-6
  ' Level erhöhen
  X=X+1
  ' Levelart und Geschwindigkeitsindex holen
  READ A,W
else
  ' Einmal mehr nicht geschafft
  FAIL=FAIL+1
  ' Schon dreimal? Nein, dann nochmal versuchen. Ja, dann Ende
  if(FAIL<3)
     ? "TRY AGAIN":?:?
     Pause 99
     D=D0
     GOTO 3
  endif
  ? "L";X;" ";PU;"P":?:?
  WHILE PTRIG(0)=1:WEND
  RUN
endif
GOTO 3
' Copyright
J=ADR("2018 by 1NG")
' Die Begleitungsnoten und die Notenhöhen für die Noten in den Levels
DATA 182,0,121,144,0,121,144,0,182,182,0,0,173,173,0,0,182,153,136,128,121,102,91
' Die Level
DATA 3,40,3,35,3,22,3,15,3,10,9,30,9,20,9,15,9,9,9,7,2,50,2,40,2,35,2,30,1,60,1,50,1,45,1,40,9,0,9,0,9,0,5,0,7,20,3,20,0,0