mirror of
https://github.com/grp/Wii.py.git
synced 2025-06-19 07:15:49 -04:00
pushed mono 'fix' for bns.py, just needs cleaning for var naming
This commit is contained in:
parent
f59fae9756
commit
685afc3384
64
bns.py
64
bns.py
@ -3,13 +3,14 @@
|
|||||||
from common import *
|
from common import *
|
||||||
|
|
||||||
class SoundFile:
|
class SoundFile:
|
||||||
def __init__(self, signal, filename, samplerate=32000):
|
def __init__(self, signal, filename, chancnt=2, samplerate=32000):
|
||||||
self.actual_file = StringIO()
|
self.actual_file = StringIO()
|
||||||
self.file = wave.open(filename, 'wb')
|
self.file = wave.open(filename, 'wb')
|
||||||
self.signal = signal
|
self.signal = signal
|
||||||
self.sr = samplerate
|
self.sr = samplerate
|
||||||
|
self.chancnt = chancnt
|
||||||
def write(self):
|
def write(self):
|
||||||
self.file.setparams((2, 2, self.sr, self.sr*4, 'NONE', 'noncompressed'))
|
self.file.setparams((self.chancnt, 2, self.sr, self.sr*self.chancnt*2, 'NONE', 'noncompressed'))
|
||||||
self.file.writeframes(self.signal)
|
self.file.writeframes(self.signal)
|
||||||
self.actual_file.seek(0)
|
self.actual_file.seek(0)
|
||||||
self.file.close()
|
self.file.close()
|
||||||
@ -80,7 +81,7 @@ class BNS_info(object):
|
|||||||
assert self.chan_cnt <=2
|
assert self.chan_cnt <=2
|
||||||
self.samplerate, self.pad0 = struct.unpack('>HH', buffer[offset+12:offset+16])
|
self.samplerate, self.pad0 = struct.unpack('>HH', buffer[offset+12:offset+16])
|
||||||
assert self.samplerate <= 48000
|
assert self.samplerate <= 48000
|
||||||
assert self.samplerate > 32000
|
assert self.samplerate >= 32000
|
||||||
self.loop_start, self.loop_end = struct.unpack('>II', buffer[offset+16:offset+24])
|
self.loop_start, self.loop_end = struct.unpack('>II', buffer[offset+16:offset+24])
|
||||||
co = offset + 24
|
co = offset + 24
|
||||||
self.offset_to_chan_starts = Struct.uint32(buffer[co:co+4], endian='>')
|
self.offset_to_chan_starts = Struct.uint32(buffer[co:co+4], endian='>')
|
||||||
@ -424,14 +425,25 @@ class BNS(object):
|
|||||||
def encode(self, buffer, offset=0):
|
def encode(self, buffer, offset=0):
|
||||||
sampsbuf = [0 for i in range(14)]
|
sampsbuf = [0 for i in range(14)]
|
||||||
templen = len(buffer)
|
templen = len(buffer)
|
||||||
templen = templen / 4
|
|
||||||
|
if self.info.chan_cnt == 2:
|
||||||
|
templen = templen / 4
|
||||||
|
elif self.info.chan_cnt == 1:
|
||||||
|
templen = templen / 2
|
||||||
|
|
||||||
modlen = templen % 14
|
modlen = templen % 14
|
||||||
for x in xrange(14-modlen):
|
for x in xrange(14-modlen):
|
||||||
buffer = buffer + '\x00'
|
buffer = buffer + '\x00'
|
||||||
buffer = buffer + '\x00'
|
buffer = buffer + '\x00'
|
||||||
buffer = buffer + '\x00'
|
if self.info.chan_cnt == 2:
|
||||||
buffer = buffer + '\x00'
|
buffer = buffer + '\x00'
|
||||||
num_samps = len(buffer) / 4
|
buffer = buffer + '\x00'
|
||||||
|
|
||||||
|
if self.info.chan_cnt == 2:
|
||||||
|
num_samps = len(buffer) / 4
|
||||||
|
elif self.info.chan_cnt == 1:
|
||||||
|
num_samps = len(buffer) / 2
|
||||||
|
|
||||||
blocks = (num_samps + 13) / 14
|
blocks = (num_samps + 13) / 14
|
||||||
snddatal = []
|
snddatal = []
|
||||||
snddatar = []
|
snddatar = []
|
||||||
@ -440,25 +452,33 @@ class BNS(object):
|
|||||||
for x in xrange(num_samps):
|
for x in xrange(num_samps):
|
||||||
snddatal.append(Struct.int16(buffer[co:co+2]))
|
snddatal.append(Struct.int16(buffer[co:co+2]))
|
||||||
co += 2
|
co += 2
|
||||||
snddatar.append(Struct.int16(buffer[co:co+2]))
|
if self.info.chan_cnt == 2:
|
||||||
co += 2
|
snddatar.append(Struct.int16(buffer[co:co+2]))
|
||||||
|
co += 2
|
||||||
data = [0 for i in range(blocks*16)]
|
data = [0 for i in range(blocks*16)]
|
||||||
data1_off = 0
|
data1_off = 0
|
||||||
data2_off = blocks * 8
|
data2_off = blocks * 8
|
||||||
self.info.chan2_start = data2_off
|
|
||||||
|
if self.info.chan_cnt == 2:
|
||||||
|
self.info.chan2_start = data2_off
|
||||||
|
else:
|
||||||
|
self.info.chan2_start = 0
|
||||||
|
|
||||||
for i in xrange(blocks):
|
for i in xrange(blocks):
|
||||||
for j in xrange(14):
|
for j in xrange(14):
|
||||||
sampsbuf[j] = snddatal[i*14+j]
|
sampsbuf[j] = snddatal[i*14+j]
|
||||||
out_buf = self.repack_adpcm(0, self.deftbl, sampsbuf)
|
out_buf = self.repack_adpcm(0, self.deftbl, sampsbuf)
|
||||||
for k in xrange(8):
|
for k in xrange(8):
|
||||||
data[data1_off+k] = out_buf[k]
|
data[data1_off+k] = out_buf[k]
|
||||||
for j in xrange(14):
|
if self.info.chan_cnt == 2:
|
||||||
sampsbuf[j] = snddatar[i*14+j]
|
for j in xrange(14):
|
||||||
out_buf = self.repack_adpcm(1, self.deftbl, sampsbuf)
|
sampsbuf[j] = snddatar[i*14+j]
|
||||||
for k in xrange(8):
|
out_buf = self.repack_adpcm(1, self.deftbl, sampsbuf)
|
||||||
data[data2_off+k] = out_buf[k]
|
for k in xrange(8):
|
||||||
|
data[data2_off+k] = out_buf[k]
|
||||||
data1_off += 8
|
data1_off += 8
|
||||||
data2_off += 8
|
if self.info.chan_cnt == 2:
|
||||||
|
data2_off += 8
|
||||||
self.info.loop_end = blocks * 7
|
self.info.loop_end = blocks * 7
|
||||||
return data
|
return data
|
||||||
def create_bns(self, inbuf, samplerate=44100, channels=2):
|
def create_bns(self, inbuf, samplerate=44100, channels=2):
|
||||||
@ -469,6 +489,14 @@ class BNS(object):
|
|||||||
self.data.size = len(self.data.data)
|
self.data.size = len(self.data.data)
|
||||||
self.header.data_len = self.data.size
|
self.header.data_len = self.data.size
|
||||||
self.header.filesize = self.info.size + self.data.size + 8 + self.header.size
|
self.header.filesize = self.info.size + self.data.size + 8 + self.header.size
|
||||||
|
if self.info.chan_cnt == 1:
|
||||||
|
self.header.info_len = 0x60
|
||||||
|
self.header.data_off = 0x80
|
||||||
|
self.info.length = 0x60
|
||||||
|
self.info.channel1_start_offset = 0x0000001C
|
||||||
|
self.info.channel2_start_offset = 0x00000000 #technically this becomes chan1_start
|
||||||
|
self.info.chan1_start = 0x00000028 # technically this is coeff1_offset
|
||||||
|
self.info.coefficients1_offset = 0x00000000 # technically this is padding
|
||||||
self.info.loop_end = self.data.size - (self.data.size / 7)
|
self.info.loop_end = self.data.size - (self.data.size / 7)
|
||||||
for x in xrange(16):
|
for x in xrange(16):
|
||||||
self.info.coefficients1[x] = self.deftbl[x]
|
self.info.coefficients1[x] = self.deftbl[x]
|
||||||
@ -568,7 +596,7 @@ def main():
|
|||||||
bns = BNS()
|
bns = BNS()
|
||||||
wavbuffer = bns.eat(buffer, 0x00, True)
|
wavbuffer = bns.eat(buffer, 0x00, True)
|
||||||
wavstring = ''.join(Struct.int16(p) for p in wavbuffer)
|
wavstring = ''.join(Struct.int16(p) for p in wavbuffer)
|
||||||
f = SoundFile(wavstring, sys.argv[3], bns.info.samplerate)
|
f = SoundFile(wavstring, sys.argv[3], bns.info.chan_cnt, bns.info.samplerate)
|
||||||
f.write()
|
f.write()
|
||||||
|
|
||||||
elif sys.argv[1] == "-e":
|
elif sys.argv[1] == "-e":
|
||||||
@ -583,6 +611,7 @@ def main():
|
|||||||
bns = BNS()
|
bns = BNS()
|
||||||
bns.create_bns(buffer, samplerate, num_chans)
|
bns.create_bns(buffer, samplerate, num_chans)
|
||||||
bns.write(sys.argv[3])
|
bns.write(sys.argv[3])
|
||||||
|
|
||||||
elif sys.argv[1] == "-s":
|
elif sys.argv[1] == "-s":
|
||||||
file = open(sys.argv[2], 'rb')
|
file = open(sys.argv[2], 'rb')
|
||||||
if file:
|
if file:
|
||||||
@ -594,6 +623,7 @@ def main():
|
|||||||
bns = BNS()
|
bns = BNS()
|
||||||
bns.eat(buffer, 0x00, False)
|
bns.eat(buffer, 0x00, False)
|
||||||
bns.show()
|
bns.show()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print "Unknown second argument. possiblities are -d and -e"
|
print "Unknown second argument. possiblities are -d and -e"
|
||||||
print "Usage: python bns.py -d <sound.bin> <output.wav>"
|
print "Usage: python bns.py -d <sound.bin> <output.wav>"
|
||||||
|
Loading…
Reference in New Issue
Block a user