Code archives/Audio/CDG player
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| 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\test\CDG\Twist 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 http://www.arcademusicbox.com (made in Blitz+) | |||||
Global CDG_COMMAND = 9
Global CDG_MASK = 63
Global CDG_INST_MEMORY_PRESET = 1
Global CDG_INST_BORDER_PRESET = 2
Global CDG_INST_TILE_BLOCK = 6
Global CDG_INST_SCROLL_PRESET = 20
Global CDG_INST_SCROLL_COPY = 24
Global CDG_INST_DEF_TRANSP_COL = 28
Global CDG_INST_LOAD_COL_TBL_0_7 = 30
Global CDG_INST_LOAD_COL_TBL_8_15 = 31
Global CDG_INST_TILE_BLOCK_XOR = 38
Global CDG_STREAM_COMMAND
Global CDG_STREAM_INTRUCTION
Global CDG_BUFFER_FRONT=0
Global CDG_BUFFER_BACK=1
Global CDG_COLOR_BORDER=0
Global CDG_COLOR_FILL=0
Global CDG_COLOR_TRANSPERANT=0
Global CDG_STREAM_FILE$ = ""
Global CDG_STREAM_FILE_ID = 0
Global CDG_STREAM_FILE_SOUND = 0
Global CDG_STREAM_FILE_TIMER
Global CDG_STREAM_XOFFSET = 0
Global CDG_STREAM_YOFFSET = 0
Global CDG_IMAGE
Global CDG_ROTATION = 0
Dim CDG_COLOR_TABLE(17,5)
Dim CDG_STREAM_PARITYQ(2)
Dim CDG_STREAM_DATA$(17)
Dim CDG_STREAM_PARITYP(4)
Dim CDG_SCREEN(301,217,2,2)
CMD$=Lower$(CommandLine$())
If Instr(CMD$,"\rotate90") Then CDG_ROTATION=90 : CMD$=Replace$(CMD$,"\rotate90","")
If Instr(CMD$,"\rotate180") Then CDG_ROTATION=180 : CMD$=Replace$(CMD$,"\rotate180","")
If Instr(CMD$,"\rotate270") Then CDG_ROTATION=270 : CMD$=Replace$(CMD$,"\rotate270","")
FILE$=Trim$(CMD$)
If FileType(FILE$)=-0 Then FILE$=RequestFile("Open a CDG file","CDG",False)
CDG_PLAY(FILE$,CDG_ROTATION)
Function CDG_PLAY(FILE$, CDG_ROTATION)
;mode=2
CDG_BUFFER_FRONT=0
CDG_BUFFER_BACK=1
; SETUP THE GRAPHICS CARD. THIS APPLICATION SUPPORT ROTATION
If CDG_ROTATION=0 Or CDG_ROTATION=180
If GfxModeExists(320,240,16) Then Graphics 320,240,16,0 Else Graphics 321,240,16,0
CDG_IMAGE=CreateImage(301,217,1,1)
MaskImage CDG_IMAGE,5,5,5
EndIf
If CDG_ROTATION=90 Or CDG_ROTATION=270
If GfxModeExists(400,300,16) Then Graphics 400,300,16,0 Else Graphics 640,480,16,0
CDG_IMAGE=CreateImage(217,301,1,1)
EndIf
fntVerdana=LoadFont("Verdana",14,False,False,False)
SetFont fntVerdana
A=StringWidth("Karaoke")
COPYRIGHT=CreateImage(A,20,1,1)
SetBuffer ImageBuffer(Copyright)
SetFont fntVerdana
Color 90,90,90
Text 0,0,"Karaoke"
A=StringWidth("Arcade Music Box")
COPYRIGHT2=CreateImage(A,20,1,1)
SetBuffer ImageBuffer(Copyright2)
SetFont fntVerdana
Color 90,90,90
Text 0,0,"Arcade Music Box"
If CDG_ROTATION=90
MidHandle Copyright : MidHandle Copyright2
RotateImage Copyright,90 : RotateImage Copyright2,90
HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
Else If CDG_ROTATION=180
MidHandle Copyright : MidHandle Copyright2
RotateImage Copyright,180 : RotateImage Copyright2,180
HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
Else If CDG_ROTATION=270
MidHandle Copyright : MidHandle Copyright2
RotateImage Copyright,270 : RotateImage Copyright2,270
HandleImage Copyright,0,0 : HandleImage Copyright2,0,0
EndIf
; READ MUSIC FILE AND OPEN CDG FILE
CDG_STREAM_FILE_ID=ReadFile(FILE$)
If CDG_STREAM_FILE_ID=0 Then Return
FILE2$=Left$(FILE$,Len(FILE$)-4)
CDG_STREAM_FILE_SOUND=LoadSound(FILE2$+".mp3")
If CDG_STREAM_FILE_SOUND=0 Then LoadSound(FILE2$+".ogg")
If CDG_STREAM_FILE_SOUND=0 Then LoadSound(FILE2$+".wav")
If CDG_STREAM_FILE_SOUND=0 Then Return
ok=PlaySound(CDG_STREAM_FILE_SOUND)
; ********************
; **** CDG PLAYER ****
; ********************
CDG_STREAM_FILE_TIMER = MilliSecs()+50
Repeat
; READ A 24 BYTE PACKET FROM THE FILE (PARITYQ and PARITYP seen not been used in anyware, but keept them here)
For ticks=1 To 15
CDG_STREAM_COMMAND=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
CDG_STREAM_INTRUCTION=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
CDG_STREAM_PARITYQ(1)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
CDG_STREAM_PARITYQ(2)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK
For i=0 To 15 : Byte=ReadByte(CDG_STREAM_FILE_ID) : CDG_STREAM_DATA$(i)=Right$(Bin$(Byte),6) : Next
For i=1 To 4 : CDG_STREAM_PARITYP(i)=ReadByte(CDG_STREAM_FILE_ID) And CDG_MASK : Next
If CDG_STREAM_COMMAND=9
ok=0
If CDG_STREAM_INTRUCTION=CDG_INST_MEMORY_PRESET Then CDG_MEMORY_PRESET() : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_BORDER_PRESET Then CDG_BORDER_PRESET() : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_LOAD_COL_TBL_0_7 Then CDG_LOAD_COL_TBL(0) : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_LOAD_COL_TBL_8_15 Then CDG_LOAD_COL_TBL(8) : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_TILE_BLOCK Then CDG_TILE_BLOCK(0) : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_TILE_BLOCK_XOR Then CDG_TILE_BLOCK(1) : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_SCROLL_PRESET Then CDG_SCROLL(0) : ok=1
If CDG_STREAM_INTRUCTION=CDG_INST_SCROLL_COPY Then CDG_SCROLL(1) : ok=1
;If CDG_STREAM_INTRUCTION>0 And ok=0 Then Print "unsupported instruction: "+CDG_STREAM_INTRUCTION
EndIf
Next
SetBuffer ImageBuffer(CDG_IMAGE)
If KeyDown(1)=True Then End
; DISPLAY THE BUFFER TO THE SCREEN
If (CDG_STREAM_FILE_TIMER >= MilliSecs())
LockBuffer ImageBuffer(CDG_IMAGE)
For x=7 To 300
For y=13 To 216
xx=x+CDG_STREAM_XOFFSET : If xx>300 Then xx=xx-300
yy=y+CDG_STREAM_YOFFSET : If yy>216 Then yy=yy-216
If CDG_ROTATION=0 Then WritePixelFast x-6,y-12,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
If CDG_ROTATION=90 Then WritePixelFast 217-y,x-6,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
If CDG_ROTATION=180 Then WritePixelFast 301-x,217-y,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
If CDG_ROTATION=270 Then WritePixelFast y-12,301-x,CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)
Next
Next
UnlockBuffer ImageBuffer(CDG_IMAGE)
SetBuffer BackBuffer()
If CDG_ROTATION=-1
Else If CDG_ROTATION=0
Color 255,255,255
x=14 : y=18
DrawImage CDG_IMAGE,x,y,0
Rect x,y,294+2,204+2,0
DrawImage COPYRIGHT,160-ImageWidth(COPYRIGHT)/2,1 : DrawImage COPYRIGHT2, 160-ImageWidth(COPYRIGHT2)/2,224
Flip
Else If CDG_ROTATION=90
Color 255,255,255
x=2 : y=100 : If GraphicsWidth()=640 Then x=96 : cx=244
Rect y-1,x-1,204+2,294+2,1
DrawImage CDG_IMAGE,y-1,x-1,0
DrawImage COPYRIGHT2,30,GraphicsHeight()/2-ImageHeight(COPYRIGHT2)/2
DrawImage COPYRIGHT, GraphicsWidth()-50-cx, GraphicsHeight()/2-ImageHeight(COPYRIGHT)/2
Flip
Else If CDG_ROTATION=270
Color 255,255,255
x=2 : y=100 : If GraphicsWidth()=640 Then x=96 : cy=240 : y=y+cy : cx=244
Rect y-1,x-1,204+2,294+2,1
DrawImage CDG_IMAGE,y-1,x-1,0
DrawImage COPYRIGHT,30+cy,GraphicsHeight()/2-ImageHeight(COPYRIGHT)/2
DrawImage COPYRIGHT2, GraphicsWidth()-50-cx+cy, GraphicsHeight()/2-ImageHeight(COPYRIGHT2)/2
Flip
Else CDG_ROTATION=180
Color 255,255,255
x=14 : y=18
Rect x-1,y-1,294+2,204+2,1
DrawImage CDG_IMAGE,x-1,y-1,0
DrawImage COPYRIGHT2,160-ImageWidth(COPYRIGHT2)/2,-5 : DrawImage COPYRIGHT, 160-ImageWidth(COPYRIGHT)/2,219
Flip
EndIf
EndIf
; WAIT TIMER
Repeat : Delay 1 : Until CDG_STREAM_FILE_TIMER < MilliSecs()
CDG_STREAM_FILE_TIMER=CDG_STREAM_FILE_TIMER+50
Until Eof(CDG_STREAM_FILE_ID) Or ChannelPlaying(CDG_STREAM_FILE_SOUND)=1
FreeSound CDG_STREAM_FILE_SOUND
FreeImage CDG_IMAGE
End Function
; **** DRAW A 6x12 TILE (USING XOR OR NORMAL OPERATION)
Function CDG_TILE_BLOCK(BLOCK_XOR)
colorA=ReadBit(CDG_STREAM_DATA$(0),3,4)
colorB=ReadBit(CDG_STREAM_DATA$(1),3,4)
row=ReadBit(CDG_STREAM_DATA$(2),2,5)*12
col=ReadBit(CDG_STREAM_DATA$(3),1,6)*6
For y=0 To 11
For x=0 To 5
yy=y+row : xx=x+col
If xx<294 And yy<205
If Mid(CDG_STREAM_DATA$(y+4),x+1,1)="1"
display=colorB
Else
display=colorA
EndIf
If BLOCK_XOR=1
display=display Xor CDG_SCREEN(xx,yy,1,CDG_BUFFER_FRONT) ;THIS COMMAND IS HEAVY USED
EndIf
CDG_SCREEN(xx,yy,1,CDG_BUFFER_FRONT)=display
CDG_SCREEN(xx,yy,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(display,4)
EndIf
Next
Next
End Function
; **** FILL THE SCREEN WITH THAT COLOR
Function CDG_MEMORY_PRESET()
CDG_COLOR_FILL=ReadBit(CDG_STREAM_DATA$(0),3,4)
CDG_COLOR_REPEAT=ReadBit(CDG_STREAM_DATA$(1),3,4) ; THIS MAY BE A BOUNCS IF COMMANDS. IT ONLY NEED THIS ONCE.
If CDG_COLOR_REPEAT=0
For x=7 To 300
For y=13 To 216
CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_FILL
Next
Next
EndIf
End Function
; **** FILL THE BORDER WITH THAT COLOR (ONLY USED FOR SCROLLING THINGS)
Function CDG_BORDER_PRESET(COLOUR=-1)
If COLOUR=-1 Then CDG_COLOR_BORDER=ReadBit(CDG_STREAM_DATA$(0),3,4) Else CDG_COLOR_BORDER=COLOUR
For x=1 To 6
For y=1 To 216
CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_BORDER
Next
Next
For x=1 To 300
For y=1 To 12
CDG_SCREEN(x,y,0,CDG_BUFFER_FRONT)=CDG_COLOR_TABLE(CDG_COLOR_FILL,4)
CDG_SCREEN(x,y,1,CDG_BUFFER_FRONT)=CDG_COLOR_BORDER
Next
Next
End Function
; **** READ COLOR THE LOWER 8 OR HIGHER 8 COLOR TABLES
Function CDG_LOAD_COL_TBL(FROM)
count=0
For i=0 To 15 Step 2
COLORS$=CDG_STREAM_DATA$(i)+CDG_STREAM_DATA$(i+1)
RED=ReadBit(COLORS$,1,4)*17
GREEN=ReadBit(COLORS$,5,4)*17
BLUE=ReadBit(COLORS$,9,4)*17
CDG_COLOR_TABLE(count+from,1)=RED
CDG_COLOR_TABLE(count+from,2)=GREEN
CDG_COLOR_TABLE(count+from,3)=BLUE
COLORS$="00"+HexByte$(RED)+HexByte$(GREEN)+HexByte$(BLUE)
COLOUR=VAL(COLORS$)
CDG_COLOR_TABLE(count+FROM,4)=COLOUR
count=count+1
Next
End Function
; **** SCROLL THE TEXT ****
Function CDG_SCROLL(COPY=0)
colorA=ReadBit(CDG_STREAM_DATA$(0),3,4)
hSCmd = ReadBit(CDG_STREAM_DATA$(1),1,2)
hScroll=ReadBit(CDG_STREAM_DATA$(1),3,4)
vSCmd = ReadBit(CDG_STREAM_DATA$(2),1,2)
vScroll=ReadBit(CDG_STREAM_DATA$(2),3,4)
If vSCmd=0
CDG_STREAM_YOFFSET=vScroll+1
Else If vSCmd=1
MOVE_Y=12
Else
MOVE_Y=-12
EndIf
If hSCmd=0
CDG_STREAM_XOFFSET=hScroll+1
Else If hSCmd=1
MOVE_X=6
Else
MOVE_X=-6
EndIf
If MOVE_Y=0 And MOVE_Y=0 Then Return
CDG_STREAM_YOFFSET=0
CDG_STREAM_XOFFSET=0
If COPY=0 Then CDG_BORDER_PRESET(colorA)
For y=1 To 216
For x=1 To 300
NewX=x+MOVE_X
NewY=y+MOVE_Y
If NewY<1 Then NewY=NewY+216
If NewY>216 Then NewY=NewY-216
If NewX<1 Then NewX=NewX+300
If NewX>300 Then NewX=NewX-300
CDG_SCREEN(NewX,NewY,0, CDG_BUFFER_BACK)=CDG_SCREEN(x,y,0, CDG_BUFFER_FRONT)
CDG_SCREEN(NewX,NewY,1, CDG_BUFFER_BACK)=CDG_SCREEN(x,y,1, CDG_BUFFER_FRONT)
Next
Next
CDG_BUFFER_FRONT=CDG_BUFFER_FRONT+1 : If CDG_BUFFER_FRONT=2 Then CDG_BUFFER_FRONT=0
CDG_BUFFER_BACK=CDG_BUFFER_BACK+1 : If CDG_BUFFER_BACK=2 Then CDG_BUFFER_BACK=0
End Function
; ************************
; **** HELP FUNCTIONS ****
; ************************
Function HexByte$(BYTE) ;THIS WAS USED FOR GETTING RGB VALUES OF COLORS
Return Right$(Hex$(BYTE),2)
End Function
Function ReadBit(BINARY$,s,c) ;IT EASIER TO READ BINARY BITS FROM A STRING, RATHER THAN BITS IT SELF.
BI$=Mid$(BINARY$,s,c)
D=1
RES=0
For i=c To 1 Step -1
If Mid$(BI$,i,1)="1" Then RES=RES+D
D=D+D
Next
Return RES
End Function
Function Tok$(FIND$,TXT$)
RESULT$="" : ADD=0 : R=0
For I=1 To Len(TXT$)
If ADD=0 Then CHAR$=Mid$(TXT$, I,Len(FIND$)+1)
If ADD=1 Then CHAR$=Mid$(TXT$, I,1)
If CHAR$="|" Then Return RESULT$
If ADD=1 Then RESULT$=RESULT$+CHAR$
If Trim(CHAR$)=Trim(FIND$)+"=" And ADD=0 Then I=I+Len(FIND$) : ADD=1
Next
Return
End Function
Function Val#(StringNumeric$)
StringNumeric$="$"+StringNumeric$
Local Num# = 0
Local Hex1 = ((Left$(StringNumeric$,1)="#") Or (Left$(StringNumeric$,1)="$"))
Local Hex2 = (Left$(StringNumeric$,2)="0x")
Local i,c
StringNumeric$ = Upper(StringNumeric$)
For i=(Hex1 + (Hex2 * 2) + 1) To Len(StringNumeric$)
c = Asc(Mid$(StringNumeric$,i,1))
Select True
Case (c>=48 And c<=57) ;0 through 9
Num# = (Num# * 16) + c-48
Case (c>=65 And c<=70) ;A through F
Num# = (Num# * 16) + c-55
Default
Return Num#
End Select
Next
Return Num#
End Function |
Comments
| ||
| heh, now THATS sweet :) Cheers! |
| ||
| 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. |
Code Archives Forum