home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 226-250 / apd233 / soundtrackerv2_2.amos / soundtrackerv2_2.amosSourceCode
AMOS Source Code  |  1986-08-03  |  7KB  |  191 lines

  1. Screen Open 0,320,48,2,Lowres : Colour 1,$AAA : Curs Off 
  2. Dim IREAL(32)
  3. Global TST,AMAX,ABASE
  4. IMAX=14 : Dim APAT(5) : SONGDATA=4 : I$="Not named       "
  5. I_END=$8000 : I_SVOL=$8300 : I_STOP=$8400 : I_REP=$8500 : I_LEDM=$8600
  6. I_LEDA=$8700 : I_TEMPO=$8800 : I_INST=$8900 : I_ARP=$8A00 : I_PORT=$8B00
  7. I_VIB=$8C00 : I_VSL=$8D00 : I_SLUP=$8E00 : I_SLDOWN=$8F00 : I_DEL=$9000 : I_PJMP=$9100
  8. AGAIN:
  9. ST$=Fsel$("**","","Convert ST Module") : If ST$="" Then Default : Edit 
  10. Open In 1,ST$ : BMAX=Lof(1) : Close : Erase 10 : Reserve As Work 10,BMAX : Bload ST$,Start(10)
  11. CODE$="M.K."
  12. If Leek(Start(10)+$438)=Leek(Varptr(CODE$))
  13. OF_MUSIC=$43C : OF_PATTERN=$3B8 : OF_NUMBER=$3B6 : MXINST=30
  14. Else 
  15. OF_MUSIC=600 : OF_PATTERN=472 : OF_NUMBER=470 : MXINST=15
  16. End If 
  17. TST=-1 : Gosub I_CONV : TST=-1 : Gosub S_CONV
  18. Print "Instruments:";NI : LWORK=(((BMAX-LINST-LSONG)*3)/3+1) and $FFFFFFFE : N=0
  19. Repeat 
  20. If N=0
  21. Print "Converting song..."
  22. Else 
  23. Print : Print "Buffer too small : Try again!"
  24. End If 
  25. Gosub P_CONV : Print : LWORK=LWORK+4000 : Inc N
  26. Until LPATTERN
  27. Print "Converting song..." : TST=0 : Gosub S_CONV : Print "Converting instruments..." : TST=0 : Gosub I_CONV
  28. AD=Start(10) : A$="AmBk" : Gosub 10100 : Doke AD,3 : Doke AD+2,0 : AD=AD+4
  29. TL=8+16+LINST+LSONG+LPATTERN : Loke AD,$80000000 or TL : AD=AD+4
  30. A$="Music   " : Gosub 10100
  31. Loke AD,16 : Loke AD+4,16+LINST : Loke AD+8,16+LINST+LSONG : Loke AD+12,0 : AD=AD+16
  32. SAMCOPY[SCOPY,ECOPY,AD+NI*32+2+4] : Copy Start(11),Start(11)+NI*32+2 To AD
  33. Loke AD+2+NI*32,0
  34. Copy Start(12),Start(12)+LSONG To AD+LINST : Copy Start(13),Start(13)+LPATTERN To AD+LINST+LSONG
  35. Clw : ABK$=Fsel$("*.abk","","Save as Amos Music Bank .abk") : If ABK$="" Then Goto AGAIN
  36. Print : Print "Saving AMOS music bank..." : Bsave ABK$,Start(10) To AD+LINST+LSONG+LPATTERN
  37. Clw : Centre "Loading new bank to play it!"
  38. For N=10 To 13 : Erase N : Next 
  39. Load ABK$ : Volume 63 : Music 1 : Clw : Centre "Press a key to end..." : Wait Key 
  40. For V=63 To 0 Step -1 : Volume V : Wait Vbl : Next : Erase 3 : Clw : Goto AGAIN
  41. I_CONV:
  42. AD=Start(10)
  43. NPAT=0
  44. For A=AD+OF_PATTERN To AD+OF_PATTERN+127
  45.    NPAT=Max(NPAT,Peek(A))
  46. Next A
  47. Inc NPAT : LMAX=NPAT*1024
  48. ADI=AD+LMAX+OF_MUSIC
  49. NI=0
  50. For A=AD+20 To AD+20+$1E*MXINST Step $1E
  51.    If Deek(A+22) Then Inc NI
  52. Next 
  53. Erase 11 : Reserve As Work 11,NI*32+2+4 : APOK=Start(11)
  54. AOFF=APOK : SDOKE[AOFF,NI] : AOFF=AOFF+2 : AINST=AOFF+NI*32
  55. INUL=AINST : SLOKE[AINST,0] : AINST=AINST+4 : SCOPY=ADI
  56. I=0 : IR=0
  57. For A=AD+20 To AD+20+$1E*MXINST Step $1E
  58. If Deek(A+22)
  59. IREAL(I)=IR : Inc IR : SLOKE[AOFF,AINST-APOK] : L=Deek(A+22) : SDOKE[AOFF+14,L] : I2=Deek(A+26) : L2=Deek(A+28)
  60. If L2<=2
  61. SDOKE[AOFF+8,L] : SLOKE[AOFF+4,INUL-APOK] : SDOKE[AOFF+10,2]
  62. Else 
  63. SDOKE[AOFF+8,Max(I2/2,1)] : SLOKE[AOFF+4,AINST-APOK+I2] : SDOKE[AOFF+10,L2]
  64. End If 
  65. SDOKE[AOFF+12,Deek(A+24)] : L=L*2 : ECOPY=ADI+L : ADI=ADI+L : AINST=AINST+L
  66. For P=0 To 15 : SPOKE[AOFF+16+P,Peek(A+P)] : Next : Add AOFF,32
  67. End If 
  68. Inc I : Next 
  69. If Btst(0,AINST) Then Inc AINST
  70. LINST=AINST-APOK : Return 
  71. S_CONV: APOK=0
  72. If TST=0
  73. Erase 12 : Reserve As Work 12,LSONG : APOK=Start(12) : T=17
  74. End If 
  75. AD=Start(10) : AMU=APOK : SDOKE[AMU,1] : Add AMU,2 : SLOKE[AMU,6] : Add AMU,4
  76. If T<=0 or T>100 Then T=17
  77. SDOKE[AMU+8,T]
  78. LLIST=Peek(AD+OF_NUMBER)
  79. LPAT=(LLIST+1)*2 : APAT=8+SONGDATA+16
  80. For N=0 To 3 : APAT(N)=AMU+APAT : SDOKE[AMU+N*2,APAT] : APAT=APAT+LPAT : Next N
  81. AMU=AMU+8+SONGDATA
  82. For A=0 To 15 : SPOKE[AMU+A,Peek(AD+A)] : Next : Add AMU,16 : AMU=AMU+LPAT*4
  83. For A=AD+OF_PATTERN To AD+OF_PATTERN+LLIST-1 : P=Peek(A)
  84. For V=0 To 3 : SDOKE[APAT(V),P] : APAT(V)=APAT(V)+2 : Next V : Next A
  85. For V=0 To 3 : SDOKE[APAT(V),-2] : Next V
  86. If Btst(0,AMU) Then Inc AMU
  87. LSONG=AMU-APOK : Return 
  88. P_CONV: Erase 13 : Reserve As Work 13,LWORK : AMAX=Start(13)+LWORK-512 : Fill Start(13) To Start(13)+Length(13),0
  89. AD=Start(10) : AOFF=Start(13) : Print "Patterns:";NPAT
  90. APAT=AOFF+2+NPAT*8 : Doke AOFF,NPAT
  91. For NP=0 To NPAT-1 : PATMAX=64 : NBESS=0 : AAPAT=APAT : PJMP=0
  92. O_AGAIN: For V=0 To 3 : Locate 0,Y Curs : Print "Converting:";NP;" /";V;
  93. AP=AD+OF_MUSIC+NP*1024
  94. Doke AOFF+2+NP*8+V*2,APAT-AOFF : Gosub PP_CONV : If APAT>AMAX Then LPATTERN=0 : Return 
  95. Next V
  96. If PATMAX<>64 and NBESS=0 Then NBESS=1 : APAT=AAPAT : Goto O_AGAIN
  97. Next NP : LPATTERN=APAT-Start(13) : Return 
  98. PP_CONV: OI=-1 : VIT=1 : NN=0 : DEL=0 : OLDEFF=-1 : OPRAM=-1 : VOL=-1
  99. PP_LOOP: Do 
  100. Inc NN : Exit If NN>PATMAX
  101. D1=Deek(AP+V*4) : D2=Deek(AP+V*4+2) : AP=AP+16 : I=(D2/$1000)+((D1 and $1000)/$1000)*16-1
  102. If I>=0
  103. If OI<>I or VOL<>63
  104. Gosub POK_DELAY : Doke APAT,I_SVOL+63 : Add APAT,2 : VOL=63 : Doke APAT,I_INST+IREAL(I) : Add APAT,2 : OI=I
  105. End If : End If 
  106. EFF=(D2 and $F00)/$100 : PRAM=D2 and $FF
  107. If EFF<>OLDEFF or PRAM<>OPRAM
  108. On OLDEFF+1 Gosub EST,EST,EST,EST,EST,NST,NST,NST,NST,NST,EST,NST,NST,NST,NST,NST
  109. On EFF+1 Gosub EF0,EF1,EF2,EF3,EF4,EF5,EF6,EF7,EF8,EF9,EF10,EF11,EF12,EF13,EF14,EF15
  110. OLDEFF=EFF : OPRAM=PRAM
  111. End If 
  112. If D1 and $FFF
  113. Gosub POK_DELAY : Doke APAT,$3000+(D1 and $FFF) : Add APAT,2
  114. End If : Add DEL,VIT
  115. Loop 
  116. PP_END: Gosub POK_DELAY
  117. If PATMAX<>64 and PJMP<>0
  118. Doke APAT,PJMP : Add APAT,2
  119. Else 
  120. Doke APAT,I_END : Add APAT,2
  121. End If : Return 
  122. POK_DELAY:
  123. If DEL
  124. Doke APAT,I_DEL+DEL : Add APAT,2 : DEL=0
  125. End If : Return 
  126. EST:
  127. On EFF+1 Goto STA,NST,NST,NST,NST,SST,SST,SST,SST,SST,NST,SST,SST,SST,SST,SST
  128. STA: If PRAM=0 Then Goto SST
  129. NST: Return 
  130. SST: Gosub POK_DELAY : Doke APAT,I_STOP : Add APAT,2 : Return 
  131. EF0:
  132. If PRAM
  133. Gosub POK_DELAY : Doke APAT,I_ARP+PRAM : Add APAT,2
  134. End If : Return 
  135. EF1: Gosub POK_DELAY : Doke APAT,I_SLUP+PRAM : Add APAT,2 : Return 
  136. EF2: Gosub POK_DELAY : Doke APAT,I_SLDOWN+PRAM : Add APAT,2 : Return 
  137. EF3: Gosub POK_DELAY : Doke APAT,I_PORT+PRAM : Add APAT,2 : Return 
  138. EF4: Gosub POK_DELAY : Doke APAT,I_VIB+PRAM : Add APAT,2 : Return 
  139. EF5: Return 
  140. EF6: Return 
  141. EF7: Return 
  142. EF8: Return 
  143. EF9: Return 
  144. EF10: Gosub POK_DELAY : Doke APAT,I_VSL+PRAM : Add APAT,2 : VOL=-1 : Return 
  145. EF11: Gosub POK_DELAY : PJMP=I_PJMP+PRAM : PATMAX=NN-1 : Return 
  146. EF12: Gosub POK_DELAY
  147. If VOL<>PRAM and OI>=0
  148. Doke APAT,I_SVOL+PRAM : VOL=PRAM : Add APAT,2
  149. End If : Return 
  150. EF13: Gosub POK_DELAY : PATMAX=NN-1 : Return 
  151. EF14: Gosub POK_DELAY
  152. If Btst(1,PRAM) Then Doke APAT,I_LEDM Else Doke APAT,I_LEDA
  153. Add APAT,2 : Return 
  154. EF15:
  155. Gosub POK_DELAY
  156. Doke APAT,I_TEMPO+(100/PRAM) : Add APAT,2 : Return 
  157. 10000 For X=0 To Len(A$)-1
  158. 10005 SPOKE[A+X,Asc(Mid$(A$,X+1,1))]
  159. 10010 Next 
  160. 10015 Return 
  161. 10100 A=AD : Gosub 10000 : AD=AD+Len(A$) : Return 
  162. Procedure SPOKE[A,B]
  163.    If TST=0
  164.       Poke A,B
  165.    End If 
  166. End Proc
  167. Procedure SDOKE[A,B]
  168.    If TST=0
  169.       Doke A,B
  170.    End If 
  171. End Proc
  172. Procedure SLOKE[A,B]
  173.    If TST=0
  174.       Loke A,B
  175.    End If 
  176. End Proc
  177. Procedure SAMCOPY[S,E,D]
  178.    If TST=0
  179.       If S mod 2=0 and E mod 2=0 and D mod 2=0
  180.          Copy S,E To D
  181.       Else 
  182.          Print "Slow Copying Sample"
  183.          A=0
  184.          While A+S<E
  185.             Poke D+A,Peek(S+A)
  186.             Inc A
  187.          Wend 
  188.          Print "Done."
  189.       End If 
  190.    End If 
  191. End Proc