Vgm2FurnaceClipboardTxt_Ay38910K051649_28.sdlbas 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #! /usr/bin/sdlbrt
  2. finp$="F1Spirit_msx_01_F1Shuffle.vgm"
  3. cbstr$="org.tildearrow.furnace - Pattern Data (103)"
  4. '- .vgm to furnace tracker clipboard converter - AY-3-8910 , k051649
  5. '- copyleft nitrofurano, may'22
  6. '-------------------------------
  7. '- bugs:
  8. '- - pattern-long delay maybe related to sample data transfering?
  9. '-------------------------------
  10. ltxtm$="...........|...........|...........|...........|...........|...........|...........|...........|":ltxcr$=ltxtm$
  11. instch$="0102030404040404"
  12. dim frqaa[16],frqka[16],volaa[16],volka[16],wfca[32,32]
  13. dim hdrv[256],wfc0[32],wfc1[32],wfc2[32],wfc3[32],wfc4[32]
  14. frqaa[0]=0:frqaa[1]=0:frqaa[2]=0:volaa[0]=0:volaa[1]=0:volaa[2]=0
  15. patsz=64:patc=0:patid=0:freqq=0:hdram=0x40:vgmv=0:veof=0
  16. frqka[0]=0:frqka[1]=0:frqka[2]=0:frqka[3]=0:frqka[4]=0
  17. volka[0]=0:volka[1]=0:volka[2]=0:volka[3]=0:volka[4]=0
  18. if argc>2 then:finp$=argv(2):end if
  19. fout2$=finp$+"_furnaceclipboard.txt":fout3$=finp$+"_furnaceclipboard_debug.txt"
  20. frmc=0:frmr=300:trg=0
  21. frmi=735
  22. if argc>3 then:
  23. if argv(3)="1" or ucase$(argv(2))="-PAL" then
  24. frmi=882:end if:end if
  25. debug=0
  26. if argc>4 then:
  27. if argv(4)="1" or ucase$(argv(2))="-DEBUG" then
  28. debug=1:end if:end if
  29. debug=1 '- remove this linecode later... xD
  30. '- fix: 0x0FE=440hz=A-4
  31. function nttfrq$(freqb)
  32. e$= "C-1C#1D-1D#1E-1F-1F#1G-1G#1A-1A#1B-1"
  33. e$=e$+"C-2C#2D-2D#2E-2F-2F#2G-2G#2A-2A#2B-2"
  34. e$=e$+"C-3C#3D-3D#3E-3F-3F#3G-3G#3A-3A#3B-3"
  35. e$=e$+"C-4C#4D-4D#4E-4F-4F#4G-4G#4A-4A#4B-4"
  36. e$=e$+"C-5C#5D-5D#5E-5F-5F#5G-5G#5A-5A#5B-5"
  37. e$=e$+"C-6C#6D-6D#6E-6F-6F#6G-6G#6A-6A#6B-6"
  38. e$=e$+"C-7C#7D-7D#7E-7F-7F#7G-7G#7A-7A#7B-7"
  39. e$=e$+"B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7"
  40. e$=e$+"B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7B-7..."
  41. tmq=141-(int((log(freqb*.99)/log(2))*12))
  42. if tmq<1 then:tmq=1:end if
  43. if tmq>97 then:tmq=97:end if
  44. return mid$(e$,(tmq*3)-2,3)
  45. end function
  46. open finp$ for input as #1
  47. for i=0 to 255
  48. hdrv[i]=readbyte(1)
  49. next
  50. close #1
  51. hdram=0x040
  52. vgmv=hdrv[8]+hdrv[9]*256
  53. if vgmv>=0x0150 then:hdram=0x080:end if
  54. if vgmv>=0x0160 then:hdram=0x0C0:end if
  55. if vgmv>=0x0170 then:hdram=0x100:end if
  56. '- wrong information???
  57. ttsam=hdrv[0x18]+hdrv[0x19]*256+hdrv[0x1A]*65536+hdrv[0x1B]*16777216
  58. hsam$="PlayOrder=L0"
  59. for i=1 to (ttsam/(frmi*patsz))-1
  60. hsam$=hsam$+","+str$(i)
  61. next
  62. open finp$ for input as #1
  63. open fout2$ for output as #2
  64. open fout3$ for output as #3
  65. print #2,"---------8<----------------------------------------------"
  66. print #2,"[Pattern00]"
  67. print #2," "
  68. print #2,cbstr$
  69. print #2,"0"
  70. '- the amount of header bytes depends on vgm format version
  71. for eee=0 to hdram-1:q0=readbyte(1):next '- read offset byte first
  72. txou1$=" #("+str$(0)+")"
  73. while veof=0:
  74. q0=readbyte(1)
  75. '- vgm eof command
  76. if q0=0x66 then:
  77. veof=1
  78. print #3,"--vgm-eof--"
  79. print #2," "
  80. end if
  81. '- delay 1 byte (1..16 samples)
  82. if bitwiseand(q0,0x70)=0x70 then
  83. frmc=frmc+bitwiseand(q0,0xF)+1
  84. txou1$=" #("+str$(frmc)+")"
  85. 'print #3,txou1$
  86. end if
  87. '- delay 3 bytes (0..65535 samples)
  88. if q0=0x61 then
  89. q0=readbyte(1)
  90. frmc=frmc+q0
  91. q0=readbyte(1)
  92. frmc=frmc+(q0*256)
  93. txou1$=" #("+str$(frmc)+")"
  94. 'print #3,txou1$
  95. end if
  96. '- 1 ntsc frame delay, 735 samples
  97. if q0=0x62 then
  98. frmc=frmc+735
  99. txou1$=" #("+str$(frmc)+")"
  100. 'print #3,txou1$
  101. end if
  102. '- 1 pal frame delay, 882 samples
  103. if q0=0x63 then
  104. frmc=frmc+882
  105. txou1$=" #("+str$(frmc)+")"
  106. 'print #3,txou1$
  107. end if
  108. '- updates frameout pulses
  109. while frmr<frmc
  110. '- creates a new pattern
  111. if patc>(patsz-1) then:
  112. print #2," "
  113. patid=patid+1:patc=0
  114. txou9$="[Pattern"+ucase$(right$(hex$(0x100+patid),2))+"]"
  115. print #2,"---------8<----------------------------------------------"
  116. print #2,txou9$
  117. print #2,""
  118. print #2,cbstr$
  119. print #2,"0"
  120. end if
  121. '- writes a pattern line in each frame
  122. if trg=0 then
  123. print #3,"--frameout-unchanged--"
  124. print #2,ltxtm$
  125. else
  126. print #3,"--frameout--"
  127. print #2,ltxcr$
  128. ltxcr$=ltxtm$
  129. trg=0
  130. end if
  131. frmr=frmr+frmi
  132. patc=patc+1
  133. end while
  134. '-------------------------------------------------------------------------------
  135. '- ay
  136. '- token 0xA0 gets registers and values to AY-3-8910 output
  137. if q0=0xA0 then
  138. q0=readbyte(1)
  139. '-------------------------------------------------------------------------------
  140. '- frequencies/notes on ay - channel 0 to 2
  141. if (q0>=0 and q0<=5) then
  142. q0qq=q0
  143. qqch=int(q0/2)
  144. q0=readbyte(1)
  145. if q0qq mod 2=0 then
  146. frqaa[qqch]=bitwiseor((bitwiseand(frqaa[qqch],0xF00)),(bitwiseand(q0,0x0FF))) '- fine
  147. else
  148. frqaa[qqch]=bitwiseor((bitwiseand(q0*256,0xF00)),(bitwiseand(frqaa[qqch],0x0FF))) '- coarse
  149. end if
  150. ltxtm1$=ltxtm$
  151. ltxtm2$=replace$((12*qqch),ltxtm1$,nttfrq$(frqaa[qqch])+"00")
  152. ltxcr$=replace$((12*qqch),ltxcr$,nttfrq$(frqaa[qqch])+"00")
  153. print #3,ltxtm2$
  154. trg=1
  155. end if
  156. '-------------------------------------------------------------------------------
  157. '- volume on ay, channels 0 to 2
  158. if (q0>=8 and q0<=10) then
  159. chqq=q0-8
  160. q0=readbyte(1)
  161. volaa[chqq]=bitwiseand(q0,0x0F)
  162. ltxtm1$=ltxtm$
  163. ltxtm2$=replace$((12*chqq)+5,ltxtm1$,""+ucase$(right$(hex$(0x100+volaa[chqq]*1),2)))
  164. ltxcr$=replace$((12*chqq)+5,ltxcr$,""+ucase$(right$(hex$(0x100+volaa[chqq]*1),2)))
  165. print #3,ltxtm2$
  166. trg=1
  167. end if
  168. '-------------------------------------------------------------------------------
  169. '-
  170. '?????
  171. if q0=6 then
  172. print #3,ltxtm$
  173. end if
  174. '?????
  175. 'if q0=7 then
  176. ' q0=readbyte(1)
  177. ' ltxtm1$=ltxtm$
  178. ' ltxtm2$=left$(ltxtm1$,31)+ right$(bin$(512+q0),8) +right$(ltxtm1$,2)+txou1$
  179. ' print #3,ltxtm2$
  180. ' trg=1
  181. ' end if
  182. '-------------------------------------------------------------------------------
  183. end if
  184. '-------------------------------------------------------------------------------
  185. '- k051649
  186. '- token 0xD2 gets registers and values to K051649 output
  187. if q0=0xD2 then
  188. q0=readbyte(1)
  189. '-------------------------------------------------------------------------------
  190. '- k051649 waveform '(bug? why it does create delay?) - change to bidimensional array?
  191. if q0=0x00 then '- write waveform
  192. q0=readbyte(1)
  193. q2=int(q0/32)
  194. if (q2>=0 and q2<=4) then '- verificar diferença entre k051649 e k052539?
  195. q1=readbyte(1)
  196. wfca[q2,bitwiseand(q0,31)]=q1
  197. if q2=3 then:
  198. wfca[4,bitwiseand(q0,31)]=q1
  199. end if
  200. end if
  201. end if
  202. '-------------------------------------------------------------------------------
  203. '- k051649 frequency/notes - channels 0 to 4
  204. if q0=0x01 then '- set frequency
  205. q0=readbyte(1)
  206. if (q0>=0 and q0<=9) then
  207. q0qq=q0
  208. qqch=int(q0/2)
  209. q0=readbyte(1)
  210. if q0qq mod 2=0 then
  211. frqka[qqch]=bitwiseor((bitwiseand(frqka[qqch],0xF00)),(bitwiseand(q0,0x0FF))) '- fine
  212. else
  213. frqka[qqch]=bitwiseor((bitwiseand(q0*256,0xF00)),(bitwiseand(frqka[qqch],0x0FF))) '- coarse
  214. end if
  215. ltxtm1$=ltxtm$
  216. ltxtm2$=replace$((12*(qqch+3)),ltxtm1$,nttfrq$(frqka[qqch])+ mid$(instch$,qqch*2+1,2) )
  217. ltxcr$=replace$((12*(qqch+3)),ltxcr$,nttfrq$(frqka[qqch])+ mid$(instch$,qqch*2+1,2) )
  218. print #3,ltxtm2$
  219. trg=1
  220. end if
  221. end if
  222. '-------------------------------------------------------------------------------
  223. '- k051649 volume - channels 0 to 4
  224. if q0=0x02 then '- set volume
  225. q0=readbyte(1)
  226. if (q0>=0 and q0<=4) then
  227. chqq=q0
  228. q0=readbyte(1)
  229. volka[chqq]= bitwiseand(q0,0x0F)
  230. ltxtm1$=ltxtm$
  231. ltxtm2$=replace$((12*(chqq+3))+5,ltxtm1$,""+ucase$(right$(hex$(0x100+volka[chqq]*1),2)))
  232. ltxcr$=replace$((12*(chqq+3))+5,ltxcr$,""+ucase$(right$(hex$(0x100+volka[chqq]*1),2)))
  233. print #3,ltxtm2$
  234. trg=1
  235. end if
  236. end if
  237. '-------------------------------------------------------------------------------
  238. end if
  239. '-------------------------------------------------------------------------------
  240. if eof(1)<>0 then:veof=1:end if
  241. wend
  242. print #2," "
  243. print #2,"[Waveform0] (hex)"
  244. print #2,"1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 1F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "
  245. print #2," "
  246. for j=0 to 4
  247. txousm$=""
  248. for i=0 to 31
  249. txousm$=txousm$+ucase$(right$(hex$(0x100+int(wfca[j,i]/8)),2))+" "
  250. next
  251. print #2,"[Waveform"+right$(hex$(j+1),1)+"] (hex)"
  252. print #2,txousm$
  253. print #2," "
  254. next
  255. '--------------------------------
  256. close #1:close #2:close #3
  257. if debug=0 then:
  258. shell("rm "+fout3$)
  259. end if