October 28, 2020, 05:36:32 AM

Author Topic: [bb] CDG player by Space Fractal [ 1+ years ago ]  (Read 1344 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] CDG player by Space Fractal [ 1+ years ago ]
« on: June 29, 2017, 12:28:42 AM »
Title : CDG player
Author : Space Fractal
Posted : 1+ years ago

Description : CDG Command Line Player

Public Domain. No warranty.

Version 0.1

Purpose:
CommandLine CDG player for using with external software players.

Supported formats:
MP3, OGG and WAV with added CDG graphic files.

Command:
CDG_Player.exe FILENAME
CDG_Player.exe FILENAME Rotate90
CDG_Player.exe FILENAME Rotate180
CDG_Player.exe FILENAME Rotate270

Example:
CDG_Player.exe D:Download   estCDGTwist and Shout.cdg Rotate90

Note:
If the file dosen't exists, it open a file requester instead.

Relaesed to:
Build You Own Arcade Controls (http://www.arcadecontrols.com) and Blitz Community.

All you need is just a little notice credit in your readme (I really hope).

Best Regaards by
Space Fractal
<a href="http://www.arcademusicbox.com/" target="_blank">http://www.arcademusicbox.com[/url] (made in Blitz+)


Code :
Code: BlitzBasic
  1. Global CDG_COMMAND = 9
  2. Global CDG_MASK = 63
  3.  
  4. Global CDG_INST_MEMORY_PRESET     = 1
  5. Global CDG_INST_BORDER_PRESET     = 2
  6. Global CDG_INST_TILE_BLOCK        = 6
  7. Global CDG_INST_SCROLL_PRESET     = 20
  8. Global CDG_INST_SCROLL_COPY       = 24
  9. Global CDG_INST_DEF_TRANSP_COL    = 28
  10. Global CDG_INST_LOAD_COL_TBL_0_7  = 30
  11. Global CDG_INST_LOAD_COL_TBL_8_15 = 31
  12. Global CDG_INST_TILE_BLOCK_XOR    = 38
  13.  
  14. Global CDG_STREAM_COMMAND
  15. Global CDG_STREAM_INTRUCTION
  16. Global CDG_BUFFER_FRONT=0
  17. Global CDG_BUFFER_BACK=1
  18.  
  19. Global CDG_COLOR_BORDER=0
  20. Global CDG_COLOR_FILL=0
  21. Global CDG_COLOR_TRANSPERANT=0
  22.  
  23. Global CDG_STREAM_FILE$      = ""
  24. Global CDG_STREAM_FILE_ID    = 0
  25. Global CDG_STREAM_FILE_SOUND = 0
  26. Global CDG_STREAM_FILE_TIMER
  27. Global CDG_STREAM_XOFFSET = 0
  28. Global CDG_STREAM_YOFFSET = 0
  29. Global CDG_IMAGE
  30. Global CDG_ROTATION = 0
  31.  
  32. Dim CDG_COLOR_TABLE(17,5)
  33. Dim CDG_STREAM_PARITYQ(2)
  34. Dim CDG_STREAM_DATA$(17)
  35. Dim CDG_STREAM_PARITYP(4)
  36. Dim CDG_SCREEN(301,217,2,2)
  37.  
  38. CMD$=Lower$(CommandLine$())
  39. If Instr(CMD$,"
  40. otate90") Then CDG_ROTATION=90 : CMD$=Replace$(CMD$,"
  41. otate90","")
  42. If Instr(CMD$,"
  43. otate180") Then CDG_ROTATION=180 : CMD$=Replace$(CMD$,"
  44. otate180","")
  45. If Instr(CMD$,"
  46. otate270") Then CDG_ROTATION=270 : CMD$=Replace$(CMD$,"
  47. otate270","")
  48. FILE$=Trim$(CMD$)
  49. If FileType(FILE$)=-0 Then FILE$=RequestFile("Open a CDG file","CDG",False)
  50.  
  51. CDG_PLAY(FILE$,CDG_ROTATION)
  52.  
  53. Function CDG_PLAY(FILE$, CDG_ROTATION)
  54.         ;mode=2
  55.         CDG_BUFFER_FRONT=0
  56.         CDG_BUFFER_BACK=1
  57.        
  58.         ; SETUP THE GRAPHICS CARD. THIS APPLICATION SUPPORT ROTATION
  59.         If CDG_ROTATION=0 Or CDG_ROTATION=180
  60.                 If GfxModeExists(320,240,16) Then Graphics 320,240,16,0 Else Graphics 321,240,16,0
  61.                 CDG_IMAGE=CreateImage(301,217,1,1)
  62.                 MaskImage CDG_IMAGE,5,5,5
  63.         EndIf
  64.  
  65.         If CDG_ROTATION=90 Or CDG_ROTATION=270
  66.                 If GfxModeExists(400,300,16) Then Graphics 400,300,16,0 Else Graphics 640,480,16,0
  67.                 CDG_IMAGE=CreateImage(217,301,1,1)
  68.         EndIf
  69.        
  70.  
  71.         fntVerdana=LoadFont("Verdana",14,False,False,False)
  72.         SetFont fntVerdana
  73.  
  74.         A=StringWidth("Karaoke")
  75.         COPYRIGHT=CreateImage(A,20,1,1)
  76.         SetBuffer ImageBuffer(Copyright)
  77.         SetFont fntVerdana
  78.         Color 90,90,90
  79.         Text 0,0,"Karaoke"
  80.  
  81.         A=StringWidth("Arcade Music Box")
  82.         COPYRIGHT2=CreateImage(A,20,1,1)
  83.         SetBuffer ImageBuffer(Copyright2)
  84.         SetFont fntVerdana
  85.         Color 90,90,90
  86.         Text 0,0,"Arcade Music Box"
  87.  
  88.         If CDG_ROTATION=90
  89.                 MidHandle Copyright : MidHandle Copyright2
  90.                 RotateImage Copyright,90 :      RotateImage Copyright2,90
  91.                 HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
  92.         Else If CDG_ROTATION=180
  93.                 MidHandle Copyright : MidHandle Copyright2
  94.                 RotateImage Copyright,180 :     RotateImage Copyright2,180
  95.                 HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
  96.         Else If CDG_ROTATION=270
  97.                 MidHandle Copyright : MidHandle Copyright2
  98.                 RotateImage Copyright,270 :     RotateImage Copyright2,270
  99.                 HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
  100.         EndIf
  101.  
  102.         ; READ MUSIC FILE AND OPEN CDG FILE
  103.         CDG_STREAM_FILE_ID=ReadFile(FILE$)
  104.         If CDG_STREAM_FILE_ID=0 Then Return
  105.  
  106.         FILE2$=Left$(FILE$,Len(FILE$)-4)
  107.         CDG_STREAM_FILE_SOUND=LoadSound(FILE2$+".mp3")
  108.         If CDG_STREAM_FILE_SOUND=0 Then LoadSound(FILE2$+".ogg")
  109.         If CDG_STREAM_FILE_SOUND=0 Then LoadSound(FILE2$+".wav")
  110.         If CDG_STREAM_FILE_SOUND=0 Then Return
  111.         ok=PlaySound(CDG_STREAM_FILE_SOUND)
  112.        
  113.         ; ********************
  114.         ; **** CDG PLAYER ****
  115.         ; ********************
  116.         CDG_STREAM_FILE_TIMER = MilliSecs()+50
  117.         Repeat
  118.                 ; READ A 24 BYTE PACKET FROM THE FILE (PARITYQ and PARITYP seen not been used in anyware, but keept them here)
  119.                 For ticks=1 To 15
  120.                         CDG_STREAM_COMMAND=ReadByte(CDG_STREAM_FILE_ID)  And CDG_MASK
  121.                         CDG_STREAM_INTRUCTION=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
  122.                         CDG_STREAM_PARITYQ(1)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
  123.                         CDG_STREAM_PARITYQ(2)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
  124.                         For i=0 To 15 : Byte=ReadByte(CDG_STREAM_FILE_ID) : CDG_STREAM_DATA$(i)=Right$(Bin$(Byte),6) : Next
  125.                         For i=1 To 4 : CDG_STREAM_PARITYP(i)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK : Next
  126.                         If CDG_STREAM_COMMAND=9
  127.                                 ok=0
  128.                                 If CDG_STREAM_INTRUCTION=CDG_INST_MEMORY_PRESET Then CDG_MEMORY_PRESET() : ok=1
  129.                                 If CDG_STREAM_INTRUCTION=CDG_INST_BORDER_PRESET  Then CDG_BORDER_PRESET() : ok=1
  130.                                 If CDG_STREAM_INTRUCTION=CDG_INST_LOAD_COL_TBL_0_7 Then CDG_LOAD_COL_TBL(0) : ok=1
  131.                                 If CDG_STREAM_INTRUCTION=CDG_INST_LOAD_COL_TBL_8_15 Then CDG_LOAD_COL_TBL(8) : ok=1
  132.                                 If CDG_STREAM_INTRUCTION=CDG_INST_TILE_BLOCK Then CDG_TILE_BLOCK(0) : ok=1
  133.                                 If CDG_STREAM_INTRUCTION=CDG_INST_TILE_BLOCK_XOR Then CDG_TILE_BLOCK(1) : ok=1
  134.                                 If CDG_STREAM_INTRUCTION=CDG_INST_SCROLL_PRESET Then CDG_SCROLL(0) : ok=1
  135.                                 If CDG_STREAM_INTRUCTION=CDG_INST_SCROLL_COPY Then CDG_SCROLL(1) : ok=1
  136.                                 ;If CDG_STREAM_INTRUCTION>0 And ok=0 Then Print "unsupported instruction: "+CDG_STREAM_INTRUCTION
  137.                         EndIf
  138.                 Next
  139.  
  140.                 SetBuffer ImageBuffer(CDG_IMAGE)
  141.                 If KeyDown(1)=True Then End
  142.                
  143.                 ; DISPLAY THE BUFFER TO THE SCREEN
  144.                 If (CDG_STREAM_FILE_TIMER >= MilliSecs())
  145.                         LockBuffer ImageBuffer(CDG_IMAGE)
  146.                         For x=7 To 300
  147.                                 For y=13 To 216
  148.                                         xx=x+CDG_STREAM_XOFFSET : If xx>300 Then xx=xx-300
  149.                                         yy=y+CDG_STREAM_YOFFSET : If yy>216 Then yy=yy-216
  150.                                         If CDG_ROTATION=0 Then WritePixelFast x-6,y-12,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
  151.                                         If CDG_ROTATION=90 Then WritePixelFast 217-y,x-6,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
  152.                                         If CDG_ROTATION=180 Then WritePixelFast 301-x,217-y,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
  153.                                         If CDG_ROTATION=270 Then WritePixelFast y-12,301-x,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
  154.                                 Next
  155.                         Next
  156.  
  157.                         UnlockBuffer ImageBuffer(CDG_IMAGE)
  158.  
  159.                         SetBuffer BackBuffer()
  160.                         If CDG_ROTATION=-1
  161.                
  162.                         Else If CDG_ROTATION=0
  163.                                 Color 255,255,255
  164.                                 x=14 : y=18
  165.                                 DrawImage CDG_IMAGE,x,y,0
  166.                                 Rect x,y,294+2,204+2,0
  167.                                 DrawImage COPYRIGHT,160-ImageWidth(COPYRIGHT)/2,1 : DrawImage COPYRIGHT2, 160-ImageWidth(COPYRIGHT2)/2,224
  168.                                 Flip
  169.                         Else If CDG_ROTATION=90
  170.                                 Color 255,255,255
  171.                                 x=2 : y=100 : If GraphicsWidth()=640 Then x=96 : cx=244
  172.                                 Rect y-1,x-1,204+2,294+2,1
  173.                                 DrawImage CDG_IMAGE,y-1,x-1,0
  174.                                 DrawImage COPYRIGHT2,30,GraphicsHeight()/2-ImageHeight(COPYRIGHT2)/2
  175.                                 DrawImage COPYRIGHT, GraphicsWidth()-50-cx, GraphicsHeight()/2-ImageHeight(COPYRIGHT)/2
  176.                                 Flip
  177.                         Else If CDG_ROTATION=270
  178.                                 Color 255,255,255
  179.                                 x=2 : y=100 : If GraphicsWidth()=640 Then x=96 : cy=240 : y=y+cy : cx=244
  180.                                 Rect y-1,x-1,204+2,294+2,1
  181.                                 DrawImage CDG_IMAGE,y-1,x-1,0
  182.                                 DrawImage COPYRIGHT,30+cy,GraphicsHeight()/2-ImageHeight(COPYRIGHT)/2
  183.                                 DrawImage COPYRIGHT2, GraphicsWidth()-50-cx+cy, GraphicsHeight()/2-ImageHeight(COPYRIGHT2)/2
  184.                                 Flip
  185.                         Else CDG_ROTATION=180
  186.                                 Color 255,255,255
  187.                                 x=14 : y=18
  188.                                 Rect x-1,y-1,294+2,204+2,1
  189.                                 DrawImage CDG_IMAGE,x-1,y-1,0
  190.                                 DrawImage COPYRIGHT2,160-ImageWidth(COPYRIGHT2)/2,-5 : DrawImage COPYRIGHT, 160-ImageWidth(COPYRIGHT)/2,219            
  191.                                 Flip
  192.                         EndIf
  193.                 EndIf
  194.                
  195.                 ; WAIT TIMER
  196.                 Repeat : Delay 1 : Until CDG_STREAM_FILE_TIMER < MilliSecs()
  197.                 CDG_STREAM_FILE_TIMER=CDG_STREAM_FILE_TIMER+50
  198.         Until Eof(CDG_STREAM_FILE_ID) Or ChannelPlaying(CDG_STREAM_FILE_SOUND)=1
  199.         FreeSound CDG_STREAM_FILE_SOUND
  200.         FreeImage CDG_IMAGE
  201. End Function
  202.  
  203. ; **** DRAW A 6x12 TILE (USING XOR OR NORMAL OPERATION)
  204. Function CDG_TILE_BLOCK(BLOCK_XOR)
  205.         colorA=ReadBit(CDG_STREAM_DATA$(0),3,4)
  206.         colorB=ReadBit(CDG_STREAM_DATA$(1),3,4)
  207.         row=ReadBit(CDG_STREAM_DATA$(2),2,5)*12
  208.         col=ReadBit(CDG_STREAM_DATA$(3),1,6)*6
  209.         For y=0 To 11
  210.                 For x=0 To 5
  211.                         yy=y+row : xx=x+col
  212.                         If xx<294 And yy<205
  213.                                 If Mid(CDG_STREAM_DATA$(y+4),x+1,1)="1"
  214.                                         display=colorB
  215.                                 Else
  216.                                         display=colorA
  217.                                 EndIf
  218.                                 If BLOCK_XOR=1
  219.                                         display=display Xor CDG_SCREEN(xx,yy,1,CDG_BUFFER_FRONT)   ;THIS COMMAND IS HEAVY USED
  220.                                 EndIf
  221.                                 CDG_SCREEN(xx,yy,1,CDG_BUFFER_FRONT)=display
  222.                                 CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(display,4)
  223.                         EndIf
  224.                 Next
  225.         Next
  226. End Function
  227.  
  228. ; **** FILL THE SCREEN WITH THAT COLOR
  229. Function CDG_MEMORY_PRESET()
  230.         CDG_COLOR_FILL=ReadBit(CDG_STREAM_DATA$(0),3,4)
  231.         CDG_COLOR_REPEAT=ReadBit(CDG_STREAM_DATA$(1),3,4) ; THIS MAY BE A BOUNCS IF COMMANDS. IT ONLY NEED THIS ONCE.
  232.         If CDG_COLOR_REPEAT=0
  233.                 For x=7 To 300
  234.                         For y=13 To 216
  235.                                 CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
  236.                                 CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_FILL
  237.                         Next
  238.                 Next
  239.         EndIf
  240. End Function
  241.  
  242. ; **** FILL THE BORDER WITH THAT COLOR (ONLY USED FOR SCROLLING THINGS)
  243. Function CDG_BORDER_PRESET(COLOUR=-1)
  244.         If COLOUR=-1 Then CDG_COLOR_BORDER=ReadBit(CDG_STREAM_DATA$(0),3,4) Else CDG_COLOR_BORDER=COLOUR
  245.         For x=1 To 6
  246.                 For y=1 To 216
  247.                         CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
  248.                         CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_BORDER
  249.                 Next
  250.         Next
  251.  
  252.         For x=1 To 300
  253.                 For y=1 To 12
  254.                         CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
  255.                         CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_BORDER
  256.                 Next
  257.         Next
  258. End Function
  259.  
  260. ; **** READ COLOR THE LOWER 8 OR HIGHER 8 COLOR TABLES
  261. Function CDG_LOAD_COL_TBL(FROM)
  262.         count=0
  263.         For i=0 To 15 Step 2
  264.                 COLORS$=CDG_STREAM_DATA$(i)+CDG_STREAM_DATA$(i+1)
  265.                 RED=ReadBit(COLORS$,1,4)*17
  266.                 GREEN=ReadBit(COLORS$,5,4)*17
  267.                 BLUE=ReadBit(COLORS$,9,4)*17
  268.                 CDG_COLOR_TABLE(count+from,1)=RED
  269.                 CDG_COLOR_TABLE(count+from,2)=GREEN
  270.                 CDG_COLOR_TABLE(count+from,3)=BLUE
  271.                 COLORS$="00"+HexByte$(RED)+HexByte$(GREEN)+HexByte$(BLUE)
  272.                 COLOUR=VAL(COLORS$)
  273.                 CDG_COLOR_TABLE(count+FROM,4)=COLOUR
  274.                 count=count+1
  275.         Next
  276. End Function
  277.  
  278. ; **** SCROLL THE TEXT ****
  279. Function CDG_SCROLL(COPY=0)
  280.         colorA=ReadBit(CDG_STREAM_DATA$(0),3,4)
  281.        
  282.         hSCmd = ReadBit(CDG_STREAM_DATA$(1),1,2)
  283.         hScroll=ReadBit(CDG_STREAM_DATA$(1),3,4)
  284.  
  285.         vSCmd = ReadBit(CDG_STREAM_DATA$(2),1,2)
  286.         vScroll=ReadBit(CDG_STREAM_DATA$(2),3,4)
  287.         If vSCmd=0
  288.                 CDG_STREAM_YOFFSET=vScroll+1
  289.         Else If vSCmd=1
  290.                 MOVE_Y=12
  291.         Else
  292.                 MOVE_Y=-12
  293.         EndIf
  294.  
  295.         If hSCmd=0
  296.                 CDG_STREAM_XOFFSET=hScroll+1
  297.         Else If hSCmd=1
  298.                 MOVE_X=6
  299.         Else
  300.                 MOVE_X=-6
  301.         EndIf
  302.  
  303.         If MOVE_Y=0 And MOVE_Y=0 Then Return
  304.         CDG_STREAM_YOFFSET=0
  305.         CDG_STREAM_XOFFSET=0
  306.         If COPY=0 Then CDG_BORDER_PRESET(colorA)
  307.        
  308.         For y=1 To 216
  309.                 For x=1 To 300
  310.                         NewX=x+MOVE_X
  311.                         NewY=y+MOVE_Y
  312.                         If NewY<1 Then NewY=NewY+216
  313.                         If NewY>216 Then NewY=NewY-216
  314.                         If NewX<1 Then NewX=NewX+300
  315.                         If NewX>300 Then NewX=NewX-300
  316.                         CDG_SCREEN(NewX,NewY,0, CDG_BUFFER_BACK)=CDG_SCREEN(x,y,0, CDG_BUFFER_FRONT)
  317.                         CDG_SCREEN(NewX,NewY,1, CDG_BUFFER_BACK)=CDG_SCREEN(x,y,1, CDG_BUFFER_FRONT)
  318.                 Next
  319.         Next
  320.         CDG_BUFFER_FRONT=CDG_BUFFER_FRONT+1 : If CDG_BUFFER_FRONT=2 Then CDG_BUFFER_FRONT=0
  321.         CDG_BUFFER_BACK=CDG_BUFFER_BACK+1 : If CDG_BUFFER_BACK=2 Then CDG_BUFFER_BACK=0
  322.  
  323.  
  324. End Function
  325.  
  326. ; ************************
  327. ; **** HELP FUNCTIONS ****
  328. ; ************************
  329.  
  330. Function HexByte$(BYTE) ;THIS WAS USED FOR GETTING RGB VALUES OF COLORS
  331.         Return Right$(Hex$(BYTE),2)
  332. End Function
  333.  
  334. Function ReadBit(BINARY$,s,c) ;IT EASIER TO READ BINARY BITS FROM A STRING, RATHER THAN BITS IT SELF.
  335.         BI$=Mid$(BINARY$,s,c)
  336.         D=1
  337.         RES=0
  338.         For i=c To 1 Step -1
  339.                 If Mid$(BI$,i,1)="1" Then RES=RES+D
  340.                 D=D+D
  341.         Next
  342.         Return RES
  343. End Function
  344.  
  345. Function Tok$(FIND$,TXT$)
  346.         RESULT$="" : ADD=0 : R=0
  347.         For I=1 To Len(TXT$)
  348.                 If ADD=0 Then CHAR$=Mid$(TXT$, I,Len(FIND$)+1)
  349.                 If ADD=1 Then CHAR$=Mid$(TXT$, I,1)
  350.                 If CHAR$="|" Then Return RESULT$
  351.                 If ADD=1 Then RESULT$=RESULT$+CHAR$
  352.                 If Trim(CHAR$)=Trim(FIND$)+"=" And ADD=0 Then I=I+Len(FIND$) : ADD=1
  353.         Next
  354. Return
  355. End Function
  356.  
  357. Function Val#(StringNumeric$)
  358.         StringNumeric$="$"+StringNumeric$
  359.         Local Num# = 0
  360.         Local Hex1 = ((Left$(StringNumeric$,1)="#") Or (Left$(StringNumeric$,1)="$"))
  361.         Local Hex2 = (Left$(StringNumeric$,2)="0x")
  362.         Local i,c
  363.    
  364.         StringNumeric$ = Upper(StringNumeric$)
  365.         For i=(Hex1 + (Hex2 * 2) + 1) To Len(StringNumeric$)
  366.                 c = Asc(Mid$(StringNumeric$,i,1))
  367.                 Select True
  368.                         Case (c>=48 And c<=57)  ;0 through 9
  369.                                 Num# = (Num# * 16) + c-48
  370.                         Case (c>=65 And c<=70)  ;A through F
  371.                                 Num# = (Num# * 16) + c-55
  372.                         Default
  373.                                 Return Num#                        
  374.                 End Select
  375.         Next
  376.         Return Num#
  377. End Function


Comments :


Damien Sturdy(Posted 1+ years ago)

 heh, now THATS sweet :) Cheers!


DjBigWorm(Posted 1+ years ago)

 This has to be the neatest code I have seen in a while.  I have always wondered what it took to make a karaoke cdg player.  (loud applause)  Thanks you.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal