ON ERROR IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE MODE 3 : PRINT REPORT$ : END REM 'Die Parade Der Zinnsoldaten' Op.123 - Leon Jessel 1897 REM Coded for Z80 Music by Richard Russell and Ron Stickley REM Animated BBCSDL version by Richard Russell, 23-Aug-2018 SYS "SDL_SetWindowTitle", @hwnd%, "The Parade of the Tin Soldiers by Leon Jessel", @memhdc% INSTALL @lib$+"ogllib" : REM @lib$ + "webgllib" DIM L%(0), B%(15), N%(15), F%(15), S%(15), M%(15), T%(15), P(15), T(15), R(15) DIM X(15), Y(15), Z(15) DIM D3Dlight8{Type%, Diffuse{r%,g%,b%,a%}, Specular{r%,g%,b%,a%}, \ \ Ambient{r%,g%,b%,a%}, Position{x%,y%,z%}, Direction{x%,y%,z%}, \ \ Range%, Falloff%, Attenuation0%, Attenuation1%, Attenuation2%, \ \ Theta%, Phi%} PROCinitrender ON CLOSE PROCcleanup : QUIT ON ERROR PROCcleanup : IF ERR=17 CHAIN @lib$+"../examples/tools/touchide" ELSE MODE 3 : PRINT REPORT$ : END ON MOVE IF @msg% <> 5 RETURN ELSE PROCcleanup : PROCinitrender : RETURN *TEMPO 132 *STEREO 1,127 *STEREO 2,42 *STEREO 3,-42 *STEREO 0,-127 SOUND 1,0,0,10 DIM snd{(3,50)a&,p&,d&}, p%(3), q%(3), cli$(3) DIM cmajor&(7), scale%(7), acc%(7), flat&(7), sharp&(7) cmajor&() = 88,96,52,60,68,72,80 flat&() = 0, &02, &12, &13, &1B, &5B, &5F, &7F sharp&() = 0, &A0, &A4, &E4, &EC, &ED, &FD, &FF dur% = 24 flag% = FALSE tempo = 3 ENVELOPE 1,1,0,0,0,0,0,0,32,-2,-1,-4,119,89 REPEAT READ T$ IF T$ = "" REPEAT PROCanimate(flag%) : UNTIL FALSE acc%() = scale%() clef% = 48 : voice% = 1 p%() = 0 : q%() = 0 WHILE T$<>"" I% = 1 : WHILE INSTR("0123456789",MID$(T$,I%,1)) I% += 1 : ENDWHILE IF I% > 1 dur% = VALLEFT$(T$,I%-1) : T$ = MID$(T$,I%) C$ = LEFT$(T$,1) : T$=MID$(T$,2) CASE C$ OF WHEN " ": WHEN ";": IF INSTR(T$, "LEFT TURN") flag% = -3 IF INSTR(T$, "RIGHT TURN") flag% = 3 IF INSTR(T$, "FALL DOWN") flag% = 99 T$ = "" WHEN "[","P","R": T$ = "" WHEN "=": WHILE ASC(T$)>=&30 AND ASC(T$)<=&39 T$ = MID$(T$,2) : ENDWHILE WHEN "T": acc%() = scale%() : clef% = 48 WHEN "S": acc%() = scale%() : clef% = 0 WHEN "V": acc%() = scale%() : voice% = ASC(T$) - &30 : T$=MID$(T$,2) voice% AND= 3 WHEN "W": wave% = VAL(T$) : T$ = MID$(T$,2) WHILE ADVAL(-5-voice%)<12 PROCanimate(flag%) : ENDWHILE cli$(voice%) = "voice " + STR$voice% + "," + STR$(wave%) WHEN "K": key% = ASC(T$) - &30 : T$=MID$(T$,2) scale%() = 0 IF key% THEN key$ = LEFT$(T$,1) : T$=MID$(T$,2) CASE key$ OF WHEN "#": key& = sharp&(key%) WHEN "b","&": key& = flat&(key%) ENDCASE FOR I% = 0 TO 6 IF key& AND (2^I%) scale%(I%) = -4 : IF key& AND &80 scale%(I%) = +4 NEXT ENDIF acc%() = scale%() OTHERWISE Note% = INSTR("ABCDEFG$",C$)-1 IF Note% < 0 ERROR 100, "Unrecognised command "+C$ octave% = 0 REPEAT ok% = FALSE CASE LEFT$(T$,1) OF WHEN "#": acc%(Note%) = 4 : T$=MID$(T$,2) : ok% = TRUE WHEN "%": acc%(Note%) = 0 : T$=MID$(T$,2) : ok% = TRUE WHEN "&","b": acc%(Note%) =-4 : T$=MID$(T$,2) : ok% = TRUE WHEN "+": octave% += 48 : T$=MID$(T$,2) : ok% = TRUE WHEN "-": octave% -= 48 : T$=MID$(T$,2) : ok% = TRUE ENDCASE UNTIL NOT ok% ticks% = dur% / tempo IF LEFT$(T$,1)="." ticks% = dur% / tempo * 3/2 : T$=MID$(T$,2) IF LEFT$(T$,1)=":" ticks% = dur% / tempo * 2/3 : T$=MID$(T$,2) pitch% = cmajor&(Note%) + acc%(Note%) + clef% + octave% IF pitch% < 0 pitch% += 48 IF Note% = 7 pitch% = 0 IF pitch% < 0 OR pitch% > 255 ERROR 100, "Pitch out of range: "+STR$pitch% IF ticks% < 0 OR ticks% > 254 ERROR 100, "Duration out of range: "+STR$ticks% snd{(voice%,p%(voice%))}.p& = pitch% snd{(voice%,p%(voice%))}.d& = ticks% p%(voice%) += 1 ENDCASE ENDWHILE WHILE ADVAL(-5)=0 OR ADVAL(-6)=0 OR ADVAL(-7)=0 OR ADVAL(-8)=0 PROCanimate(flag%) ENDWHILE IF p%(0)<>q%(0) OR p%(1)<>q%(1) OR p%(2)<>q%(2) OR p%(3)<>q%(3) THEN SOUND &300,0,0,0 : SOUND &301,0,0,0 : SOUND &302,0,0,0 : SOUND &303,0,0,0 FOR v% = 0 TO 3 IF cli$(v%)<>"" OSCLI(cli$(v%)) : cli$(v%) = "" NEXT REPEAT stall% = TRUE FOR v% = 0 TO 3 IF q%(v%) < p%(v%) IF ADVAL(-5-v%) THEN stall% = FALSE IF snd{(v%,q%(v%))}.p& = 0 THEN SOUND v%+&1000,1,0,snd{(v%,q%(v%))}.d& ELSE SOUND v%,1,snd{(v%,q%(v%))}.p&,snd{(v%,q%(v%))}.d& ENDIF q%(v%) += 1 ENDIF NEXT v% IF stall% PROCanimate(flag%) UNTIL p%(0)=q%(0) AND p%(1)=q%(1) AND p%(2)=q%(2) AND p%(3)=q%(3) ENDIF UNTIL FALSE END DEF PROCanimate(RETURN F%) PRIVATE A%, w IF F% A% = F% : F% = FALSE LOCAL e(), a() DIM e(2), a(2) a() = 0, 30, 0 e() = 50*SIN(TIME/250), 125, 175+75*SIN(TIME/500) IF A% = 99 THEN IF w > -90 w -= 0.01 + ABS(w / 15) T() = RAD(w) R() = T() * X() / 100 ELSE w = (w + A%) MOD 360 P() = RAD(w) IF (w MOD 90) = 0 A% = 0 ENDIF PROC_render(D3D%, &FF3F7F3F, 1, L%(), 16, M%(), T%(), B%(), N%(), F%(), S%(), \ \ P(), T(), R(), X(), Y(), Z(), e(), a(), PI/4, @vdu%!208/@vdu%!212, 50, 1000, 0) ENDPROC DEF PROCinitrender LOCAL I%, o%, n%, f%, s%, t% IF POS REM SDL thread sync VDU 26 D3D% = FN_initgl(@hwnd%, 0, 1) IF D3D% = 0 ERROR 100, "Can't initialise 3D library" REM. Load soldier: o% = FN_load3d(D3D%, @dir$+"soldier.fvf", n%, f%, s%) IF o% = 0 ERROR 100, "Can't load soldier.fvf" t% = FN_loadtexture(D3D%, @dir$+"soldier.gif") IF t% = 0 ERROR 100, "Can't load soldier.gif" REM. Point-source light: D3Dlight8.Type%=1 : REM. point source D3Dlight8.Diffuse.r% =FN_f4(1) D3Dlight8.Diffuse.g% =FN_f4(1) D3Dlight8.Diffuse.b% =FN_f4(1) D3Dlight8.Specular.r%=FN_f4(1) D3Dlight8.Specular.g%=FN_f4(1) D3Dlight8.Specular.b%=FN_f4(1) D3Dlight8.Position.x%=FN_f4(0) D3Dlight8.Position.y%=FN_f4(100) D3Dlight8.Position.z%=FN_f4(200) D3Dlight8.Range% =FN_f4(1000) D3Dlight8.Attenuation0%=FN_f4(1) L%(0) = D3Dlight8{} - PAGE + !340 REM Create parade: FOR I% = 0 TO 15 B%(I%) = o% N%(I%) = n% F%(I%) = f% S%(I%) = s% T%(I%) = t% X(I%) = (I% DIV 4 - 1.5) * 30 Z(I%) = (I% MOD 4 - 1.5) * 40 NEXT ENDPROC DEF PROCcleanup T%(0) += 0 : IF T%(0) PROC_release(T%(0)) : T%(0) = 0 B%(0) += 0 : IF B%(0) PROC_release(B%(0)) : B%(0) = 0 D3D% += 0 : IF D3D% PROC_release(D3D%) : D3D% = 0 ENDPROC DATA [ DATA [ DIE PARADE DER ZINNSOLDATEN Op.123 - Leon Jessel. DATA [ (The Parade of the Tin Soldiers) DATA [ DATA ;TRANSCODED BY R.T.RUSSELL TO PART H.LINE 560 DATA ;CORRECTED AND COMPLETED BY R.J.STICKLEY FROM PART H.LINE 570 DATA =100 DATA PA DATA T12$GG DATA 24GEF12GG V224$C#D$ DATA 24GC#D12GG V224$A-#B-$ DATA 24GEFC# V224$C#DA-# DATA 24D$$12GG V224B-$$$ DATA PB DATA 24EGG12GG V2S24CEE$ V3T24$CC$ DATA 24FGG12GG V2S24DFF$ V324T$B-B-$ DATA 24EGBA V224SCEG-E V3$C+$C+ DATA T12GF#F%E24D12GG V224SDFF$ V324$BB$ DATA T24EGG12GG V2S24CEE$ V3$C+C+$ DATA T24DGG12BB V224$BB$ V3S24DGG$ DATA T24G$F#$ V224SC+$D$ V3TA$D+$ DATA T24D$$12E+E+ V224G$$12G+G+ V3S24G$$$ DATA ;LEFT TURN DATA PC DATA T24C+E+E+12E+E+ V224E+G+G+12G+G+ V3S24CEG-$ DATA T24F+G+G+12G+G+ V224D+F+F+12F+F+ V3S24DFG$ DATA T24E+G+B+A+ V2S$C+$C+ V3CEG-E DATA T12G+F+#F+%E+24D+12G+G+ V224SDGG12TE+E+ V3S24$BB$ DATA T24E+G+G+12G+G+ V224C+E+E+12E+E+ V324SCEG$ DATA T24D+B+B+12B+B+ V224BD+D+12D+D+ V3S24DBG$ DATA T24A+$D++$ V2E+$F+#$ V3SC+$D$ DATA PD DATA T48G+24$12GG V248B$ V3S48G$ DATA ;RIGHT TURN DATA PE DATA T24AAAA V2$GGG V3S$E+D+C+# DATA T12AGFEDEFG V224F$$ V324D$$ DATA T24A12FA24G12EG V224F$E$ V3D$A-$ DATA T24FED12FF V2S24D+AF V324$$D$ DATA T24GGGG V2$FFF V3$DCD DATA T12GFEDCDEF V224E$$$ V324C$$$ DATA PF DATA T24G12EG24F12DF V224E$D$ V324SC+$G$ DATA T24EDC12GG V2S24C+GC$ DATA PG DATA T24GEF12GG V224$C#D$ V324S$A#B$ DATA T24GC#D12GG V224S$A#B$ V3$GG$ DATA T24GEFC# V2$C#DA- V3S$A#BG DATA T24G$$12GG V224B-$$$ V3SG$$$ DATA ;RIGHT TURN DATA PH RB DATA 24EGG12GG V2S24CEE$ V3T24$CC$ DATA 24FGG12GG V2S24DFF$ V324T$B-B-$ DATA 24EGBA V224SCEG-E V3$C+$C+ DATA T12GF#F%E24D12GG V224SDFF$ V324$BB$ DATA T24EGG12GG V2S24CEE$ V3$C+C+$ DATA T24DGG12BB V224$BB$ V3S24DGG$ DATA T24G$F#$ V224SC+$D$ V3TA$D+$ DATA T24D$$12E+E+ V224G$$12G+G+ V3S24G$$$ DATA ;LEFT TURN DATA PI DATA T24C+E+E+12E+E+ V224E+G+G+12G+G+ V3S24CEG-$ DATA T24F+G+G+12G+G+ V224D+F+F+12F+F+ V3S24DFG$ DATA T24E+G+B+A+ V2S$C+$C+ V3CEG-E DATA T12G+F+#F+%E+24D+12G+G+ V224SDGG12TE+E+ V3S24$BB$ DATA T24E+G+G+12G+G+ V224C+E+E+12E+E+ V324SCEG$ DATA T24F+A+A+12C+C+ V224FD+D+$ V324SFAA-$ DATA T24E+$D+$ V2C+$B$ V3E$F$ SV4G$G$ DATA TC+$C+$ V2G$E$ SV3E+$C$ V4C+$C--$ DATA K1&=100 DATA V1W7V2W7V3W7V4W7 DATA PJ DATA T24$48A. V224$48F. V324$48C. SV424FA12C-C#-DE DATA PK RJ RJ RJ DATA T24$48A. V224$48F. V324$48C. SV424FA12C-C#-DE DATA T24$48A. V224$48F. V324$48C. SV424FA12C-C#-DE DATA T24$48A. V224$48F. V324$48C. SV424FA12C-C#-DE DATA ;RIGHT TURN DATA PK DATA V1W2V2W2V3W2V4W2 DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+F+ V2A6$$AA24AA SV3$C+$C+ V4FAC-A DATA TF+E+48E+ V224BB48B SV324$C+$C+ V4GBC-B DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA ;RIGHT TURN DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA TC+6$$C+C+24C+G+ V2B6$$BB24BB SV3$C+$C+ V4GBC-B DATA TG+F+48F+ V224BA48A SV324$C+$C+ V4FAC-A DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA ;RIGHT TURN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+F+ V2A6$$AA24AA SV3$C+$C+ V4FAC-A DATA TF+E+48E+ V224AA48A SV324$C+$C+ V4EAEA DATA PL DATA V1W6V2W6V3W6V4W6 DATA T12EA24E12EA24E SV248C+C+ SV3AA V4EE DATA ;RIGHT TURN DATA T12EA24E12EA24E SV248C+C+ SV3AA V4EE DATA T24E+E+12E+D+C+B% SV224C+C+48D+ V324AA48G# V424EE48E DATA T48A24A$ V248$24E$ SV348C+24A$ V448A24A-$ DATA PM DATA V1W2V2W2V3W2V4W2 DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA ;LEFT TURN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+F+ V2A6$$AA24AA SV3$C+$C+ V4FAC-A DATA TF+E+48E+ V224BB48B SV324$C+$C+ V4GBC-B DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA ;LEFT TURN DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA TC+6$$C+C+24C+G+ V2B6$$BB24BB SV3$C+$C+ V4GBC-B DATA TG+F+48F+ V224BA48A SV324$C+$C+ V4FAC-A DATA PN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA ;LEFT TURN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+F+ V2A6$$AA24AA SV3$C+$C+ V4FAC-A DATA TF+E+48E+ V224AA48A SV324$C+$C+ V4EAEA DATA PO DATA V1W6V2W6V3W6V4W6 DATA T12E+A+24E+12E+A+24E+ SV248C+C+ SV3AA V4EE DATA ;LEFT TURN DATA T12E+A+24E+12E+A+24E+ SV248C+C+ SV3AA V4EE DATA T24E+E+12E+D+C+B% SV224C+C+48D+ V324AA48G# V424EE48E DATA T24AAA$ V2$$$$ SV3C+C+C+$ V4AAAA- DATA PP DATA V1W1V2W1V3W1V4W1 DATA T24$D+$D+ V2$G#$G# V3$E$E SV448B-%24E-B%- DATA T24$C+$C+ V2$A$A V3$E$E SV448C24A-C DATA T24$D+$D+ V2$G#$G# V3$E$E SV4B-%DCB-% DATA T$C+$C+ V2$A$A V3$E$E SV4CB-%A-A- DATA T$D+$D+ V2$G#$G# V3$E$E SV448B-%24E-B%- DATA T$C+C+12AC+ V224$AA$ V3$EE$ SV448C24A-$ DATA TE+12E+E+24E+D+ V2$$$B% V3$$$$ V4E12EE24EE DATA TC+B%A$ V2AG#E$ V3$$C$ SV4E+E+A$ DATA PQ RM DATA V1W2V2W2V3W2V4W2 DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA ;RIGHT TURN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+F+ V2A6$$AA24AA SV3$C+$C+ V4FAC-A DATA TF+E+48E+ V224BB48B SV324$C+$C+ V4GBC-B DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA ;RIGHT TURN DATA T12C+G+24BD+C+ V2$$BB SV3$C+$C+ V4GBC-B DATA TC+6$$C+C+24C+G+ V2B6$$BB24BB SV3$C+$C+ V4GBC-B DATA TG+F+48F+ V224BA48A SV324$C+$C+ V4FAC-A DATA PR DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA ;RIGHT TURN DATA T12C+F+24AD+C+ V2$$AA SV3$C+$C+ V4FAC-A DATA TC+6$$C+C+24C+A+ V2A6$$AA24AF+ SV3$C+$C+ V4FAC-A DATA TA+G+48G+ V224D+B+48B+ V324$D$D SV4B-BB-B DATA TF+12F+F+24F+D+ V2D+12D+D+24D+B% SV348B%24D+D+ V448G#24G#G# DATA ;RIGHT TURN DATA TD+C+BA V2D+C+BA V3$C$C SV4FACA DATA T12GABC+24D+E+ V2$$$B V348D.24C SV448B.24C DATA TF+$F+ V2A$C+ SV3C+$F V4F$F- DATA K0 DATA T12$$ DATA PS RA RB DATA V1W3V2W3V3W3V4W3 DATA T12GG DATA 24GEF12GG V224$C#D$ DATA 24GC#D12GG V224$A-#B-$ DATA 24GEFC# V224$C#DA-# DATA 24D$$12GG V224B-$$$ DATA 24EGG12GG V2S24CEE$ V3T24$CC$ DATA 24FGG12GG V2S24DFF$ V324T$B-B-$ DATA 24EGBA V224SCEG-E V3$C+$C+ DATA T12GF#F%E24D12GG V224SDFF$ V324$BB$ DATA T24EGG12GG V2S24CEE$ V3$C+C+$ DATA T24DGG12BB V224$BB$ V3S24DGG$ DATA T24G$F#$ V224SC+$D$ V3TA$D+$ DATA T24D$$12E+E+ V224G$$12G+G+ V3S24G$$$ DATA PT DATA T24C+E+E+12E+E+ V224E+G+G+12G+G+ V3S24CEG-$ DATA T24F+G+G+12G+G+ V224D+F+F+12F+F+ V3S24DFG$ DATA T24E+G+B+A+ V2S$C+$C+ V3CEG-E DATA T12G+F+#F+%E+24D+12G+G+ V224SDGG12TE+E+ V3S24$BB$ DATA T24E+G+G+12G+G+ V224C+E+E+12E+E+ V324SCEG$ DATA T24F+A+A+$ V224FD+D+$ V324SFAA-$ DATA ;BANG!! DATA PU DATA V1W1V2W1V3W1V4W1 DATA SV172F#-$ V2F#--$ V3F#$ V4F#+$ DATA PV DATA ;FALL DOWN DATA T6Eb++D++Db++C++B+Bb+A+Ab+G+Gb+F+E+Eb+D+Db+C+BBbAAbGGbFE$$$$$ DATA T24G$B$ V2E$F$ SV3C+$G$ V4G$G-$ DATA TC+$$$ V2G$$$ V3E$$$ SV4C$$$ DATA TE+$$$ V2C+$$$ V3G$$$ SV4C$$$ DATA TC+255C+ V224E255E SV324C255C V424C-255C- DATA ""