Vgm2FurnaceClipboardTxt_Sn76489_07.sdlbas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #! /usr/bin/sdlbrt
  2. finp$="song.vgm"
  3. cbstr$="org.tildearrow.furnace - Pattern Data (99)"
  4. '- .vgm to Furnace Tracker clipboard converter - SN-76489 version
  5. '- copyleft Paulo Silva, jul'22
  6. '-------------------------------
  7. '- bugs:
  8. '- chip frequency innacuracy
  9. '- noise channel frequency innacuracy
  10. dim frqaa[16],volaa[16]
  11. dim volka[16],wfca[32,32],frqka[16]
  12. frqaa[0]=0:frqaa[1]=0:frqaa[2]=0:frqaa[3]=0
  13. volaa[0]=0:volaa[1]=0:volaa[2]=0:volaa[3]=0
  14. ltxtm$="...........|...........|...........|...........|":ltxcr$=ltxtm$
  15. freq0=0:freq1=0:freq2=0:freq3=0:vol0=0:vol1=0:vol2=0:vol3=0
  16. patsz=64:patc=0:patid=0:freqq=0
  17. hdram=0x40:vgmv=0:veof=0
  18. dim hdrv[256]
  19. if argc>2 then:finp$=argv(2):end if
  20. fout2$=finp$+"_furnacetrackerclipboard.txt":fout3$=finp$+"_furnacetrackerclipboard_debug.txt"
  21. frmc=0:frmr=300:trg=0
  22. frmi=735
  23. if argc>3 then:
  24. if argv(3)="1" or ucase$(argv(2))="-PAL" then
  25. frmi=882:end if:end if
  26. debug=0
  27. if argc>4 then:
  28. if argv(4)="1" or ucase$(argv(2))="-DEBUG" then
  29. debug=1:end if:end if
  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$+"C-8C#8D-8D#8E-8F-8F#8G-8G#8A-8A#8B-8..."
  40. tmq=141-24-(int((log(freqb*.99)/log(2))*12))
  41. if tmq<1 then:tmq=1:end if
  42. if tmq>97 then:tmq=97:end if
  43. return mid$(e$,(tmq*3)-2,3)
  44. end function
  45. open finp$ for input as #1
  46. for i=0 to 255
  47. hdrv[i]=readbyte(1)
  48. next
  49. close #1
  50. hdram=0x040
  51. vgmv=hdrv[8]+hdrv[9]*256
  52. if vgmv>=0x0150 then:hdram=0x080:end if
  53. if vgmv>=0x0170 then:hdram=0x100:end if
  54. ttsam=hdrv[0x18]+hdrv[0x19]*256+hdrv[0x1A]*65536+hdrv[0x1B]*16777216
  55. hsam$="PlayOrder=L0"
  56. for i=1 to (ttsam/(frmi*patsz))-1
  57. hsam$=hsam$+","+str$(i)
  58. next
  59. open finp$ for input as #1
  60. open fout2$ for output as #2
  61. open fout3$ for output as #3
  62. print #2,"---------8<----------------------------------------------"
  63. print #2,"[Pattern00]"
  64. print #2," "
  65. print #2,cbstr$
  66. print #2,"0"
  67. '- the amount of header bytes depends on vgm format version
  68. for eee=0 to hdram-1:q0=readbyte(1):next '- read offset byte first
  69. txou1$=" #("+str$(0)+")"
  70. while veof=0:
  71. q0=readbyte(1)
  72. '- vgm eof command
  73. if q0=0x66 then:
  74. veof=1
  75. print #3,"--vgm-eof--"
  76. print #2,""
  77. 'print #2,"# End of export"
  78. end if
  79. '- delay 1 byte (1..16 samples)
  80. if bitwiseand(q0,0xF0)=0x70 then
  81. frmc=frmc+bitwiseand(q0,0xF)+1
  82. txou1$=" #("+str$(frmc)+")"
  83. 'print #3,txou1$
  84. end if
  85. '- delay 3 bytes (0..65535 samples)
  86. if q0=0x61 then
  87. q0=readbyte(1)
  88. frmc=frmc+q0
  89. q0=readbyte(1)
  90. frmc=frmc+(q0*256)
  91. txou1$=" #("+str$(frmc)+")"
  92. 'print #3,txou1$
  93. end if
  94. '- 1 ntsc frame delay, 735 samples
  95. if q0=0x62 then
  96. frmc=frmc+735
  97. txou1$=" #("+str$(frmc)+")"
  98. 'print #3,txou1$
  99. end if
  100. '- 1 pal frame delay, 882 samples
  101. if q0=0x63 then
  102. frmc=frmc+882
  103. txou1$=" #("+str$(frmc)+")"
  104. 'print #3,txou1$
  105. end if
  106. '- updates frameout pulses
  107. while frmr<frmc
  108. '- creates a new pattern
  109. if patc>(patsz-1) then:
  110. print #2," "
  111. patid=patid+1:patc=0
  112. 'txou9$="Pattern "+str$(patid)+"]"
  113. txou9$="Pattern "+right$("00000"+ucase$(hex$(patid)),2)
  114. 'print #2,txou9$
  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. ltxcr$=ltxtm$
  125. print #2,ltxcr$
  126. else
  127. print #3,"--frameout--"
  128. print #2,ltxcr$
  129. ltxcr$=ltxtm$
  130. trg=0
  131. end if
  132. frmr=frmr+frmi
  133. patc=patc+1
  134. end while
  135. '- token 0x50 gets registers and values to SN76489 output '- 0x30 second chip
  136. if q0=0x50 then
  137. q0=readbyte(1)
  138. '- channel 0..3 - coarse
  139. if bitwiseand (q0,0x80)=0x00 then
  140. 'chqq=bitwiseand(q0,0x60)/32
  141. frqaa[chqq]= bitwiseor ( (bitwiseand(q0,0x3F))*16,(bitwiseand(frqaa[chqq],0x00F)) )
  142. ltxtm1$=ltxtm$
  143. ltxtm2$=replace$((12*chqq)+0,ltxtm1$,nttfrq$(frqaa[chqq])+"00")
  144. ltxcr$=replace$((12*chqq)+0,ltxcr$,nttfrq$(frqaa[chqq])+"00")
  145. print #3,ltxtm2$+" #("+str$(frmc)+")"
  146. trg=1
  147. end if
  148. '- channel 0..3 - fine
  149. if bitwiseand(q0,0x90)=0x80 then
  150. chqq=bitwiseand(q0,0x60)/32
  151. freqq=chqq
  152. frqaa[chqq]= bitwiseor ( (bitwiseand(frqaa[chqq],0xFF0)),(bitwiseand(q0,0x00F)) )
  153. ltxtm1$=ltxtm$
  154. ltxtm2$=replace$((12*chqq)+0,ltxtm1$,nttfrq$(frqaa[chqq])+"00")
  155. ltxcr$=replace$((12*chqq)+0,ltxcr$,nttfrq$(frqaa[chqq])+"00")
  156. print #3,ltxtm2$+" #("+str$(frmc)+")"
  157. trg=1
  158. end if
  159. '- channel 0..3 - volume
  160. if bitwiseand(q0,0x90)=0x90 then
  161. chqq=bitwiseand(q0,0x60)/32
  162. volaa[chqq]=15-bitwiseand(q0,0xF)
  163. ltxtm1$=ltxtm$
  164. ltxtm2$=replace$((12*chqq)+5,ltxtm1$,ucase$(right$(hex$(0x100+volaa[chqq]),2)))
  165. ltxcr$=replace$((12*chqq)+5,ltxcr$,ucase$(right$(hex$(0x100+volaa[chqq]),2)))
  166. print #3,ltxtm2$+" #("+str$(frmc)+")"
  167. trg=1
  168. end if
  169. end if
  170. if eof(1)<>0 then
  171. veof=1
  172. print #2,""
  173. end if
  174. wend
  175. print #2,"---------8<----------------------------------------------"
  176. print #2,""
  177. close #1:close #2:close #3
  178. if debug=0 then:
  179. shell("rm "+fout3$)
  180. end if