home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 076-100 / apd076 / gmc_to_amos.amos / gmc_to_amos.amosSourceCode
AMOS Source Code  |  1990-11-07  |  7KB  |  222 lines

  1. '--------------------------------------------
  2. '-         GMC Music file converter         -  
  3. '-    By Francois Lionet & A. Fothergill    -  
  4. '-                                          -  
  5. '-      SOUNDTRACKER & SONIX USERS !!!      -
  6. '-                                          -
  7. '- We wanted to fit converters for both     -
  8. '- of these other music systems but simply  -
  9. '- ran out of disc space! You can get these -
  10. '- files from the AMOS PD library NOW.      -
  11. '- The disc refernce is APD8. This disc     -
  12. '- also contains many tunes for use within  -
  13. '- AMOS. Sorry we could not fit them all    -
  14. '- on, but it's just too crammed - only     -
  15. '- just enough room for this last byte!     -
  16. '--------------------------------------------
  17. 'Opens a very small screen to save memory! 
  18. Screen Open 0,640,48,2,Hires : Colour 1,$FFF
  19. Global TST,AMAX,ABASE
  20. IMAX=14 : Dim APAT(5)
  21. SONGDATA=4
  22. I$="Not named       "
  23. MU$="GMC music!"
  24. I_END=$8000
  25. I_SLUP=$8100
  26. I_SLDOWN=$8200
  27. I_SVOL=$8300
  28. I_REP=$8500
  29. I_LEDM=$8600
  30. I_LEDA=$8700
  31. I_TEMPO=$8800
  32. I_INST=$8900
  33. '
  34. AGAIN:
  35. GMC$=Fsel$("","","Please enter file to convert","You MUST choose a GMC binary file!")
  36. 'GMC$="Gmc1.bin" 
  37. If GMC$="" Then Default : End 
  38. Open In 1,GMC$ : BMAX=Lof(1) : Close 
  39. Erase 10 : Reserve As Work 10,BMAX
  40. Bload GMC$,Start(10)
  41. '---> Gets size of instruments and song
  42. TST=True : Gosub I_CONV
  43. TST=True : Gosub S_CONV
  44. '---> Converts patterns
  45. LWORK=((BMAX-LINST-LSONG)/3+1) and $FFFFFFFE
  46. N=0
  47. Repeat 
  48.    If N=0
  49.       Print "Converting song..."
  50.    Else 
  51.       Print : Print "One more try: my buffer estimation was too small!"
  52.    End If 
  53.    Gosub 3000 : Print 
  54.    LWORK=LWORK+4000
  55.    Inc N
  56. Until LPATTERN
  57. '---> Converts song
  58. Print : Print "Converting song..."
  59. TST=0 : Gosub S_CONV
  60. '---> Converts instruments 
  61. Print : Print "Converting instruments..."
  62. TST=0 : Gosub I_CONV
  63. ' Creates header 
  64. AD=Start(10) : A$="AmBk" : Gosub 10100 : Doke AD,3 : Doke AD+2,0 : AD=AD+4
  65. TL=8+16+LINST+LSONG+LPATTERN : Loke AD,$80000000 or TL : AD=AD+4
  66. A$="Music   " : Gosub 10100
  67. Loke AD,16 : Loke AD+4,16+LINST : Loke AD+8,16+LINST+LSONG : Loke AD+12,0 : AD=AD+16
  68. ' Copy instrument
  69. SAMCOPY[SCOPY,ECOPY,AD+NI*32+2+4]
  70. Copy Start(11),Start(11)+NI*32+2 To AD
  71. Loke AD+2+NI*32,0
  72. ' Copy Song
  73. Copy Start(12),Start(12)+LSONG To AD+LINST
  74. ' Copy Patterns
  75. Copy Start(13),Start(13)+LPATTERN To AD+LINST+LSONG
  76. '
  77. Clw : ABK$=Fsel$("*.abk","","Save as Amos Music Bank .abk") : If ABK$="" Then Goto AGAIN
  78. Print : Print "Saving AMOS music bank..."
  79. Bsave ABK$,Start(10) To AD+LINST+LSONG+LPATTERN
  80. Print : Print "Job done! Press a key..."
  81. Wait Key : Clw : Goto AGAIN
  82. ' Instrument conversion
  83. I_CONV:
  84. AD=Start(10)
  85. NPAT=Leek(AD+240)
  86. LMAX=0
  87. For A=AD+244 To AD+244+NPAT*2 Step 2
  88.    LMAX=Max(LMAX,Deek(A))
  89. Next A
  90. LMAX=LMAX+1024 : IOFF=444+LMAX
  91. ADI=AD+IOFF
  92. NI=0
  93. For A=AD To AD+IMAX*16 Step 16
  94.    If Leek(A) Then Inc NI
  95. Next 
  96. Erase 11 : Reserve As Work 11,NI*32+2+4 : APOK=Start(11)
  97. AOFF=APOK : SDOKE[AOFF,NI] : AOFF=AOFF+2 : AINST=AOFF+NI*32
  98. INUL=AINST : SLOKE[AINST,0] : AINST=AINST+4 : SCOPY=ADI
  99. For AA=AD To AD+IMAX*16 Step 16
  100.    A1=Leek(AA) : If A1=0 Then Goto L1155
  101.    SLOKE[AOFF,AINST-APOK] : L1=Deek(AA+4) : SDOKE[AOFF+8,L1]
  102.    A2=Leek(AA+8)-A1 : L2=Deek(AA+12) : SDOKE[AOFF+10,L2]
  103.    If L2=2 Then SLOKE[AOFF+4,INUL-APOK] Else SLOKE[AOFF+4,AINST+A2-APOK]
  104.    SDOKE[AOFF+12,Deek(AA+6)]
  105.    L=L1*2 : ECOPY=ADI+L
  106.    ADI=ADI+L : AINST=AINST+L : A=AOFF+16 : A$=I$ : Gosub 10000 : AOFF=AOFF+32
  107.    L1155: Inc N
  108. Next AA
  109. If Btst(0,AINST) Then Inc AINST
  110. LINST=AINST-APOK
  111. Return 
  112. ' Song conversion
  113. S_CONV:
  114. APOK=0
  115. If TST=0
  116.    Erase 12 : Reserve As Work 12,LSONG : APOK=Start(12)
  117.    Input "Please enter TEMPO value (1-100, default is 15):";T
  118. End If 
  119. AD=Start(10) : AMU=APOK
  120. SDOKE[AMU,1] : AMU=AMU+2
  121. SLOKE[AMU,6] : AMU=AMU+4
  122. If T<=0 or T>100 Then T=15
  123. SDOKE[AMU+8,T]
  124. NPAT=Deek(AD+242) : LPAT=(NPAT+2)*2 : APAT=8+SONGDATA+16
  125. For N=0 To 3 : APAT(N)=AMU+APAT : SDOKE[AMU+N*2,APAT] : APAT=APAT+LPAT : Next N
  126. AMU=AMU+8+SONGDATA
  127. A$=Space$(16) : A=AMU : Gosub 10000 : A$=MU$ : Gosub 10000 : AMU=AMU+16
  128. AMU=AMU+LPAT*4
  129. For A=AD+244 To AD+244+(NPAT-1)*2 Step 2
  130.    P=Deek(A)/1024
  131.    For V=0 To 3
  132.       SDOKE[APAT(V),P] : APAT(V)=APAT(V)+2
  133.    Next V
  134. Next A
  135. For V=0 To 3
  136.    SDOKE[APAT(V),-2]
  137. Next V
  138. If Btst(0,AMU) Then Inc AMU
  139. LSONG=AMU-APOK
  140. Return 
  141. ' Pattern conversion 
  142. 3000 Erase 13 : Reserve As Work 13,LWORK : AMAX=Start(13)+LWORK-512 : Fill Start(13) To Start(13)+Length(13),0
  143. 3005 AD=Start(10) : AOFF=Start(13) : NPAT=Deek(AD+242)
  144. 3006 MPAT=0 : For A=AD+244 To AD+244+(NPAT-1)*2 Step 2 : MPAT=Max(Deek(A)/1024,MPAT) : Next A : Inc MPAT
  145. 3007 Print "Number of different patterns:";MPAT
  146. 3010 APAT=AOFF+2+MPAT*8
  147. 3015 Doke AOFF,MPAT
  148. 3020 For NP=0 To MPAT-1 : PATMAX=64 : NBESS=0 : AAPAT=APAT
  149.    3025 For V=0 To 3 : Locate 0,Y Curs : Print "Computing pattern";NP;" - voice";V;
  150.       3030 AP=AD+444+NP*1024
  151.       3035 Doke AOFF+2+NP*8+V*2,APAT-AOFF
  152.       3040 Gosub 3100 : If APAT>AMAX Then LPATTERN=0 : Return 
  153.    3045 Next V : If PATMAX<>64 and NBESS=0 Then NBESS=1 : APAT=AAPAT : Print : Print "Once again!";PATMAX : Goto 3025
  154. 3050 Next NP
  155. 3055 LPATTERN=APAT-Start(13)
  156. 3060 Return 
  157. 3100 OI=-1 : VIT=1 : NN=0 : DEL=0 : ADN=0 : VOL=-1
  158. 3200 Inc NN : If NN>PATMAX Then 3250
  159. 3205 D1=Deek(AP+V*4) : D2=Deek(AP+V*4+2) : AP=AP+16 : Rem print hex$(D1,4);hex$(D2,4) 
  160. 3210 If(D2 and $F000)=0 Then If DEL+VIT<256 Then FLAG=1 : Gosub 3300 : DEL=DEL+VIT : Goto 3200 Else Stop 
  161. 3215 Gosub 3400 : DEL=DEL+VIT
  162. 3220 I=(D2/$1000)-1 : If OI<>I Then OI=I : Doke APAT,I_INST+I : APAT=APAT+2 : VOL=-1
  163. 3225 FLAG=0 : Gosub 3300
  164. 3230 Doke APAT,$7F00 : Doke APAT+2,D1 : ADN=APAT : APAT=APAT+4
  165. 3235 Goto 3200
  166. 3250 Gosub 3400
  167. 3255 Doke APAT,I_END : APAT=APAT+2 : Return 
  168. 3300 EFFECT=(D2 and $F00)/$100 : PRAM=D2 and $FF
  169. 3305 If EFFECT>0 and EFFECT<9 Then Gosub 3450+EFFECT*50 : APAT=APAT+2
  170. 3310 Return 
  171. 3400 If DEL=0 Then Return 
  172. 3405 If ADN=0 and DEL<>0 Then Doke APAT,$7F00+DEL : Doke APAT+2,0 : APAT=APAT+4
  173. 3410 If ADN<>0 Then Poke ADN+1,DEL
  174. 3415 ADN=0 : DEL=0 : Return 
  175. 3500 If FLAG Then Gosub 3400
  176. 3505 Doke APAT,I_SLUP+PRAM : Return 
  177. 3550 If FLAG Then Gosub 3400
  178. 3555 Doke APAT,I_SLDOWN+PRAM : Return 
  179. 3600 If FLAG Then Gosub 3400
  180. 3605 If VOL<>PRAM Then If OI>=0 Then Doke APAT,I_SVOL+PRAM : VOL=PRAM : Return 
  181. 3610 APAT=APAT-2 : Return 
  182. 3650 Stop : PATMAX=NN : Return 
  183. 3700 Stop : Return 
  184. 3750 Doke APAT,I_LEDM : Return 
  185. 3800 Doke APAT,I_LEDA : Return 
  186. 3850 Doke APAT,I_TEMPO+(100/PRAM) : Return 
  187. '
  188. 10000 For X=0 To Len(A$)-1
  189.    10005 SPOKE[A+X,Asc(Mid$(A$,X+1,1))]
  190. 10010 Next 
  191. 10015 Return 
  192. 10100 A=AD : Gosub 10000 : AD=AD+Len(A$) : Return 
  193. Procedure SPOKE[A,B]
  194.    If TST=0
  195.       Poke A,B
  196.    End If 
  197. End Proc
  198. Procedure SDOKE[A,B]
  199.    If TST=0
  200.       Doke A,B
  201.    End If 
  202. End Proc
  203. Procedure SLOKE[A,B]
  204.    If TST=0
  205.       Loke A,B
  206.    End If 
  207. End Proc
  208. Procedure SAMCOPY[S,E,D]
  209.    If TST=0
  210.       If S mod 2=0 and E mod 2=0 and D mod 2=0
  211.          Copy S,E To D
  212.       Else 
  213.          Print "Slow Copying Sample"
  214.          A=0
  215.          While A+S<E
  216.             Poke D+A,Peek(S+A)
  217.             Inc A
  218.          Wend 
  219.          Print "Done."
  220.       End If 
  221.    End If 
  222. End Proc