home *** CD-ROM | disk | FTP | other *** search
/ AMOS PD CD / amospdcd.iso / 001-025 / apd008 / sound_tracker2_1.amos / sound_tracker2_1.amosSourceCode
AMOS Source Code  |  1991-11-16  |  9KB  |  369 lines

  1. '     SoundTracker/NoiseTracker/OtherTracker Module converter V 2.0      
  2. '                         By Fran�ois Lionet   
  3. '                         October 13th, 1990 
  4. '
  5. ' This program converts any module from any Soundtracker (all versions)    
  6. ' and NoiseTracker (tested up to 1.1) to AMOS music bank format.   
  7. '
  8. '     AMOS 1.2 Music player supports all NoiseTracker 1.1 Labels.
  9. '
  10. ' IMPORTANT NOTE: due to the new labels, music banks created by this 
  11. ' program will crash the old music player (V1.1). You are therefore
  12. ' encouraged to spread the new music player to all AMOS users! 
  13. '
  14. ' We would like to thank the many users who contacted us when the first
  15. ' converter was released. With their test data and help we were able to  
  16. ' update this program quickly. 
  17. '
  18. 'Opens a very small screen to save memory  
  19. Screen Open 0,640,48,2,Hires : Colour 1,$FFF
  20. Curs Off 
  21. '
  22. Dim IREAL(32)
  23. Global TST,AMAX,ABASE
  24. '
  25. IMAX=14 : Dim APAT(5)
  26. SONGDATA=4
  27. I$="Not named       "
  28. I_END=$8000
  29. I_SVOL=$8300
  30. I_STOP=$8400
  31. I_REP=$8500
  32. I_LEDM=$8600
  33. I_LEDA=$8700
  34. I_TEMPO=$8800
  35. I_INST=$8900
  36. I_ARP=$8A00
  37. I_PORT=$8B00
  38. I_VIB=$8C00
  39. I_VSL=$8D00
  40. I_SLUP=$8E00
  41. I_SLDOWN=$8F00
  42. I_DEL=$9000
  43. I_PJMP=$9100
  44. '
  45. AGAIN:
  46. ST$=Fsel$("**","","Sound-NoiseTracker converter V2.1","Please enter module to convert")
  47. If ST$="" Then Default : Edit 
  48. Open In 1,ST$ : BMAX=Lof(1) : Close 
  49. Erase 10 : Reserve As Work 10,BMAX
  50. Bload ST$,Start(10)
  51. '---> What version of Soundtracker?
  52. CODE$="M.K."
  53. If Leek(Start(10)+$438)=Leek(Varptr(CODE$))
  54.    OF_MUSIC=$43C
  55.    OF_PATTERN=$3B8
  56.    OF_NUMBER=$3B6
  57.    MXINST=30
  58. Else 
  59.    OF_MUSIC=600
  60.    OF_PATTERN=472
  61.    OF_NUMBER=470
  62.    MXINST=15
  63. End If 
  64. '---> Gets size of instruments and song
  65. TST=-1 : Gosub I_CONV
  66. TST=-1 : Gosub S_CONV
  67. Print "Number of instruments:";NI
  68. '---> Converts patterns
  69. LWORK=(((BMAX-LINST-LSONG)*3)/3+1) and $FFFFFFFE
  70. N=0
  71. Repeat 
  72.    If N=0
  73.       Print "Converting song..."
  74.    Else 
  75.       Print : Print "One more try: my buffer estimation was too small!"
  76.    End If 
  77.    Gosub P_CONV : Print 
  78.    LWORK=LWORK+4000
  79.    Inc N
  80. Until LPATTERN
  81. '---> Converts song
  82. Print "Converting song..."
  83. TST=0 : Gosub S_CONV
  84. '---> Converts instruments 
  85. Print "Converting instruments..."
  86. TST=0 : Gosub I_CONV
  87. ' Creates header 
  88. AD=Start(10) : A$="AmBk" : Gosub 10100 : Doke AD,3 : Doke AD+2,0 : AD=AD+4
  89. TL=8+16+LINST+LSONG+LPATTERN : Loke AD,$80000000 or TL : AD=AD+4
  90. A$="Music   " : Gosub 10100
  91. Loke AD,16 : Loke AD+4,16+LINST : Loke AD+8,16+LINST+LSONG : Loke AD+12,0 : AD=AD+16
  92. ' Copy instrument
  93. SAMCOPY[SCOPY,ECOPY,AD+NI*32+2+4]
  94. Copy Start(11),Start(11)+NI*32+2 To AD
  95. Loke AD+2+NI*32,0
  96. ' Copy Song
  97. Copy Start(12),Start(12)+LSONG To AD+LINST
  98. ' Copy Patterns
  99. Copy Start(13),Start(13)+LPATTERN To AD+LINST+LSONG
  100. '
  101. Clw : ABK$=Fsel$("*.abk","","Save as Amos Music Bank .abk") : If ABK$="" Then Goto AGAIN
  102. Print : Print "Saving AMOS music bank..."
  103. Bsave ABK$,Start(10) To AD+LINST+LSONG+LPATTERN
  104. ' Play the music!
  105. Clw : Centre "Loading the new bank to play it!"
  106. For N=10 To 13
  107.    Erase N
  108. Next 
  109. Load ABK$ : Volume 63 : Music 1
  110. Clw : Centre "Press a key to end..."
  111. Wait Key 
  112. For V=63 To 0 Step -1
  113.    Volume V
  114.    Wait Vbl 
  115. Next 
  116. Erase 3
  117. Clw 
  118. ' And now, happy structured people, a nice GOTO! Arghhh, kill him! 
  119. Goto AGAIN
  120. '----------------------------------------------------------------------------  
  121. ' Instrument conversion
  122. '----------------------------------------------------------------------------
  123. I_CONV:
  124. AD=Start(10)
  125. NPAT=0
  126. For A=AD+OF_PATTERN To AD+OF_PATTERN+127
  127.    NPAT=Max(NPAT,Peek(A))
  128. Next A
  129. Inc NPAT : LMAX=NPAT*1024
  130. ADI=AD+LMAX+OF_MUSIC
  131. NI=0
  132. For A=AD+20 To AD+20+$1E*MXINST Step $1E
  133.    If Deek(A+22) Then Inc NI
  134. Next 
  135. Erase 11 : Reserve As Work 11,NI*32+2+4 : APOK=Start(11)
  136. AOFF=APOK : SDOKE[AOFF,NI] : AOFF=AOFF+2 : AINST=AOFF+NI*32
  137. INUL=AINST : SLOKE[AINST,0] : AINST=AINST+4 : SCOPY=ADI
  138. I=0 : IR=0
  139. For A=AD+20 To AD+20+$1E*MXINST Step $1E
  140.    If Deek(A+22)
  141.       IREAL(I)=IR : Inc IR
  142.       SLOKE[AOFF,AINST-APOK] : L=Deek(A+22) : SDOKE[AOFF+14,L]
  143.       I2=Deek(A+26) : L2=Deek(A+28)
  144.       If L2<=2
  145.          SDOKE[AOFF+8,L]
  146.          SLOKE[AOFF+4,INUL-APOK] : SDOKE[AOFF+10,2]
  147.       Else 
  148.          SDOKE[AOFF+8,Max(I2/2,1)]
  149.          SLOKE[AOFF+4,AINST-APOK+I2] : SDOKE[AOFF+10,L2]
  150.       End If 
  151.       SDOKE[AOFF+12,Deek(A+24)]
  152.       L=L*2 : ECOPY=ADI+L
  153.       ADI=ADI+L : AINST=AINST+L
  154.       For P=0 To 15 : SPOKE[AOFF+16+P,Peek(A+P)] : Next 
  155.       Add AOFF,32
  156.    End If 
  157.    Inc I
  158. Next 
  159. If Btst(0,AINST) Then Inc AINST
  160. LINST=AINST-APOK
  161. Return 
  162. '----------------------------------------------------------------------------  
  163. ' Song conversion
  164. '----------------------------------------------------------------------------
  165. S_CONV:
  166. APOK=0
  167. If TST=0
  168.    Erase 12 : Reserve As Work 12,LSONG : APOK=Start(12)
  169.    T=17
  170. End If 
  171. AD=Start(10) : AMU=APOK
  172. SDOKE[AMU,1] : Add AMU,2
  173. SLOKE[AMU,6] : Add AMU,4
  174. If T<=0 or T>100 Then T=17
  175. SDOKE[AMU+8,T]
  176. LLIST=Peek(AD+OF_NUMBER)
  177. LPAT=(LLIST+1)*2 : APAT=8+SONGDATA+16
  178. For N=0 To 3 : APAT(N)=AMU+APAT : SDOKE[AMU+N*2,APAT] : APAT=APAT+LPAT : Next N
  179. AMU=AMU+8+SONGDATA
  180. For A=0 To 15 : SPOKE[AMU+A,Peek(AD+A)] : Next : Add AMU,16
  181. AMU=AMU+LPAT*4
  182. For A=AD+OF_PATTERN To AD+OF_PATTERN+LLIST-1
  183.    P=Peek(A)
  184.    For V=0 To 3
  185.       SDOKE[APAT(V),P] : APAT(V)=APAT(V)+2
  186.    Next V
  187. Next A
  188. For V=0 To 3
  189.    SDOKE[APAT(V),-2]
  190. Next V
  191. If Btst(0,AMU) Then Inc AMU
  192. LSONG=AMU-APOK
  193. Return 
  194. '----------------------------------------------------------------------------
  195. ' Pattern conversion 
  196. '----------------------------------------------------------------------------
  197. P_CONV:
  198. Erase 13 : Reserve As Work 13,LWORK : AMAX=Start(13)+LWORK-512 : Fill Start(13) To Start(13)+Length(13),0
  199. AD=Start(10) : AOFF=Start(13)
  200. Print "Number of different patterns:";NPAT
  201. APAT=AOFF+2+NPAT*8
  202. Doke AOFF,NPAT
  203. For NP=0 To NPAT-1 : PATMAX=64 : NBESS=0 : AAPAT=APAT : PJMP=0
  204.    O_AGAIN:
  205.    For V=0 To 3 : Locate 0,Y Curs : Print "Computing pattern";NP;" - voice";V;
  206.       AP=AD+OF_MUSIC+NP*1024
  207.       Doke AOFF+2+NP*8+V*2,APAT-AOFF
  208.       Gosub PP_CONV : If APAT>AMAX Then LPATTERN=0 : Return 
  209.    Next V
  210.    If PATMAX<>64 and NBESS=0 Then NBESS=1 : APAT=AAPAT : Goto O_AGAIN
  211. Next NP
  212. LPATTERN=APAT-Start(13)
  213. Return 
  214. '
  215. PP_CONV:
  216. OI=-1 : VIT=1 : NN=0 : DEL=0 : OLDEFF=-1 : OPRAM=-1 : VOL=-1
  217. PP_LOOP:
  218. Do 
  219.    Inc NN : Exit If NN>PATMAX
  220.    D1=Deek(AP+V*4) : D2=Deek(AP+V*4+2) : AP=AP+16
  221.    I=(D2/$1000)+((D1 and $1000)/$1000)*16-1
  222.    If I>=0
  223.       If OI<>I or VOL<>63
  224.          Gosub POK_DELAY
  225.          Doke APAT,I_SVOL+63 : Add APAT,2 : VOL=63
  226.          Doke APAT,I_INST+IREAL(I) : Add APAT,2
  227.          OI=I
  228.       End If 
  229.    End If 
  230.    EFF=(D2 and $F00)/$100 : PRAM=D2 and $FF
  231.    If EFF<>OLDEFF or PRAM<>OPRAM
  232.       On OLDEFF+1 Gosub EST,EST,EST,EST,EST,NST,NST,NST,NST,NST,EST,NST,NST,NST,NST,NST
  233.       On EFF+1 Gosub EF0,EF1,EF2,EF3,EF4,EF5,EF6,EF7,EF8,EF9,EF10,EF11,EF12,EF13,EF14,EF15
  234.       OLDEFF=EFF : OPRAM=PRAM
  235.    End If 
  236.    If D1 and $FFF
  237.       Gosub POK_DELAY
  238.       Doke APAT,$3000+(D1 and $FFF) : Add APAT,2
  239.    End If 
  240.    Add DEL,VIT
  241. Loop 
  242. '
  243. PP_END:
  244. Gosub POK_DELAY
  245. If PATMAX<>64 and PJMP<>0
  246.    Doke APAT,PJMP : Add APAT,2
  247. Else 
  248.    Doke APAT,I_END : Add APAT,2
  249. End If 
  250. Return 
  251. '
  252. POK_DELAY:
  253. If DEL
  254.    Doke APAT,I_DEL+DEL : Add APAT,2
  255.    DEL=0
  256. End If 
  257. Return 
  258. '
  259. ' Stop old effect    
  260. EST:
  261. On EFF+1 Goto STA,NST,NST,NST,NST,SST,SST,SST,SST,SST,NST,SST,SST,SST,SST,SST
  262. STA: If PRAM=0 Then Goto SST
  263. NST: Return 
  264. SST: Gosub POK_DELAY : Doke APAT,I_STOP : Add APAT,2 : Return 
  265. '
  266. ' 0-> Arpeggio 
  267. EF0:
  268. If PRAM
  269.    Gosub POK_DELAY
  270.    Doke APAT,I_ARP+PRAM : Add APAT,2
  271. End If 
  272. Return 
  273. ' 1-> Slide up 
  274. EF1:
  275. Gosub POK_DELAY
  276. Doke APAT,I_SLUP+PRAM : Add APAT,2 : Return 
  277. ' 2-> Slide down 
  278. EF2:
  279. Gosub POK_DELAY
  280. Doke APAT,I_SLDOWN+PRAM : Add APAT,2 : Return 
  281. ' 3-> Portamento 
  282. EF3:
  283. Gosub POK_DELAY
  284. Doke APAT,I_PORT+PRAM : Add APAT,2 : Return 
  285. ' 4-> Vibrato  
  286. EF4:
  287. Gosub POK_DELAY
  288. Doke APAT,I_VIB+PRAM : Add APAT,2 : Return 
  289. ' 5-> Future expansion 
  290. EF5: Return 
  291. ' 6-> Future expansion 
  292. EF6: Return 
  293. ' 7-> Future expansion 
  294. EF7: Return 
  295. ' 8-> Future expansion 
  296. EF8: Return 
  297. ' 9-> Future expansion 
  298. EF9: Return 
  299. ' A Volume slide 
  300. EF10:
  301. Gosub POK_DELAY
  302. Doke APAT,I_VSL+PRAM : Add APAT,2 : VOL=-1 : Return 
  303. ' B Position jump
  304. EF11:
  305. Gosub POK_DELAY
  306. PJMP=I_PJMP+PRAM : PATMAX=NN-1 : Return 
  307. ' C Set volume 
  308. EF12:
  309. Gosub POK_DELAY
  310. If VOL<>PRAM and OI>=0
  311.    Doke APAT,I_SVOL+PRAM : VOL=PRAM : Add APAT,2
  312. End If 
  313. Return 
  314. ' D Pattern break
  315. EF13:
  316. Gosub POK_DELAY
  317. PATMAX=NN-1 : Return 
  318. ' E Led on / off 
  319. EF14:
  320. Gosub POK_DELAY
  321. If Btst(1,PRAM) Then Doke APAT,I_LEDM Else Doke APAT,I_LEDA
  322. Add APAT,2 : Return 
  323. ' F Set tempo
  324. EF15:
  325. Gosub POK_DELAY
  326. Doke APAT,I_TEMPO+(100/PRAM) : Add APAT,2 : Return 
  327. '
  328. '
  329. '
  330. '
  331. 10000 For X=0 To Len(A$)-1
  332.    10005 SPOKE[A+X,Asc(Mid$(A$,X+1,1))]
  333. 10010 Next 
  334. 10015 Return 
  335. 10100 A=AD : Gosub 10000 : AD=AD+Len(A$) : Return 
  336. '
  337. Procedure SPOKE[A,B]
  338.    If TST=0
  339.       Poke A,B
  340.    End If 
  341. End Proc
  342. '
  343. Procedure SDOKE[A,B]
  344.    If TST=0
  345.       Doke A,B
  346.    End If 
  347. End Proc
  348. '
  349. Procedure SLOKE[A,B]
  350.    If TST=0
  351.       Loke A,B
  352.    End If 
  353. End Proc
  354. '
  355. Procedure SAMCOPY[S,E,D]
  356.    If TST=0
  357.       If S mod 2=0 and E mod 2=0 and D mod 2=0
  358.          Copy S,E To D
  359.       Else 
  360.          Print "Slow Copying Sample"
  361.          A=0
  362.          While A+S<E
  363.             Poke D+A,Peek(S+A)
  364.             Inc A
  365.          Wend 
  366.          Print "Done."
  367.       End If 
  368.    End If 
  369. End Proc