if you know about encode-decode wav samples and you have some advise - it will be nice
to see difference between original and encode-decode:
Code: Select all
DataSection
; piece 8bit MK3
datamk38bit:
Data.a $80,$80,$80,$8D,$62,$81,$8E,$8E,$B9,$AC,$81,$56,$81,$74,$67,$92,$67,$64,$6B,$5E,$89,$96,$99,$B8
Data.a $99,$6E,$99,$7A,$4F,$5C,$71,$46,$3F,$4C,$45,$70,$9B,$B0,$C5,$C8,$C8,$9D,$7E,$71,$5C,$4F,$4C,$61
; original 4bit MK3
datamk34bit:
Data.a $00,$40,$6F,$04,$C7,$FF,$C7,$7C,$AF,$C3,$47,$62,$FE,$E7,$4F,$F5,$4B,$7B,$57,$25,$F0,$CE,$CD,$5A
; piece jim 8bit
datajim8bit:
Data.a $80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$7F,$7F,$7F,$7F,$7F,$7D,$7C,$7B,$7B
Data.a $7D,$7F,$82,$87,$8B,$8C,$8A,$86,$81,$7E,$7E,$7E,$80,$84,$86,$83,$7E,$79,$76,$72,$6F,$70,$71,$75
enddatajim8bit:
EndDataSection
Global Dim pikarray.b(15) ;{
; original table. not need to edit. as is.
pikarray(0) = 0
pikarray(1) = 1
pikarray(2) = 3
pikarray(3) = 7
pikarray(4) = $D ; 13
pikarray(5) = $15 ; 21
pikarray(6) = $1F ; 31
pikarray(7) = $2B ; 43
pikarray(8) = 0
pikarray(9) = -1
pikarray(10) = -3
pikarray(11) = -7
pikarray(12) = -$D ; -13
pikarray(13) = -$15 ; -21
pikarray(14) = -$1F ; -31
pikarray(15) = -$2B ; -43
;}
;{ bits operations
Macro SetBit(Var, Bit) ;
Var | (Bit)
EndMacro
Macro ClearBit(Var, Bit) ;
Var & (~(Bit))
EndMacro
Macro TestBit(Var, Bit)
Bool(Var & (Bit))
EndMacro
Macro NumToBit(Num) ;
(1<<(Num))
EndMacro
Macro GetBits(Var, StartPos, EndPos)
((Var>>(StartPos))&(NumToBit((EndPos)-(StartPos)+1)-1))
EndMacro
;}
;{
; just first version. i keep values just in case
Procedure.a GetEncodeValueOr(value.b)
ret.a = 0
Select value
Case 0
ret = 0
Case 1 To 2
ret = 1
Case 3 To 6
ret = 2
Case 7 To 12
ret = 3
Case 13 To 20
ret = 4
Case 21 To 30
ret = 5
Case 31 To 42
ret = 6
Case 43 To 55
ret = 7
Case -2 To -1
ret = 9
Case -6 To -3
ret = 10
Case -12 To -7
ret = 11
Case -20 To -13
ret = 12
Case -30 To -21
ret = 13
Case -42 To -31
ret = 14
Case -55 To -43
ret = 15
EndSelect
ProcedureReturn ret
EndProcedure
;}
Procedure.a GetEncodeValue(value.b)
ret.a = 0
; this case is not fine. it need to some more tune limitations
Select value
Case 0
ret = 0
Case 1
ret = 1
Case 2 To 3
ret = 2
Case 4 To 7
ret = 3
Case 8 To 13
ret = 4
Case 14 To 21
ret = 5
Case 22 To 31
ret = 6
Case 32 To 127
ret = 7
Case -1
ret = 9
Case -3 To -2
ret = 10
Case -7 To -4
ret = 11
Case -13 To -8
ret = 12
Case -21 To -14
ret = 13
Case -31 To -22
ret = 14
Case -127 To -32
ret = 15
EndSelect
ProcedureReturn ret
EndProcedure
TestNumberb.b
TestNumbera.b
;{ this part for tests original samples. how they are will encode with new table
If blablabla; = 0 ; uncomment here to check it too
Debug "MK3 8bit"
OutText$ = ""
tik = 0
For m = ?datamk38bit To ?datamk34bit - 1
TestNumbera = PeekA(m)
OutText$ + "$" + RSet(Hex(TestNumbera, #PB_Ascii), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
Next
Debug OutText$
Debug "MK3 into 4bit"
oldvalue = $80
f = 0
OutText$ = ""
tik = 0
For m = ?datamk38bit To ?datamk34bit
If f = 0
f = 1
newvalue = PeekA(m)
TestNumberb = newvalue - oldvalue
second = GetEncodeValue(TestNumberb)
oldvalue = newvalue
Else
f = 0
newvalue = PeekA(m)
TestNumberb = newvalue - oldvalue
first = GetEncodeValue(TestNumberb)
oldvalue = newvalue
OutText$ + "$" + RSet(Hex((first << 4 + second), #PB_Ascii), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
EndIf
Next
Debug OutText$
Debug "MK3 4bit"
OutText$ = ""
tik = 0
For m = ?datamk34bit To ?datajim8bit - 1
TestNumbera = PeekA(m)
OutText$ + "$" + RSet(Hex(TestNumbera, #PB_Ascii), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
Next
Debug OutText$
Debug "MK3 4 => 8"
DPCMinpval.a
DPCMforwrite = $80
OutText$ = ""
tik = 0
For m = ?datamk34bit To ?datajim8bit - 1
DPCMinpval = PeekA(m)
; split 8bit value into two 4bit
DPCMfirst = GetBits(DPCMinpval, 0, 3) ; get %0000xxxx
DPCMsecond = GetBits(DPCMinpval, 4, 7) ; get %xxxx0000
DPCMforwrite + pikarray(DPCMfirst)
OutText$ + "$" + RSet(Hex(DPCMforwrite), 2, "0") + " "
tik + 1
DPCMforwrite + pikarray(DPCMsecond)
OutText$ + "$" + RSet(Hex(DPCMforwrite), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
Next
Debug OutText$
EndIf
;}
Debug "JIM"
Debug "8bit"
OutText$ = ""
tik = 0
For m = ?datajim8bit To ?enddatajim8bit - 1
TestNumbera = PeekA(m)
OutText$ + "$" + RSet(Hex(TestNumbera, #PB_Ascii), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
Next
Debug OutText$
Debug "into 4bit"
f = 0
OutText$ = ""
tik = 0
tik2 = 0
WriteValue.a
Jim4BitMem = AllocateMemory(24) ; reserve memory for convertin result
oldvalue = $80 ; starting value
For m = ?datajim8bit To ?enddatajim8bit ; cycle from start memory to end of memory with this data
If f = 0
f = 1 ; flag, order of bits
newvalue = PeekA(m) ; read from memory
TestNumberb = newvalue - oldvalue ; get distinction
second = GetEncodeValue(TestNumberb) ; get value from "back-table"
oldvalue = newvalue
Else
f = 0 ; flag, order of bits
newvalue = PeekA(m) ; read from memory
TestNumberb = newvalue - oldvalue ; get distinction
first = GetEncodeValue(TestNumberb) ; get value from "back-table"
oldvalue = newvalue
WriteValue = first << 4 + second ; move bytes and make value for write
OutText$ + "$" + RSet(Hex(WriteValue, #PB_Ascii), 2, "0") + " " ; text for showing in debug window
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10) ; next string in a window
EndIf
tik2 + 1
PokeA(Jim4BitMem + tik2, WriteValue) ; write into memory
EndIf
Next
Debug OutText$
Debug "4 => 8"
DPCMinpval.a
DPCMforwrite = $80
OutText$ = ""
tik = 0
For m = Jim4BitMem To Jim4BitMem + 23
DPCMinpval = PeekA(m)
; split 8bit value into two 4bit
DPCMfirst = GetBits(DPCMinpval, 0, 3) ; get %0000xxxx
DPCMsecond = GetBits(DPCMinpval, 4, 7) ; get %xxxx0000
DPCMforwrite + pikarray(DPCMfirst)
OutText$ + "$" + RSet(Hex(DPCMforwrite), 2, "0") + " "
tik + 1
DPCMforwrite + pikarray(DPCMsecond)
OutText$ + "$" + RSet(Hex(DPCMforwrite), 2, "0") + " "
tik + 1
If tik = 12
tik = 0
OutText$ + Chr(10)
EndIf
Next
Debug OutText$